Forgejo trên Docker: Cách gọn nhẹ để tự host Git Server riêng

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

Làm chủ hạ tầng của bạn

Việc phụ thuộc mọi side project vào các nền tảng Big Tech ban đầu có vẻ tiện lợi cho đến khi rắc rối xảy ra. Các điều khoản dịch vụ thay đổi, sự cố gián đoạn, và cuối cùng, bạn nhận ra mình không thực sự làm chủ quy trình làm việc của mình. Nếu đang vận hành một HomeLab, có lẽ bạn muốn một Git Server chạy trên phần cứng của mình mà không ngốn tới 4GB RAM chỉ để ở trạng thái nghỉ. GitHub và GitLab rất tuyệt vời, nhưng chúng quá dư thừa đối với nhiều hệ thống tự host (self-hosted).

Tôi đã đạt đến giới hạn khi một instance GitLab bắt đầu làm nghẽn VPS của mình. Tôi cần một công cụ mang lại trải nghiệm như GitHub nhưng hoạt động hiệu quả như một binary gốc. Đó chính là lúc Forgejo tỏa sáng. Đây là một bản fork từ cộng đồng của Gitea, được tạo ra vào cuối năm 2022 để đảm bảo dự án luôn thực sự là mã nguồn mở. Qua thử nghiệm, Forgejo xử lý hàng chục repository trong khi tiêu thụ chưa đến 500MB RAM, cực kỳ phù hợp cho phần cứng có cấu hình khiêm tốn.

Tại sao chọn Forgejo thay vì Gitea hay GitLab?

Bạn có thể thắc mắc tại sao chúng ta lại chọn Forgejo thay vì Gitea. Sau khi Gitea chuyển sang mô hình thương mại, cộng đồng đã ra mắt Forgejo để ưu tiên người dùng hơn là lợi ích doanh nghiệp. Nó duy trì khả năng tương thích 100% với Gitea nhưng tập trung vào sứ mệnh “Phần mềm Tự do” (Free Software).

So với GitLab, Forgejo là một “nhà vô địch” về sự gọn nhẹ. Trong khi GitLab là một cỗ máy mạnh mẽ đòi hỏi nhiều CPU và bộ nhớ, Forgejo cung cấp những tính năng thiết yếu—theo dõi issue (issue tracking), pull request, wiki và CI/CD cơ bản (Actions)—với chi phí tài nguyên cực thấp. Nó chạy mượt mà trên Raspberry Pi 4 hoặc một cloud instance cơ bản giá 5$ mỗi tháng.

Chuẩn bị môi trường

Trước khi bắt đầu với terminal, hãy đảm bảo bạn đã cài đặt sẵn Docker và Docker Compose. Chúng ta sẽ sử dụng PostgreSQL thay vì SQLite mặc định. Mặc dù SQLite vẫn ổn cho nhu cầu cá nhân, PostgreSQL xử lý các kết nối đồng thời tốt hơn nhiều khi số lượng repository của bạn tăng lên. Nó cũng giúp chiến lược sao lưu của bạn trở nên chuyên nghiệp hơn.

Bắt đầu bằng cách tạo một thư mục có cấu trúc để giữ cấu hình và dữ liệu tập trung một chỗ:

mkdir -p ~/homelab/forgejo
cd ~/homelab/forgejo
mkdir data db

Cấu hình Docker Compose

Chúng ta sẽ định nghĩa hai dịch vụ: ứng dụng Forgejo và cơ sở dữ liệu PostgreSQL 15. Việc tách biệt này là một quy chuẩn DevOps tiêu chuẩn. Nó đảm bảo dữ liệu của bạn nằm trong một môi trường được quản lý, giúp việc cập nhật và di chuyển dữ liệu an toàn hơn đáng kể.

Tạo file docker-compose.yml của bạn:

services:
  server:
    image: code.forgejo.org/forgejo/forgejo:latest
    container_name: forgejo
    restart: always
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - FORGEJO__database__DB_TYPE=postgres
      - FORGEJO__database__HOST=db:5432
      - FORGEJO__database__NAME=forgejo
      - FORGEJO__database__USER=forgejo
      - FORGEJO__database__PASSWD=mat_khau_bao_mat_cua_ban
    networks:
      - forgejo
    volumes:
      - ./data:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3000:3000"
      - "2222:22"
    depends_on:
      - db

  db:
    image: postgres:15-alpine
    restart: always
    environment:
      - POSTGRES_USER=forgejo
      - POSTGRES_PASSWORD=mat_khau_bao_mat_cua_ban
      - POSTGRES_DB=forgejo
    networks:
      - forgejo
    volumes:
      - ./db:/var/lib/postgresql/data

