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
2222ra 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
alpinegiú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:
- 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. - 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. - 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.

