{"id":31820,"date":"2026-06-18T08:14:00","date_gmt":"2026-06-18T06:14:00","guid":{"rendered":"https:\/\/contabo.com\/blog\/?p=31820"},"modified":"2026-06-23T12:11:42","modified_gmt":"2026-06-23T10:11:42","slug":"gitea-vps-docker-selbst-hosten","status":"publish","type":"post","link":"https:\/\/contabo.com\/blog\/de\/gitea-vps-docker-selbst-hosten\/","title":{"rendered":"Gitea auf einem VPS mit Docker selbst hosten (2026)"},"content":{"rendered":"\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1200\" height=\"630\" src=\"https:\/\/contabo.com\/blog\/wp-content\/uploads\/2026\/06\/blog-head_how2-self-host-gitea-on-a-vps_DE.webp\" alt=\"Gitea auf einem VPS mit Docker selbst hosten (2026) (Titelbild)\" class=\"wp-image-31452\" srcset=\"https:\/\/contabo.com\/blog\/wp-content\/uploads\/2026\/06\/blog-head_how2-self-host-gitea-on-a-vps_DE.webp 1200w, https:\/\/contabo.com\/blog\/wp-content\/uploads\/2026\/06\/blog-head_how2-self-host-gitea-on-a-vps_DE-600x315.webp 600w, https:\/\/contabo.com\/blog\/wp-content\/uploads\/2026\/06\/blog-head_how2-self-host-gitea-on-a-vps_DE-768x403.webp 768w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/figure>\n\n\n\n<p>Jedes Team erreicht diesen Punkt. Eine Plattform \u00e4ndert ihre Preise, schr\u00e4nkt private Repositories ein oder wird schlicht mehr zur Last als zum Gewinn. Einen eigenen Git-Server zu betreiben bedeutete fr\u00fcher wochenlanges Setup und eine feste Ops-Stelle f\u00fcr die Wartung. Mit Docker und einem preiswerten VPS ist es heute eine Sache von einem Nachmittag.<\/p>\n\n\n\n<p>Wenn du deinen Git-Server auf einem VPS selbst hostest, bekommst du volle Hoheit \u00fcber deinen Code, keine Abrechnung pro Sitzplatz und keinen Zugriff Dritter auf deine Repositories. F\u00fcr einen einzelnen Entwickler oder ein kleines Team ist diese Kombination schwer zu schlagen. Gitea macht das praktikabel: Es ist eine vollst\u00e4ndige Git-Hosting-Plattform, die auf bescheidener Hardware problemlos l\u00e4uft, den kompletten Code-Review-Workflow abdeckt und in unter einer Stunde von null auf HTTPS steht.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-was-ist-gitea\">Was ist Gitea?<\/h2>\n\n\n\n<p><a href=\"https:\/\/about.gitea.com\" rel=\"nofollow\">Gitea<\/a> ist ein quelloffener, selbstgehosteter Git-Dienst, geschrieben in Go. Das Projekt startete 2016 als Fork von Gogs und ist zu einer voll ausgestatteten Plattform f\u00fcr Repositories, Pull Requests, Issues, Wikis, Webhooks und eine integrierte Package Registry herangewachsen. Die Weboberfl\u00e4che \u00e4hnelt GitHub so weit, dass Entwickler auf der Suche nach einer selbstgehosteten GitHub-Alternative sich vom ersten Tag an zurechtfinden.<\/p>\n\n\n\n<p>Die Go-Runtime h\u00e4lt die Binary klein und den Speicherverbrauch niedrig. Laut Systemanforderungen reicht 1 GB RAM f\u00fcr kleine Teams und Projekte in der Regel aus. Genau das macht Gitea f\u00fcr einen kleinen VPS geeignet statt f\u00fcr eine dedizierte Maschine.<\/p>\n\n\n\n<p><a href=\"https:\/\/forgejo.org\" rel=\"nofollow\">Forgejo<\/a> ist ein aktiv gepflegter Community-Fork von Gitea, entstanden 2022, als Bedenken zur Governance des Projekts aufkamen. Beide teilen sich dieselbe Codebasis und Docker-Image-Struktur, sodass das in dieser Anleitung beschriebene Setup f\u00fcr beide gilt. Falls du dich noch nicht entschieden hast: Die FAQ am Ende geht genauer auf die Unterschiede ein.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-warum-gitea-auf-einem-vps-selbst-hosten\">Warum Gitea auf einem VPS selbst hosten?<\/h2>\n\n\n\n<p>Die Hauptgr\u00fcnde, warum Entwickler Gitea selbst hosten, haben sich nicht ge\u00e4ndert. Sie kommen aber h\u00e4ufiger zur Sprache, seit die meisten gehosteten Plattformen auf Abrechnung pro Sitzplatz umgestellt haben:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Code-Hoheit<\/strong>. Die Repositories liegen auf deinem Server. Kein Anbieter kann dein Konto l\u00f6schen, private Repositories einschr\u00e4nken oder dir das Preismodell unter den F\u00fc\u00dfen wegziehen.<\/li>\n\n\n\n<li><strong>Keine Kosten pro Platz<\/strong>. Ob 3 Nutzer oder 30: Die monatliche Rechnung bleibt gleich, n\u00e4mlich das, was dein VPS kostet. Bei wenigen Euro pro Monat f\u00fcr einen <a href=\"https:\/\/contabo.com\/de\/vps\/\">Einsteiger-VPS von Contabo<\/a> geht die Rechnung schnell zugunsten des Selbsthostens auf, sobald du mehr als zwei oder drei aktive Mitwirkende hast.<\/li>\n\n\n\n<li><strong>Schlank von Grund auf<\/strong>. Gitea l\u00e4uft auf Hardware, mit der schwerere Plattformen zu k\u00e4mpfen h\u00e4tten. Ein kleiner VPS bew\u00e4ltigt den t\u00e4glichen Push-und-Pull-Betrieb eines echten Teams ohne M\u00fche.<\/li>\n\n\n\n<li><strong>Datenstandort<\/strong>. Wenn dein Team oder deine Kunden verlangen, dass der Code innerhalb der EU bleibt, erf\u00fcllt Contabo diese Anforderung ohne Aufpreis. Es gibt keine separate &#8222;DSGVO-konforme Stufe&#8220;, f\u00fcr die du extra zahlst.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-voraussetzungen\">Voraussetzungen<\/h2>\n\n\n\n<p>Bevor du loslegst, stelle sicher, dass du f\u00fcr ein Gitea-Docker-Setup Folgendes hast:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Einen VPS mit Ubuntu 22.04 oder 24.04 \u2013 ein Einsteiger-VPS von Contabo reicht f\u00fcr die meisten Teams<\/li>\n\n\n\n<li>Docker und Docker Compose installiert \u2013 folge unserer <a href=\"https:\/\/contabo.com\/blog\/how-to-install-docker-on-ubuntu-step-by-step-guide\/\">Docker-Installationsanleitung f\u00fcr Ubuntu<\/a> oder nutze einfach das Docker-Add-On f\u00fcr deinen VPS bei Contabo<\/li>\n\n\n\n<li>Eine Domain oder Subdomain mit einem A-Record, der auf die IP-Adresse deines VPS zeigt (f\u00fcr HTTPS in Schritt 4 n\u00f6tig)<\/li>\n\n\n\n<li>Root- oder sudo-SSH-Zugriff auf den Server<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-schritt-1-vps-vorbereiten-und-docker-installieren\">Schritt 1: VPS vorbereiten und Docker installieren<\/h2>\n\n\n\n<p>Bestell einen VPS auf der <a href=\"https:\/\/contabo.com\/de\/vps\/\">Contabo VPS-Seite<\/a>. Erstelle ein sicheres Passwort und bewahre es gut auf. Deine IP-Adresse und weitere Informationen findest du in deiner &#8222;Ihre Logindaten!&#8220;-Mail, die du nach der Bestellung erh\u00e4ltst.<\/p>\n\n\n\n<p>Melde dich per SSH an:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh root@YOUR_SERVER_IP<\/code><\/pre>\n\n\n\n<p>Aktualisiere alle Pakete, bevor du irgendetwas anderes machst:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apt update &amp;&amp; apt upgrade -y<\/code><\/pre>\n\n\n\n<p>Stelle sicher, dass Docker f\u00fcr das Gitea-Docker-Setup installiert ist. Bei Contabo w\u00e4hlst du beim Checkout einfach das Docker-Add-On, das den VPS bereits mit installiertem und konfiguriertem Docker bereitstellt. Beide Wege f\u00fchren am Ende zur selben funktionierenden Docker Engine, nur mit unterschiedlichem Aufwand und Timing. Pr\u00fcfe die Versionen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker --version\ndocker compose version\nsudo systemctl status docker<\/code><\/pre>\n\n\n\n<p>Lege ein eigenes Verzeichnis f\u00fcr den Gitea-Stack an:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir -p \/opt\/gitea &amp;&amp; cd \/opt\/gitea<\/code><\/pre>\n\n\n\n<p>Halte die Installation in <code>\/opt\/gitea<\/code>, damit Volumes, Compose-Dateien und alle k\u00fcnftigen Konfigurations\u00e4nderungen an einem Ort liegen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-schritt-2-gitea-docker-compose-yml-mit-postgresql\">Schritt 2: Gitea docker-compose.yml mit PostgreSQL<\/h2>\n\n\n\n<p>SQLite funktioniert f\u00fcr sehr kleine Setups, aber PostgreSQL ist die richtige Wahl f\u00fcr alles, was ein Team betrifft. Es verarbeitet gleichzeitige Schreibvorg\u00e4nge sauber und macht Backups unkompliziert.<\/p>\n\n\n\n<p>Bevor du den Befehl unten ausf\u00fchrst, ersetze zwei Werte:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Beide Vorkommen von <code>changeme<\/code> durch ein echtes Passwort<\/li>\n\n\n\n<li>Beide Vorkommen von <code>git.yourdomain.com<\/code> durch deine tats\u00e4chliche Domain<\/li>\n<\/ul>\n\n\n\n<p>F\u00fcge dann den gesamten Block f\u00fcr die Gitea-Installation in einem Rutsch in dein Server-Terminal ein:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/opt\/gitea\/docker-compose.yml &lt;&lt; 'EOF'\nservices:\n  db:\n    image: postgres:16\n    restart: always\n    environment:\n      POSTGRES_USER: gitea\n      POSTGRES_PASSWORD: changeme\n      POSTGRES_DB: gitea\n    volumes:\n      - postgres_data:\/var\/lib\/postgresql\/data\n    networks:\n      - gitea_net\n\n  gitea:\n    image: gitea\/gitea:latest\n    restart: always\n    depends_on:\n      - db\n    environment:\n      - USER_UID=1000\n      - USER_GID=1000\n      - GITEA__database__DB_TYPE=postgres\n      - GITEA__database__HOST=db:5432\n      - GITEA__database__NAME=gitea\n      - GITEA__database__USER=gitea\n      - GITEA__database__PASSWD=changeme\n      - GITEA__server__ROOT_URL=https:\/\/git.yourdomain.com\n      - GITEA__server__SSH_DOMAIN=git.yourdomain.com\n      - GITEA__server__SSH_PORT=222\n    ports:\n      - \"127.0.0.1:3000:3000\"\n      - \"222:22\"\n    volumes:\n      - gitea_data:\/data\n      - \/etc\/timezone:\/etc\/timezone:ro\n      - \/etc\/localtime:\/etc\/localtime:ro\n    networks:\n      - gitea_net\n\nnetworks:\n  gitea_net:\n\nvolumes:\n  postgres_data:\n  gitea_data:\nEOF<\/code><\/pre>\n\n\n\n<p>Der Befehl erstellt die Datei stillschweigend und bringt dich ohne Best\u00e4tigungsmeldung zur\u00fcck zum Prompt \u2013 das ist normal. Pr\u00fcfe, ob die Datei korrekt geschrieben wurde:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat \/opt\/gitea\/docker-compose.yml<\/code><\/pre>\n\n\n\n<p>Die Ausgabe sollte das vollst\u00e4ndige YAML mit deinem Passwort und deiner Domain zeigen. Sobald das passt, geht es weiter mit Schritt 3 deines Gitea-Setups.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-schritt-3-erstkonfiguration-und-admin-konto\">Schritt 3: Erstkonfiguration und Admin-Konto<\/h2>\n\n\n\n<p>1. Starte den Stack im Detached-Modus:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker compose up -d<\/code><\/pre>\n\n\n\n<p>2. Warte etwa 10 Sekunden und best\u00e4tige dann, dass beide Container laufen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker compose ps<\/code><\/pre>\n\n\n\n<p>Sowohl <code>db<\/code> als auch <code>gitea<\/code> sollten den Status \u201erunning&#8220; zeigen. Falls <code>gitea<\/code> neu startet, pr\u00fcfe die Logs mit <code>docker compose logs gitea<\/code> \u2013 ein Datenbankverbindungsfehler an dieser Stelle bedeutet meist, dass die beiden <code>changeme<\/code>-Passw\u00f6rter in deiner Compose-Datei nicht \u00fcbereinstimmen.<\/p>\n\n\n\n<p>3. \u00d6ffne <code>http:\/\/YOUR_SERVER_IP:3000<\/code> in deinem Browser. Der Gitea-Setup-Assistent l\u00e4dt beim ersten Aufruf.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Bevor du den Assistenten \u00f6ffnest, \u00e4ndere <code>ROOT_URL<\/code> in deiner <code>docker-compose.yml<\/code> vor\u00fcbergehend auf deine Server-IP:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>GITEA__server__ROOT_URL=http:\/\/YOUR_SERVER_IP:3000<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Starte den Container neu und \u00f6ffne dann den Assistenten. In Schritt 4 stellst du das auf deine echte Domain um, sobald nginx steht.<\/li>\n<\/ul>\n\n\n\n<p>4. Die Datenbankfelder sollten bereits deine Compose-Datei widerspiegeln. Scrolle zum Abschnitt <strong>Administrator Account Settings<\/strong> ganz unten und lege Benutzernamen, E-Mail-Adresse und Passwort f\u00fcr den ersten Admin-Nutzer fest.<\/p>\n\n\n\n<p>5. Klicke auf <strong>Install Gitea<\/strong>. Gitea schreibt die Konfiguration, initialisiert die Datenbank und leitet dich zur Login-Seite weiter.<\/p>\n\n\n\n<p>6. Melde dich mit dem Benutzernamen genau so an, wie du ihn eingegeben hast \u2013 Gitea unterscheidet Gro\u00df- und Kleinschreibung, <code>Admin<\/code> und <code>admin<\/code> sind also verschieden. Beim ersten Login fordert Gitea dich auf, dein Passwort zu aktualisieren. Mach das, und du landest auf dem Dashboard.<\/p>\n\n\n\n<p>Sobald du auf dem Dashboard bist, setze das Port-Binding in deiner <code>docker-compose.yml<\/code> wieder auf <code>127.0.0.1:3000:3000<\/code> zur\u00fcck und starte den Container neu, bevor du zu Schritt 4 \u00fcbergehst:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker compose up -d gitea<\/code><\/pre>\n\n\n\n<p>Damit schlie\u00dft du den direkten Zugriff auf Port 3000 und bereitest Gitea darauf vor, hinter nginx zu laufen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-schritt-4-reverse-proxy-und-https-hinzufugen\">Schritt 4: Reverse Proxy und HTTPS hinzuf\u00fcgen<\/h2>\n\n\n\n<p>Mit laufendem Gitea folgt als N\u00e4chstes das Einrichten eines Reverse Proxy f\u00fcr Gitea per nginx mit einem TLS-Zertifikat von Let&#8217;s Encrypt. So bekommst du eine echte <code>https:\/\/<\/code>-Adresse und schlie\u00dft den direkten Zugriff auf Port 3000.<\/p>\n\n\n\n<p>Du brauchst eine Domain oder Subdomain, die auf deine Server-IP zeigt, bevor es weitergeht. Falls du eine neue Domain ben\u00f6tigst, gibt es hier eine Schritt-f\u00fcr-Schritt-Anleitung, um <a href=\"https:\/\/help.contabo.com\/de\/support\/solutions\/articles\/103000271134-kann-ich-eine-neue-domain-bei-contabo-kaufen-\">eine Domain bei Contabo zu bekommen<\/a>.<\/p>\n\n\n\n<p><strong>Installiere nginx und Certbot:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apt install nginx certbot python3-certbot-nginx -y<\/code><\/pre>\n\n\n\n<p><strong>Hol dir ein TLS-Zertifikat:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>certbot --nginx -d your.domain.com<\/code><\/pre>\n\n\n\n<p>Certbot fragt nach einer E-Mail-Adresse und bittet dich, den Nutzungsbedingungen zuzustimmen. Falls es nach einer Weiterleitung von HTTP auf HTTPS fragt, w\u00e4hle Option 2. Bei Erfolg siehst du die best\u00e4tigten Zertifikatspfade in der Ausgabe.<\/p>\n\n\n\n<p><strong>Erstelle die nginx-Konfiguration f\u00fcr Gitea:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/nginx\/sites-available\/gitea &lt;&lt; 'EOF'\nserver {\n    listen 80;\n    server_name your.domain.com;\n    return 301 https:\/\/$host$request_uri;\n}\n\nserver {\n    listen 443 ssl;\n    server_name your.domain.com;\n\n    ssl_certificate \/etc\/letsencrypt\/live\/your.domain.com\/fullchain.pem;\n    ssl_certificate_key \/etc\/letsencrypt\/live\/your.domain.com\/privkey.pem;\n    ssl_protocols TLSv1.2 TLSv1.3;\n\n    client_max_body_size 512M;\n\n    location \/ {\n        proxy_pass http:\/\/127.0.0.1:3000;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n    }\n}\nEOF<\/code><\/pre>\n\n\n\n<p>Aktiviere sie, entferne die Default-Site und lade nginx neu:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ln -s \/etc\/nginx\/sites-available\/gitea \/etc\/nginx\/sites-enabled\/\nrm \/etc\/nginx\/sites-enabled\/default\nnginx -t &amp;&amp; systemctl reload nginx<\/code><\/pre>\n\n\n\n<p><strong>Stelle Gitea auf deine Domain um:<\/strong><\/p>\n\n\n\n<p>\u00d6ffne deine <code>docker-compose.yml<\/code> und \u00e4ndere diese beiden Zeilen auf deine echte Domain:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>- GITEA__server__ROOT_URL=https:\/\/your.domain.com\n- GITEA__server__SSH_DOMAIN=your.domain.com<\/code><\/pre>\n\n\n\n<p>Setze gleichzeitig das Port-Binding wieder auf localhost-only zur\u00fcck:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>- \"127.0.0.1:3000:3000\"<\/code><\/pre>\n\n\n\n<p>Starte Gitea dann neu:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker compose up -d gitea<\/code><\/pre>\n\n\n\n<p>\u00d6ffne <code>https:\/\/your.domain.com<\/code> in deinem Browser. Du solltest die Gitea-Oberfl\u00e4che \u00fcber HTTPS sehen, mit g\u00fcltigem Schloss-Symbol.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-schritt-5-ssh-fur-git-operationen-konfigurieren\">Schritt 5: SSH f\u00fcr Git-Operationen konfigurieren<\/h2>\n\n\n\n<p>Teste die Gitea-SSH-Verbindung von deinem lokalen Rechner aus:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh -p 222 -T git@your.domain.com<\/code><\/pre>\n\n\n\n<p>Bei der ersten Verbindung siehst du eine Abfrage zur Host-Authentizit\u00e4t \u2013 tippe <code>yes<\/code>, um fortzufahren. Die erwartete Antwort ist <code>Permission denied (publickey)<\/code>. Das best\u00e4tigt, dass SSH funktioniert; der Fehler bedeutet nur, dass du noch keinen Schl\u00fcssel hinzugef\u00fcgt hast.<\/p>\n\n\n\n<p>Um deinen \u00f6ffentlichen SSH-Schl\u00fcssel hinzuzuf\u00fcgen, melde dich bei Gitea an und gehe zu <strong>User Settings > SSH \/ GPG Keys<\/strong>. F\u00fcge deinen \u00f6ffentlichen Schl\u00fcssel ein und speichere. Sobald er hinzugef\u00fcgt ist, klonst du ein Repository mit:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git clone ssh:\/\/git@your.domain.com:222\/username\/repo.git<\/code><\/pre>\n\n\n\n<p>Gitea generiert die korrekte Klon-URL automatisch in der Repository-Oberfl\u00e4che \u2013 kopier sie von dort, statt sie von Hand zusammenzubauen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-nachste-schritte-gitea-server-absichern-und-sichern\">N\u00e4chste Schritte: Gitea-Server absichern und sichern<\/h2>\n\n\n\n<p>Eine laufende Gitea-Instanz ist noch keine produktionsreife. Zwei Dinge z\u00e4hlen, bevor du sie f\u00fcr fertig erkl\u00e4rst:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Server h\u00e4rten<\/strong>. Deaktiviere den Root-SSH-Login, konfiguriere fail2ban f\u00fcr wiederholte Authentifizierungsfehler, deaktiviere die \u00f6ffentliche Registrierung in den Gitea-Einstellungen, falls du sie nicht brauchst, und beschr\u00e4nke den eingehenden Traffic mit der Contabo Firewall im Customer Control Panel auf die Ports 22, 80, 443 und 222. Das H\u00e4rten des Servers ist im Handumdrehen erledigt.<\/li>\n\n\n\n<li><strong>Volumes sichern<\/strong>. Deine Daten liegen in den Docker-Volumes <code>gitea_data<\/code> und <code>postgres_data<\/code>. Stoppe den Stack, packe jedes Volume in ein lokales Archiv und kopiere es regelm\u00e4\u00dfig vom Server weg auf Contabo Object Storage oder ein anderes entferntes Ziel f\u00fcr dein Gitea-Backup.<\/li>\n<\/ul>\n\n\n\n<p>Keines von beiden ist optional, wenn fremder Code oder fremde Arbeit von der Instanz abh\u00e4ngt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-troubleshooting\">Troubleshooting<\/h2>\n\n\n\n<p><strong>Der Gitea-Container startet st\u00e4ndig neu<\/strong>. F\u00fchre <code>docker compose logs gitea<\/code> aus und suche nach der ersten Fehlerzeile. Ein <code>password authentication failed<\/code>-Fehler bedeutet, dass der Wert von <code>GITEA__database__PASSWD<\/code> nicht zu <code>POSTGRES_PASSWORD<\/code> passt. Korrigiere beide und f\u00fchre dann erneut <code>docker compose up -d<\/code> aus.<\/p>\n\n\n\n<p><strong>Der Login leert das Formular ohne Fehlermeldung<\/strong>. Das hei\u00dft, der Login klappt, aber Gitea leitet dich zur\u00fcck zur Login-Seite. Die Ursache ist fast immer ein <code>ROOT_URL<\/code>-Mismatch: Gitea versucht, zur konfigurierten Domain weiterzuleiten, scheitert und landet wieder beim Login. Stelle sicher, dass <code>ROOT_URL<\/code> in deiner <code>docker-compose.yml<\/code> zu der Adresse passt, \u00fcber die du Gitea tats\u00e4chlich aufrufst, und starte den Container neu.<\/p>\n\n\n\n<p><strong>Gro\u00dfer Push mit 413 abgelehnt<\/strong>. F\u00fcge <code>client_max_body_size<\/code> im nginx-Server-Block hinzu oder erh\u00f6he den Wert und lade nginx neu.<\/p>\n\n\n\n<p><strong>SSH-Klon scheitert mit <code>Connection refused<\/code><\/strong>. Best\u00e4tige, dass Port 222 in deiner Firewall offen ist. Wenn du die Contabo Firewall aus dem Customer Control Panel nutzt, f\u00fcge eine eingehende Regel f\u00fcr TCP-Port 222 hinzu.<\/p>\n\n\n\n<p><strong>Port 3000 vom Browser aus nicht erreichbar<\/strong>. Gitea ist standardm\u00e4\u00dfig an <code>127.0.0.1:3000<\/code> gebunden, akzeptiert also nur Verbindungen vom Server selbst. Das ist Absicht: nginx leitet die Anfragen weiter. Falls du Port 3000 zum Testen direkt aufrufen musst, \u00e4ndere das Binding vor\u00fcbergehend auf <code>0.0.0.0:3000:3000<\/code> in deiner <code>docker-compose.yml<\/code> und starte den Container neu. Setze es vor dem Produktivbetrieb wieder zur\u00fcck.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-warum-gitea-auf-contabo-betreiben\">Warum Gitea auf Contabo betreiben?<\/h2>\n\n\n\n<p>Gitea ist eine schlanke Arbeitslast. Ein Einsteiger-<a href=\"https:\/\/contabo.com\/de\/vps\/\">VPS <\/a>hat reichlich Ressourcen, um die t\u00e4gliche Git-Aktivit\u00e4t eines kleinen bis mittleren Teams zu bew\u00e4ltigen, mit Luft f\u00fcr die Datenbank, nginx und gelegentliche Admin-Aufgaben. Wenn du sp\u00e4ter CI\/CD-Runner auf dieselbe Maschine legst, verschafft dir ein Plan h\u00f6her bequemen Spielraum ohne nennenswerten Kostensprung.<\/p>\n\n\n\n<p>F\u00fcr Teams mit Anforderungen an den Datenstandort hat Contabo <a href=\"https:\/\/contabo.com\/de\/locations\/\">Rechenzentren in Europa und weltweit<\/a>. W\u00e4hl bei der Bereitstellung die Region, die zu deinen Compliance-Anforderungen passt \u2013 keine Premium-Stufe, kein Papierkram.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-faq-gitea-selbst-hosten\">FAQ: Gitea selbst hosten<\/h2>\n\n\n\n<div class=\"schema-faq wp-block-yoast-faq-block\"><div class=\"schema-faq-section\" id=\"faq-question-1782209384962\"><strong class=\"schema-faq-question\">Wof\u00fcr wird Gitea verwendet?<\/strong> <p class=\"schema-faq-answer\">Gitea ist ein selbstgehosteter Git-Dienst f\u00fcr Code-Hosting, Pull Requests, Issue-Tracking und Repository-Verwaltung. Teams nutzen es als selbstgehostete Alternative zu GitHub oder GitLab, wenn sie ihren Code auf eigener Infrastruktur halten, Lizenzkosten pro Sitzplatz vermeiden oder Anforderungen an den Datenstandort erf\u00fcllen wollen. Es unterst\u00fctzt Webhooks und l\u00e4sst sich in die meisten CI\/CD-Pipelines integrieren, ohne dass ein separater gehosteter Dienst n\u00f6tig ist.<\/p> <\/div> <div class=\"schema-faq-section\" id=\"faq-question-1782209397465\"><strong class=\"schema-faq-question\">Wie viel RAM braucht Gitea?<\/strong> <p class=\"schema-faq-answer\">Laut der offiziellen Gitea-Dokumentation reichen 2 CPU-Kerne und 1 GB RAM in der Regel f\u00fcr kleine Teams. In der Praxis passt der komplette Stack \u2013 Gitea, PostgreSQL und nginx \u2013 bequem in dieses 1 GB. Ein <a href=\"https:\/\/contabo.com\/de\/vps\/\">Einsteiger-VPS von Contabo<\/a> l\u00e4sst reichlich Spielraum f\u00fcr Repository-Aktivit\u00e4t und Hintergrundjobs, ohne dass du aufr\u00fcsten musst.<\/p> <\/div> <div class=\"schema-faq-section\" id=\"faq-question-1782209412153\"><strong class=\"schema-faq-question\">Ist Gitea besser als selbstgehostetes GitLab?<\/strong> <p class=\"schema-faq-answer\">F\u00fcr die meisten kleinen Teams ist Gitea die praktischere Wahl. GitLabs minimal empfohlener RAM liegt bei 8 GB, und ein komfortables Produktiv-Setup braucht 16 GB oder mehr. Gitea deckt den Kern-Workflow ab \u2013 Code-Review, Issues, Webhooks, Package Registry \u2013 mit einem Bruchteil dieser Ressourcen. GitLab ergibt mehr Sinn, wenn du seine integrierte CI\/CD-Plattform und Enterprise-Zugriffskontrollen brauchst und die Serverkapazit\u00e4t hast, um es zu betreiben.<\/p> <\/div> <div class=\"schema-faq-section\" id=\"faq-question-1782209428338\"><strong class=\"schema-faq-question\">Gitea oder Forgejo \u2013 was sollte ich betreiben?<\/strong> <p class=\"schema-faq-answer\">Forgejo ist ein Community-Fork von Gitea, der sich 2022 wegen Governance-Bedenken abgespalten hat. Er ist mit demselben Docker-Compose-Setup kompatibel \u2013 tausche <code>gitea\/gitea:latest<\/code> gegen <code>codeberg.org\/forgejo\/forgejo:latest<\/code>, und der Rest dieser Anleitung gilt unver\u00e4ndert. Wenn du ein Community-getriebenes Projekt ohne Unternehmensbeteiligung bevorzugst, ist Forgejo eine solide Wahl. Wenn du das Ursprungsprojekt mit l\u00e4ngerer kommerzieller Historie willst, ist Gitea in Ordnung.<\/p> <\/div> <div class=\"schema-faq-section\" id=\"faq-question-1782209446224\"><strong class=\"schema-faq-question\">Wie sichere ich eine Gitea-Instanz?<\/strong> <p class=\"schema-faq-answer\">Sichere zwei Dinge: das Docker-Volume <code>gitea_data<\/code> (Repositories, Anh\u00e4nge, Konfiguration) und das Volume <code>postgres_data<\/code> (die Datenbank). Stoppe zuerst den Stack, packe jedes Volume \u00fcber einen tempor\u00e4ren Container in ein lokales Archiv und kopiere die Archive dann vom Server weg. Unsere rclone-Backup-Anleitung deckt den kompletten automatisierten Workflow mit Contabo Object Storage ab.<\/p> <\/div> <\/div>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Betreibe deinen eigenen Git-Server auf einem Contabo VPS mit Docker Compose. Diese Anleitung deckt das komplette Setup ab: Gitea mit PostgreSQL, Reverse Proxy, HTTPS und SSH. Keine Pro-Nutzer-Kosten, kein Zugriff Dritter auf deinen Code.<\/p>\n","protected":false},"author":65,"featured_media":31452,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1399],"tags":[],"ppma_author":[1489],"class_list":["post-31820","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials"],"uagb_featured_image_src":{"full":["https:\/\/contabo.com\/blog\/wp-content\/uploads\/2026\/06\/blog-head_how2-self-host-gitea-on-a-vps_DE.webp",1200,630,false],"thumbnail":["https:\/\/contabo.com\/blog\/wp-content\/uploads\/2026\/06\/blog-head_how2-self-host-gitea-on-a-vps_DE-150x150.webp",150,150,true],"medium":["https:\/\/contabo.com\/blog\/wp-content\/uploads\/2026\/06\/blog-head_how2-self-host-gitea-on-a-vps_DE-600x315.webp",600,315,true],"medium_large":["https:\/\/contabo.com\/blog\/wp-content\/uploads\/2026\/06\/blog-head_how2-self-host-gitea-on-a-vps_DE-768x403.webp",768,403,true],"large":["https:\/\/contabo.com\/blog\/wp-content\/uploads\/2026\/06\/blog-head_how2-self-host-gitea-on-a-vps_DE.webp",1200,630,false],"1536x1536":["https:\/\/contabo.com\/blog\/wp-content\/uploads\/2026\/06\/blog-head_how2-self-host-gitea-on-a-vps_DE.webp",1200,630,false],"2048x2048":["https:\/\/contabo.com\/blog\/wp-content\/uploads\/2026\/06\/blog-head_how2-self-host-gitea-on-a-vps_DE.webp",1200,630,false]},"uagb_author_info":{"display_name":"Julia Mink","author_link":"https:\/\/contabo.com\/blog\/de\/author\/julia-mink\/"},"uagb_comment_info":0,"uagb_excerpt":"Betreibe deinen eigenen Git-Server auf einem Contabo VPS mit Docker Compose. Diese Anleitung deckt das komplette Setup ab: Gitea mit PostgreSQL, Reverse Proxy, HTTPS und SSH. Keine Pro-Nutzer-Kosten, kein Zugriff Dritter auf deinen Code.","authors":[{"term_id":1489,"user_id":65,"is_guest":0,"slug":"julia-mink","display_name":"Julia Mink","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/26ce5d4ae17d160425d842da4ea00c56716ffb5d4c58ee0cfb73de57b1de5272?s=96&d=mm&r=g","author_category":"","user_url":"","last_name":"Mink","first_name":"Julia","job_title":"","description":""}],"_links":{"self":[{"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/posts\/31820","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/users\/65"}],"replies":[{"embeddable":true,"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/comments?post=31820"}],"version-history":[{"count":2,"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/posts\/31820\/revisions"}],"predecessor-version":[{"id":31823,"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/posts\/31820\/revisions\/31823"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/media\/31452"}],"wp:attachment":[{"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/media?parent=31820"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/categories?post=31820"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/tags?post=31820"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/ppma_author?post=31820"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}