networks:
  forgejo:
    external: false

Các lưu ý quan trọng về cấu hình

  • USER_UID/GID: Set các giá trị này khớp với user Linux của bạn (thường là 1000) để tránh lỗi phân quyền khi Forgejo ghi dữ liệu vào thư mục ./data.
  • SSH Mapping: Chúng ta map port 2222 ra port 22 of container. Điều này giúp tránh xung đột với dịch vụ SSH chính trên máy host của bạn.
  • Database: Phiên bản image alpine giúp tổng dung lượng ổ đĩa sử dụng dưới mức 300MB.

Khởi chạy Server

Việc khởi chạy server chỉ mất một câu lệnh duy nhất. Chạy lệnh sau và đợi các container khởi tạo:

docker compose up -d

Sau khi lệnh hoàn tất, hãy theo dõi log để đảm bảo kết nối cơ sở dữ liệu ổn định:

docker compose logs -f

Bây giờ, hãy mở trình duyệt và truy cập http://[ip-server-cua-ban]:3000. Bạn sẽ thấy màn hình thiết lập. Vì chúng ta đã định nghĩa thông tin đăng nhập database trong biến môi trường, Forgejo sẽ tự động điền hầu hết các trường kỹ thuật cho bạn.

Các bước đầu tiên “Bắt buộc phải sửa”

Đừng chỉ click qua loa bước cài đặt. Một vài tinh chỉnh nhỏ lúc này sẽ giúp bạn tiết kiệm hàng giờ fix lỗi sau này:

  1. SSH Port: Thay đổi cổng SSH server trong giao diện (UI) thành 2222. Điều này đảm bảo các URL clone khớp với cấu hình Docker của chúng ta.
  2. Root URL: Sử dụng domain thực tế hoặc IP nội bộ của bạn (ví dụ: http://git.home.arpa:3000). Nếu bạn để mặc định là localhost, các link clone sẽ không hoạt động từ các máy tính khác.
  3. Admin User: Thiết lập tài khoản chính của bạn tại đây. Trong Forgejo, người dùng đầu tiên được tạo sẽ được cấp toàn bộ quyền quản trị.

Cấu hình SSH để Commit nhanh hơn

Việc đẩy code qua HTTPS sẽ sớm trở nên phiền phức. SSH nhanh hơn và bảo mật hơn. Vì Forgejo đang lắng nghe trên cổng 2222, bạn nên chỉ cho Git client nội bộ cách tìm thấy nó. Cập nhật file ~/.ssh/config của bạn:

Host forgejo
    HostName 192.168.1.100
    User git
    Port 2222
    IdentityFile ~/.ssh/id_rsa

Với cấu hình này, bạn có thể clone bằng lệnh git clone forgejo:username/project.git. Nó loại bỏ nhu cầu nhập mật khẩu và khiến quy trình làm việc giống hệt như trên GitHub.

Sao lưu và Bảo trì

Việc sao lưu server rất đơn giản vì chúng ta đã sử dụng Docker volume. Chỉ cần dừng các container và nén thư mục forgejo lại. Tôi khuyên bạn nên thiết lập một cron job hàng đêm để rsync các thư mục này sang ổ cứng ngoài hoặc NAS.

Cập nhật cũng dễ dàng không kém. Chỉ cần pull image mới và khởi động lại các container:

docker compose pull
docker compose up -d

Forgejo tự động quản lý việc di chuyển dữ liệu (migration). Tôi đã trải qua ba lần cập nhật phiên bản lớn mà không gặp bất kỳ lỗi database nào. Nó cực kỳ ổn định.

Lời kết

Xây dựng server Forgejo riêng là một trong những dự án HomeLab thiết thực nhất mà bạn có thể thực hiện. Bạn có toàn quyền kiểm soát mã nguồn của mình, một giao diện cộng tác quen thuộc và một hệ thống tôn trọng tài nguyên phần cứng. Dù bạn lưu trữ các script cá nhân hay các dự án phát triển phức tạp, việc sở hữu Git Server riêng là một thắng lợi lớn cho quyền tự chủ kỹ thuật số.

Hãy thử dùng trong một tuần. Tốc độ của một Git Server nội bộ và sự yên tâm khi dữ liệu được lưu trữ cục bộ là những thứ khó lòng từ bỏ một khi bạn đã trải nghiệm chúng.

Share: