Self-hosting Forgejo

  • 5 minute de citit
  • 10 exemple de cod în Shell

Disponibil și în English

Pe această pagină

Salut tuturor!

Scriu acest articol ca să îți arăt rapid cum să self-hostezi Forgejo, forge-ul de Git, și cum să faci operațiunile obișnuite de întreținere.

Introducere

Forgejo este un forge de Git ușor, privat și ușor de operat. Îl poți privi ca pe propria ta instanță GitHub private, unde controlezi 100% din date.

Ca să self-hostezi Forgejo, singura dependență de care ai nevoie este Forgejo! Este un binar Golang independent care funcționează pur și simplu. Vine implicit cu SQLite și suportă și alte baze de date, precum MariaDB, MySQL și PostgreSQL.

Dacă ai mai puțin de 100 de utilizatori, cred că SQLite este suficient.

O problemă a Forgejo este lipsa interacțiunii între utilizatorii din instanțe diferite. Dacă tu găzduiești Forgejo, iar vecinul tău își găzduiește pe a lui, ca să îi placi repository-urile sau să îl urmărești, trebuie să îți creezi un cont pe instanța lui. Această problemă este rezolvată în prezent prin federare: 😱:

https://forgejo.org/2023-01-10-answering-forgejo-federation-questions/

În curând vei putea să federezi instanța ta cu alte instanțe, precum ale vecinilor, și asta îți va permite să vezi conturile, activitățile publice ale celorlalți și să interacționezi cu ei, toate din propria ta instanță.

Protocolul de federare se numește ForgeFed și este descris aici: https://forgefed.org/.

Self Hosting

Am creat un Ansible Playbook ca să automatizez procesul de self-hosting. Îl poți descărca de pe forge-ul meu:

Playbook-ul funcționează doar pe distribuții bazate pe RHEL, precum: Fedora, RockyLinux, CentOS, AlmaLinux, OpenSuse Thumbleweed, OpenSuse Leap.

Ca să rulezi playbook-ul trebuie să ai Ansible instalat; fie îl instalezi cu make install, fie rulezi manual comenzile din Makefile.

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

Apoi actualizează inventory.ini cu adresa IP a serverului tău și cu utilizatorul sudo. Serverul pe care vei instala Forgejo. Ansible se va conecta la el prin SSH și va instala toate pachetele necesare.

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

Următorul pas: editează fișierul variables.yaml cu valorile tale:

# variables.yaml# Nu aș expune Forgejo direct la internet.# Dacă setup_firewall este true, vor fi deschise porturile în firewall-ul sistemului.setup_firewall: falseforgejo:  # Aceasta este adresa de bază a instanței tale.  base_url: forgejo.example.com    # Portul HTTP al instanței tale, folosit pentru UI, API și clonare prin HTTP.  http_port: 3000  # Portul SSH al instanței tale, folosit pentru clonare prin SSH.  ssh_port: 3001    # Imaginea containerului. La momentul scrierii acestui articol, versiunea 12 este cea mai recentă.  container_image: "codeberg.org/forgejo/forgejo:12"    # Directorul de bază în care vor fi stocate datele Forgejo, al meu este în rădăcina /forgejo.  base_directory: "/forgejo"

Odată ce fișierul este editat, poți executa make run sau ansible-playbook -i inventory.ini playbook.yaml --ask-become-pass.

Ansible îți va cere acum parola sudo a utilizatorului ansible_user, apoi va începe să descarce și să configureze dependențele necesare.

Forgejo va rula ca un container quadlet gestionat de Systemd.

Configurarea Nginx

Acum trebuie să îl expui la internet; îți recomand să configurezi un reverse proxy Nginx în fața lui.

Sistemul tău are probabil nginx instalat; tot ce trebuie să faci este să creezi un fișier în directorul sites-available cu conținutul de mai jos, apoi să îl legi în directorul sites-enabled. Te rog să nu uiți să actualizezi domeniul.

# 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; # Redirecționează cererile către localhost: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;    }    # Opțional: pagini de eroare personalizate    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;    } # managed by Certbot    listen 80;    server_name forge.nuculabs.dev;}

