# Gitea Selbstgehostetes Git-Hosting. | Punkt | Wert | |---|---| | Software | Gitea (Binary nach `/usr/local/bin/gitea`) | | Öffentlich | `https://git.example.com` | | Interner Port | `127.0.0.1:3001` | | Datenbank | SQLite (`/var/lib/gitea/data/gitea.db`) | | Dienstbenutzer | `git` | ## 1. Benutzer und Verzeichnisse ```bash sudo adduser --system --shell /bin/bash --gecos 'Gitea' \ --group --disabled-password --home /home/git git sudo mkdir -p /var/lib/gitea/{custom,data,log} /etc/gitea sudo chown -R git:git /var/lib/gitea sudo chmod 750 /var/lib/gitea # Waehrend der Ersteinrichtung muss Gitea in /etc/gitea schreiben duerfen. sudo chown root:git /etc/gitea sudo chmod 770 /etc/gitea ``` ## 2. Binary installieren ```bash VER=$(curl -s https://api.github.com/repos/go-gitea/gitea/releases/latest \ | python3 -c "import json,sys; print(json.load(sys.stdin)['tag_name'].lstrip('v'))") curl -fLo /tmp/gitea "https://dl.gitea.com/gitea/${VER}/gitea-${VER}-linux-amd64" sudo install -m 755 /tmp/gitea /usr/local/bin/gitea gitea --version ``` ## 3. systemd-Unit Nach `/etc/systemd/system/gitea.service`: ```ini [Unit] Description=Gitea (Git with a cup of tea) After=network.target [Service] User=git Group=git WorkingDirectory=/var/lib/gitea ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini Restart=always RestartSec=5 Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/gitea [Install] WantedBy=multi-user.target ``` ```bash sudo systemctl daemon-reload sudo systemctl enable --now gitea ``` ## 4. Ersteinrichtung Gitea zunächst über nginx erreichbar machen (siehe `services/nginx/`), dann `https://git.example.com` im Browser öffnen und den Installationsdialog ausfüllen. Danach die Rechte auf `/etc/gitea` wieder einschränken: ```bash sudo chmod 750 /etc/gitea sudo chmod 640 /etc/gitea/app.ini ``` Das ist wichtig: `app.ini` enthält den `SECRET_KEY` und den `INTERNAL_TOKEN`. Bleibt die Datei für alle lesbar, kann jeder lokale Benutzer Sitzungen fälschen. ## 5. Wichtige Werte in `app.ini` ```ini [server] HTTP_PORT = 3001 ROOT_URL = https://git.example.com/ DOMAIN = git.example.com SSH_PORT = 22 [database] DB_TYPE = sqlite3 PATH = /var/lib/gitea/data/gitea.db ``` `ROOT_URL` muss stimmen, sonst erzeugt Gitea Klon-URLs und Weiterleitungen mit falschem Hostnamen. Nach der Ersteinrichtung sollte die offene Registrierung geschlossen werden: ```ini [service] DISABLE_REGISTRATION = true ``` ## 6. Sicherung ```bash sudo systemctl stop gitea sudo tar czf gitea-$(date +%F).tar.gz /var/lib/gitea /etc/gitea/app.ini sudo systemctl start gitea ``` Die SQLite-Datenbank sollte nicht im laufenden Betrieb kopiert werden. Alternativ Giteas eigener Dump: ```bash sudo -u git gitea dump --config /etc/gitea/app.ini ``` ## Über die API arbeiten Repository anlegen, ohne den Browser zu benutzen: ```bash curl -u ':' \ -H "Content-Type: application/json" \ -X POST -d '{"name":"projekt","private":true,"default_branch":"main"}' \ https://git.example.com/api/v1/user/repos ``` Issue anlegen: ```bash curl -u ':' -H "Content-Type: application/json" \ -X POST -d '{"title":"Titel","body":"Beschreibung"}' \ https://git.example.com/api/v1/repos///issues ``` > Besser ein Zugriffstoken (Einstellungen → Anwendungen) statt des Passworts > verwenden und den Geltungsbereich einschränken. ## Stolpersteine | Symptom | Ursache | |---|---| | Falsche Klon-URLs | `ROOT_URL`/`DOMAIN` stimmen nicht | | Ersteinrichtung schlägt fehl | `/etc/gitea` für den Benutzer `git` nicht schreibbar | | `app.ini` weltlesbar | Rechte nach der Einrichtung nicht zurückgesetzt | | Beschädigte Sicherung | SQLite im laufenden Betrieb kopiert |