Cài Gitea trên VPS: Git server tự host với Docker, HTTPS và sao lưu

Hướng dẫn cài Gitea trên VPS bằng Docker, chạy sau nginx với HTTPS, clone qua SSH hoặc HTTPS, sao lưu bằng gitea dump, hoặc cài một chạm bằng ZoPanel.

Sơ đồ: Gitea chạy trong Docker sau nginx và HTTPS trên VPS, lập trình viên push code lên

Ý chính

  • Gitea là Git server giấy phép MIT, có repository, issue, pull request, package và Actions, đủ nhẹ cho một VPS nhỏ.
  • Số phiên bản đã nhảy từ 1.27 lên 28.0 vào tháng 9/2026, nên dòng hiện hành là 28.x.
  • Đặt ROOT_URL đúng địa chỉ HTTPS và tăng client_max_body_size của nginx, nếu không link clone và các lần push lớn sẽ lỗi.
  • Sao lưu bằng gitea dump hoặc cả volume /data; mỗi bản clone có code nhưng không có issue hay pull request.

Để cài Gitea trên VPS, cách gọn nhất là chạy image Docker chính thức với một volume /data, chỉ mở cổng web trên 127.0.0.1 sau nginx có HTTPS, và đặt ROOT_URL là địa chỉ công khai, ví dụ https://git.example.com/. SQLite đủ cho một lập trình viên hoặc nhóm nhỏ, và VPS 1 đến 2 GB RAM là điểm bắt đầu thoải mái. Nếu server chạy ZoPanel, Gitea cài một chạm từ Kho ứng dụng, có SSL, giới hạn 512 MB RAM, khoá thiết lập, và clone qua HTTPS.

Bài này gồm: Gitea là gì, khi nào nên tự host thay vì dùng GitHub, cài thủ công bằng Docker, cài bằng ZoPanel, sao lưu và cập nhật.

Gitea là gì?

Gitea là dịch vụ Git tự host gọn nhẹ có giao diện web: repository riêng tư và công khai, issue, pull request có review code, wiki, release, kho package và Gitea Actions cho CI/CD. Gitea là một file chạy viết bằng Go, phát hành theo giấy phép MIT, bản miễn phí không giới hạn người dùng và repository. Công ty Gitea Ltd bán thêm Gitea Cloud (instance được quản lý sẵn) và Gitea Enterprise.

Tại thời điểm viết (tháng 10/2026), bản mới nhất là v28.2.0 ngày 18/10/2026. Lưu ý cách đánh số: sau v1.27.3 (tháng 8/2026), dự án ra v28.0.0 ngày 29/9/2026. Các hướng dẫn cũ ghim gitea/gitea:1.2x đã lỗi thời.

Gitea hay GitHub: có đáng tự host không?

Nói thẳng chuyện tiền trước. Gói Free của GitHub đã có repository riêng tư và cộng tác viên không giới hạn, 2.000 phút Actions mỗi tháng và 500 MB lưu trữ package. GitHub Team được niêm yết 4 $/người/tháng (ghi chú là giá cho 12 tháng đầu) tại thời điểm viết (tháng 10/2026). Với nhiều nhóm nhỏ, như vậy còn rẻ hơn thời gian bỏ ra để vận hành server.

Tự host Gitea hợp lý khi:

  • Code phải nằm trên hạ tầng của bạn, do hợp đồng với khách, quy định của cơ quan quản lý, hoặc chính sách công ty.
  • Bạn không muốn trả tiền theo đầu người khi nhóm lớn dần.
  • Bạn đã có runner CI và server deploy riêng trong cùng mạng.
  • Bạn muốn mirror repository từ GitHub hay GitLab làm bản sao do mình kiểm soát.
Gitea tự host GitHub Free GitHub Team
Phí giấy phép 0 $ (MIT) 0 $ 4 $/người/tháng (12 tháng đầu)
Repository riêng tư Không giới hạn Không giới hạn Không giới hạn
CI/CD Gitea Actions với runner của bạn 2.000 phút Actions/tháng Nhiều phút hơn (xem trang giá của GitHub)
Code nằm ở đâu Server của bạn GitHub GitHub
Ai bảo trì Bạn GitHub GitHub

GitHub có hệ sinh thái lớn hơn, runner có sẵn và không phải bảo trì. Gitea cho bạn quyền kiểm soát và tốn ít tài nguyên. Nếu cần hỗ trợ thương mại, Gitea Enterprise và Gitea Cloud tính giá theo người dùng trên trang giá của Gitea, có 30 ngày dùng thử.

Cài Gitea cần VPS cấu hình bao nhiêu?

Gitea không công bố mức RAM tối thiểu; trang so sánh của dự án ghi "low RAM/CPU usage" là một ưu điểm so với GitLab và các phần mềm khác. Để tham khảo, ZoPanel chạy Gitea với giới hạn 512 MB RAM và 1 CPU. VPS 1 GB đủ cho nhóm nhỏ dùng SQLite; dùng 2 GB nếu thêm PostgreSQL hoặc runner CI trên cùng máy. Thường thì ổ đĩa mới là giới hạn thật: repository, file LFS và package đều tăng dần.

