Tự dựng Git Server ‘ngon – bổ – rẻ’ với Gitea trên Fedora: Bảo mật tối đa với SELinux

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

Tại sao Gitea và Fedora là ‘cặp bài trùng’?

Dùng GitHub hay GitLab thì sướng thật, nhưng cảm giác tự tay làm chủ mã nguồn của mình vẫn có cái thú riêng. Nếu bạn đang chạy một con VPS cỏ hoặc máy cũ ở nhà, GitLab sẽ là cơn ác mộng vì nó ngốn ít nhất 4GB RAM chỉ để khởi động. Gitea thì khác. Nó nhẹ hìu, chỉ tốn khoảng 100MB – 150MB RAM cho nhu cầu cá nhân nhưng vẫn đầy đủ tính năng như Pull Request, Wiki và Kanban board.

Mình chọn Fedora Server vì distro này luôn đi đầu về công nghệ. Nó ổn định hơn các bản bleeding-edge nhưng lại có package mới hơn hẳn so với Debian hay CentOS cũ. Kết hợp với SELinux có sẵn, server của bạn sẽ được bảo vệ cực kỳ nghiêm ngặt.

Quick Start: Cài đặt nhanh trong 5 phút

Dành cho những ai đã rành Fedora và muốn thấy ngay kết quả. Đây là lộ trình tóm tắt:

  1. Dựng database MariaDB.
  2. Tạo user git (không dùng root để chạy app).
  3. Tải binary Gitea bản mới nhất.
  4. Mở port 3000 trên Firewalld.
  5. Cấu hình qua Web UI.
# Cài MariaDB và khởi động ngay
sudo dnf install mariadb-server -y
sudo systemctl enable --now mariadb

# Mở port 3000 để truy cập web cài đặt
sudo firewall-cmd --permanent --add-port=3000/tcp
sudo firewall-cmd --reload

Xong bước này là bạn đã có nền móng. Giờ hãy đi sâu vào chi tiết để tránh các lỗi vặt về quyền truy cập.

Bước 1: Thiết lập Cơ sở dữ liệu

Gitea hỗ trợ nhiều loại DB, nhưng MariaDB là lựa chọn “ăn chắc mặc bền” nhất trên Fedora. Sau khi cài, đừng quên chạy lệnh bảo mật:

sudo mysql_secure_installation

Tiếp theo, tạo một database riêng cho Gitea. Lưu ý dùng utf8mb4 để hỗ trợ tốt các ký tự đặc biệt và emoji trong commit message:

CREATE DATABASE giteadb CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';
CREATE USER 'gitea'@'localhost' IDENTIFIED BY 'MatKhauCuaBan';
GRANT ALL PRIVILEGES ON giteadb.* TO 'gitea'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Bước 2: Tạo User hệ thống và Phân quyền

Nguyên tắc vàng: Đừng bao giờ chạy service web bằng quyền root. Một lỗ hổng nhỏ cũng có thể khiến bạn mất quyền kiểm soát toàn bộ server. Hãy tạo một user định danh riêng:

sudo useradd -m -r -s /bin/bash git

# Tạo cấu trúc thư mục chuẩn
sudo mkdir -p /var/lib/gitea/{custom,data,log}
sudo chown -R git:git /var/lib/gitea/
sudo chmod -R 750 /var/lib/gitea/
sudo mkdir /etc/gitea
sudo chown root:git /etc/gitea
sudo chmod 770 /etc/gitea

Ở đây, mình để /etc/gitea có quyền ghi cho group git. Sau khi cài đặt xong, chúng ta sẽ thu hồi quyền này để tăng tính bảo mật.

Bước 3: Tải và cài đặt Gitea Binary

Thay vì cài từ repo cũ kỹ, mình ưu tiên dùng binary trực tiếp từ trang chủ để lấy bản mới nhất (ví dụ 1.21.x).

VERSION=1.21.4
wget -O /tmp/gitea https://dl.gitea.com/gitea/${VERSION}/gitea-${VERSION}-linux-amd64
sudo mv /tmp/gitea /usr/local/bin/gitea
sudo chmod +x /usr/local/bin/gitea

Bước 4: Chinh phục SELinux (Đừng tắt nó!)

Nhiều hướng dẫn trên mạng khuyên bạn chạy setenforce 0. Đó là lời khuyên tồi. SELinux là lớp giáp bảo vệ Fedora khỏi các cuộc tấn công leo thang đặc quyền. Thay vì tắt nó đi, hãy dạy nó cách tin tưởng Gitea.

Cài đặt công cụ quản lý và gán nhãn (label) cho các file của Gitea:

sudo dnf install policycoreutils-python-utils -y

# Gán context đúng cho binary và dữ liệu
sudo semanage fcontext -a -t bin_t "/usr/local/bin/gitea"
sudo semanage fcontext -a -t var_lib_t "/var/lib/gitea(/.*)?"
sudo semanage fcontext -a -t etc_t "/etc/gitea(/.*)?"
sudo restorecon -Rv /usr/local/bin/gitea /var/lib/gitea /etc/gitea

Bước 5: Thiết lập Systemd Service

Để Gitea tự chạy mỗi khi reboot, hãy tạo một file service đơn giản tại /etc/systemd/system/gitea.service:

[Unit]
Description=Gitea
After=network.target mariadb.service

[Service]
RestartSec=2s
Type=simple
User=git
Group=git
WorkingDirectory=/var/lib/gitea/
ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini
Restart=always
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/gitea

[Install]
WantedBy=multi-user.target

Kích hoạt bằng hai lệnh quen thuộc:

sudo systemctl daemon-reload
sudo systemctl enable --now gitea

Bước 6: Hoàn tất qua Web UI

Truy cập http://IP_CUA_BAN:3000. Điền các thông tin database đã tạo ở Bước 1. Một lưu ý nhỏ: Ở mục Server Domain, hãy điền đúng IP hoặc Domain bạn định dùng để các link clone SSH/HTTP không bị lỗi.

Quan trọng: Hãy tạo tài khoản Admin ngay tại trang này. Nếu bạn bỏ qua, người đầu tiên đăng ký tài khoản trên web sẽ nghiễm nhiên chiếm quyền Admin cao nhất.

Nâng cao: Chạy qua Nginx và SSL

Để chuyên nghiệp hơn, bạn nên dùng Nginx làm Reverse Proxy và cài SSL từ Let’s Encrypt. Khi đó, Gitea sẽ chạy qua port 443 tiêu chuẩn thay vì port 3000 lẻ loi.

server {
    listen 80;
    server_name git.domain_cua_ban.com;

    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Kinh nghiệm thực chiến

  • Backup: Gitea có lệnh gitea dump. Hãy tạo một cronjob chạy lệnh này mỗi đêm lúc 2h sáng. Một file zip duy nhất sẽ chứa tất cả: code, db, và cấu hình.
  • Update: Khi có bản mới, bạn chỉ cần tải binary mới đè lên file cũ ở /usr/local/bin/gitea rồi restart service. Mọi thứ diễn ra trong chưa đầy 30 giây.
  • Lỗi SSH: Nếu push code bị từ chối dù đã add SSH key, 99% là do SELinux chưa cho phép ghi vào thư mục .ssh. Hãy dùng restorecon -Rv /home/git/.ssh để xử lý.

Tự host Gitea không chỉ giúp bạn tiết kiệm tiền mà còn là cách tuyệt vời để hiểu sâu về hệ thống Linux. Nếu trong quá trình cài đặt có bước nào làm khó bạn, đừng ngần ngại quăng lỗi vào phần comment bên dưới nhé!

Share: