Hướng Dẫn Tự Xây Dựng Máy Chủ Đám Mây Tại Nhà
Bài viết này là một phần trong series “Tự Hosting Từ Đầu” của tôi.
Bạn có mệt mỏi khi phải chi trả cho AWS, Render hay Fly.io trong khi quản lý nhiều dự án không? Tôi sẽ hướng dẫn bạn cách xây dựng một thiết lập hosting tự quản lý, từng bước một, với tất cả các lỗi, sửa lỗi và bài học đã học được trong quá trình này.
Lộ Trình Series:
- Bài 1-3: Phần Cứng, Cài Đặt Ubuntu & Bảo Mật
- Bài 4: Docker & Docker Compose
- Bài 5: Reverse Proxy với Traefik
- Bài 6: Cloudflare Tunnel (HTTPS công khai mà không cần cấu hình router)
- Bài 7: Kiểm Tra Smoke với Whoami
- Bài 8: Postgres trong Docker (volume, kiểm tra sức khỏe, sao lưu)
- ... và nhiều bài khác sẽ sớm ra mắt
Đánh Dấu Series Này
Ghi nhớ series này và theo dõi. Cuối cùng, bạn sẽ tự tin chạy máy chủ của riêng mình.
Mục Tiêu Cuối Cùng Ngày Hôm Nay
Bạn sẽ hoàn thành với một máy chủ Ubuntu sạch sẽ, an toàn mà bạn có thể đăng nhập từ laptop của mình bằng khóa SSH, với tường lửa và cập nhật bảo mật tự động. Đây sẽ là nền tảng mà chúng ta sẽ sử dụng lại cho Docker, Traefik, Cloudflare Tunnel, cơ sở dữ liệu và lưu trữ tệp trong các bài học sau.
Tôi sẽ dạy theo cách tôi đã xây dựng máy chủ của mình, để bạn hiểu tại sao mỗi lệnh tồn tại, khi nào sử dụng và cách sửa các lỗi phổ biến mà không hoảng sợ.
Lộ Trình (Hôm Nay & Tiếp Theo)
Hôm Nay (Bài 1-3):
- Lựa chọn phần cứng (máy chủ tại nhà vs PC nhỏ vs VPS)
- Cài đặt Ubuntu Server (LTS) & khởi động lần đầu
- Bảo mật truy cập: khóa SSH, tường lửa, cập nhật
Tiếp theo (theo thứ tự):
Docker & Compose → Traefik → Cloudflare Tunnel → kiểm tra smoke “whoami” → Postgres → Prisma → API Node/Express → lưu trữ tương thích với Cloudflare R2/S3 → tải lên đã ký trước → khả năng quan sát → phân tách dev/prod sạch sẽ.
Trong suốt series, tôi cũng sẽ chỉ ra những lỗi thực tế mà chúng tôi gặp phải (ví dụ: Traefik 404 từ một container không khỏe mạnh, sự không tương thích OpenSSL của Prisma, các vấn đề CORS của S3) và cách chúng tôi sửa chúng, để bạn không mất cả ngày như chúng tôi.
BÀI HỌC 1: Phần Cứng (Chọn cái phù hợp với ngân sách của bạn)
Cây Quyết Định (tiếng Việt đơn giản)
-
£0–£50: Tái sử dụng một PC hoặc laptop cũ.
- Ưu điểm: miễn phí, khởi động nhanh. Nhược điểm: tiêu thụ điện, ổ đĩa cũ.
-
£120–£300: Mini PC đã tân trang (Lenovo Tiny, Dell Micro, Intel NUC).
- Điểm lý tưởng: 16–32 GB RAM, 256+ GB SSD, yên tĩnh, tiêu thụ điện thấp.
-
£5–£10/tháng: VPS (Hetzner/Contabo/Linode).
- Ưu điểm: luôn bật, có IP công cộng. Nhược điểm: chi phí hàng tháng.
Thông Số Tối Thiểu cho Khóa Học Này
- CPU: bất kỳ x86_64 nào từ khoảng ~10 năm qua
- RAM: 8 GB (16 GB nếu bạn sẽ chạy DB + lưu trữ đối tượng + tìm kiếm)
- Disk: 128 GB SSD (NVMe là lý tưởng). Bắt đầu đơn giản (một đĩa).
- Mạng: Ethernet có dây nếu có thể (Wi-Fi cũng được, nhưng khó khăn hơn)
Các Tiện Ích Thêm (tùy chọn)
- UPS (pin mini) để tránh việc mất điện làm hỏng cơ sở dữ liệu.
- Ghi nhãn hộp với tên máy chủ và IP tĩnh; bạn sẽ cảm ơn bản thân sau này.
Điểm Kiểm Tra: chọn thiết bị của bạn. Nếu nó ở nhà, hãy cắm Ethernet. Nếu đó là VPS, hãy ghi chú IP đã cung cấp và đăng nhập.
BÀI HỌC 2 — Ubuntu Server (Cài đặt & Khởi động lần đầu)
Chúng ta sẽ cài đặt Ubuntu Server 24.04 LTS vì nó ổn định và được hỗ trợ tốt bởi Docker.
2.1 Tạo phương tiện cài đặt
- Tải xuống file ISO Ubuntu Server 24.04 LTS.
- Flash nó vào USB stick bằng balenaEtcher (hoặc Rufus trên Windows).
* Tại sao: nó ghi ISO ở định dạng có thể khởi động một cách an toàn.
2.2 Khởi động BIOS/UEFI
- Cắm USB vào máy chủ của bạn, bật nguồn, nhấn F12 / F2 / DEL / ESC để mở menu khởi động, chọn thiết bị USB.
2.3 Trình cài đặt (chọn cái gì & tại sao)
- Bàn phím/Ngôn ngữ: mặc định thường ổn.
- Mạng: DHCP là ổn cho bây giờ (chúng ta sẽ sử dụng Cloudflare Tunnel sau, vì vậy không cần chuyển tiếp cổng).
- Lưu trữ: “Sử dụng toàn bộ đĩa”. LVM là tùy chọn. Bắt đầu đơn giản.
- Người dùng: tạo một người dùng quản trị (tài khoản này có
sudo). - OpenSSH: Bật nó (cho phép bạn đăng nhập từ xa).
- Khởi động lại, gỡ USB ra.
Nếu bạn thấy một nhắc nhở tên máy chủ, hãy chọn một cái gì đó dễ nhớ, ví dụ:
blackscript-serverhoặcorion.
2.4 Đăng nhập lần đầu (tại chỗ hoặc qua SSH)
Trên màn hình máy chủ, bạn sẽ thấy một địa chỉ IP (ví dụ: 192.168.1.50).
Từ terminal laptop/desktop của bạn:
ssh youruser@192.168.1.50
sshmở một shell bảo mật tới máy chủ.- Lần đầu tiên, bạn sẽ được yêu cầu tin tưởng một dấu vân tay → gõ
yes, sau đó nhập mật khẩu của bạn.
2.5 Cập nhật hệ thống (cơ sở bảo mật)
sudo apt update
sudo apt upgrade -y
apt updatelàm mới danh sách gói.apt upgrade -yáp dụng các bản nâng cấp ngay lập tức.
Điểm Kiểm Tra: chạy hostnamectl (xem tên máy chủ của bạn) và ip a | grep inet (xác nhận IP). Nếu SSH hoạt động và cập nhật hoàn tất, bạn đã sẵn sàng cho việc bảo mật.
BÀI HỌC 3 — Bảo Mật Truy Cập (Khóa SSH, Tường Lửa, Cập Nhật)
Chúng tôi sẽ giúp bạn đến một nơi mà bạn đăng nhập bằng khóa (không phải mật khẩu), một tường lửa bảo vệ hộp, và cập nhật bảo mật tự động áp dụng.
⚠️ Mẹo an toàn: giữ một phiên SSH mở trong khi bạn thay đổi cài đặt. Nếu bạn cấu hình sai, bạn vẫn có một đường cứu.
3.1 Tạo khóa SSH (trên laptop của bạn)
Nếu bạn chưa có:
ssh-keygen -t ed25519 -C "you@example.com"
Điều nó làm:
- Tạo một cặp khóa trong
~/.ssh/(id_ed25519+id_ed25519.pub). -t ed25519là loại khóa hiện đại, an toàn.-Cthêm một nhãn để bạn nhận ra sau này.- Đặt một cụm mật khẩu khi được yêu cầu (để bảo vệ khỏi đánh cắp cục bộ).
3.2 Sao chép khóa của bạn vào máy chủ
Vẫn trên laptop của bạn:
ssh-copy-id youruser@192.168.1.50
Điều nó làm:
- Thêm khóa công khai của bạn vào
~/.ssh/authorized_keyscủa máy chủ. - Sau khi này, khóa của bạn có thể đăng nhập mà không cần nhập mật khẩu máy chủ mỗi lần.
Nếu
ssh-copy-idkhông có sẵn, bạn có thể sao chép bằng tay:
cat ~/.ssh/id_ed25519.pub | ssh youruser@192.168.1.50 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
3.3 Kiểm tra đăng nhập bằng khóa
Đóng phiên SSH của bạn và kết nối lại:
ssh youruser@192.168.1.50
Nếu nó đăng nhập mà không yêu cầu mật khẩu máy chủ (nó có thể hỏi cụm mật khẩu của bạn), bạn đã thành công.
3.4 Bật & cấu hình tường lửa (UFW)
sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw status
allow OpenSSHmở cổng 22 để bạn không bị khóa.enablebật tường lửa lên.statushiển thị các quy tắc đã cho phép.
Sau này, khi chúng ta chạy Traefik, chúng ta sẽ mở HTTP (80). Với Cloudflare Tunnel, bạn thường không cần mở cổng công khai, nhưng chúng ta sẽ đề cập cả hai mô hình.
3.5 Củng cố SSH (vô hiệu hóa đăng nhập bằng mật khẩu & root)
sudo nano /etc/ssh/sshd_config
Tìm/cài đặt:
PasswordAuthentication no
PermitRootLogin no
Lưu và khởi động lại SSH:
sudo systemctl restart ssh
Tại sao:
- Đăng nhập bằng mật khẩu có thể bị brute-forced trên internet công cộng. Khóa an toàn hơn.
- Đăng nhập root bị vô hiệu hóa giảm thiểu rủi ro.
Phục hồi nếu bạn bị khóa:
- Sử dụng console/KVM/monitor + bàn phím để tạm thời đặt lại
PasswordAuthentication yes.- Hoặc kích hoạt lại qua bảng điều khiển nhà cung cấp đám mây.
Luôn giữ một cửa sổ SSH mở trong khi kiểm tra thay đổi.
3.6 Cập nhật bảo mật tự động
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
- Cài đặt một dịch vụ áp dụng tự động các bản cập nhật bảo mật.
- Bước cấu hình lại này kích hoạt nó một cách liên tục.
Bạn có thể kiểm tra nhật ký trong
/var/log/unattended-upgrades/.
Mạng An Toàn Bổ Sung (tùy chọn nhưng tốt)
A. Tạo bí danh SSH thân thiện trên laptop của bạn
Thêm vào ~/.ssh/config:
Host home-server
HostName 192.168.1.50
User youruser
IdentityFile ~/.ssh/id_ed25519
Bây giờ bạn có thể thực hiện ssh home-server.
B. Múi Giờ & NTP (hữu ích cho nhật ký)
sudo timedatectl set-timezone Europe/London
timedatectl
C. Cài đặt fail2ban cơ bản (chặn các lần xác thực thất bại lặp lại. Hữu ích nếu bạn mở SSH)
sudo apt install -y fail2ban
Mặc định là hợp lý; chúng ta có thể điều chỉnh sau nếu bạn mở SSH ra thế giới.
“Những gì có thể sai?” (những lỗi thực tế mà chúng tôi đã mắc phải)
-
Bị khóa khỏi SSH.
Tôi đã vô hiệu hóa đăng nhập bằng mật khẩu trước khi xác nhận xác thực bằng khóa hoạt động.
Cách xử lý: Console vào, đặt lạiPasswordAuthentication yes, khởi động lại ssh, sao chép khóa chính xác, sau đó vô hiệu hóa lại. -
UFW đã khóa SSH của tôi.
Tôi đã bật UFW mà không cho phép OpenSSH trước.
Cách xử lý: Console vào,sudo ufw allow OpenSSH,sudo ufw enable. -
Không có mạng sau khi khởi động lại.
Router thay đổi IP qua DHCP.
Cách xử lý: Kiểm tra màn hình/ip ađể biết IP mới. Sau này, chúng ta sẽ đặt một dự trữ DHCP hoặc một IP tĩnh.
Những lỗi lớn hơn chúng ta sẽ gặp sau (và sửa):
- Traefik 404s vì container backend không khỏe mạnh (kiểm tra sức khỏe của chúng tôi đã hit một
/healthzkhông tồn tại).- Sự không tương thích OpenSSL của Prisma (khách hàng được xây dựng cho
openssl-1.1.xnhưng runtime có3.0.x). Chúng tôi đã sửa bằng cách đặtbinaryTargets = ["native","debian-openssl-3.0.x"]và tạo trong hình ảnh xây dựng.
- Cơn đau đầu CORS của S3 trên MinIO; chúng tôi đã làm việc xung quanh bằng cách tiêm CORS tại Traefik.
Bạn sẽ thấy những sửa chữa đó trong bối cảnh khi chúng ta đạt đến những bài học đó.
Tóm Tắt (những gì bạn đã đạt được hôm nay)
- Chọn phần cứng hợp lý mà không làm hỏng ví tiền của bạn.
- Cài đặt Ubuntu Server 24.04 LTS đúng cách (với SSH).
- Đăng nhập từ laptop của bạn, bật tường lửa, chuyển sang xác thực dựa trên khóa và bật cập nhật bảo mật tự động.
Đây là nền tảng. Với điều này hoàn tất, mọi thứ khác (Docker, Traefik, tunnel, DBs) trở nên đơn giản và có thể lặp lại.