Cách 1: Cài Gitea bằng ZoPanel (một chạm)

Trên server có ZoPanel, Gitea nằm trong Kho ứng dụng (hướng dẫn đầy đủ):

  1. Mở Kho ứng dụng. Nếu thấy Cần cài Docker, bấm Cài Docker trước.
  2. Trên thẻ Gitea, bấm Cài đặt.
  3. Nhập Tên miền (ví dụ git.example.com). Quản trị viên chọn thêm Chủ sở hữu. Giữ bật SSL miễn phí (Let's Encrypt).
  4. Bấm Cài đặt và theo dõi nhật ký tác vụ đến dòng Gitea is available at http://<domain>.

ZoPanel đặt sẵn GITEA__server__ROOT_URL=https://<domain>/, tên miền server, DISABLE_SSH=true và DB_TYPE=sqlite3, và áp dụng lại mỗi lần khởi động.

Khoá thiết lập. Khi Gitea chưa được cấu hình, người vào đầu tiên có thể tạo tài khoản quản trị, nên khách truy cập chỉ thấy trang "đang được thiết lập" trong lúc bạn hoàn tất:

  1. Ở tab Docker của website, chờ trạng thái running, rồi bấm Mở ứng dụng (chỉ mình tôi) trong thẻ Đang khoá thiết lập. Trang Initial Configuration mở ra.
  2. Giữ Database Settings là SQLite3. Đặt Site Title và kiểm tra Gitea Website URL là https://<domain>/.
  3. Tuỳ chọn: ở Email Settings, nhập một hộp thư tạo trong panel (cổng 587 hoặc 465) để gửi thông báo và đặt lại mật khẩu.
  4. Ở Server and Third-Party Service Settings, tích Only administrators can create user accounts nếu không muốn mở đăng ký công khai, và Require sign-in to view pages cho instance riêng tư.
  5. Điền Administrator Account Settings rồi bấm Install Gitea.
  6. Quay lại tab Docker, bấm Đã thiết lập xong — mở công khai.

Giới hạn cần biết, theo tài liệu:

  • Không clone qua SSH. Cổng 22 là SSH của chính server, nên SSH server của Gitea bị tắt và URL clone dùng HTTPS. Khi bật xác thực hai lớp, dùng access token làm mật khẩu Git.
  • Dung lượng push. Mỗi lần push bị giới hạn bởi dung lượng upload của website, mặc định 256 MB. Tăng Upload tối đa (MB) ở tab Công cụ của website (tối đa 10 GB) khi cần push lịch sử lớn.
  • Actions cần runner riêng (act_runner) trên máy khác, kết nối qua HTTPS.
  • Migrate và mirror từ GitHub hay GitLab chạy được, webhook tới URL công khai cũng vậy. Webhook tới địa chỉ nội bộ thì không.

Để deploy website từ Gitea vào các site trên ZoPanel, xem bài Git auto-deploy.

Cách 2: Cài Gitea thủ công bằng Docker Compose

Dành cho VPS chưa có panel. Cài Docker Engine từ kho của Docker (các lệnh có trong bài cài n8n trên VPS).

Bước 1: File Compose

Dựa theo tài liệu Docker của Gitea:

sudo mkdir -p /opt/gitea && cd /opt/gitea
sudo nano compose.yaml
services:
  server:
    image: docker.gitea.com/gitea:28.2.0
    restart: always
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - GITEA__server__ROOT_URL=https://git.example.com/
      - GITEA__server__DOMAIN=git.example.com
      - GITEA__server__SSH_DOMAIN=git.example.com
      - GITEA__server__SSH_PORT=222
    volumes:
      - ./gitea:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "127.0.0.1:3000:3000"
      - "222:22"

Lưu ý:

  • Cổng web chỉ mở trên 127.0.0.1; nginx phục vụ nó qua HTTPS.
  • Tài liệu Gitea map SSH của container ra cổng 222 của máy, để cổng 22 cho chính server. Mở cổng này trên tường lửa (sudo ufw allow 222/tcp) nếu muốn clone qua SSH; nếu không, bỏ dòng đó và dùng HTTPS.
  • Thư mục ./gitea phải thuộc UID và GID bạn đặt, nếu không container có thể không khởi động.
  • Với nhóm lớn hơn, cùng trang tài liệu có bản dùng PostgreSQL (GITEA__database__DB_TYPE=postgres với service postgres:18). Hãy ghim phiên bản lớn của PostgreSQL, vì PostgreSQL không tự nâng cấp thư mục dữ liệu.
sudo docker compose up -d

Bước 2: nginx và HTTPS

server {
    listen 80;
    server_name git.example.com;
    client_max_body_size 512m;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

client_max_body_size rất quan trọng: mặc định 1 MB của nginx khiến các lần push lớn lỗi HTTP 413. Bật site, chạy sudo certbot --nginx -d git.example.com, rồi mở tên miền để hoàn tất trang Initial Configuration ngay.

Bước 3: Khoá chặt

  • Tắt tự đăng ký nếu không cần, và bắt đăng nhập với instance riêng tư.
  • Bật xác thực hai lớp cho mọi tài khoản admin (Settings → Security).
  • Dùng access token có phạm vi hẹp cho CI và script.

Sao lưu Gitea

Mỗi bản clone chứa toàn bộ lịch sử của repository, nhưng không có issue, pull request, metadata của wiki, người dùng hay cấu hình. Những thứ đó nằm trong database.

Cách A, gitea dump. Lệnh sao lưu của Gitea tạo file zip gồm database dạng SQL, repository, dữ liệu và cấu hình:

sudo docker compose exec -u git server gitea dump -c /data/gitea/conf/app.ini --file /tmp/gitea-dump.zip
sudo docker compose cp server:/tmp/gitea-dump.zip /root/gitea-dump-$(date +%F).zip

Tài liệu Gitea khuyên tạm ngừng hoạt động khi dump để kết quả nhất quán hoàn toàn, nên hãy chạy lúc ít người dùng.

Cách B, sao lưu volume. Dừng container, nén thư mục /opt/gitea/gitea, khởi động lại. Đơn giản và đầy đủ.

Trên ZoPanel, dữ liệu ứng dụng không nằm trong bản sao lưu tài khoản. Dùng thẻ Sao lưu ở tab Docker (Sao lưu ngay, quản trị viên có thêm Lịch hằng ngày hoặc hằng tuần); container tạm dừng vài giây để SQLite và repository nhất quán. Hãy chép bản sao lưu ra ngoài server, như trong mọi chiến lược sao lưu.

Cập nhật Gitea

  1. Sao lưu. Gitea chuyển đổi database khi khởi động và không hỗ trợ quay về phiên bản cũ.
  2. Đọc ghi chú phát hành, nhất là khi lên phiên bản lớn.
  3. Đổi tag rồi chạy sudo docker compose pull && sudo docker compose up -d.

Trên ZoPanel, Cập nhật bản mới chỉ nằm trong dòng 28.x; phiên bản lớn tiếp theo đến cùng bản cập nhật ZoPanel.

Kết luận

Gitea là một trong những ứng dụng tự host dễ vận hành nhất: một container, một volume, ROOT_URL đúng và giới hạn upload của nginx đủ lớn. Hãy quyết định sớm giữa SSH trên cổng riêng và HTTPS với token, và sao lưu cả database chứ không chỉ code. Nếu bạn muốn chạy Gitea cạnh các website trên cùng server, với SSL, cách ly và lịch sao lưu ứng dụng có sẵn, hãy dùng thử gói Free của ZoPanel (3 tài khoản hosting, 10 website, không giới hạn thời gian) và xem tính năng Kho ứng dụng:

curl -fsSL https://get.zopanel.net | sudo bash

Câu hỏi thường gặp

Gitea có miễn phí cho mục đích thương mại không?

Có. Gitea dùng giấy phép MIT, nên doanh nghiệp chạy nội bộ hay cho khách hàng đều không mất phí giấy phép. Gitea Enterprise và Gitea Cloud là sản phẩm trả phí tuỳ chọn, có hỗ trợ và tính năng thêm như SAML SSO và audit log.

Cài Gitea cần bao nhiêu RAM?

Gitea không công bố mức tối thiểu và nổi tiếng là nhẹ. ZoPanel chạy nó với giới hạn 512 MB; VPS 1 GB dùng được cho nhóm nhỏ với SQLite, 2 GB thì còn chỗ cho PostgreSQL.

Nên dùng Gitea hay GitLab?

GitLab tích hợp sẵn nhiều thứ hơn, như hệ thống CI hoàn chỉnh và quản lý dự án đầy đủ, nhưng trang yêu cầu hệ thống của GitLab ghi mức cơ bản cho một máy là 16 GB RAM và 8 vCPU (tối thiểu 8 GB khi bộ nhớ hạn chế). Gitea nhẹ và dễ bảo trì hơn. Với nhóm nhỏ chủ yếu cần repository, review code và CI cơ bản, Gitea thường là đủ.

Gitea có CI/CD không?

Có, Gitea Actions dùng file workflow tương tự GitHub Actions. Bạn cần đăng ký ít nhất một runner (act_runner), thường chạy job trong Docker trên máy bạn chọn.

Có mirror repository từ GitHub sang Gitea được không?

Được. New Migration nhập repository từ GitHub, GitLab và các nơi khác, và có thể giữ nó ở dạng pull mirror tự đồng bộ theo lịch. Đây là cách rẻ để có một bản sao code quan trọng do chính bạn kiểm soát.