Tự host Git server trên VPS giúp bạn giữ mã nguồn, issue và cấu hình CI trên hạ tầng của chính mình, theo quy tắc phân quyền và chính sách lưu trữ do bạn đặt ra. Phần khó không nằm ở bước cài đặt. Cái khó là chọn đúng phần mềm cho quy mô đội, cấp đủ RAM, và chắc chắn bản sao lưu khôi phục được khi cần. Bài này so sánh Gitea với GitLab, đưa ra mức cấu hình thực tế, hướng dẫn cài Gitea bằng Docker, phác thảo cách cài GitLab, rồi kết thúc bằng phần sao lưu và mấy chi tiết SSH hay làm người mới vấp phải.
Gitea hay GitLab: quyết định trước khi thuê VPS
Hai dự án này giải hai bài toán khác nhau, và lựa chọn của bạn quyết định luôn cấu hình máy chủ.
| Gitea | GitLab (Community Edition) | |
|---|---|---|
| Bản chất | Một binary Go duy nhất: repo, issue, pull request, package, CI tương thích Actions | Nền tảng DevOps trọn gói: repo, merge request, CI/CD tích hợp, registry, công cụ quản lý dự án |
| Mức dùng RAM | Nhỏ; chạy thoải mái với 1 đến 2 GB RAM cho đội nhỏ | Lớn; đi kèm PostgreSQL, Redis, Puma, Sidekiq và Gitaly |
| Cấu hình khởi đầu thực tế | 1 vCPU, 2 GB RAM | 4 vCPU, 8 GB RAM |
| Nâng cấp | Thay binary hoặc đổi tag image | Phải đi đúng lộ trình nâng cấp bắt buộc của GitLab |
| Hợp với | Đội nhỏ, dự án cá nhân, mirror repo | Đội cần CI/CD, registry và quản lý dự án trong một sản phẩm |
Nếu còn phân vân, hãy bắt đầu với Gitea. Nó đáp ứng gần hết nhu cầu hằng ngày của một đội nhỏ và vẫn chừa tài nguyên trên máy cho CI runner hay dịch vụ khác. Chuyển sang GitLab khi bạn thật sự cần pipeline tích hợp và mô hình phân quyền của nó, và khi đó hãy chọn cấu hình đủ ngay từ đầu. GitLab có thể ép chạy trên ít RAM hơn nếu tinh chỉnh, nhưng một GitLab thiếu tài nguyên sẽ chậm tới mức cả đội ngại dùng.
Chọn vị trí và cấu hình khi tự host Git server trên VPS
Git server phần lớn thời gian rảnh, xen kẽ những đợt tải ngắn: clone, push, render trang web và đôi khi một lần fetch lớn từ CI. CPU shared xử lý Gitea tốt. GitLab chạy ổn hơn trên CPU general purpose, và nên dùng CPU dedicated nếu bạn chạy CI job trên cùng máy.
Với đội làm việc cho khách hàng hoặc đối tác ở châu Âu, Frankfurt và Amsterdam đều là vị trí trung tâm, gói tháng ở cả hai nơi kèm 5 TB băng thông, đủ dư cho CI clone đi clone lại. Xem máy chủ Cloudj tại Đức và tại Hà Lan, hoặc đọc VPS tốt nhất tại Đức và VPS tốt nhất tại Hà Lan để biết chi tiết từng nơi. Nếu đội bạn ở khu vực khác của châu Âu, hướng dẫn VPS châu Âu so sánh cả bảy quốc gia.
Ổ đĩa là con số hay bị đánh giá thấp nhất. Hãy tính cho repo, đối tượng Git LFS, package registry, artifact của CI và ít nhất một bản sao lưu cục bộ trước khi đẩy ra ngoài. Cứ chừa dư từ đầu; bạn có thể mở rộng ổ đĩa sau trong console, nhưng dọn ổ đầy khi cả đội đang chờ push thì không dễ chịu chút nào.
Cài Gitea bằng Docker Compose
Trước tiên hãy chuẩn bị máy chủ Linux mới với SSH key và firewall; bài cài SSH key cho VPS và cài Docker trên VPS hướng dẫn cả hai. Sau đó tạo thư mục dự án:
mkdir -p ~/gitea && cd ~/gitea
Tạo file docker-compose.yml:
services:
gitea:
image: gitea/gitea:latest # môi trường thật nên ghim một tag phiên bản cụ thể
container_name: gitea
restart: always
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__server__DOMAIN=git.example.com
- GITEA__server__ROOT_URL=https://git.example.com/
- GITEA__server__SSH_DOMAIN=git.example.com
- GITEA__server__SSH_PORT=2222
volumes:
- ./data:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "127.0.0.1:3000:3000"
- "2222:22"
Có hai chi tiết cần để ý. Cổng web được gắn vào 127.0.0.1, nên chỉ truy cập được qua reverse proxy trên cùng máy. Git qua SSH dùng cổng 2222 trên máy chủ, để cổng 22 cho bạn đăng nhập quản trị. Khởi động:
docker compose up -d
docker compose logs -f gitea
Đặt Nginx phía trước cổng 3000 kèm chứng chỉ Let's Encrypt (bài Nginx reverse proxy và SSL có sẵn mẫu cấu hình), rồi mở firewall:
sudo ufw allow 80,443/tcp
sudo ufw allow 2222/tcp
Truy cập https://git.example.com, hoàn tất trình cài đặt (SQLite đủ dùng cho đội nhỏ; chọn PostgreSQL nếu bạn dự kiến mở rộng) và tạo tài khoản admin. Lập trình viên clone qua SSH như sau:
git clone ssh://[email protected]:2222/team/project.git
Để khỏi gõ cổng mỗi lần, mỗi người có thể thêm đoạn này vào ~/.ssh/config:
Host git.example.com
Port 2222
User git
Cài GitLab: các bước chính
Gói Omnibus của GitLab cài mọi thành phần trong một bước trên Ubuntu hoặc Debian. Trên máy chủ đủ RAM:
sudo apt update && sudo apt install -y curl ca-certificates
curl -fsSL https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
sudo EXTERNAL_URL="https://git.example.com" apt install -y gitlab-ce
Khi dùng URL https và DNS đã trỏ về máy chủ, gói cài sẽ tự xin chứng chỉ Let's Encrypt. Mật khẩu root ban đầu nằm trong /etc/gitlab/initial_root_password và chỉ tồn tại 24 giờ. Cấu hình nằm ở /etc/gitlab/gitlab.rb; sau mỗi lần sửa hãy chạy sudo gitlab-ctl reconfigure. Đọc lộ trình nâng cấp chính thức trước mỗi lần lên phiên bản, vì GitLab không cho bỏ qua một số mốc bắt buộc.
Sao lưu sao cho khôi phục được
Với Gitea chạy Docker, cách sao lưu nhất quán đơn giản nhất là dừng container chốc lát rồi nén thư mục dữ liệu:
cd ~/gitea
docker compose stop gitea
sudo tar czf /var/backups/gitea-$(date +%F).tar.gz data
docker compose start gitea
Với GitLab, bản sao lưu ứng dụng và file bí mật là hai thứ tách biệt, và bạn cần cả hai:
sudo gitlab-backup create
sudo cp /etc/gitlab/gitlab.rb /etc/gitlab/gitlab-secrets.json /var/backups/
Sau đó đẩy các file nén ra ngoài máy chủ theo lịch, ví dụ bằng rsync hoặc rclone tới nơi lưu trữ ở vị trí khác. Mỗi quý một lần, khôi phục thử lên một máy chủ thuê theo giờ, kiểm tra clone được repo và mở được issue, rồi xóa máy thử. Máy chủ theo giờ vẫn tính tiền chừng nào còn tồn tại, kể cả khi đã tắt, nên phải xóa hẳn thì mới ngừng bị trừ tiền.
Câu hỏi thường gặp
Gitea cần bao nhiêu RAM?
Đội nhỏ chạy thoải mái với 1 đến 2 GB RAM. Hãy tăng RAM khi bật Actions runner, package registry hoặc mirror nhiều repo trên cùng máy.
GitLab chạy trên 4 GB RAM được không?
Khởi động được, nhưng sẽ chậm và có thể hết RAM khi CI chạy nặng. Với đội dùng hằng ngày, hãy coi 8 GB là mức tối thiểu thực tế.
Sao không để Git SSH ở cổng 22?
Được, nhưng khi đó SSH quản trị phải chuyển sang cổng khác. Giữ quản trị ở cổng 22 và Git ở cổng 2222 dễ hiểu và dễ cấu hình firewall hơn.
Có nên chạy CI runner trên cùng máy chủ?
Với job nhẹ thì được. Với build nặng, hãy tách ra máy riêng để build dài không làm chậm push và review code. Bài tự host GitHub Actions runner nói kỹ về phía runner.
Triển khai Git server của bạn
Chọn Gitea nếu muốn gọn nhẹ, GitLab nếu cần nền tảng trọn gói, rồi chọn cấu hình tương ứng và thử khôi phục trước khi tin vào bản sao lưu. Xem giá hiện hành trên trang bảng giá, hoặc triển khai ngay từ console Cloudj, nơi hiển thị chi phí chính xác trước khi bạn xác nhận.