Files
WikiJS/IT_Abteilung/DatenBank/Gitea.md

1835 lines
47 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: Gitea Profice Dokumentation
description:
published: true
date: 2026-02-24T08:17:55.412Z
tags:
editor: markdown
dateCreated: 2026-02-24T08:17:55.412Z
---
# Gitea Vollständige Server-Dokumentation
> **Systemumgebung:** Debian-basierter Server (Debian 12 / Ubuntu 22.04+)
> **Datenbank:** PostgreSQL 16 (lokal installiert)
> **Wiki-Anbindung:** Wiki.js
> **Einsatz:** Selbst gehostete Git-Plattform für Versionsverwaltung, Code-Review und CI/CD
---
## Inhaltsverzeichnis
1. [Überblick und Architektur](#1-überblick-und-architektur)
2. [Installation](#2-installation)
3. [Grundkonfiguration (app.ini)](#3-grundkonfiguration-appini)
4. [PostgreSQL-Anbindung](#4-postgresql-anbindung)
5. [Reverse Proxy und SSL](#5-reverse-proxy-und-ssl)
6. [Benutzerverwaltung](#6-benutzerverwaltung)
7. [Repositories verwalten](#7-repositories-verwalten)
8. [Branches, Tags und Releases](#8-branches-tags-und-releases)
9. [Issues und Projektplanung](#9-issues-und-projektplanung)
10. [Pull Requests und Code-Review](#10-pull-requests-und-code-review)
11. [CI/CD mit Gitea Actions](#11-cicd-mit-gitea-actions)
12. [Wiki-Funktion und Wiki.js-Anbindung](#12-wiki-funktion-und-wikijs-anbindung)
13. [SSH-Zugang und Authentifizierung](#13-ssh-zugang-und-authentifizierung)
14. [Webhooks und Integrationen](#14-webhooks-und-integrationen)
15. [Pakete und Container Registry](#15-pakete-und-container-registry)
16. [Datensicherung und Wiederherstellung](#16-datensicherung-und-wiederherstellung)
17. [Wartung und Updates](#17-wartung-und-updates)
18. [Sicherheitshärtung](#18-sicherheitshärtung)
19. [Fehlerbehebung](#19-fehlerbehebung)
20. [Schnellreferenz Befehle auf einen Blick](#20-schnellreferenz--befehle-auf-einen-blick)
---
## 1. Überblick und Architektur
### Was ist Gitea?
Gitea ist eine leichtgewichtige, selbst gehostete Git-Plattform, geschrieben in Go. Sie bietet eine ähnliche Funktionalität wie GitHub oder GitLab, benötigt aber deutlich weniger Ressourcen. Gitea umfasst Versionsverwaltung, Issue-Tracking, Code-Review über Pull Requests, CI/CD (Gitea Actions), eine Paket-Registry und vieles mehr.
### Kernfunktionen
| Funktion | Beschreibung |
|---|---|
| **Git-Repositories** | Erstellen, klonen, pushen, branchen vollständiges Git-Hosting |
| **Issue-Tracker** | Aufgaben, Bugs und Feature-Requests verwalten |
| **Pull Requests** | Code-Review mit Diff-Ansicht, Kommentaren und Freigaben |
| **Gitea Actions** | CI/CD-Pipelines (kompatibel mit GitHub Actions) |
| **Wiki** | Integriertes Wiki pro Repository |
| **Paket-Registry** | Docker, npm, PyPI, Maven, NuGet und weitere |
| **Organisationen** | Team- und Rechteverwaltung |
| **Webhooks** | Ereignisgesteuerte Integrationen |
### Architektur auf diesem Server
```plantuml
@startuml
skinparam shadowing false
skinparam roundCorner 10
package "Debian Server" {
[Reverse Proxy\n(Nginx/Caddy)] as proxy
[Gitea\n(Git-Server)] as gitea
[Wiki.js\n(Dokumentation)] as wiki
package "PostgreSQL 16" {
database "DB: gitea" as db_gitea
database "DB: wikijs" as db_wiki
}
proxy --> gitea : HTTPS
proxy --> wiki : HTTPS
gitea --> db_gitea : Daten
wiki --> db_wiki : Daten
wiki --> gitea : Git-Sync
}
cloud "Benutzer" {
[Browser] as browser
[Git CLI] as git_cli
[IDE / Editor] as ide
}
browser --> proxy : HTTPS
git_cli --> gitea : SSH / HTTPS
ide --> gitea : SSH / HTTPS
@enduml
```
### Systemvoraussetzungen
| Komponente | Minimum | Empfohlen |
|---|---|---|
| RAM | 256 MB | 1 GB+ |
| CPU | 1 Kern | 2+ Kerne |
| Speicherplatz | 1 GB | 10 GB+ (je nach Repositories) |
| Go | Nicht nötig (Binär) | |
| Git | 2.0+ | Aktuelle Version |
| PostgreSQL | 12+ | 16 (bereits installiert) |
---
## 2. Installation
### 2.1 Systembenutzer erstellen
Gitea läuft unter einem eigenen Systembenutzer:
```bash
# Benutzer erstellen (ohne Login, mit Home-Verzeichnis)
sudo adduser --system --shell /bin/bash --gecos 'Gitea' \
--group --disabled-password --home /home/gitea gitea
```
### 2.2 Verzeichnisse anlegen
```bash
# Arbeitsverzeichnisse erstellen
sudo mkdir -p /etc/gitea
sudo mkdir -p /var/lib/gitea/{custom,data,log}
# Berechtigungen setzen
sudo chown -R gitea:gitea /var/lib/gitea
sudo chmod -R 750 /var/lib/gitea
# Konfigurationsverzeichnis (Gitea braucht Schreibrechte bei der Ersteinrichtung)
sudo chown root:gitea /etc/gitea
sudo chmod 770 /etc/gitea
```
### 2.3 Git installieren
```bash
sudo apt install -y git
git --version
```
### 2.4 Gitea-Binärdatei herunterladen
```bash
# Aktuelle Version ermitteln (Beispiel: 1.22)
GITEA_VERSION="1.22.6"
# Binärdatei herunterladen
sudo wget -O /usr/local/bin/gitea \
"https://dl.gitea.com/gitea/${GITEA_VERSION}/gitea-${GITEA_VERSION}-linux-amd64"
# Ausführbar machen
sudo chmod +x /usr/local/bin/gitea
# Version prüfen
gitea --version
```
> **Tipp:** Die aktuelle Version findet man unter [dl.gitea.com/gitea](https://dl.gitea.com/gitea/) oder auf [github.com/go-gitea/gitea/releases](https://github.com/go-gitea/gitea/releases).
### 2.5 Systemd-Service erstellen
```bash
sudo nano /etc/systemd/system/gitea.service
```
```ini
[Unit]
Description=Gitea (Git with a cup of tea)
After=syslog.target
After=network.target
After=postgresql.service
Requires=postgresql.service
[Service]
Type=simple
User=gitea
Group=gitea
WorkingDirectory=/var/lib/gitea
RuntimeDirectory=gitea
ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini
Restart=always
RestartSec=5
Environment=USER=gitea HOME=/home/gitea GITEA_WORK_DIR=/var/lib/gitea
# Sicherheitshärtung
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full
[Install]
WantedBy=multi-user.target
```
```bash
# Service aktivieren und starten
sudo systemctl daemon-reload
sudo systemctl enable gitea
sudo systemctl start gitea
# Status prüfen
sudo systemctl status gitea
```
### 2.6 Ersteinrichtung über den Web-Installer
Nach dem Start ist der Web-Installer erreichbar unter:
```
http://SERVER_IP:3000/install
```
Hier werden die Grundeinstellungen festgelegt:
- Datenbanktyp und Verbindung (PostgreSQL)
- Site-Titel und Domain
- Administrator-Konto
> **Hinweis:** Nach der Ersteinrichtung die Berechtigungen des Konfigurationsverzeichnisses einschränken:
> ```bash
> sudo chmod 750 /etc/gitea
> sudo chmod 640 /etc/gitea/app.ini
> ```
---
## 3. Grundkonfiguration (app.ini)
Die Hauptkonfiguration von Gitea liegt in `/etc/gitea/app.ini`. Die Datei folgt dem INI-Format mit Sektionen.
### 3.1 Wichtige Sektionen
```ini
; ===========================================================
; /etc/gitea/app.ini Hauptkonfiguration
; ===========================================================
; ---------- Allgemein ----------
APP_NAME = Gitea: Git-Server
RUN_MODE = prod
RUN_USER = gitea
WORK_PATH = /var/lib/gitea
; ---------- Repository-Einstellungen ----------
[repository]
ROOT = /var/lib/gitea/repositories
DEFAULT_BRANCH = main
DEFAULT_PRIVATE = public
MAX_CREATION_LIMIT = -1 ; -1 = unbegrenzt
DISABLED_REPO_UNITS = ; Keine Funktionen deaktivieren
DEFAULT_REPO_UNITS = repo.code,repo.issues,repo.pulls,repo.wiki,repo.releases,repo.projects
ENABLE_PUSH_CREATE_USER = true ; Repo per Push erstellen
ENABLE_PUSH_CREATE_ORG = true
; ---------- Server ----------
[server]
PROTOCOL = http
DOMAIN = git.example.de
HTTP_ADDR = 127.0.0.1
HTTP_PORT = 3000
ROOT_URL = https://git.example.de/
SSH_DOMAIN = git.example.de
SSH_PORT = 22
START_SSH_SERVER = false ; System-SSH verwenden
LFS_START_SERVER = true ; Git LFS aktivieren
LFS_JWT_SECRET = ; Wird automatisch generiert
OFFLINE_MODE = false
LANDING_PAGE = explore ; Startseite: explore, home, login
; ---------- Datenbank (PostgreSQL) ----------
[database]
DB_TYPE = postgres
HOST = 127.0.0.1:5432
NAME = gitea
USER = gitea_user
PASSWD = SICHERES_PASSWORT_HIER
SSL_MODE = disable
LOG_SQL = false
; ---------- Sicherheit ----------
[security]
INSTALL_LOCK = true ; Installer deaktivieren
SECRET_KEY = ; Wird automatisch generiert
INTERNAL_TOKEN = ; Wird automatisch generiert
PASSWORD_COMPLEXITY = lower,upper,digit,spec
MIN_PASSWORD_LENGTH = 12
PASSWORD_CHECK_PWN = true ; Prüfung gegen bekannte Leaks
; ---------- Service ----------
[service]
REGISTER_EMAIL_CONFIRM = true ; E-Mail-Bestätigung
DISABLE_REGISTRATION = false ; Registrierung erlauben
ALLOW_ONLY_EXTERNAL_REGISTRATION = false
REQUIRE_SIGNIN_VIEW = false ; Öffentliche Repos ohne Login sichtbar
DEFAULT_KEEP_EMAIL_PRIVATE = true
DEFAULT_ALLOW_CREATE_ORGANIZATION = true
NO_REPLY_ADDRESS = noreply.git.example.de
ENABLE_NOTIFY_MAIL = true
; ---------- E-Mail (SMTP) ----------
[mailer]
ENABLED = true
PROTOCOL = smtp+starttls
SMTP_ADDR = smtp.example.de
SMTP_PORT = 587
USER = gitea@example.de
PASSWD = SMTP_PASSWORT_HIER
FROM = "Gitea" <gitea@example.de>
; ---------- Session ----------
[session]
PROVIDER = file
PROVIDER_CONFIG = /var/lib/gitea/data/sessions
COOKIE_SECURE = true ; Nur über HTTPS
; ---------- Cache ----------
[cache]
ADAPTER = memory
INTERVAL = 60
; ---------- Logging ----------
[log]
MODE = file
LEVEL = info
ROOT_PATH = /var/lib/gitea/log
; ---------- Markup / Rendering ----------
[markup.asciidoc]
ENABLED = true
; ---------- Indexer (Volltextsuche) ----------
[indexer]
ISSUE_INDEXER_TYPE = bleve
ISSUE_INDEXER_PATH = /var/lib/gitea/data/indexers/issues.bleve
REPO_INDEXER_ENABLED = true
REPO_INDEXER_PATH = /var/lib/gitea/data/indexers/repos.bleve
REPO_INDEXER_INCLUDE =
REPO_INDEXER_EXCLUDE = resources/bin/**
MAX_FILE_SIZE = 1048576 ; 1 MB
; ---------- Webhook ----------
[webhook]
ALLOWED_HOST_LIST = external,loopback ; Externe und lokale Webhooks
DELIVER_TIMEOUT = 10
; ---------- API ----------
[api]
ENABLE_SWAGGER = true
MAX_RESPONSE_ITEMS = 50
; ---------- Aktionen (CI/CD) ----------
[actions]
ENABLED = true
DEFAULT_ACTIONS_URL = https://github.com
```
### 3.2 Konfigurationsänderungen anwenden
```bash
# Nach Änderungen an app.ini: Gitea neu starten
sudo systemctl restart gitea
# Konfiguration prüfen (ohne Neustart)
sudo -u gitea gitea doctor check --config /etc/gitea/app.ini
```
### 3.3 Konfigurationsreferenz
Die vollständige Liste aller Optionen ist in der offiziellen Dokumentation zu finden:
```
https://docs.gitea.com/administration/config-cheat-sheet
```
---
## 4. PostgreSQL-Anbindung
### 4.1 Datenbank und Benutzer erstellen
Falls nicht bereits im Rahmen der PostgreSQL-Installation geschehen:
```bash
# Als PostgreSQL-Superuser verbinden
sudo -u postgres psql
```
```sql
-- Benutzer erstellen
CREATE USER gitea_user WITH PASSWORD 'SICHERES_PASSWORT_HIER';
-- Datenbank erstellen
CREATE DATABASE gitea
OWNER gitea_user
ENCODING 'UTF8'
LC_COLLATE 'de_DE.UTF-8'
LC_CTYPE 'de_DE.UTF-8'
TEMPLATE template0;
-- Berechtigungen vergeben
GRANT ALL PRIVILEGES ON DATABASE gitea TO gitea_user;
-- Schema-Berechtigungen
\c gitea
GRANT ALL ON SCHEMA public TO gitea_user;
```
### 4.2 Verbindung testen
```bash
# Als gitea_user verbinden
psql -h 127.0.0.1 -U gitea_user -d gitea
# In psql: Tabellen anzeigen (nach der Ersteinrichtung)
\dt
\q
```
### 4.3 pg_hba.conf prüfen
Sicherstellen, dass der Zugriff für den Gitea-Benutzer konfiguriert ist:
```bash
sudo cat /etc/postgresql/16/main/pg_hba.conf | grep -v "^#" | grep -v "^$"
```
Benötigter Eintrag:
```conf
host gitea gitea_user 127.0.0.1/32 scram-sha-256
```
### 4.4 Datenbankstatus prüfen
```sql
-- Als postgres-Superuser:
-- Tabellenzahl prüfen (Gitea erstellt ca. 60+ Tabellen)
SELECT COUNT(*) FROM information_schema.tables
WHERE table_schema = 'public' AND table_catalog = 'gitea';
-- Datenbankgröße
SELECT pg_size_pretty(pg_database_size('gitea'));
-- Größte Tabellen
SELECT tablename,
pg_size_pretty(pg_total_relation_size('public.' || tablename)) AS groesse
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY pg_total_relation_size('public.' || tablename) DESC
LIMIT 10;
```
---
## 5. Reverse Proxy und SSL
### 5.1 Nginx-Konfiguration
```bash
sudo nano /etc/nginx/sites-available/gitea
```
```nginx
server {
listen 80;
server_name git.example.de;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name git.example.de;
# SSL-Zertifikate
ssl_certificate /etc/letsencrypt/live/git.example.de/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/git.example.de/privkey.pem;
# Sicherheitsheader
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
# Maximale Upload-Größe (Git LFS, Anhänge)
client_max_body_size 512M;
location / {
proxy_pass http://127.0.0.1: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;
# WebSocket-Support (für Live-Features)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Timeouts für große Repositories
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
}
}
```
```bash
sudo ln -sf /etc/nginx/sites-available/gitea /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
```
### 5.2 Caddy-Konfiguration
```caddyfile
git.example.de {
request_body {
max_size 512MB
}
reverse_proxy 127.0.0.1:3000 {
header_up X-Real-IP {remote_host}
transport http {
read_timeout 300s
}
}
}
```
### 5.3 SSL-Zertifikat (Let's Encrypt)
```bash
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d git.example.de
sudo certbot renew --dry-run
```
---
## 6. Benutzerverwaltung
### 6.1 Administrator-Konto erstellen
Falls kein Admin bei der Ersteinrichtung erstellt wurde:
```bash
sudo -u gitea gitea admin user create \
--config /etc/gitea/app.ini \
--username admin \
--password 'SICHERES_PASSWORT' \
--email admin@example.de \
--admin
```
### 6.2 Benutzer über die CLI verwalten
```bash
# Alle Benutzer auflisten
sudo -u gitea gitea admin user list --config /etc/gitea/app.ini
# Benutzer erstellen
sudo -u gitea gitea admin user create \
--config /etc/gitea/app.ini \
--username neuerbenutzer \
--password 'Passwort123!' \
--email benutzer@example.de
# Passwort ändern
sudo -u gitea gitea admin user change-password \
--config /etc/gitea/app.ini \
--username neuerbenutzer \
--password 'NeuesPasswort456!'
# Admin-Rechte vergeben
sudo -u gitea gitea admin user change-password \
--config /etc/gitea/app.ini \
--username neuerbenutzer \
--admin
```
### 6.3 Benutzer über die Weboberfläche verwalten
1. Als Administrator anmelden
2. **Site-Administration** (Krone-Symbol oben rechts) → **Benutzerkonten**
3. Mögliche Aktionen:
| Aktion | Beschreibung |
|---|---|
| Erstellen | Neuen Benutzer mit E-Mail und Passwort anlegen |
| Bearbeiten | Berechtigungen, E-Mail, Passwort ändern |
| Deaktivieren | Konto sperren, Daten bleiben erhalten |
| Löschen | Konto und alle zugehörigen Repositories entfernen |
### 6.4 Zwei-Faktor-Authentifizierung (2FA)
Jeder Benutzer kann 2FA selbst aktivieren:
1. **Einstellungen****Sicherheit****Zwei-Faktor-Authentifizierung**
2. QR-Code mit einer TOTP-App scannen (Aegis, Authy etc.)
3. Bestätigungscode eingeben
4. **Wiederherstellungscodes** sicher aufbewahren
2FA für alle Benutzer erzwingen (in `app.ini`):
```ini
[service]
ENABLE_BASIC_AUTHENTICATION = false
[auth.webauthn]
ENABLED = true
[security]
MIN_PASSWORD_LENGTH = 12
```
### 6.5 Externe Authentifizierung (OAuth2 / LDAP)
Gitea unterstützt verschiedene externe Authentifizierungsquellen:
1. **Site-Administration****Authentifizierungsquellen****Hinzufügen**
2. Unterstützte Typen:
| Typ | Beschreibung |
|---|---|
| **LDAP** | Active Directory, OpenLDAP |
| **OAuth2** | GitHub, GitLab, Google, Keycloak etc. |
| **SMTP** | Authentifizierung über den E-Mail-Server |
| **PAM** | Linux-Systembenutzer |
---
## 7. Repositories verwalten
### 7.1 Repository über die Weboberfläche erstellen
1. **„+"** → **Neues Repository**
2. Felder ausfüllen:
- **Besitzer:** Eigener Benutzer oder Organisation
- **Name:** Repository-Name (keine Leerzeichen)
- **Sichtbarkeit:** Öffentlich oder Privat
- **Beschreibung:** Optional
- **README initialisieren:** Empfohlen
- **.gitignore:** Vorlage passend zur Sprache
- **Lizenz:** Je nach Projekt
3. **Repository erstellen**
### 7.2 Repository klonen
```bash
# Über HTTPS
git clone https://git.example.de/benutzer/mein-repo.git
# Über SSH
git clone git@git.example.de:benutzer/mein-repo.git
```
### 7.3 Bestehendes Projekt importieren
```bash
# Lokales Projekt mit Gitea verbinden
cd /pfad/zum/projekt
git init
git add .
git commit -m "Erster Commit"
git remote add origin https://git.example.de/benutzer/mein-repo.git
git push -u origin main
```
### 7.4 Repository per Push erstellen
Wenn in `app.ini` aktiviert (`ENABLE_PUSH_CREATE_USER = true`):
```bash
# Erstellt das Repository automatisch beim ersten Push
git remote add origin git@git.example.de:benutzer/neues-repo.git
git push -u origin main
```
### 7.5 Repository migrieren (Import)
Gitea kann Repositories von anderen Plattformen importieren:
1. **„+"** → **Neue Migration**
2. Plattform wählen: GitHub, GitLab, Bitbucket, Gitea, Gogs etc.
3. URL des Quell-Repositories eingeben
4. Optionen:
- [x] Issues migrieren
- [x] Labels migrieren
- [x] Pull Requests migrieren
- [x] Releases migrieren
- [x] Wiki migrieren
5. **Repository migrieren**
### 7.6 Repository-Einstellungen
In den Repository-Einstellungen (Zahnrad-Symbol) können konfiguriert werden:
| Einstellung | Beschreibung |
|---|---|
| **Allgemein** | Name, Beschreibung, Sichtbarkeit, Website |
| **Zusammenarbeit** | Benutzer und Teams mit Rechten hinzufügen |
| **Branches** | Branch-Schutzregeln, Standard-Branch |
| **Webhooks** | Ereignisbasierte HTTP-Callbacks |
| **Git Hooks** | Pre-receive, Post-receive, Update-Hooks |
| **Deploy Keys** | Schreibgeschützte oder volle SSH-Schlüssel |
| **Gefahrenzone** | Repository übertragen, archivieren, löschen |
### 7.7 Repository-Berechtigungen
| Berechtigung | Lesen | Schreiben | Admin |
|---|---|---|---|
| Code einsehen | ✅ | ✅ | ✅ |
| Klonen | ✅ | ✅ | ✅ |
| Pushen | ❌ | ✅ | ✅ |
| Issues erstellen | ✅ | ✅ | ✅ |
| Pull Requests mergen | ❌ | ✅ | ✅ |
| Einstellungen ändern | ❌ | ❌ | ✅ |
| Repository löschen | ❌ | ❌ | ✅ |
---
## 8. Branches, Tags und Releases
### 8.1 Branches
```bash
# Neuen Branch erstellen
git checkout -b feature/neue-funktion
# Branch pushen
git push -u origin feature/neue-funktion
# Branches auflisten
git branch -a
# Branch löschen (lokal und remote)
git branch -d feature/neue-funktion
git push origin --delete feature/neue-funktion
```
### 8.2 Branch-Schutzregeln
Über die Weboberfläche unter **Repository-Einstellungen → Branches**:
| Regel | Beschreibung |
|---|---|
| **Push deaktivieren** | Kein direkter Push auf den Branch (nur über PR) |
| **Merge-Whitelist** | Nur bestimmte Benutzer dürfen mergen |
| **Review erforderlich** | Mindestanzahl an Freigaben vor dem Merge |
| **Statusprüfungen** | CI/CD muss erfolgreich sein |
| **Force-Push blockieren** | Verhindert History-Umschreibung |
| **Branch löschen blockieren** | Schutz vor versehentlichem Löschen |
Empfehlung für den `main`-Branch:
- [x] Push deaktivieren
- [x] Mindestens 1 Review erforderlich
- [x] Force-Push blockieren
- [x] Branch löschen blockieren
### 8.3 Tags und Releases
```bash
# Tag erstellen und pushen
git tag -a v1.0.0 -m "Version 1.0.0"
git push origin v1.0.0
# Alle Tags auflisten
git tag -l
```
Release über die Weboberfläche:
1. **Repository****Releases****Neues Release**
2. Tag auswählen oder neuen Tag erstellen
3. Release-Titel und Beschreibung (Changelog)
4. Optional: Binärdateien als Anhänge hochladen
5. **Release veröffentlichen**
---
## 9. Issues und Projektplanung
### 9.1 Issues erstellen
1. **Repository****Issues****Neues Issue**
2. **Titel** und **Beschreibung** eingeben (Markdown wird unterstützt)
3. Optional:
- **Labels** zuweisen (z. B. Bug, Feature, Priorität)
- **Meilenstein** zuordnen
- **Verantwortlichen** zuweisen
- **Projekt** zuordnen
### 9.2 Labels verwalten
Labels helfen bei der Kategorisierung. Gitea bietet vordefinierte Label-Sets:
1. **Repository****Labels****Label-Set verwenden**
2. Oder eigene Labels erstellen mit Name, Farbe und Beschreibung
Empfohlene Labels:
| Label | Farbe | Verwendung |
|---|---|---|
| `bug` | 🔴 Rot | Fehler |
| `feature` | 🟢 Grün | Neue Funktionen |
| `enhancement` | 🔵 Blau | Verbesserungen |
| `documentation` | 🟡 Gelb | Dokumentation |
| `priority: high` | 🟠 Orange | Hohe Priorität |
| `priority: low` | ⚪ Grau | Niedrige Priorität |
| `wontfix` | ⚫ Schwarz | Wird nicht behoben |
### 9.3 Meilensteine
Meilensteine fassen Issues zu einem Ziel zusammen (z. B. Version 2.0):
1. **Issues****Meilensteine****Neuer Meilenstein**
2. Titel, Beschreibung und Fälligkeitsdatum festlegen
3. Issues dem Meilenstein zuweisen
4. Fortschritt wird automatisch berechnet
### 9.4 Projekte (Kanban-Board)
Gitea bietet integrierte Kanban-Boards:
1. **Repository** oder **Organisation****Projekte****Neues Projekt**
2. Board-Typ wählen (Kanban oder Tabelle)
3. Spalten erstellen (z. B. „Offen", „In Arbeit", „Review", „Fertig")
4. Issues per Drag-and-Drop verschieben
### 9.5 Referenzen in Commits
Issues können direkt aus Commits referenziert und geschlossen werden:
```bash
# Issue referenzieren
git commit -m "Login-Seite überarbeitet, siehe #42"
# Issue automatisch schließen
git commit -m "Login-Bug behoben, closes #42"
git commit -m "Fix: Absturz bei leerem Passwort, fixes #15"
```
Schlüsselwörter zum Schließen: `close`, `closes`, `closed`, `fix`, `fixes`, `fixed`, `resolve`, `resolves`, `resolved`
---
## 10. Pull Requests und Code-Review
### 10.1 Pull Request erstellen
1. Änderungen in einem Feature-Branch committen und pushen
2. In Gitea: **Neuer Pull Request**
3. **Quell-Branch****Ziel-Branch** (z. B. `feature/login``main`)
4. Titel und Beschreibung ausfüllen
5. Reviewer, Labels und Meilenstein zuweisen
6. **Pull Request erstellen**
### 10.2 Code-Review durchführen
Als Reviewer:
1. Pull Request öffnen → **Geänderte Dateien**
2. Zeilen kommentieren (auf das „+" neben der Zeilennummer klicken)
3. Review abschließen:
| Option | Beschreibung |
|---|---|
| **Kommentar** | Feedback ohne Freigabe/Ablehnung |
| **Freigabe** | Code ist in Ordnung, kann gemergt werden |
| **Änderungen angefordert** | Nachbesserung nötig |
### 10.3 Merge-Strategien
Gitea unterstützt verschiedene Merge-Methoden:
| Methode | Beschreibung | Ergebnis |
|---|---|---|
| **Merge Commit** | Erstellt einen Merge-Commit | Vollständige History, klar erkennbar |
| **Rebase** | Commits werden auf den Ziel-Branch umbasiert | Lineare History |
| **Squash** | Alle Commits werden zu einem zusammengefasst | Saubere History |
| **Rebase Merge** | Rebase + Merge-Commit | Kombination |
Die verfügbaren Methoden können pro Repository oder global konfiguriert werden:
```ini
; In app.ini
[repository.pull-request]
DEFAULT_MERGE_STYLE = merge
WORK_IN_PROGRESS_PREFIXES = WIP:,[WIP]
```
### 10.4 Automatische PR-Checks
Pull Requests können automatische Prüfungen erfordern:
- **CI/CD-Status** (Gitea Actions müssen erfolgreich sein)
- **Review-Freigaben** (mindestens X Freigaben)
- **Keine Konflikte** (Branch muss aktuell sein)
---
## 11. CI/CD mit Gitea Actions
### 11.1 Überblick
Gitea Actions ist ein integriertes CI/CD-System, das mit GitHub Actions kompatibel ist. Workflows werden in YAML-Dateien definiert und bei bestimmten Ereignissen ausgelöst.
### 11.2 Gitea Actions aktivieren
In `app.ini` (bereits in der Standardkonfiguration enthalten):
```ini
[actions]
ENABLED = true
DEFAULT_ACTIONS_URL = https://github.com
```
### 11.3 Runner registrieren
Gitea Actions benötigt einen separaten Runner, der die Workflows ausführt:
```bash
# act_runner herunterladen
RUNNER_VERSION="0.2.11"
wget -O /usr/local/bin/act_runner \
"https://dl.gitea.com/act_runner/${RUNNER_VERSION}/act_runner-${RUNNER_VERSION}-linux-amd64"
chmod +x /usr/local/bin/act_runner
# Runner registrieren (Token aus der Weboberfläche holen)
# Site-Administration → Runner → Registrierungstoken erstellen
act_runner register \
--instance https://git.example.de \
--token RUNNER_TOKEN_HIER \
--name "server-runner" \
--labels "ubuntu-latest:docker://node:20,self-hosted:host"
# Runner als Systemd-Service
sudo nano /etc/systemd/system/gitea-runner.service
```
```ini
[Unit]
Description=Gitea Actions Runner
After=network.target gitea.service
[Service]
Type=simple
User=gitea
WorkingDirectory=/var/lib/gitea
ExecStart=/usr/local/bin/act_runner daemon --config /var/lib/gitea/.runner
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
```
```bash
sudo systemctl daemon-reload
sudo systemctl enable gitea-runner
sudo systemctl start gitea-runner
```
### 11.4 Workflow-Datei erstellen
Workflow-Dateien liegen im Repository unter `.gitea/workflows/`:
```yaml
# .gitea/workflows/ci.yaml
name: CI Pipeline
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Code auschecken
uses: actions/checkout@v4
- name: Node.js einrichten
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Abhängigkeiten installieren
run: npm ci
- name: Tests ausführen
run: npm test
- name: Linting
run: npm run lint
build:
runs-on: ubuntu-latest
needs: test
steps:
- uses: actions/checkout@v4
- run: npm ci
- run: npm run build
```
### 11.5 Secrets verwalten
Secrets werden in der Weboberfläche konfiguriert:
1. **Repository****Einstellungen****Actions****Secrets**
2. **Neues Secret:** Name und Wert eingeben
3. Im Workflow verwenden:
```yaml
env:
API_KEY: ${{ secrets.API_KEY }}
```
---
## 12. Wiki-Funktion und Wiki.js-Anbindung
### 12.1 Integriertes Gitea-Wiki
Jedes Repository hat ein integriertes Wiki:
1. **Repository****Wiki****Neue Seite**
2. Inhalt in Markdown schreiben
3. **Speichern**
Das Wiki ist ein eigenes Git-Repository und kann auch lokal bearbeitet werden:
```bash
# Wiki-Repository klonen
git clone https://git.example.de/benutzer/mein-repo.wiki.git
# Seiten bearbeiten (Markdown-Dateien)
cd mein-repo.wiki
nano Startseite.md
# Änderungen pushen
git add .
git commit -m "Wiki aktualisiert"
git push
```
### 12.2 Wiki.js mit Gitea verbinden
Wiki.js kann ein Gitea-Repository als Speicher-Backend nutzen. So werden alle Wiki-Inhalte versioniert in Git gespeichert.
#### Schritt 1: Repository für Wiki.js erstellen
In Gitea ein neues Repository erstellen:
- **Name:** `wiki-content` (oder beliebig)
- **Sichtbarkeit:** Privat (empfohlen)
- **README initialisieren:** Ja
#### Schritt 2: Deploy Key oder Access Token erstellen
**Variante A: Access Token (empfohlen)**
1. In Gitea: **Benutzer-Einstellungen****Anwendungen****Zugriffstoken erstellen**
2. Name: `wiki-js-sync`
3. Berechtigungen: `repo` (Lesen/Schreiben)
4. Token kopieren und sicher aufbewahren
**Variante B: Deploy Key**
```bash
# SSH-Schlüssel auf dem Server generieren
sudo -u wiki ssh-keygen -t ed25519 -C "wiki-js" -f /home/wiki/.ssh/gitea_deploy
```
1. Repository → **Einstellungen****Deploy-Schlüssel****Hinzufügen**
2. Öffentlichen Schlüssel einfügen
3. **Schreibzugriff** aktivieren
#### Schritt 3: Wiki.js Git-Speicher konfigurieren
1. In Wiki.js: **Administration****Speicher****Git**
2. Konfiguration:
| Feld | Wert |
|---|---|
| Authentifizierungstyp | `basic` (für Token) oder `ssh` (für Deploy Key) |
| Repository-URL | `https://git.example.de/benutzer/wiki-content.git` |
| Branch | `main` |
| Benutzername | `wiki-js-sync` (oder der Gitea-Benutzername) |
| Passwort / Token | Der erstellte Access Token |
| Autoren-E-Mail | `wiki@example.de` |
| Autoren-Name | `Wiki.js` |
| SSL verifizieren | `Ja` (bei gültigem Zertifikat) |
3. **Synchronisierungsintervall:** `5 Minuten` (oder nach Bedarf)
4. **Speichern** und **Aktivieren**
#### Schritt 4: Synchronisierung prüfen
```bash
# Im Gitea-Repository sollten nach der ersten Synchronisierung Dateien erscheinen
# Jede Wiki-Seite wird als Markdown-Datei gespeichert
# Manuell prüfen:
cd /tmp
git clone https://git.example.de/benutzer/wiki-content.git
ls wiki-content/
```
#### Vorteile der Git-Anbindung
| Vorteil | Beschreibung |
|---|---|
| **Versionierung** | Jede Änderung wird als Git-Commit gespeichert |
| **Backup** | Wiki-Inhalte sind im Git-Repository gesichert |
| **Offline-Bearbeitung** | Inhalte können lokal bearbeitet und gepusht werden |
| **Mehrere Editoren** | Bearbeitung sowohl in Wiki.js als auch direkt in Git |
| **Review-Prozess** | Änderungen können über Pull Requests geprüft werden |
---
## 13. SSH-Zugang und Authentifizierung
### 13.1 SSH-Schlüssel hinzufügen
Jeder Benutzer kann SSH-Schlüssel in seinem Profil hinterlegen:
1. SSH-Schlüssel lokal erstellen (falls nicht vorhanden):
```bash
ssh-keygen -t ed25519 -C "benutzer@example.de"
cat ~/.ssh/id_ed25519.pub
```
2. In Gitea: **Einstellungen****SSH/GPG-Schlüssel****Schlüssel hinzufügen**
3. Öffentlichen Schlüssel einfügen und speichern
### 13.2 SSH-Verbindung testen
```bash
ssh -T git@git.example.de
# Erwartete Ausgabe: Hi benutzer! You've successfully authenticated...
```
### 13.3 SSH-Konfiguration (Client-Seite)
Bei nicht standardmäßigem Port oder mehreren Schlüsseln:
```bash
nano ~/.ssh/config
```
```
Host git.example.de
HostName git.example.de
Port 22
User git
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
```
### 13.4 GPG-Signierung
Commits können mit GPG signiert werden:
```bash
# GPG-Schlüssel erstellen
gpg --full-generate-key
# Öffentlichen Schlüssel exportieren
gpg --armor --export SCHLUESSEL_ID
# In Gitea: Einstellungen → SSH/GPG-Schlüssel → GPG-Schlüssel hinzufügen
# Git für Signierung konfigurieren
git config --global user.signingkey SCHLUESSEL_ID
git config --global commit.gpgsign true
```
Signierte Commits werden in Gitea mit einem grünen „Verifiziert"-Badge angezeigt.
---
## 14. Webhooks und Integrationen
### 14.1 Webhook erstellen
1. **Repository****Einstellungen****Webhooks****Webhook hinzufügen**
2. Webhook-Typ wählen:
| Typ | Beschreibung |
|---|---|
| **Gitea** | Standard-JSON-Format |
| **Slack** | Slack-kompatibles Format |
| **Discord** | Discord-kompatibles Format |
| **Telegram** | Telegram-Bot-Format |
| **Microsoft Teams** | Teams-kompatibles Format |
| **Feishu / DingTalk** | Chinesische Messenger |
| **Matrix** | Matrix-kompatibles Format |
| **Paketdienst** | Allgemeines JSON |
3. **Ziel-URL** eingeben
4. **Ereignisse** auswählen (Push, Pull Request, Issue etc.)
5. **Secret** festlegen (zur Verifizierung)
6. **Webhook hinzufügen**
### 14.2 Beispiel: Webhook an n8n
n8n kann Gitea-Webhooks empfangen und daraufhin Workflows auslösen:
1. In n8n: **Webhook-Node** erstellen → URL kopieren
2. In Gitea: Webhook mit der n8n-URL erstellen
3. Ereignisse wählen (z. B. Push, Pull Request)
Typische Automatisierungen:
- Bei Push: Automatisches Deployment auslösen
- Bei neuem Issue: Benachrichtigung in Slack/Teams
- Bei Pull Request: Automatische Code-Analyse starten
### 14.3 Webhook-Zustellung prüfen
In Gitea unter **Repository → Einstellungen → Webhooks → (Webhook auswählen)** können vergangene Zustellungen eingesehen werden, einschließlich Request/Response-Daten.
---
## 15. Pakete und Container Registry
### 15.1 Überblick
Gitea bietet eine integrierte Paket-Registry für verschiedene Formate:
| Format | Befehl | Anwendung |
|---|---|---|
| **Docker** | `docker push/pull` | Container-Images |
| **npm** | `npm publish` | JavaScript-Pakete |
| **PyPI** | `pip install` / `twine upload` | Python-Pakete |
| **Maven** | `mvn deploy` | Java-Pakete |
| **NuGet** | `dotnet nuget push` | .NET-Pakete |
| **Cargo** | `cargo publish` | Rust-Pakete |
| **Composer** | `composer require` | PHP-Pakete |
| **Generic** | HTTP Upload | Beliebige Dateien |
### 15.2 Docker-Registry verwenden
```bash
# Anmelden
docker login git.example.de
# Image taggen
docker tag mein-image:latest git.example.de/benutzer/mein-image:latest
# Image pushen
docker push git.example.de/benutzer/mein-image:latest
# Image pullen
docker pull git.example.de/benutzer/mein-image:latest
```
### 15.3 npm-Registry verwenden
```bash
# .npmrc konfigurieren
echo "@scope:registry=https://git.example.de/api/packages/benutzer/npm/
//git.example.de/api/packages/benutzer/npm/:_authToken=DEIN_TOKEN" > .npmrc
# Paket veröffentlichen
npm publish
```
### 15.4 Generic-Pakete (beliebige Dateien)
```bash
# Datei hochladen
curl -X PUT \
-H "Authorization: token DEIN_TOKEN" \
--upload-file ./build.zip \
"https://git.example.de/api/packages/benutzer/generic/mein-paket/1.0.0/build.zip"
# Datei herunterladen
curl -o build.zip \
"https://git.example.de/api/packages/benutzer/generic/mein-paket/1.0.0/build.zip"
```
---
## 16. Datensicherung und Wiederherstellung
### 16.1 Was wird gesichert?
| Komponente | Speicherort | Methode |
|---|---|---|
| **PostgreSQL-Datenbank** | PostgreSQL | `pg_dump` |
| **Git-Repositories** | `/var/lib/gitea/repositories` | Dateisystem |
| **LFS-Daten** | `/var/lib/gitea/data/lfs` | Dateisystem |
| **Anhänge** | `/var/lib/gitea/data/attachments` | Dateisystem |
| **Avatare** | `/var/lib/gitea/data/avatars` | Dateisystem |
| **Konfiguration** | `/etc/gitea/app.ini` | Dateisystem |
| **Log-Dateien** | `/var/lib/gitea/log` | Optional |
### 16.2 Gitea-internes Backup (gitea dump)
Gitea bietet einen eingebauten Backup-Befehl:
```bash
# Vollständiges Backup erstellen
sudo -u gitea gitea dump \
--config /etc/gitea/app.ini \
--type tar.gz \
--file /backup/gitea/gitea-dump-$(date +%Y%m%d).tar.gz
```
Der Dump enthält:
- Datenbank-Export (SQL)
- Repositories
- Konfiguration
- Log-Dateien (optional)
### 16.3 Manuelles Backup (empfohlen)
Für mehr Kontrolle:
```bash
#!/bin/bash
# /opt/scripts/gitea-backup.sh
set -e
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backup/gitea"
KEEP_DAYS=30
mkdir -p "$BACKUP_DIR"
echo "[$(date)] Gitea-Backup gestartet..."
# 1. PostgreSQL-Datenbank sichern
sudo -u postgres pg_dump -Fc gitea > "${BACKUP_DIR}/db_${TIMESTAMP}.dump"
# 2. Repositories sichern
tar -czf "${BACKUP_DIR}/repos_${TIMESTAMP}.tar.gz" \
-C /var/lib/gitea repositories/
# 3. Daten sichern (LFS, Anhänge, Avatare etc.)
tar -czf "${BACKUP_DIR}/data_${TIMESTAMP}.tar.gz" \
-C /var/lib/gitea/data \
lfs/ attachments/ avatars/ 2>/dev/null || true
# 4. Konfiguration sichern
cp /etc/gitea/app.ini "${BACKUP_DIR}/app.ini_${TIMESTAMP}"
# 5. Alte Backups löschen
find "$BACKUP_DIR" -name "*.dump" -mtime +$KEEP_DAYS -delete
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +$KEEP_DAYS -delete
find "$BACKUP_DIR" -name "app.ini_*" -mtime +$KEEP_DAYS -delete
echo "[$(date)] Gitea-Backup abgeschlossen."
```
```bash
sudo chmod +x /opt/scripts/gitea-backup.sh
```
### 16.4 Automatisches Backup (Cronjob)
```bash
sudo nano /etc/cron.d/gitea-backup
```
```cron
# Tägliches Backup um 02:30 Uhr
30 2 * * * root /opt/scripts/gitea-backup.sh >> /var/log/gitea-backup.log 2>&1
```
### 16.5 Wiederherstellung
```bash
# 1. Gitea stoppen
sudo systemctl stop gitea
# 2. Datenbank wiederherstellen
sudo -u postgres dropdb gitea
sudo -u postgres createdb -O gitea_user gitea
sudo -u postgres pg_restore -d gitea /backup/gitea/db_YYYYMMDD_HHMMSS.dump
# 3. Repositories wiederherstellen
sudo tar -xzf /backup/gitea/repos_YYYYMMDD_HHMMSS.tar.gz \
-C /var/lib/gitea/
# 4. Daten wiederherstellen
sudo tar -xzf /backup/gitea/data_YYYYMMDD_HHMMSS.tar.gz \
-C /var/lib/gitea/data/
# 5. Konfiguration wiederherstellen
sudo cp /backup/gitea/app.ini_YYYYMMDD_HHMMSS /etc/gitea/app.ini
# 6. Berechtigungen setzen
sudo chown -R gitea:gitea /var/lib/gitea
sudo chmod 640 /etc/gitea/app.ini
# 7. Gitea starten
sudo systemctl start gitea
# 8. Git-Repositories regenerieren (falls nötig)
sudo -u gitea gitea admin repo-sync-releases --config /etc/gitea/app.ini
```
---
## 17. Wartung und Updates
### 17.1 Gitea aktualisieren
```bash
# 1. Aktuelle Version prüfen
gitea --version
# 2. Backup erstellen (siehe Abschnitt 16)
/opt/scripts/gitea-backup.sh
# 3. Gitea stoppen
sudo systemctl stop gitea
# 4. Neue Version herunterladen
GITEA_VERSION="1.22.6" # Durch aktuelle Version ersetzen
sudo wget -O /usr/local/bin/gitea \
"https://dl.gitea.com/gitea/${GITEA_VERSION}/gitea-${GITEA_VERSION}-linux-amd64"
sudo chmod +x /usr/local/bin/gitea
# 5. Gitea starten (Datenbank-Migration erfolgt automatisch)
sudo systemctl start gitea
# 6. Logs prüfen
sudo journalctl -u gitea --no-pager -n 50
# 7. Version bestätigen
gitea --version
```
> **Wichtig:** Immer die Release Notes lesen, bevor ein Update durchgeführt wird. Manche Versionen erfordern manuelle Migrationsschritte.
### 17.2 Gesundheitscheck (Doctor)
Gitea hat ein eingebautes Diagnose-Tool:
```bash
# Vollständigen Check durchführen
sudo -u gitea gitea doctor check --config /etc/gitea/app.ini
# Nur bestimmte Checks
sudo -u gitea gitea doctor check --config /etc/gitea/app.ini --run check-db-consistency
# Automatische Reparatur
sudo -u gitea gitea doctor check --config /etc/gitea/app.ini --fix
```
Verfügbare Checks:
| Check | Beschreibung |
|---|---|
| `check-db-consistency` | Datenbank-Konsistenz prüfen |
| `check-repo-stats` | Repository-Statistiken aktualisieren |
| `check-db-collation` | Datenbank-Zeichensatz prüfen |
### 17.3 Git-Repositories optimieren
```bash
# Alle Repositories aufräumen (git gc)
sudo -u gitea gitea admin repo-sync-releases --config /etc/gitea/app.ini
# Einzelnes Repository manuell optimieren
cd /var/lib/gitea/repositories/benutzer/repo.git
sudo -u gitea git gc --aggressive --prune=now
```
### 17.4 Suchindex neu aufbauen
```bash
# Issue-Index neu aufbauen
sudo -u gitea gitea admin regenerate hooks --config /etc/gitea/app.ini
# Code-Index neu aufbauen (bei aktiviertem Repo-Indexer)
# Indexer-Verzeichnis leeren und Gitea neu starten
sudo systemctl stop gitea
sudo rm -rf /var/lib/gitea/data/indexers/repos.bleve
sudo systemctl start gitea
```
### 17.5 Logdateien verwalten
```bash
# Aktuelle Logs anzeigen
sudo tail -f /var/lib/gitea/log/gitea.log
# Systemd-Journal
sudo journalctl -u gitea -f
# Logrotate konfigurieren
sudo nano /etc/logrotate.d/gitea
```
```
/var/lib/gitea/log/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
copytruncate
}
```
---
## 18. Sicherheitshärtung
### 18.1 Checkliste
- [ ] **Installer gesperrt** (`INSTALL_LOCK = true` in `app.ini`)
- [ ] **HTTPS erzwungen** (Reverse Proxy mit SSL)
- [ ] **Offene Registrierung deaktiviert** (oder Domain-Whitelist)
- [ ] **Starke Passwort-Richtlinien** (`MIN_PASSWORD_LENGTH`, `PASSWORD_COMPLEXITY`)
- [ ] **2FA aktiviert** (mindestens für Administratoren)
- [ ] **SSH-Schlüssel statt Passwörter** für Git-Zugriff
- [ ] **Branch-Schutzregeln** auf `main`-Branch
- [ ] **Regelmäßige Backups** konfiguriert und getestet
- [ ] **Gitea aktuell halten** (Sicherheitsupdates)
- [ ] **Firewall konfiguriert** (nur Ports 22, 80, 443 öffentlich)
- [ ] **Admin-Bereich geschützt** (starkes Passwort, 2FA)
- [ ] **Cookie-Sicherheit** (`COOKIE_SECURE = true`)
- [ ] **Passwort-Leak-Prüfung** (`PASSWORD_CHECK_PWN = true`)
### 18.2 Sicherheitsrelevante app.ini-Einstellungen
```ini
[security]
INSTALL_LOCK = true
MIN_PASSWORD_LENGTH = 12
PASSWORD_COMPLEXITY = lower,upper,digit,spec
PASSWORD_CHECK_PWN = true
SECRET_KEY = AUTOMATISCH_GENERIERT
[service]
DISABLE_REGISTRATION = true
REGISTER_EMAIL_CONFIRM = true
REQUIRE_SIGNIN_VIEW = false
DEFAULT_KEEP_EMAIL_PRIVATE = true
ENABLE_CAPTCHA = true
[session]
COOKIE_SECURE = true
COOKIE_NAME = gitea_session
SAME_SITE = strict
[server]
LANDING_PAGE = explore
```
### 18.3 Fail2Ban für Gitea
```bash
sudo nano /etc/fail2ban/filter.d/gitea.conf
```
```ini
[Definition]
failregex = .*Failed authentication attempt for .* from <HOST>
ignoreregex =
```
```bash
sudo nano /etc/fail2ban/jail.d/gitea.local
```
```ini
[gitea]
enabled = true
port = http,https
filter = gitea
logpath = /var/lib/gitea/log/gitea.log
maxretry = 5
bantime = 3600
findtime = 600
```
```bash
sudo systemctl restart fail2ban
```
### 18.4 Rate Limiting
In `app.ini`:
```ini
[api]
MAX_RESPONSE_ITEMS = 50
[service]
ENABLE_CAPTCHA = true
CAPTCHA_TYPE = image
```
---
## 19. Fehlerbehebung
### 19.1 Gitea startet nicht
```bash
# Service-Status prüfen
sudo systemctl status gitea
# Ausführliche Logs
sudo journalctl -u gitea --no-pager -n 100
# Konfiguration prüfen
sudo -u gitea gitea doctor check --config /etc/gitea/app.ini
# Häufige Ursachen:
# - Datenbankverbindung fehlgeschlagen → PostgreSQL-Status prüfen
# - Port bereits belegt → sudo ss -tlnp | grep 3000
# - Berechtigungsfehler → sudo chown -R gitea:gitea /var/lib/gitea
```
### 19.2 Datenbankverbindungsfehler
```bash
# PostgreSQL-Status prüfen
sudo systemctl status postgresql
# Verbindung manuell testen
psql -h 127.0.0.1 -U gitea_user -d gitea
# Häufige Ursachen:
# - Falsches Passwort in app.ini
# - pg_hba.conf erlaubt die Verbindung nicht
# - PostgreSQL hört nicht auf localhost
```
### 19.3 Git Push / Pull schlägt fehl
| Problem | Lösung |
|---|---|
| `Permission denied (publickey)` | SSH-Schlüssel in Gitea hinterlegen |
| `fatal: repository not found` | URL prüfen, Zugriffsrechte prüfen |
| `remote: error: pack exceeds maximum allowed size` | `client_max_body_size` in Nginx erhöhen |
| `error: RPC failed; HTTP 413` | Upload-Limit im Reverse Proxy erhöhen |
| `fatal: early EOF` | Netzwerkproblem, HTTP-Puffer vergrößern |
Nginx HTTP-Puffer vergrößern:
```nginx
# In der server-Konfiguration
proxy_buffering off;
proxy_request_buffering off;
client_max_body_size 1G;
```
### 19.4 Speicherplatz knapp
```bash
# Gitea-Datenverbrauch prüfen
sudo du -sh /var/lib/gitea/repositories/
sudo du -sh /var/lib/gitea/data/
sudo du -sh /var/lib/gitea/log/
# Datenbank-Größe
sudo -u postgres psql -c "SELECT pg_size_pretty(pg_database_size('gitea'));"
# Git-Repositories aufräumen
cd /var/lib/gitea/repositories/benutzer/repo.git
sudo -u gitea git gc --aggressive --prune=now
# Alte Logs löschen
sudo find /var/lib/gitea/log -name "*.log" -mtime +30 -delete
```
### 19.5 Wiki.js-Synchronisierung funktioniert nicht
```bash
# Git-Zugang prüfen
sudo -u wiki git ls-remote https://git.example.de/benutzer/wiki-content.git
# Häufige Ursachen:
# - Token abgelaufen → Neuen Token erstellen
# - Repository umbenannt → URL in Wiki.js aktualisieren
# - Netzwerkfehler → DNS und Firewall prüfen
# - SSL-Fehler → Zertifikat prüfen
# Wiki.js-Logs prüfen
sudo journalctl -u wiki-js --no-pager -n 50
```
### 19.6 E-Mail-Versand funktioniert nicht
```bash
# SMTP-Konfiguration in app.ini prüfen
grep -A 10 "\[mailer\]" /etc/gitea/app.ini
# Test-E-Mail über die API senden
curl -X POST "https://git.example.de/api/v1/admin/sendmail" \
-H "Authorization: token ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"subject":"Test","text":"Testmail","to":["admin@example.de"]}'
# Gitea-Logs auf SMTP-Fehler prüfen
grep -i "mail\|smtp" /var/lib/gitea/log/gitea.log | tail -20
```
---
## 20. Schnellreferenz Befehle auf einen Blick
### Systemd-Dienstverwaltung
```bash
sudo systemctl start gitea # Starten
sudo systemctl stop gitea # Stoppen
sudo systemctl restart gitea # Neustarten
sudo systemctl status gitea # Status prüfen
sudo systemctl enable gitea # Autostart aktivieren
sudo journalctl -u gitea -f # Live-Logs
```
### Gitea-Administration (CLI)
```bash
# Benutzer
sudo -u gitea gitea admin user list --config /etc/gitea/app.ini
sudo -u gitea gitea admin user create --config /etc/gitea/app.ini \
--username NAME --password PASS --email MAIL
sudo -u gitea gitea admin user change-password --config /etc/gitea/app.ini \
--username NAME --password NEUES_PASS
# Diagnose
sudo -u gitea gitea doctor check --config /etc/gitea/app.ini
sudo -u gitea gitea doctor check --config /etc/gitea/app.ini --fix
# Backup
sudo -u gitea gitea dump --config /etc/gitea/app.ini \
--type tar.gz --file /backup/gitea-dump.tar.gz
# Regenerieren
sudo -u gitea gitea admin regenerate hooks --config /etc/gitea/app.ini
sudo -u gitea gitea admin repo-sync-releases --config /etc/gitea/app.ini
```
### Häufige Git-Befehle
```bash
# Klonen
git clone git@git.example.de:benutzer/repo.git
git clone https://git.example.de/benutzer/repo.git
# Täglicher Workflow
git pull # Aktuelle Änderungen holen
git checkout -b feature/xyz # Feature-Branch erstellen
git add . # Änderungen stagen
git commit -m "Beschreibung" # Committen
git push -u origin feature/xyz # Pushen
# Nützlich
git status # Aktueller Status
git log --oneline -20 # Letzte 20 Commits
git diff # Änderungen anzeigen
git stash # Änderungen zwischenspeichern
git stash pop # Zwischengespeichertes wiederherstellen
```
### Gitea-API (Beispiele)
```bash
# Token: Einstellungen → Anwendungen → Zugriffstoken
# Repositories auflisten
curl -s -H "Authorization: token DEIN_TOKEN" \
"https://git.example.de/api/v1/user/repos" | jq '.[].full_name'
# Neues Repository erstellen
curl -X POST -H "Authorization: token DEIN_TOKEN" \
-H "Content-Type: application/json" \
"https://git.example.de/api/v1/user/repos" \
-d '{"name":"neues-repo","private":false,"auto_init":true}'
# Issues auflisten
curl -s -H "Authorization: token DEIN_TOKEN" \
"https://git.example.de/api/v1/repos/benutzer/repo/issues" | jq '.[].title'
```
### Wichtige Dateipfade
```
/usr/local/bin/gitea # Gitea-Binärdatei
/etc/gitea/app.ini # Hauptkonfiguration
/var/lib/gitea/ # Arbeitsverzeichnis
├── repositories/ # Git-Repositories
├── data/
│ ├── lfs/ # Git LFS-Objekte
│ ├── attachments/ # Issue-/Release-Anhänge
│ ├── avatars/ # Benutzer-Avatare
│ ├── sessions/ # Sitzungsdaten
│ ├── indexers/ # Suchindizes
│ └── packages/ # Paket-Registry-Daten
├── custom/ # Eigene Templates/Logos
└── log/ # Logdateien
/home/gitea/ # Home-Verzeichnis des Systembenutzers
└── .ssh/ # SSH-Schlüssel (authorized_keys)
```
### Wichtige URLs
```
Weboberfläche: https://git.example.de
API-Dokumentation: https://git.example.de/api/swagger
Admin-Bereich: https://git.example.de/-/admin
Benutzer-Settings: https://git.example.de/user/settings
```
---
> **Letzte Aktualisierung:** *24.02.2026*
> **Autor:** *Administrator*
> **Version:** 1.0