Server tự-làm: Phần 1 - Khởi đầu

Server tự-làm: Phần 1 - Khởi đầu

Chọn lựa phương án cấu hình homeserver

Distro Linux tớ chọn là Rocky Linux 9, dựa trên CentOS đã bị khai tử. Về tính ổn định thì không thua RedHat và RHEL là bao, lại còn mã nguồn mở.

Về nhu cầu:

  • Một git server (Lựa chọn Gitea)
  • Một file/media server (OwnCloud/Nextcloud)
  • Một hệ thống code collaboration (code-server)
  • Một bot Discord để vọc vạch
  • Một blog riêng

Tớ không muốn chơi kiểu bare-metal (cài thẳng toàn bộ trực tiếp dưới dạng package lên Rocky), mà để đảm bảo tính bảo mật, tớ chọn containerize (sử dụng Docker). Đương nhiên, một số thứ vẫn phải được cài kiểu bare-metal.

Containerized Package

  • Portainer - Tạo giao diện quản lý các Docker container.
  • Coder Docker - Hệ thống Code Collaboration, tạo môi trường riêng để lập trình và quản lý chúng.
  • Gitea - Server Git vừa nhẹ vừa có giao diện đẹp như Github.
  • Nextcloud - File server, có cả lịch và này kia này kia. Điểm trừ là lag, cần cài chung với Redis để cache.

Non-containerized Package

  • Caddy - Web server siêu cấp trái đất, cung cấp mọi thứ từ a tới z: Reverse Proxy, tự động ký chứng chỉ SSL, vân vân... Chắc chắn là dễ dùng hơn nginx.
  • Cloudflare Tunnel (cloudflared) - Tạo 1 cái tunnel riêng để SSH vào máy chủ cho yên tâm, lại còn bảo mật.
  • DDClient (ddclient) - Tự động cập nhật IP máy chủ cho tên miền. Do mạng gia đình đều gắn IP động, nên cái này vô cùng cần thiết. Nếu bạn dùng gói IP tĩnh doanh nghiệp gì đó thì có thể không cần cài đặt phần này.
  • Cockpit - Được Rocky cung cấp sẵn, dùng để theo dõi và quản lý homeserver qua giao diện Web.
  • Docker - Tạo container. Cái này không cần giải thích nhiều.

Tối ưu tốc độ DNF để cài đặt các package cần thiết

Thêm 2 dòng vào cuối file /etc/dnf/dnf.conf

max_parallel_downloads=10
fastestmirror=True

Sau đó, chạy lại sudo dnf update --refresh để reload cache.

Cấu hình bước đầu để chạy được: Cài đặt Docker

Mặc định, RedHat, cùng các Distro dựa trên RHEL đều sử dụng podman cho việc Container hóa. Tuy vậy, podman có rất nhiều hạn chế.

Một trong số đó là việc thiết lập docker-compose trên podman có vẻ không được hỗ trợ 100%.

Mình yêu sự tiện lợi và khoa học của docker-compose và mình cũng không thích xài docker run. Do vậy mình sẽ thay thế podman bằng docker.

Để gỡ bỏ podman và cài đặt docker:

sudo dnf remove podman buildah
sudo dnf check-update
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install docker-ce docker-ce-cli containerd.io
sudo systemctl enable --now docker

Tiếp theo, cấu hình để chạy docker bằng quyền người dùng:

sudo usermod -aG docker $(whoami)
logout

Trong quá trình thiết lập Container bằng docker-compose, tớ đã forward port ngược. Tức là port_host:port_container thì tớ đọc ngược lại thành port_container:port_host, ăn nguyên lỗi 503. Nên đừng nhầm lẫn nhé, hãy cài đặt forward port từ Docker host vào container.

Đưa homeserver ra khỏi ao làng, kết nối với Internet

Tức là mình cần phải mở cổng (port) cho khách vào.

Mình muốn quản lý toàn bộ server bằng giao diện Web, nên chỉ mở NAT Port 80 và 443. Hoặc cao tay hơn, có thể xài DMZ và pfsense để toàn bộ traffic đổ vào homeserver, và cho pfsense xử lý.

Xét về mặt lợi hại của 2 phương án này

  • DMZ + pfsense: Mình chưa biết cấu hình proxmox nên cái này bỏ qua.
  • Mở NAT Port Cái này hơi nguy hiểm, nhưng tạm được. Để đảm bảo an toàn, mình sẽ sử dụng Cloudflare làm proxy.

Đối chiếu WAN IP với IP công khai. Nếu 2 IP khác nhau tức là cậu đã bị ISP khóa NAT mất rồi (cái này là câu chuyện của VNPT và Viettel, không rõ FPT có như vậy không?). Để mở khóa, hãy gọi lên tổng đài CSKH của nhà mạng, và yêu cầu mở NAT (có thể viện lý do là muốn xem Camera)

Gán tên miền cho homeserver

Chẳng ai lại muốn nhớ nguyên một cái địa chỉ IP để truy cập vào web server.

Vậy nên tớ đã mua tên miền của Namecheap, 20k cho năm đầu tiên và 240k cho các năm tiếp theo.  Cùng với đó, tớ sử dụng ddclient để cập nhật IP động cho các A Record.

Tại Cloudflare Dashboard, chọn vào hình đầu người góc trên cùng bên phải, và chọn mục My Profile.

Ở phần API Token, chọn Create Token, và Create Custom Token.

  • Zone Resource: Include All Zone

Permission:

  • Zone - Zone Settings - Read
  • Zone - Zone - Read
  • Zone - DNS - Edit

Sau đó, nhớ lấy cái token mà bạn vừa tạo ra.

Cài đặt ddclient trên máy chủ, và chỉnh sửa file /etc/ddclient/ddclient.conf

daemon=300
syslog=yes
pid=/var/run/ddclient.pid
ssl=yes
use=web
web='https://cloudflare.com/cdn-cgi/trace'
protocol=cloudflare,        \
zone=tên-miền-của-bạn,            \
ttl=1,                      \
password='cái-token-vừa-nãy-bạn-tạo',        \
tên-miền,tên-miền-phụ