So installierst du die Gitea DevOps-Plattform mit Docker unter Debian 12

Gitea ist eine Open-Source-Code-Hosting-Lösung, die auf der Git-Plattform basiert. Sie ist in der Sprache Go geschrieben und kann auf mehreren Betriebssystemen installiert werden, darunter Linux, macOS, Windows und Architekturen wie amd64, i386, ARM und andere. Es enthält einen Editor für Repository-Dateien, Issue Tracking, Pull Requests, Benutzerverwaltung, Benachrichtigungen, ein integriertes Wiki, LFS Support, Git Hooks und vieles mehr.

Es ist eine leichtgewichtige Anwendung. Daher kann sie auch auf Systemen mit geringerer Leistung installiert werden. Wenn du auf der Suche nach einer selbst gehosteten Git-Plattform mit weniger Speicherplatz bist, solltest du dir Gitea ansehen.

Dieser Artikel behandelt die Installation und Konfiguration von Gitea auf einem Debian 12-Server und die Einrichtung deines ersten Git-Repositorys. Gitea kann aus dem Quellcode, als Binärdatei, als Docker-Paket oder als Paket installiert werden. Für unser Tutorial werden wir es mit Docker installieren.

Voraussetzungen

  • Ein Server, auf dem Debian 12 läuft.
  • Ein Nicht-Root-Benutzer mit sudo-Rechten.
  • Ein Fully Qualified Domain Name (FQDN) wie gitea.example.com, der auf deinen Server zeigt.
  • Vergewissere dich, dass auf deinem Server Auslagerungsspeicher aktiviert ist, wenn du einen Server mit 1 GB RAM verwendest.
  • Stelle sicher, dass alles auf dem neuesten Stand ist.
    $ sudo apt update && sudo apt upgrade
    
  • Bevor wir fortfahren, benötigen wir ein paar wichtige Pakete. Einige davon werden bereits auf deinem Server installiert sein.
    $ sudo apt install curl wget nano software-properties-common dirmngr apt-transport-https ca-certificates lsb-release debian-archive-keyring gnupg2 ufw unzip -y
    

Schritt 1 – Firewall konfigurieren

Der erste Schritt besteht darin, die Firewall zu konfigurieren. Debian wird standardmäßig mit ufw (Uncomplicated Firewall) ausgeliefert.

Überprüfe, ob die Firewall aktiv ist.

$ sudo ufw status

Du wirst die folgende Ausgabe erhalten.

Status: inactive

Erlaube den SSH-Port, damit die Firewall die aktuelle Verbindung nicht unterbricht, wenn du sie aktivierst.

$ sudo ufw allow OpenSSH

Lasse auch HTTP- und HTTPS-Ports zu.

$ sudo ufw allow http
$ sudo ufw allow https

Aktiviere die Firewall

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

Überprüfe den Status der Firewall erneut.

$ sudo ufw status

Du solltest eine ähnliche Ausgabe sehen.

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

Schritt 2 – Installiere Docker und Docker Compose

Debian 12 wird mit einer älteren Version von Docker ausgeliefert. Um die neueste Version zu installieren, importiere zunächst den Docker GPG-Schlüssel.

$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg

Erstelle eine Docker-Repository-Datei.

$ echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Aktualisiere die Liste der System-Repositorys.

$ sudo apt update

Installiere die neueste Version von Docker.

$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Überprüfe, ob sie läuft.

$ sudo systemctl status docker
? docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; preset: enabled)
     Active: active (running) since Sat 2023-11-18 07:13:39 UTC; 10s ago
TriggeredBy: ? docker.socket
       Docs: https://docs.docker.com
   Main PID: 1891 (dockerd)
      Tasks: 8
     Memory: 27.2M
        CPU: 338ms
     CGroup: /system.slice/docker.service
             ??1891 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Standardmäßig benötigt Docker Root-Rechte. Wenn du vermeiden willst, dass du jedes Mal sudo verwendest, wenn du den Befehl docker ausführst, füge deinen Benutzernamen der Gruppe docker hinzu.

$ sudo usermod -aG docker $(whoami)

Um diese Änderung zu aktivieren, musst du dich vom Server abmelden und als derselbe Benutzer wieder anmelden oder den folgenden Befehl verwenden.

$ su - ${USER}

Bestätige, dass dein Benutzer der Docker-Gruppe hinzugefügt wurde.

$ groups
navjot sudo users docker

Schritt 3 – Einen Git-Benutzer erstellen

Damit die Benutzer über SSH auf den Host zugreifen können, musst du einen separaten git Benutzer auf dem Host erstellen. Führe den folgenden Befehl aus, um den Benutzer git zu erstellen.

$ sudo adduser --system --shell /bin/bash --gecos 'Git Version Control' --group --disabled-password --home /home/git git

Zum besseren Verständnis gehen wir alle Optionen und Flags des obigen Befehls durch.

  • --system – erstellt einen Systembenutzer anstelle eines normalen Benutzers. Systembenutzer sind für die Ausführung von Systemdiensten vorgesehen und können nicht für interaktive Anmeldungen verwendet werden.
  • --shell /bin/bash – setzt die Anmeldeshell für den Systembenutzer auf die Bash-Shell.
  • --gecos 'Git Version Control' – legt ein Beschreibungsfeld für den Benutzer fest. Es ist optional und kann übersprungen werden, ist aber nützlich, wenn dein System viele Benutzer hat.
  • --group – erstellt eine Gruppe mit demselben Namen wie der Benutzer.
  • --disabled-password – deaktiviert die passwortbasierte Anmeldung für den Benutzer, was zur Sicherheit des Kontos beiträgt.
  • --home /home/git – setzt das Heimatverzeichnis des Benutzers auf /home/git, in dem die Dateien und die Konfiguration des Benutzers gespeichert werden.
  • git – gibt den Benutzernamen an. Hier verwenden wir git als Benutzernamen für das Konto.

Wenn du den Befehl ausführst, erhältst du die folgende Ausgabe.

Adding system user `git' (UID 105) ...
Adding new group `git' (GID 111) ...
Adding new user `git' (UID 105) with group `git' ...
Creating home directory `/home/git' ...

Beachte die Werte der Variablen UID und GID, die wir im nächsten Schritt benötigen. In unserem Fall ist die UID 105 und die GID 111.

Schritt 4 – Gitea konfigurieren und installieren

Systemzeitzone konfigurieren

Du kannst die aktuelle Zeitzone deines Systems mit dem folgenden Befehl überprüfen.

$ timedatectl
               Local time: Sat 2023-11-18 07:15:53 UTC
           Universal time: Sat 2023-11-18 07:15:53 UTC
                 RTC time: Sat 2023-11-18 07:15:53
                Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

Du kannst sehen, dass das System auf die Zeitzone GMT oder UTC eingestellt ist. Wenn du in einem Gebiet mit einer anderen Zeitzone lebst oder sie ändern möchtest, kannst du das mit dem folgenden Befehl tun.

$ sudo timedatectl set-timezone Asia/Kolkata

Überprüfe die Zeitzone erneut.

$ timedatectl
               Local time: Sat 2023-11-18 12:46:29 IST
           Universal time: Sat 2023-11-18 07:16:29 UTC
                 RTC time: Sat 2023-11-18 07:16:29
                Time zone: Asia/Kolkata (IST, +0530)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

Du kannst sehen, dass die Zeitzone auf IST aktualisiert wurde, was GMT+5:30 entspricht.

Gitea-Verzeichnisse erstellen

Erstelle das Verzeichnis für Gitea.

$ mkdir ~/gitea-docker

Wechsle in das Gitea-Verzeichnis.

$ cd ~/gitea-docker

Erstelle Verzeichnisse für die Speicherung von Gitea-Daten und PostgreSQL-Datenbanken.

$ mkdir {gitea,postgres}

Konfiguriere die Gitea Docker Compose Datei

Erstelle und öffne die Docker Compose Datei zur Bearbeitung.

$ nano docker-compose.yml

Füge den folgenden Code in die Datei ein. Füge die zuvor erstellten UID- und GID-Werte ein.

services:
  server:
    image: gitea/gitea:1.21.0
    container_name: gitea
    environment:
      - USER_UID=105
      - USER_GID=111
      - GITEA__database__DB_TYPE=postgres
      - GITEA__database__HOST=db:5432
      - GITEA__database__NAME=gitea
      - GITEA__database__USER=gitea
      - GITEA__database__PASSWD=gitea
    restart: always
    networks:
      - gitea
    volumes:
      - ./gitea:/data
      - /home/git/.ssh/:/data/git/.ssh
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3000:3000"
      - "2221:22"
    depends_on:
      - db

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

networks:
  gitea:
    external: false

Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst.

Wir verwenden die UID- (User Identifier) und GID- (Group Identifier) Werte für den Benutzer, den wir im vorherigen Schritt erstellt haben.

Die obige Docker Compose-Datei stellt zwei Container bereit – einen für Gitea und einen für PostgreSQL. Wir haben ein paar Umgebungsvariablen hinzugefügt, um die Details der Datenbank zu konfigurieren. Um die PostgreSQL-Datenbank mit dem Gitea-Container zu verbinden, haben wir den Host als Namen des PostgreSQL-Dienstes in der Datei angegeben.

Die Port-Parameter "3000:3000" und "2221:22" geben die Port-Zuordnung an, wobei der linke Port den Host-Port und der rechte Port den Container-Port bezeichnet. Gitea verwendet den Port 3000 für seinen Webservice, den wir auch dem Server zur Verfügung gestellt haben. Für SSH verwendet unser System bereits Port 22 für die Protokollierung. Deshalb geben wir einen eigenen Port an, um SSH-Operationen durchzuführen. In unserem Fall verwenden wir Port 2221. Dieser Port muss ebenfalls über deine Firewall geöffnet werden, was wir bereits in Schritt 1 dieses Lernprogramms getan haben.

Sowohl Gitea als auch die PostgreSQL-Container sind über ein gemeinsames internes Docker-Netzwerk namens gitea verbunden. Wenn du deine Docker-Installation startest, werden automatisch die Verzeichnisse gitea und postgres im aktuellen Ordner angelegt. Die in der Compose-Datei angegebene Benutzer-ID ist diejenige, die der Gitea-Container verwendet, um das Verzeichnis gitea zu erstellen. Der PostgreSQL-Container hingegen wird vom Benutzer systemd-coredump verwaltet, was die Standardeinstellung ist. Du kannst dieses Verhalten ändern, aber es ist nicht notwendig.

Anpassen deiner Gitea-Installation

Du kannst deine Gitea-Installation anpassen, indem du eine app.ini-Datei in das Verzeichnis ~/gitea-docker/gitea/gitea/conf einfügst. Nach der Installation kann diese Datei innerhalb des Containers unter /data/gitea/conf/app.ini bearbeitet werden. Du kannst die Beispiel-ini-Datei aus dem Github-Repository von Gitea als Referenz verwenden.

Gitea installieren

Führe den folgenden Befehl aus, um die Gitea-Container zu starten.

$ docker compose up -d

Überprüfe den Status der Container, um sicherzustellen, dass sie ordnungsgemäß laufen.

$ docker ps
CONTAINER ID   IMAGE                COMMAND                  CREATED          STATUS          PORTS                                                                              NAMES
3b5ce50a04fe   gitea/gitea:1.21.0   "/usr/bin/entrypoint…"   43 seconds ago   Up 42 seconds   0.0.0.0:3000->3000/tcp, :::3000->3000/tcp, 0.0.0.0:2221->22/tcp, :::2221->22/tcp   gitea
0908cb9ec3b7   postgres:15          "docker-entrypoint.s…"   43 seconds ago   Up 42 seconds   5432/tcp                                                                           gitea-docker-db-1

Du kannst auch den folgenden Befehl verwenden, um den Status zu überprüfen.

$ docker compose ps
NAME                IMAGE                COMMAND                                        SERVICE   CREATED              STATUS              PORTS
gitea               gitea/gitea:1.21.0   "/usr/bin/entrypoint /bin/s6-svscan /etc/s6"   server    About a minute ago   Up About a minute   0.0.0.0:3000->3000/tcp, :::3000->3000/tcp, 0.0.0.0:2221->22/tcp, :::2221->22/tcp
gitea-docker-db-1   postgres:15          "docker-entrypoint.sh postgres"                db        About a minute ago   Up About a minute   5432/tcp

Schritt 5 – Nginx installieren

Debian 12 wird mit einer älteren Version von Nginx ausgeliefert. Um die neueste Version zu installieren, musst du das offizielle Nginx-Repository herunterladen.

Importiere den Signierschlüssel von Nginx.

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
    | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Füge das Repository für die stabile Version von Nginx hinzu.

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/debian `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

Aktualisiere die System-Repositories.

$ sudo apt update

Installiere Nginx.

$ sudo apt install nginx

Überprüfe die Installation. Auf Debian-Systemen funktioniert der folgende Befehl nur mit sudo.

$ sudo nginx -v
nginx version: nginx/1.24.0

Starten Sie den Nginx-Server.

$ sudo systemctl start nginx

Überprüfe den Status des Dienstes.

$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enabled)
     Active: active (running) since Sat 2023-11-18 15:47:20 IST; 1s ago
       Docs: https://nginx.org/en/docs/
    Process: 4225 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
   Main PID: 4226 (nginx)
      Tasks: 2 (limit: 2315)
     Memory: 1.8M
        CPU: 7ms
     CGroup: /system.slice/nginx.service
             ??4226 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
             ??4227 "nginx: worker process"

Öffne die IP-Adresse deines Servers in deinem Webbrowser. Du solltest die folgende Seite sehen, d.h. dein Server ist in Betrieb.

Nginx Standardseite

Schritt 6 – SSL installieren

Wir müssen Certbot installieren, um das SSL-Zertifikat zu erstellen. Du kannst Certbot entweder über das Repository von Debian installieren oder die neueste Version mit dem Snapd-Tool herunterladen. Wir werden die Snapd-Version verwenden.

Bei Debian 12 ist Snapd noch nicht installiert. Installiere das Snapd-Paket.

$ sudo apt install snapd

Führe die folgenden Befehle aus, um sicherzustellen, dass deine Version von Snapd auf dem neuesten Stand ist.

$ sudo snap install core && sudo snap refresh core

Installiere Certbot.

$ sudo snap install --classic certbot

Verwende den folgenden Befehl, um sicherzustellen, dass der Certbot-Befehl ausgeführt werden kann, indem du einen symbolischen Link zum Verzeichnis /usr/bin erstellst.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Überprüfe, ob Certbot korrekt funktioniert.

$ certbot --version
certbot 2.7.4

Erstelle das SSL-Zertifikat.

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m name@example.com -d gitea.example.com

Mit dem obigen Befehl wird ein Zertifikat in das Verzeichnis /etc/letsencrypt/live/gitea.example.com auf deinem Server heruntergeladen.

Erstelle ein Diffie-Hellman-Gruppenzertifikat.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Überprüfe den Certbot-Erneuerungszeitplanungsdienst.

$ sudo systemctl list-timers

Du findest snap.certbot.renew.service als einen der Dienste, die für die Ausführung vorgesehen sind.

NEXT                        LEFT           LAST                        PASSED      UNIT                      ACTIVATES     
---------------------------------------------------------------------------------------------------------------------------               
Sat 2023-11-18 18:41:45 IST 2h 49min left Sat 2023-11-18 12:22:34 IST 3h 29min ago apt-daily.timer           apt-daily.service
Sat 2023-11-18 20:40:00 IST 4h 47min left -                           -            snap.certbot.renew.timer  snap.certbot.renew.service
Sun 2023-11-19 00:00:00 IST 8h left       -                           -            dpkg-db-backup.timer      dpkg-db-backup.service

Führe einen Probelauf des Prozesses durch, um zu prüfen, ob die SSL-Erneuerung einwandfrei funktioniert.

$ sudo certbot renew --dry-run

Wenn du keine Fehler siehst, bist du bereit. Dein Zertifikat wird automatisch erneuert.

Schritt 7 – Nginx konfigurieren

Führe den folgenden Befehl aus, um eine Konfigurationsdatei für deine Website hinzuzufügen.

$ sudo nano /etc/nginx/conf.d/gitea.conf

Füge den folgenden Code in den Editor ein.

# Connection header for WebSocket reverse proxy
map $http_upgrade $connection_upgrade {
    default upgrade;
    ""      close;
}

map $remote_addr $proxy_forwarded_elem {

    # IPv4 addresses can be sent as-is
    ~^[0-9.]+$ "for=$remote_addr";

    # IPv6 addresses need to be bracketed and quoted
    ~^[0-9A-Fa-f:.]+$ "for=\"[$remote_addr]\"";

    # Unix domain socket names cannot be represented in RFC 7239 syntax
    default "for=unknown";
}

map $http_forwarded $proxy_add_forwarded {

   # If the incoming Forwarded header is syntactically valid, append to it
    "~^(,[ \\t]*)*([!#$%&'*+.^_`|~0-9A-Za-z-]+=([!#$%&'*+.^_`|~0-9A-Za-z-]+|\"([\\t \\x21\\x23-\\x5B\\x5D-\\x7E\\x80-\\xFF]|\\\\[\\t \\x21-\\x7E\\x80-\\xFF])*\"))?(;([!#$%&'*+.^_`|~0-9A-Za-z-]+=([!#$%&'*+.^_`|~0-9A-Za-z-]+|\"([\\t \\x21\\x23-\\x5B\\x5D-\\x7E\\x80-\\xFF]|\\\\[\\t \\x21-\\x7E\\x80-\\xFF])*\"))?)*([ \\t]*,([ \\t]*([!#$%&'*+.^_`|~0-9A-Za-z-]+=([!#$%&'*+.^_`|~0-9A-Za-z-]+|\"([\\t \\x21\\x23-\\x5B\\x5D-\\x7E\\x80-\\xFF]|\\\\[\\t \\x21-\\x7E\\x80-\\xFF])*\"))?(;([!#$%&'*+.^_`|~0-9A-Za-z-]+=([!#$%&'*+.^_`|~0-9A-Za-z-]+|\"([\\t \\x21\\x23-\\x5B\\x5D-\\x7E\\x80-\\xFF]|\\\\[\\t \\x21-\\x7E\\x80-\\xFF])*\"))?)*)?)*$" "$http_forwarded, $proxy_forwarded_elem";

    # Otherwise, replace it
    default "$proxy_forwarded_elem";
}

# Redirect all non-encrypted to encrypted
server {
    listen 80;
    listen [::]:80;
    server_name gitea.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name gitea.example.com;

    ssl_certificate     /etc/letsencrypt/live/gitea.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/gitea.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/gitea.example.com/chain.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] 8.8.8.8 8.8.4.4 [2001:4860:4860::8888] [2001:4860:4860::8844] valid=60s;
    resolver_timeout 2s;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

    access_log /var/log/nginx/gitea.access.log main;
    error_log  /var/log/nginx/gitea.error.log;

    tcp_nopush on;

    # security headers
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "no-referrer-when-downgrade" always;
    add_header Content-Security-Policy "default-src 'self' http: https: ws: wss: data: blob: 'unsafe-inline'; frame-ancestors 'self';" always;
    add_header Permissions-Policy "interest-cohort=()" always;

    # . files
    location ~ /\.(?!well-known) {
        deny all;
    }

    location / {
        client_max_body_size 100M;
        proxy_pass  http://localhost:3000;
        proxy_http_version 1.1;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        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;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header Forwarded $proxy_add_forwarded;
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }
}

Wenn du fertig bist, drücke Strg + X, um den Editor zu schließen und drücke Y, wenn du aufgefordert wirst, die Datei zu speichern.

Öffne die Datei /etc/nginx/nginx.conf zur Bearbeitung.

$ sudo nano /etc/nginx/nginx.conf

