0
0
Lập trình
Admin Team
Admin Teamtechmely

Hướng Dẫn Tự Host Forgejo với Ansible

Đăng vào 4 ngày trước

• 7 phút đọc

Giới Thiệu

Chào các bạn!

Trong bài viết này, tôi sẽ hướng dẫn các bạn cách tự host Forgejo, một phần mềm Git forge nhẹ nhàng và dễ sử dụng, và thực hiện các thao tác bảo trì thông thường.

Forgejo là một nền tảng Git riêng tư, nơi bạn có thể kiểm soát hoàn toàn dữ liệu của mình, tương tự như một phiên bản GitHub riêng. Để tự host Forgejo, bạn chỉ cần một phụ thuộc duy nhất là Forgejo! Đây là một tệp nhị phân Golang tự chứa và dễ dàng hoạt động. Nó đi kèm với SQLite mặc định và hỗ trợ các cơ sở dữ liệu khác như MariaDB, MySQL và PostgreSQL.

Nếu bạn có dưới 100 người dùng, SQLite là đủ.

Một vấn đề với Forgejo là thiếu sự tương tác giữa người dùng từ các phiên bản khác nhau. Nếu bạn host Forgejo và hàng xóm của bạn cũng vậy, để thích các kho lưu trữ của họ hoặc theo dõi họ, bạn cần tạo một tài khoản trên phiên bản của họ. Vấn đề này hiện đang được giải quyết bằng cách liên kết (federation): 😱: Liên kết đến bài viết

Sớm thôi, bạn sẽ có thể liên kết phiên bản của mình với các phiên bản khác như của hàng xóm, cho phép bạn xem tài khoản, hoạt động công khai và tương tác với nhau, tất cả từ phiên bản của bạn.

Giao thức liên kết được gọi là ForgeFed và được mô tả tại đây: Liên kết đến ForgeFed.

Tự Host

Tôi đã tạo một Ansible Playbook để tự động hóa quá trình tự host. Bạn có thể tải xuống từ kho của tôi:

Playbook chỉ hoạt động trên các bản phân phối dựa trên RHEL, như: Fedora, RockyLinux, CentOS, AlmaLinux, OpenSuse Thumbleweed, OpenSuse Leap.

Để chạy playbook, bạn cần cài đặt Ansible, có thể cài đặt bằng make install hoặc chạy các lệnh từ Makefile thủ công.

bash Copy
install:
    sudo dnf install ansible
    ansible-galaxy collection install community.general
    ansible-galaxy collection install containers.podman
    ansible-galaxy collection install ansible.posix

Sau đó, cập nhật tệp inventory.ini với địa chỉ IP của máy chủ và người dùng sudo của bạn. Máy chủ mà bạn sẽ cài đặt Forgejo. Ansible sẽ kết nối với nó qua SSH và cài đặt tất cả các gói cần thiết.

ini Copy
# inventory.ini
[nuculabs]
host.example.com ansible_user=ansible

[local]
localhost

Tiếp theo, vui lòng chỉnh sửa tệp variables.yaml với các giá trị bạn cần:

yaml Copy
# variables.yaml

# Tôi sẽ không công khai Forgejo trực tiếp lên internet.
# Nếu setup_firewall là true, nó sẽ mở các cổng trên tường lửa của hệ thống.
setup_firewall: false
forgejo:
  # Đây là URL cơ bản của phiên bản của bạn.
  base_url: forgejo.example.com

  # Cổng HTTP của phiên bản, được sử dụng cho UI, API và sao chép qua http.
  http_port: 3000
  # Cổng SSH của phiên bản, được sử dụng cho sao chép qua SSH.
  ssh_port: 3001

  # Hình ảnh container. Tính đến thời điểm bài viết này, phiên bản 12 là phiên bản mới nhất.
  container_image: "codeberg.org/forgejo/forgejo:12"

  # Thư mục cơ sở nơi dữ liệu của Forgejo sẽ được lưu trữ, của tôi nằm ở /forgejo.
  base_directory: "/forgejo"

Khi tệp đó đã được chỉnh sửa, bạn có thể thực hiện make run hoặc ansible-playbook -i inventory.ini playbook.yaml --ask-become-pass.

Ansible bây giờ sẽ yêu cầu bạn nhập mật khẩu sudo của người dùng ansible, và sau đó nó sẽ bắt đầu tải xuống và thiết lập các phụ thuộc cần thiết.

Forgejo sẽ hoạt động như một container quadlet được quản lý bởi Systemd.

Thiết lập Nginx

Bạn sẽ cần công khai nó lên internet, tôi khuyên bạn nên thiết lập một Nginx reverse proxy ở phía trước nó.

Hệ thống của bạn có thể đã cài đặt nginx, tất cả những gì bạn cần làm là tạo một tệp trong thư mục sites-available với nội dung sau và liên kết nó đến thư mục sites-enabled. Hãy nhớ cập nhật tên miền.

nginx Copy
# cat /etc/nginx/sites-available/forge
# sudo ln -s /etc/nginx/sites-available/forge/etc/nginx/sites-enabled/
server {
    server_name forge.nuculabs.dev;
    client_max_body_size 30M;

    location / {
        proxy_pass http://localhost:3000; # Chuyển tiếp yêu cầu đến localhost:4000
        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;
    }

    # Tùy chọn: Các trang lỗi tùy chỉnh
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }

}
server {
    if ($host = forge.nuculabs.dev) {
        return 301 https://$host$request_uri;
    } # được quản lý bởi Certbot

    listen 80;
    server_name forge.nuculabs.dev;
}

Sau đó chạy certbot --nginx, chọn forge.nuculabs.dev làm tên miền để tạo chứng chỉ HTTPS.

Cấu Hình

Sau khi cài đặt thành công, bạn sẽ cần cập nhật tệp app.ini nằm trong /forgejo/gitea/conf.

Tôi đã thiết lập một số cài đặt máy chủ, vô hiệu hóa đăng ký người dùng và cài đặt email:

ini Copy
#api.ini
APP_NAME = NucuLabs
RUN_MODE = prod
APP_SLOGAN = Lập trình, Đám mây và Kỹ thuật!
RUN_USER = git
WORK_PATH = /data/gitea


[server]
APP_DATA_PATH = /data/gitea
DOMAIN = forge.nuculabs.dev
SSH_DOMAIN = forge.nuculabs.dev
ROOT_URL = https://forge.nuculabs.dev/
# ....

[service]
DISABLE_REGISTRATION = true
# ...

# ...
[mailer]
ENABLED = true
SMTP_ADDR = xxx
SMTP_PORT = 587
FROM = no-reply@nuculabs.dev
USER = xxx
PASSWD = xxx

# ...

Bạn có thể để các giá trị khác ở mặc định và nếu bạn muốn tùy chỉnh nhiều hơn, Cẩm nang cấu hình giải thích tất cả các tùy chọn cấu hình có sẵn.

Để Forgejo nhận các thay đổi tệp quan trọng là phải khởi động lại nó bằng systemctl restart forgejo.


Nếu bạn dự định thêm cơ sở dữ liệu vào Forgejo, tài liệu có hướng dẫn rõ ràng về cách chuẩn bị cho nó:

Bạn cũng có thể bảo vệ phiên bản Forgejo của mình bằng Anubis, nhằm ngăn chặn bot truy cập và lập chỉ mục nó. Tôi đã viết một bài về vấn đề này ở đây:

Bảo Trì

Dưới đây là các thao tác bảo trì thường xuyên mà tôi thực hiện trên máy chủ của mình.

Nâng Cấp Phiên Bản

Việc nâng cấp phiên bản rất đơn giản. SSH vào máy chủ lưu trữ và kéo hình ảnh Forgejo mới nhất podman pull codeberg.org/forgejo/forgejo:12.

Chỉnh sửa tệp systemd /etc/containers/systemd/forgejo.container và cập nhật hình ảnh:

ini Copy
[Unit]
Description=forgejo

[Container]
ContainerName=forgejo
Image=codeberg.org/forgejo/forgejo:12
#...

Tải lại systemd và khởi động lại Forgejo:

bash Copy
sudo systemctl daemon-reload
systemctl restart forgejo

Chỉnh sửa người dùng qua CLI

Nếu bạn đã có tài khoản quản trị viên, bạn có thể tạo người dùng mới thông qua giao diện quản trị trang web. Nếu không hoặc nếu bạn mất mật khẩu, bạn có thể thay đổi người dùng của mình hoặc đặt lại mật khẩu với sự trợ giúp của forgejo-cli.

Lấy tên hoặc ID của container Forgejo.

bash Copy
podman ps

48f58cc872f0  codeberg.org/forgejo/forgejo:12        /usr/bin/s6-svsca...  4 phút trước  Đang chạy  0.0.0.0:3000->3000/tcp, forgejo

Lấy shell trong container: podman exec -it forgejo bin/bash và chuyển sang người dùng git bằng su git.

Thực hiện forgejo admin --help để xem các lệnh có sẵn:

bash Copy
# $ forgejo admin --help
NAME:
   forgejo admin - Thực hiện các thao tác quản trị chung

USAGE:
   forgejo admin [command [command options]] 

COMMANDS:
   user                Chỉnh sửa người dùng
   repo-sync-releases  Đồng bộ hóa các bản phát hành kho lưu trữ với các thẻ
   regenerate          Tạo lại các tệp cụ thể
   auth                Chỉnh sửa các nhà cung cấp xác thực bên ngoài
   sendmail            Gửi một thông điệp đến tất cả người dùng

Và đối với các lệnh người dùng:

bash Copy
# $ forgejo admin user --help
NAME:
   forgejo admin user - Chỉnh sửa người dùng

USAGE:
   forgejo admin user [command [command options]] 

COMMANDS:
   create                 Tạo một người dùng mới trong cơ sở dữ liệu
   list                   Liệt kê người dùng
   change-password        Thay đổi mật khẩu của người dùng
   delete                 Xóa người dùng cụ thể theo id, tên hoặc email
   generate-access-token  Tạo mã truy cập cho một người dùng cụ thể
   must-change-password   Đặt cờ cần thay đổi mật khẩu cho người dùng đã cung cấp hoặc tất cả người dùng
   reset-mfa              Xóa tất cả các cấu hình xác thực hai yếu tố cho một người dùng

Kết Luận

Forgejo rất dễ dàng để tự host, yêu cầu tài nguyên thấp và gánh nặng bảo trì rất thấp. Việc lựa chọn lưu trữ SQLite là tuyệt vời cho các triển khai nhỏ đến trung bình và loại bỏ nhu cầu triển khai và duy trì một cơ sở dữ liệu bổ sung.

Hy vọng rằng bạn đã thích bài viết này! Cảm ơn bạn đã đọc và hẹn gặp lại trong bài viết tiếp theo! 😄

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào