# Tự host Git server trên VPS: chọn Gitea hay GitLab và cách cài

URL: https://cloudj.net/vi/blog/self-hosted-git-server-vps
Published: 2026-11-11 · Updated: 2026-11-11

> Hướng dẫn tự host Git server trên VPS: so sánh Gitea và GitLab, chọn RAM và ổ đĩa phù hợp, tách cổng SSH cho Git, cài đặt bằng Docker và sao lưu đúng cách.

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](https://cloudj.net/vi/cloud-servers/germany) và [tại Hà Lan](https://cloudj.net/vi/cloud-servers/netherlands), hoặc đọc [VPS tốt nhất tại Đức](https://cloudj.net/vi/blog/best-vps-germany) và [VPS tốt nhất tại Hà Lan](https://cloudj.net/vi/blog/best-vps-netherlands) để 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](https://cloudj.net/vi/blog/europe-vps-guide) 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](https://cloudj.net/vi/blog/ssh-key-vps-setup) và [cài Docker trên VPS](https://cloudj.net/vi/blog/install-docker-vps) hướng dẫn cả hai. Sau đó tạo thư mục dự án:

```bash
mkdir -p ~/gitea && cd ~/gitea
```

Tạo file `docker-compose.yml`:

```yaml
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:

```bash
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](https://cloudj.net/vi/blog/nginx-reverse-proxy-ssl-vps) có sẵn mẫu cấu hình), rồi mở firewall:

```bash
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:

```bash
git clone ssh://git@git.example.com: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`:

```text
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:

```bash
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:

```bash
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:

```bash
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](https://cloudj.net/vi/blog/github-actions-runner-vps) 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á](https://cloudj.net/vi/pricing), hoặc triển khai ngay từ [console Cloudj](https://app.cloudj.net), nơi hiển thị chi phí chính xác trước khi bạn xác nhận.