Füge die folgende Zeile vor der Zeile include /etc/nginx/conf.d/*.conf; ein.

server_names_hash_bucket_size 64;

Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst. Teste die Nginx-Konfiguration.

$ sudo nginx -t

Du solltest die folgende Ausgabe sehen, die anzeigt, dass deine Konfiguration korrekt ist.

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Lade den Nginx-Dienst neu.

$ sudo systemctl reload nginx

Schritt 8 – Zugriff und Einrichtung von Gitea

Rufe die URL https://gitea.example.com in deinem Browser auf und der folgende Installationsbildschirm wird angezeigt.

Gitea Installation Teil 1

Die meisten Felder werden auf der Grundlage der Werte aus der Docker Compose-Datei vorausgefüllt.

Gitea Installation Teil 2

Gib gitea.example.com als Server Domain und https://gitea.example.com als Gitea Base URL ein. Ändere den Wert für den SSH-Server-Port von 22 auf 2221. Lass die restlichen Einstellungen unverändert.

Wenn du die E-Mail-Funktionen nutzen willst, kannst du die Details deines SMTP-Servers hinzufügen. Erweitere den Abschnitt E-Mail-Einstellungen auf der Seite und gib die Werte wie im Screenshot gezeigt ein. Achte darauf, dass du deinen SMTP-Port zusammen mit dem Hostnamen angibst. Für unser Tutorial verwenden wir den Amazon SES Service. Du kannst jeden SMTP-Dienst deiner Wahl verwenden.

Gitea E-Mail-Einstellungen

Es gibt noch ein paar weitere Einstellungen, die du vor der Installation überprüfen solltest. Um sie zu ändern, erweitere den Abschnitt Server- und Drittanbieter-Service-Einstellungen auf der Seite.

Einstellungen für Gitea Server und Drittanbieterdienste

Ändere die Einstellungen entsprechend deinen Anforderungen. Wir haben die Option E-Mail-Adressen standardmäßig verbergen aktiviert, um mehr Datenschutz zu gewährleisten, und die Option Anmeldung zum Anzeigen von Seiten erforderlich, um unsere Git-Seite privat zu halten. Wenn du nicht möchtest, dass sich jemand ein Konto anlegt, aktiviere die Option Selbstregistrierung deaktivieren.

Zu guter Letzt musst du dein Administratorkonto einrichten. Erweitere den Abschnitt Einstellungen für das Administratorkonto auf der Seite und trage die erforderlichen Werte ein.

Einstellungen des Gitea Administrator-Kontos

Klicke abschließend auf die Schaltfläche Gitea installieren, um die Installation abzuschließen. Du wirst zum Gitea Dashboard weitergeleitet. Wenn du aus irgendeinem Grund eine 502-Fehlermeldung erhältst, aktualisiere die Seite.

Gitea Dashboard

Schritt 8 – Erstes Repository erstellen

Lass uns unser erstes Repository erstellen. Klicke dazu auf das + Zeichen im Dashboard.

Gitea Schaltfläche "Neues Repository

Gib die Repository-Details ein. Wähle das Label Standardausgabe aus dem Dropdown-Menü. Wähle eine passende Lizenz für dein Projektarchiv aus.

Gitea Seite zur Einrichtung eines neuen Repositorys

Wähle den Standardzweig für dein Projektarchiv.

Gitea Einrichtungsseite für ein neues Repository Teil 2

Wenn du zufrieden bist, klicke auf die Schaltfläche Repository erstellen, um dein erstes Repository auf deiner Gitea-Installation zu erstellen. Du wirst zur Startseite deines Projektarchivs weitergeleitet.

Gitea Repository Seite

Schritt 9 – SSH einrichten

Richten wir SSH ein, um es mit unserem neu erstellten Repository zu verwenden.

Für unser Tutorial verwenden wir einen lokalen PC, auf dem Ubuntu vorinstalliert ist. Die Befehle sollten jedoch auf jedem OS-Terminal ohne große Änderungen funktionieren.

Erstelle einen neuen SSH-Schlüssel, den du mit Gitea auf deinem lokalen PC verwenden kannst.

$ ssh-keygen -f ~/.ssh/gitea-demo -t rsa -b 4096 -C "HowtoForge Gitea Demo" -q -N "yourpassphrase"

Gib eine starke Passphrase anstelle des Platzhalters im obigen Befehl ein. Dadurch wird ein SSH-Schlüssel unter ~/.ssh/gitea-demo erstellt.

Als Nächstes öffnest du deine Gitea-Profileinstellungen, indem du auf das Dropdown-Menü deines Profilbildes klickst und die Option Einstellungen auswählst.

Schaltfläche Gitea Profileinstellungen

Wechsle dann zum Reiter SSH/GPG-Schlüssel auf der Seite.

Gitea SSH-Schlüssel Seite

Füge einen Namen für deinen SSH-Schlüssel hinzu. Gehe zurück zum Terminal auf deinem lokalen PC und führe den folgenden Befehl aus, um den öffentlichen Schlüssel für Gitea auszugeben.

$ cat ~/.ssh/gitea-demo.pub

Kopiere die Ausgabe und füge sie wieder in das Feld Inhalt auf der Seite SSH-Schlüssel von Gitea ein.

Klicke auf die Schaltfläche Schlüssel hinzufügen, um das Hinzufügen des Schlüssels abzuschließen.

Gitea SSH-Schlüssel Liste

Gehe zurück zu deinem lokalen PC und richte den SSH-Agenten so ein, dass er für 1 Stunde aktiv bleibt.

$ eval $(ssh-agent -t 3600)

Füge den neu erstellten SSH-Schlüssel zum SSH-Agenten hinzu.

$ ssh-add ~/.ssh/gitea-demo
Enter passphrase for /home/navjot/.ssh/gitea-demo:
Identity added: /home/navjot/.ssh/gitea-demo (HowtoForge Gitea Demo)

Du wirst aufgefordert, deine Passphrase einzugeben.

Schritt 10 – Klonen des Repositorys mit SSH

Lass uns das neu erstellte Projektarchiv mit SSH klonen. Besuche die Repository-Seite erneut und kopiere die SSH-URL, nachdem du die Option SSH ausgewählt hast.

Gitea SSH URL kopieren

Sie sollte wie die folgende aussehen.

ssh://git@gitea.example.com:2221/navjot/howtoforge.git

Führe den folgenden Befehl auf deinem lokalen PC aus, um das Repository mit SSH zu klonen.

$ git clone ssh://git@gitea.example.com:2221/navjot/howtoforge.git
Cloning into 'howtoforge'...
The authenticity of host '[gitea.example.com]:2221 ([128.199.48.13]:2221)' can't be established.
ED25519 key fingerprint is SHA256:H7t5hNmEpZkYC9u3sXbA1mnGXCnoqaUZGL+gpAG9uNs.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[gitea.example.com]:2221' (ED25519) to the list of known hosts.
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (4/4), done.

Du wirst aufgefordert, die Host-Zugangsdaten einzugeben. Gib yes ein, um mit dem Klonen des Projektarchivs fortzufahren.

Du wirst das geklonte Projektarchiv auf deinem System sehen.

$ ls
howtoforge

Wechsle in das Verzeichnis.

$ cd howtoforge

Überprüfe den Git-Status des neu geklonten Repositorys. Hierfür solltest du Git auf deinem lokalen PC installiert haben.

$ git status
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

Damit ist klar, dass SSH einwandfrei funktioniert.

Schritt 11 – Testen des ersten Commits

Jetzt, wo wir unser erstes Repository eingerichtet haben, ist es an der Zeit, einige Änderungen vorzunehmen und sie zu committen.

Lass uns die Datei README.md aktualisieren. Öffne auf deinem lokalen PC die Readme-Datei zum Bearbeiten.

$ nano README.md

Bearbeite die Datei und wenn du fertig bist, speichere sie, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst.

Überprüfe erneut den Git-Status.

$ git status
On branch main
Your branch is up to date with 'origin/main'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")

Dieser zeigt an, dass die Readme-Datei zwar bearbeitet, aber nicht übertragen wurde. Füge die Datei hinzu, um sie für das Commit vorzubereiten.

$ git add README.md

Übertrage die Datei.

$ git commit -m "Update the Readme file for Gitea tutorial."
[main bb2956f] Update the Readme file for Gitea tutorial.
 1 file changed, 3 insertions(+), 1 deletion(-)

Pushe die Datei auf deinen Gitea Server.

$ git push origin main
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 378 bytes | 378.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote: . Processing 1 references
remote: Processed 1 references in total
To ssh://gitea.example.com:2221/navjot/howtoforge.git
   bd1248f..bb2956f  main -> main

Zur Bestätigung gehst du zurück zur Gitea-Repository-Seite.

Gitea Erfolgreicher Commit

Du kannst sehen, dass die Readme-Datei aktualisiert wurde und die letzte Commit-Meldung angezeigt wird. Um die Änderungen zu sehen, klicke auf die Commit-Meldung und du kannst die folgende Seite mit den Unterschieden sehen.

Gitea Commit Details

Damit ist unser erster Commit für unser Repository abgeschlossen. Du kannst mit der Arbeit an deiner Gitea Installation für deine Projekte beginnen.

Schritt 12 – Gitea sichern und wiederherstellen

Gitea wird mit einem Kommandozeilentool ausgeliefert, mit dem du mit einem einzigen Befehl ein Backup erstellen kannst. Um das Kommandozeilentool innerhalb des Docker-Containers auszuführen, um ein Backup zu erstellen, führe den folgenden Befehl aus.

$ docker exec -u git -it -w /app/gitea gitea bash -c '/usr/local/bin/gitea dump -c /data/gitea/conf/app.ini'

Wir führen den Befehl mit demselben Benutzer aus, den wir in Schritt 3 angelegt und während der Installation mit dem Flag -u git im obigen Befehl konfiguriert haben. Das Flag -w /app/gitea legt den Ordner innerhalb des Docker-Containers fest, in dem die Backup-Datei gespeichert werden soll. Der Backup-Ordner muss so gewählt werden, dass der Benutzer git die Berechtigung hat, auf ihn zu schreiben. Innerhalb des Docker-Containers gibt es nur zwei solcher Ordner. Der eine ist der Ordner /data und der andere ist der Ordner /app/gitea. Den Ordner /data können wir nicht verwenden, weil das Kommandozeilentool den gesamten Datenordner sichert, was zu einer Endlosschleife führt, wenn wir ihn als Ziel verwenden, was den Speicherplatz deines Servers füllen kann. Deshalb können wir das Backup nur im Ordner /app/gitea speichern.

Der nächste Punkt des Befehls ist der Name des Containers, gitea. Danach geben wir den Typ der Linux-Shell an, die zur Ausführung des Befehls innerhalb des Containers verwendet wird. Das Flag -c gibt den Befehl an, der innerhalb des Containers ausgeführt werden soll. Und der auszuführende Befehl ist /usr/local/bin/gitea dump -c /data/gitea/conf/app.ini, der das Kommandozeilentool ausführt und den Speicherort der dazugehörigen Konfigurationsdatei angibt.

Sobald der Befehl ausgeführt wurde, siehst du die folgende Ausgabe.

2023/11/20 06:21:41 ...les/setting/cache.go:75:loadCacheFrom() [I] Cache Service Enabled
2023/11/20 06:21:41 ...les/setting/cache.go:90:loadCacheFrom() [I] Last Commit Cache Service Enabled
2023/11/20 06:21:41 ...s/setting/session.go:74:loadSessionFrom() [I] Session Service Enabled
2023/11/20 06:21:41 ...es/setting/mailer.go:237:loadMailerFrom() [I] Mail Service Enabled
2023/11/20 06:21:41 ...es/setting/mailer.go:259:loadNotifyMailFrom() [I] Notify Mail Service Enabled
2023/11/20 06:21:41 ...s/storage/storage.go:176:initAttachments() [I] Initialising Attachment storage with type: local
2023/11/20 06:21:41 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /data/gitea/attachments
2023/11/20 06:21:41 ...s/storage/storage.go:166:initAvatars() [I] Initialising Avatar storage with type: local
2023/11/20 06:21:41 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /data/gitea/avatars
2023/11/20 06:21:41 ...s/storage/storage.go:192:initRepoAvatars() [I] Initialising Repository Avatar storage with type: local
2023/11/20 06:21:41 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /data/gitea/repo-avatars
2023/11/20 06:21:41 ...s/storage/storage.go:186:initLFS() [I] Initialising LFS storage with type: local
2023/11/20 06:21:41 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /data/git/lfs
2023/11/20 06:21:41 ...s/storage/storage.go:198:initRepoArchives() [I] Initialising Repository Archive storage with type: local
2023/11/20 06:21:41 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /data/gitea/repo-archive
2023/11/20 06:21:41 ...s/storage/storage.go:208:initPackages() [I] Initialising Packages storage with type: local
2023/11/20 06:21:41 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /data/gitea/packages
2023/11/20 06:21:41 ...s/storage/storage.go:219:initActions() [I] Initialising Actions storage with type: local
2023/11/20 06:21:41 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /data/gitea/actions_log
2023/11/20 06:21:41 ...s/storage/storage.go:223:initActions() [I] Initialising ActionsArtifacts storage with type: local
2023/11/20 06:21:41 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /data/gitea/actions_artifacts
2023/11/20 06:21:41 cmd/dump.go:265:runDump() [I] Dumping local repositories... /data/git/repositories
2023/11/20 06:21:41 cmd/dump.go:306:runDump() [I] Dumping database...
2023/11/20 06:21:41 cmd/dump.go:318:runDump() [I] Adding custom configuration file from /data/gitea/conf/app.ini
2023/11/20 06:21:41 cmd/dump.go:334:runDump() [I] Custom dir /data/gitea is inside data dir /data/gitea, skipped
2023/11/20 06:21:41 cmd/dump.go:346:runDump() [I] Packing data directory.../data/gitea
2023/11/20 06:21:41 cmd/dump.go:430:runDump() [I] Finish dumping in file gitea-dump-1700441501.zip

Lass uns nun den Wiederherstellungsprozess durchlaufen. Du solltest jetzt eine neue Docker-Installation von Gitea haben. Führe aber nicht den Installationsprozess durch.

Melde dich in der Docker-Shell an.

$ docker exec --user git -it gitea bash

Wechsle in das Verzeichnis app/gitea.

$ cd app/gitea

Entpacke die Sicherungsdatei.

$ unzip gitea-dump-1700441501.zip

Wechsle in das entpackte Verzeichnis.

$ cd gitea-dump-1700441501

Stelle den Ordner /data/gitea wieder her.

$ mv data/* /data/gitea

Stelle die Repositories wieder her.

$ mv repos/* /data/git/gitea-repositories/

Korrigiere die Dateiberechtigungen.

$ chown -R git:git /data

Erstelle die Git Hooks neu.

$ /usr/local/bin/gitea -c '/data/gitea/conf/app.ini' admin regenerate hooks

Beende die Docker-Shell.

$ exit

Schritt 13 – Upgrade von Gitea

Das Upgrade von Gitea ist ein einfacher Prozess.

Schließe die vorhandenen Container und entferne sie. Da die Daten außerhalb der Container auf dem Host gespeichert sind, werden sie beibehalten.

$ cd ~/gitea-docker
$ docker compose down --remove-orphans

Öffne die Datei docker-compose.yml und ändere die Version des Gitea-Containers. Als nächstes ziehst du das neue Gitea-Image.

$ docker pull

Starten Sie die neuen Container.

$ docker compose up -d

Überprüfe den Status.

$ docker ps

Fazit

Dies ist der Abschluss unseres Tutorials, in dem wir den Gitea Code Hosting Service mit Docker auf einem Debian 12 Server installiert haben. Außerdem haben wir den Nginx-Server installiert, der als Proxy fungiert, und Gitea über eine öffentliche URL mit SSL zugänglich gemacht. Wenn du Fragen hast, schreibe sie unten in die Kommentare.

Das könnte dich auch interessieren …