Apoi rulează certbot --nginx și selectează forge.nuculabs.dev ca domeniu, ca să generezi certificatele HTTPS.

Configurare

După instalarea cu succes, va trebui să actualizezi fișierul app.ini aflat în /forgejo/gitea/conf.

Aș configura câteva setări ale serverului, aș dezactiva înregistrarea utilizatorilor și setările de mail:

#api.iniAPP_NAME = NucuLabsRUN_MODE = prodAPP_SLOGAN = Programming, Cloud and Engineering!RUN_USER = gitWORK_PATH = /data/gitea[server]APP_DATA_PATH = /data/giteaDOMAIN = forge.nuculabs.devSSH_DOMAIN = forge.nuculabs.devROOT_URL = https://forge.nuculabs.dev/# ....[service]DISABLE_REGISTRATION = true# ...# ...[mailer]ENABLED = trueSMTP_ADDR = xxxSMTP_PORT = 587FROM = [email protected]USER = xxxPASSWD = xxx# ...

Poți lăsa celelalte valori implicite, iar dacă vrei să personalizezi mai mult, Configuration Cheat Sheet explică toate opțiunile de configurare disponibile:

Ca Forgejo să preia modificările fișierelor, este important să îl repornești cu systemctl restart forgejo.


Dacă plănuiești să adaugi o bază de date la Forgejo, manualul are instrucțiuni bune și clare despre cum să o pregătești:

Poți, de asemenea, să protejezi instanța Forgejo cu Anubis, ca să descurajezi botii să o acceseze și s-o indexeze. Am scris un articol despre asta aici:

Întreținere

Acestea sunt operațiunile obișnuite de întreținere pe care le fac pe serverul meu.

Actualizarea versiunilor

Actualizarea versiunilor este foarte simplă. Conectează-te prin SSH la serverul de găzduire și trage (pull) cea mai recentă imagine Forgejo: podman pull codeberg.org/forgejo/forgejo:12.

Editează fișierul systemd /etc/containers/systemd/forgejo.container și actualizează imaginea:

[Unit]Description=forgejo[Container]ContainerName=forgejoImage=codeberg.org/forgejo/forgejo:12#...

Reîncarcă systemd și repornește Forgejo:

sudo systemctl daemon-reloadsystemctl restart forgejo

Modificarea utilizatorilor prin CLI

Dacă ai deja un cont de administrator, poți crea utilizatori noi din interfața de administrare a site-ului. Dacă nu, sau dacă îți pierzi parola, îți poți modifica utilizatorul sau îi poți reseta parola cu ajutorul forgejo-cli.

Află numele sau ID-ul containerului instanței Forgejo.

podman ps48f58cc872f0  codeberg.org/forgejo/forgejo:12        /usr/bin/s6-svsca...  4 minutes ago  Up 4 minutes  0.0.0.0:3000->3000/tcp, forgejo

Deschide un shell în container: podman exec -it forgejo bin/bash și treci la utilizatorul git cu su git.

Execută forgejo admin --help ca să vezi comenzile disponibile:

# $ forgejo admin --helpNAME:   forgejo admin - Perform common administrative operationsUSAGE:   forgejo admin [command [command options]] COMMANDS:   user                Modify users   repo-sync-releases  Synchronize repository releases with tags   regenerate          Regenerate specific files   auth                Modify external auth providers   sendmail            Send a message to all users

Iar pentru comenzile legate de utilizatori:

# $ forgejo admin user --helpNAME:   forgejo admin user - Modify usersUSAGE:   forgejo admin user [command [command options]] COMMANDS:   create                 Create a new user in database   list                   List users   change-password        Change a user's password   delete                 Delete specific user by id, name or email   generate-access-token  Generate an access token for a specific user   must-change-password   Set the must change password flag for the provided users or all users   reset-mfa              Remove all two-factor authentication configurations for a user

Concluzie

Forgejo este ușor de self-hostat, are cerințe reduse de resurse, iar povara întreținerii este foarte mică. Posibilitatea de a alege stocarea SQLite este excelentă pentru instalări mici și medii și elimină nevoia de a instala și întreține o bază de date suplimentară.

Sper că ți-a plăcut acest articol! Mulțumesc că l-ai citit și ne vedem în următorul! 😄