Cài đặt Gitea trên VPS: Xây dựng Git Server riêng bảo mật, hiệu năng cao (2026)
Trong kỷ nguyên số, mã nguồn (Source Code) không chỉ là dữ liệu, mà là tài sản trí tuệ cốt lõi quyết định sự tồn tại của doanh nghiệp công nghệ. Khi các nền tảng lưu trữ đám mây như GitHub hay GitLab Cloud ngày càng thắt chặt chính sách chi phí và giới hạn tính năng, xu hướng Self-hosted Git (tự lưu trữ Git Server) đã trở thành bước đi chiến lược cho các Startup và đội ngũ phát triển phần mềm (Dev Team).
Bạn cần một hệ thống quản lý mã nguồn riêng biệt, đảm bảo quyền kiểm soát dữ liệu tuyệt đối, tốc độ truy cập mạng nội bộ tức thì và không giới hạn số lượng Private Repository? Cài đặt Gitea trên VPS chính là giải pháp tối ưu nhất hiện nay.
Bài viết này là tài liệu kỹ thuật chuyên sâu, hướng dẫn bạn từng bước xây dựng một hệ thống Git Server Production-ready (sẵn sàng vận hành) trên nền tảng Ubuntu 24.04 LTS, sử dụng công nghệ Container hóa (Docker) và cơ sở dữ liệu PostgreSQL để đảm bảo hiệu năng và độ ổn định cao nhất.
Tóm tắt quy trình cài đặt Gitea 2026:
- Chuẩn bị VPS Ubuntu 24.04 (Min: 2 Core, 1GB RAM).
- Cài đặt Docker & Docker Compose v2.
- Thiết lập file
docker-compose.ymlvới PostgreSQL.- Cấu hình Nginx làm Reverse Proxy và cài SSL (HTTPS).
- Hoàn tất thiết lập qua giao diện Web.
Tại sao Gitea là sự thay thế hoàn hảo cho GitHub/GitLab?
Trước khi đi vào triển khai kỹ thuật, chúng ta cần xác định rõ vị thế của Gitea. Gitea (Git with a cup of tea) là nền tảng DevOps mã nguồn mở được viết bằng ngôn ngữ Go. Sự khác biệt lớn nhất của Gitea nằm ở kiến trúc tinh gọn nhưng mạnh mẽ.
Nếu GitLab được ví như một “gã khổng lồ” yêu cầu tài nguyên phần cứng lớn để vận hành trơn tru, thì Gitea lại là giải pháp tối ưu hóa hiệu năng. Nó loại bỏ các lớp phức tạp không cần thiết để tập trung tối đa vào tốc độ và trải nghiệm cốt lõi của lập trình viên.
Dưới đây là bảng phân tích hiệu quả đầu tư (ROI) khi triển khai Gitea:
| Tiêu chí | GitLab CE (Self-hosted) | GitHub Enterprise (Cloud) | Gitea (Self-hosted) |
| Chi phí bản quyền | Miễn phí | ~$21/user/tháng | Miễn phí (MIT License) |
| Yêu cầu hạ tầng | Cao (RAM > 4GB, CPU > 4 Cores) | N/A | Thấp (RAM 1GB, CPU 2 Cores) |
| Tốc độ xử lý | Tiêu tốn tài nguyên | Phụ thuộc đường truyền | Tức thì (Instant) |
| Quyền dữ liệu | Kiểm soát 100% | Phụ thuộc bên thứ 3 | Kiểm soát 100% |
| Hệ sinh thái CI/CD | GitLab CI (Cấu hình riêng) | GitHub Actions | Gitea Actions (Tương thích GitHub Actions) |
Hoạch định hạ tầng VPS (Sizing Guide)
Để xây dựng một hệ thống ổn định cho môi trường doanh nghiệp (Production), việc lựa chọn cấu hình phần cứng phù hợp là bước đầu tiên và quan trọng nhất. Dựa trên các tiêu chuẩn kỹ thuật vận hành thực tế, dưới đây là cấu hình khuyến nghị cho một team phát triển từ 5 đến 50 nhân sự:
- Hệ điều hành: Ubuntu 24.04 LTS (Noble Numbat) hoặc Ubuntu 22.04 LTS. Đây là các phiên bản hỗ trợ dài hạn, đảm bảo tính ổn định và bảo mật.
- CPU: 2 Cores. Mặc dù Gitea có thể khởi chạy trên 1 Core, nhưng 2 Cores là mức thiết yếu để xử lý mượt mà các tác vụ đồng thời (concurrent tasks) như nhiều lập trình viên cùng push code, thực hiện Merge Request hoặc chạy CI/CD runner.
- RAM: 1 GB trở lên. Đây là ngưỡng an toàn để hệ thống hoạt động. Trong quá trình Git thực hiện nén dữ liệu (
git gc) hoặc xử lý các file lớn, việc thiếu RAM có thể dẫn đến lỗi Out-Of-Memory (OOM) khiến dịch vụ ngừng hoạt động đột ngột. - Lưu trữ (Disk): 20GB – 50GB SSD NVMe. Sử dụng ổ cứng SSD tốc độ cao là bắt buộc để đảm bảo tốc độ đọc/ghi (I/O) khi thao tác với hàng ngàn file mã nguồn nhỏ.
- Tên miền: Một subdomain (ví dụ:
git.yourcompany.com) đã được trỏ bản ghi A về địa chỉ IP Public của VPS.
Thiết lập môi trường Docker Engine chuẩn 2026
Chúng ta sẽ triển khai Gitea trên nền tảng Docker. Phương pháp này giúp cô lập môi trường ứng dụng khỏi hệ điều hành máy chủ, giúp việc sao lưu, di chuyển hoặc nâng cấp phiên bản sau này trở nên đơn giản và an toàn.
Quy trình cài đặt dưới đây tuân thủ chuẩn quản lý khóa bảo mật (GPG Keyring) mới nhất trên Ubuntu.
Bước 1: Làm sạch và chuẩn bị hệ thống
Trước tiên, hãy đảm bảo hệ thống hoàn toàn sạch sẽ bằng cách gỡ bỏ các gói Docker cũ (nếu có) để tránh xung đột phiên bản:
sudo apt-get remove docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc
Bước 2: Thiết lập Repository và GPG Key
Ubuntu yêu cầu xác thực chữ ký số cho các gói phần mềm cài đặt.
1. Cập nhật danh sách gói và cài đặt các công cụ cần thiết:
sudo apt-get update
sudo apt-get install ca-certificates curl -y
2. Tạo thư mục chứa keyrings (nếu chưa có) và tải GPG Key chính thức từ Docker:
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
3. Thêm Repository của Docker vào nguồn APT:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Bước 3: Cài đặt Docker Engine
Tiến hành cập nhật lại danh sách gói và cài đặt Docker Engine cùng các plugin hỗ trợ:
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
Sau khi cài đặt, hãy kiểm tra phiên bản để chắc chắn mọi thứ đã sẵn sàng:
docker compose version
Triển khai Gitea Server với Docker Compose
Đây là giai đoạn cốt lõi của quá trình triển khai. Chúng ta sẽ xây dựng một stack gồm hai dịch vụ chính: Gitea (Application) và PostgreSQL (Database).
Việc sử dụng PostgreSQL thay vì SQLite là một tiêu chuẩn bắt buộc cho môi trường Production. PostgreSQL mang lại khả năng xử lý đồng thời tốt hơn, tính toàn vẹn dữ liệu cao hơn và dễ dàng mở rộng khi dữ liệu team phát triển lớn dần theo thời gian.
Bước 1: Khởi tạo cấu trúc thư mục
Tạo một thư mục riêng biệt để lưu trữ toàn bộ cấu hình và dữ liệu của Gitea:
mkdir -p ~/gitea-server
cd ~/gitea-server
Bước 2: Cấu hình file docker-compose.yml
Tạo và chỉnh sửa file docker-compose.yml bằng trình soạn thảo nano:
nano docker-compose.yml
Hãy sao chép nội dung cấu hình dưới đây. Lưu ý: Chúng ta sẽ thiết lập biến môi trường SSH_LISTEN_PORT để đảm bảo logic kết nối SSH hoạt động chính xác giữa Docker và Gitea.
services:
server:
image: docker.gitea.com/gitea:1.25.3 # Sử dụng phiên bản ổn định cụ thể
container_name: gitea
environment:
- USER_UID=1000
- USER_GID=1000
# Cấu hình Database
- GITEA__database__DB_TYPE=postgres
- GITEA__database__HOST=db:5432
- GITEA__database__NAME=gitea
- GITEA__database__USER=gitea
- GITEA__database__PASSWD=YOUR_SECURE_PASSWORD # <--- Thay đổi bằng mật khẩu mạnh
# Cấu hình SSH (Quan trọng)
- GITEA__server__SSH_LISTEN_PORT=22 # Bắt buộc Gitea lắng nghe ở port 22 bên trong container
restart: always
networks:
- gitea
volumes:
- ./gitea_data:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000" # Port Web UI
- "222:22" # Map Port 222 (Host) vào Port 22 (Container)
depends_on:
- db
db:
image: postgres:14
restart: always
environment:
- POSTGRES_USER=gitea
- POSTGRES_PASSWORD=YOUR_SECURE_PASSWORD # <--- Phải trùng khớp với mật khẩu ở trên
- POSTGRES_DB=gitea
networks:
- gitea
volumes:
- ./postgres_data:/var/lib/postgresql/data
networks:
gitea:
external: false
Phân tích logic kỹ thuật quan trọng:
- Vấn đề SSH Port: Mặc định, nếu bạn đổi cổng hiển thị SSH (SSH Port) trong Gitea thành 222, ứng dụng cũng sẽ đổi cổng lắng nghe (Listen Port) thành 222. Điều này gây xung đột vì Docker đang cố chuyển tiếp traffic vào cổng 22.
- Giải pháp: Dòng
GITEA__server__SSH_LISTEN_PORT=22giúp “cố định” cổng lắng nghe bên trong Container là 22. Nhờ đó, chúng ta có thể thoải mái map222:22ở ngoài Docker mà không làm mất kết nối.
Bước 3: Khởi chạy hệ thống
Kích hoạt toàn bộ hệ thống bằng lệnh:
docker compose up -d
Hệ thống sẽ mất khoảng 30-60 giây để tải Image và khởi tạo cơ sở dữ liệu lần đầu. Bạn có thể kiểm tra trạng thái hoạt động bằng lệnh:
docker compose ps
Nếu cột Status hiển thị Up, hệ thống đã sẵn sàng.
Thiết lập Nginx Reverse Proxy và SSL (HTTPS)
Mặc dù Gitea đã hoạt động ở port 3000, việc phơi bày trực tiếp port này ra Internet là không chuyên nghiệp và tiềm ẩn rủi ro bảo mật. Chúng ta sẽ thiết lập Nginx làm Reverse Proxy để điều hướng lưu lượng truy cập qua tên miền chuẩn với giao thức HTTPS.
Bước 1: Cài đặt và cấu hình Nginx
Cài đặt Nginx từ kho lưu trữ mặc định của Ubuntu:
sudo apt install nginx -y
Tạo file cấu hình Virtual Host cho Gitea:
sudo nano /etc/nginx/sites-available/gitea
Dán nội dung cấu hình sau (thay git.yourcompany.com bằng tên miền thực tế của bạn):
server {
listen 80;
server_name git.yourcompany.com;
location / {
proxy_pass http://localhost: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;
}
}
Kích hoạt cấu hình và tải lại Nginx:
sudo ln -s /etc/nginx/sites-available/gitea /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Bước 2: Tự động hóa SSL với Certbot
Để bảo mật đường truyền mã nguồn, việc sử dụng SSL là bắt buộc. Chúng ta sẽ sử dụng Certbot (cài đặt qua Snap để đảm bảo tính ổn định và cập nhật mới nhất) để lấy chứng chỉ Let’s Encrypt miễn phí.
Cài đặt Snap core và làm mới:
sudo snap install core; sudo snap refresh core
Cài đặt Certbot và tạo liên kết thực thi:
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Kích hoạt HTTPS tự động cho Nginx:
sudo certbot --nginx -d git.yourcompany.com
Hoàn tất cấu hình trên giao diện Web (Web Install)
Đây là bước cuối cùng để đưa hệ thống vào hoạt động. Hãy truy cập https://git.yourcompany.com trên trình duyệt. Bạn sẽ được chào đón bởi màn hình cài đặt ban đầu.
Tại đây, bạn cần điền chính xác các thông số để đảm bảo hệ thống kết nối đúng:
- Database Settings: Các thông số này đã được tự động điền chính xác nhờ biến môi trường trong Docker Compose. Bạn không cần chỉnh sửa.
- General Application Settings:
- Site Title: Tên hiển thị của hệ thống (ví dụ: TechTeam Git).
- Server Domain:
git.yourcompany.com. - SSH Server Port: Điền 222.
- Lưu ý: Nhờ biến môi trường
SSH_LISTEN_PORT=22chúng ta đã cài đặt ở bước 3, việc bạn điền 222 ở đây chỉ có tác dụng thay đổi đường dẫn hiển thị (Clone URL) cho đúng với thực tế (ví dụ:ssh://git@domain:222/repo.git). Kết nối ngầm bên dưới vẫn hoạt động hoàn hảo qua cổng 22 của container.
- Lưu ý: Nhờ biến môi trường
- Gitea Base URL:
https://git.yourcompany.com/. (Bắt buộc phải cóhttpsvà dấu/ở cuối).
- Server and Third-Party Service Settings:
- Disable Self-Registration: Hãy tích chọn ô này. Đây là tính năng bảo mật thiết yếu cho hệ thống nội bộ, ngăn chặn người lạ tự ý đăng ký tài khoản. Chỉ có Administrator mới có quyền tạo tài khoản cho thành viên mới.
- Administrator Account Settings: Thiết lập tài khoản Admin quản trị cao nhất cho hệ thống.
Sau khi nhấn “Install Gitea”, hệ thống sẽ hoàn tất cấu hình và chuyển hướng bạn vào trang quản trị.
Chiến lược vận hành và bảo trì
Một hệ thống Git Server không chỉ cần hoạt động mà còn phải vận hành bền bỉ. Dưới đây là các quy trình tiêu chuẩn:
Quy trình sao lưu (Backup)
Dữ liệu là tài sản quan trọng nhất. Với kiến trúc Docker đã thiết lập, dữ liệu của bạn nằm trọn vẹn trong thư mục ~/gitea-server. Quy trình sao lưu thực hiện như sau:
Di chuyển ra thư mục gốc:
cd ~
Nén toàn bộ thư mục dự án (bao gồm Code và Database):
tar -czvf gitea-backup-$(date +%F).tar.gz gitea-server
Khuyến nghị: Hãy kết hợp với cron để chạy lệnh này hàng ngày và sử dụng rclone để tự động đẩy file backup lên Google Drive hoặc AWS S3.
Quy trình nâng cấp (Upgrade)
Gitea thường xuyên phát hành các bản cập nhật tính năng và vá lỗi bảo mật. Để nâng cấp, bạn chỉ cần thực hiện 2 bước:
1. Mở file docker-compose.yml, thay đổi số phiên bản image (ví dụ từ 1.25.3 lên 1.26.0).
2. Tải image mới về:
docker compose pull
3. Tái khởi động container:
docker compose up -d
Docker sẽ tự động cập nhật và giữ nguyên dữ liệu cũ.
Câu hỏi thường gặp (FAQ)
1. Gitea có tiêu tốn nhiều RAM không?
Không. Gitea tối ưu hóa tài nguyên rất tốt, chỉ chiếm khoảng 100MB – 150MB RAM khi chạy nền. Tuy nhiên, bạn nên dùng VPS có tối thiểu 1GB RAM để đảm bảo hệ thống không bị gián đoạn (crash) khi Git thực hiện nén dữ liệu hoặc chạy CI/CD.
2. Tôi nên dùng SQLite hay PostgreSQL?
Nên dùng PostgreSQL. Dù SQLite tiện lợi (không cần cài thêm), nhưng nó không chịu tải tốt khi team đông người và khó chuyển đổi dữ liệu sau này. Hãy thiết lập chuẩn ngay từ đầu.
3. Sửa lỗi “SSH Permission Denied (publickey)” trên Gitea Docker?
Lỗi này thường do bạn quên điền Port hoặc nhầm Key.
- Sai Port: Vì chạy Docker, bạn bắt buộc phải clone kèm port 222:
git clone ssh://git@domain:222/user/repo.git. Nếu thiếu:222, kết nối sẽ đi vào SSH của VPS (nơi không chứa key của bạn). - Nhầm Key: Public Key phải được thêm vào giao diện Web của Gitea (Settings > SSH Keys), không phải thêm vào file
~/.ssh/authorized_keyscủa VPS.
4. Gitea báo lỗi 500 hoặc 502 Bad Gateway sau khi cài đặt?
Thường do Database chưa khởi động xong hoặc Nginx chưa kết nối được với Docker.
- Chờ khoảng 1-2 phút sau khi chạy
docker compose up. - Kiểm tra log lỗi bằng lệnh:
docker compose logs -f.
5. Quên mật khẩu Admin thì reset thế nào?
Dùng dòng lệnh (CLI) trong Container để đổi mật khẩu trực tiếp:
docker exec -u git -it gitea gitea admin user change-password -u <tên_user> -p <mật_khẩu_mới>
6. Nguyên nhân VPS nhanh hết dung lượng lưu trữ?
Docker thường lưu lại nhiều image cũ và log gây tốn dung lượng. Hãy chạy lệnh dọn dẹp định kỳ để giải phóng không gian:
docker system prune -a
7. Làm sao backup dữ liệu an toàn nhất?
Đừng chỉ lưu trên VPS. Hãy nén thư mục gitea-server và dùng Rclone đẩy lên Google Drive/S3 hàng ngày.
Kết luận
Việc cài đặt Gitea trên VPS riêng là một bước đi chiến lược, mang lại sự tự chủ hoàn toàn về công nghệ cho doanh nghiệp. Bạn đã sở hữu một hệ thống Git Server mạnh mẽ, bảo mật, hiệu năng cao và tiết kiệm chi phí, thay thế hoàn toàn được các giải pháp Enterprise đắt đỏ.
Hệ thống này không chỉ là nơi lưu trữ mã nguồn, mà còn là nền tảng để bạn triển khai quy trình DevOps chuyên nghiệp với Gitea Actions. Hãy bắt đầu mời các thành viên trong team, tạo repository đầu tiên và trải nghiệm tốc độ vượt trội mà Gitea mang lại ngay hôm nay.
Nếu bạn cần tư vấn sâu hơn về việc tích hợp CI/CD hoặc tối ưu hóa hạ tầng VPS cho Gitea, đừng ngần ngại liên hệ để được hỗ trợ chuyên sâu.







