GitLab quá nặng — và câu chuyện từ vụ CentOS 8 EOL
Team mình hồi đó có 4 người, dùng GitLab self-hosted trên VPS 4GB RAM. Mỗi lần push code xong, server ì ạch cả phút mới xong CI pipeline. Đến khi CentOS 8 bị EOL, mình phải migrate gấp 5 server sang Rocky Linux trong 1 tuần — đây là những gì mình học được: nhân dịp đó, mình thay luôn GitLab bằng Gitea. Con VPS 1GB RAM cũ chạy Gitea mượt mà, response dưới 2 giây, cả team push/pull bình thường mà server vẫn còn dư tài nguyên để chạy thêm Nginx và một vài cronjob.
Nếu team bạn dưới 20 người và không cần CI/CD built-in phức tạp, Gitea là lựa chọn thực dụng hơn GitLab rất nhiều.
Gitea là gì và tại sao nó nhẹ đến vậy?
Gitea là nền tảng Git hosting tự host (self-hosted), viết bằng Go — ngôn ngữ nổi tiếng với binary nhỏ gọn và hiệu năng cao. Toàn bộ Gitea chỉ là một file binary duy nhất, không cần Ruby như GitLab, không cần Node.js, không bắt buộc phải có PostgreSQL — SQLite là đủ cho team nhỏ.
- RAM thực tế khi chạy: ~200–300MB
- GitLab tối thiểu: 4GB RAM
- Hỗ trợ đầy đủ: repositories, issues, pull requests, webhooks, SSH và HTTPS
- Giao diện quen thuộc, trông rất giống GitHub
- Backup đơn giản: chỉ cần copy 1 thư mục và 1 file config
Thực hành: Cài đặt Gitea từng bước trên CentOS Stream 9
Bước 1: Tạo user hệ thống cho Gitea
Không bao giờ chạy Gitea bằng root. Tạo user riêng để giới hạn quyền truy cập:
sudo useradd -r -m -d /home/gitea -s /bin/bash gitea
Bước 2: Tải binary Gitea
Truy cập trang download Gitea để lấy phiên bản mới nhất. Tại thời điểm viết bài là 1.22.x:
wget -O /usr/local/bin/gitea https://dl.gitea.com/gitea/1.22.3/gitea-1.22.3-linux-amd64
chmod 755 /usr/local/bin/gitea
# Kiểm tra cài đặt thành công
gitea --version
Bước 3: Tạo thư mục và phân quyền
sudo mkdir -p /var/lib/gitea/{custom,data,log}
sudo chown -R gitea:gitea /var/lib/gitea/
sudo chmod -R 750 /var/lib/gitea/
sudo mkdir -p /etc/gitea
sudo chown root:gitea /etc/gitea
sudo chmod 770 /etc/gitea
Bước 4: Cấu hình SELinux cho Gitea
Đây là phần nhiều người bỏ qua rồi chạy setenforce 0 cho xong — đừng làm vậy. CentOS Stream 9 bật SELinux theo mặc định và Gitea cần một vài quyền cụ thể để hoạt động đúng. Cấu hình đúng mất 3 lệnh, tắt SELinux thì mở toang bảo mật cả server:
# Gán context cho binary Gitea
sudo semanage fcontext -a -t bin_t "/usr/local/bin/gitea"
sudo restorecon -v /usr/local/bin/gitea
# Cho phép Gitea bind port 3000
sudo semanage port -a -t http_port_t -p tcp 3000
# Nếu báo lỗi port đã tồn tại thì dùng -m thay vì -a
# sudo semanage port -m -t http_port_t -p tcp 3000
Nếu sau đó Gitea vẫn bị SELinux chặn, kiểm tra log AVC để biết chính xác quyền còn thiếu:
sudo ausearch -m avc -ts recent | audit2allow -a
Bước 5: Mở port với firewalld
# Mở port 3000 cho giao diện web Gitea
sudo firewall-cmd --permanent --add-port=3000/tcp
# Đảm bảo SSH vẫn mở (clone qua SSH)
sudo firewall-cmd --permanent --add-service=ssh
# Áp dụng thay đổi
sudo firewall-cmd --reload
# Kiểm tra kết quả
sudo firewall-cmd --list-all
Bước 6: Tạo systemd service
Để Gitea tự khởi động khi reboot server, tạo file service:
sudo nano /etc/systemd/system/gitea.service
Dán nội dung sau vào file:
[Unit]
Description=Gitea (Git with a cup of tea)
After=network.target
[Service]
RestartSec=2s
Type=simple
User=gitea
Group=gitea
WorkingDirectory=/var/lib/gitea/
ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini
Restart=always
Environment=USER=gitea HOME=/home/gitea GITEA_WORK_DIR=/var/lib/gitea
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable gitea
sudo systemctl start gitea
# Kiểm tra trạng thái
sudo systemctl status gitea
Bước 7: Cài đặt lần đầu qua giao diện Web
Mở trình duyệt, truy cập http://<IP-server>:3000. Gitea hiển thị trang cài đặt ban đầu (Installation Wizard). Điền các thông tin sau:
- Database Type: Chọn
SQLite3cho team nhỏ — không cần cài thêm bất cứ thứ gì - Site Title: Tên Git server của bạn, ví dụ “Company Git”
- Repository Root Path: Giữ mặc định
/home/gitea/gitea-repositories - Application URL: Nhập URL thực tế, ví dụ
http://git.company.comhoặchttp://192.168.1.100:3000 - Admin Account: Tạo tài khoản admin ngay tại đây, đừng bỏ qua bước này
Nhấn Install Gitea — Gitea tự tạo file /etc/gitea/app.ini và sẵn sàng dùng ngay.
Bước 8: Thêm Nginx reverse proxy (nên làm)
Thay vì để port 3000 lộ ra ngoài, dùng Nginx để proxy qua port 80/443 — chuẩn hơn và dễ thêm HTTPS sau này:
sudo dnf install -y nginx
sudo nano /etc/nginx/conf.d/gitea.conf
server {
listen 80;
server_name git.yourdomain.com;
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;
}
}
# SELinux: cho phép Nginx kết nối tới Gitea trên localhost
sudo setsebool -P httpd_can_network_connect 1
sudo systemctl enable --now nginx
# Mở port 80/443, đóng 3000 nếu không muốn expose trực tiếp
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --permanent --remove-port=3000/tcp
sudo firewall-cmd --reload
Kết luận
Gitea không phải lựa chọn của người “không đủ tiền dùng GitLab” — mình chọn Gitea vì nó thực sự phù hợp hơn với quy mô team nhỏ. Ít phụ thuộc, dễ backup, dễ restore, và tiết kiệm đáng kể chi phí VPS. Sau vụ migrate khẩn cấp từ CentOS 8 đó, mình giữ Gitea trên CentOS Stream 9 đến giờ và chưa có lý do nào để quay lại GitLab.
Điều quan trọng nhất khi triển khai trên CentOS Stream 9: đừng tắt SELinux, hãy cấu hình đúng. Ba lệnh semanage ở trên là đủ — không cần chạm tới setenforce 0. SELinux tắt đi thì setup nhanh hơn 5 phút, nhưng bạn sẽ mất cả lớp bảo vệ quan trọng nhất của hệ thống.
