{"id":32010,"date":"2026-07-03T08:14:00","date_gmt":"2026-07-03T06:14:00","guid":{"rendered":"https:\/\/contabo.com\/blog\/?p=32010"},"modified":"2026-07-07T12:50:16","modified_gmt":"2026-07-07T10:50:16","slug":"gitea-server-absichern-hardening","status":"publish","type":"post","link":"https:\/\/contabo.com\/blog\/de\/gitea-server-absichern-hardening\/","title":{"rendered":"Gitea-Server absichern: die Hardening-Checkliste"},"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\/07\/blog-head_guide-securing-a-self-hosted-gitea-server_DE.webp\" alt=\"Gitea-Server absichern: die Hardening-Checkliste (Titelbild)\" class=\"wp-image-31949\" srcset=\"https:\/\/contabo.com\/blog\/wp-content\/uploads\/2026\/07\/blog-head_guide-securing-a-self-hosted-gitea-server_DE.webp 1200w, https:\/\/contabo.com\/blog\/wp-content\/uploads\/2026\/07\/blog-head_guide-securing-a-self-hosted-gitea-server_DE-600x315.webp 600w, https:\/\/contabo.com\/blog\/wp-content\/uploads\/2026\/07\/blog-head_guide-securing-a-self-hosted-gitea-server_DE-768x403.webp 768w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/figure>\n\n\n\n<p><strong>Kurz gesagt.<\/strong> Eine Gitea-Standardinstallation l\u00e4sst den Web-Installer offen, erlaubt jedem die Registrierung und macht Repositories standardm\u00e4\u00dfig \u00f6ffentlich. Diese Checkliste deckt die f\u00fcnf <code>app.ini<\/code>-Einstellungen ab, die diese L\u00fccken schlie\u00dfen (<code>INSTALL_LOCK<\/code>, <code>DISABLE_REGISTRATION<\/code>, <code>REQUIRE_SIGNIN_VIEW<\/code>, <code>RUN_USER<\/code>, Secret Keys), dazu erzwungene 2FA (ab Gitea 1.24), Scoping von Access Tokens, private Repositories per Voreinstellung, Branch Protection und eine abgesicherte Nginx-Reverse-Proxy-Konfiguration mit den Headern, die Gitea braucht.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-bevor-du-startest-die-vps-sicherheitsbasis\">Bevor du startest: die VPS-Sicherheitsbasis<\/h2>\n\n\n\n<p>Gitea-Hardening baut auf einem abgesicherten Host auf. Bevor du die folgenden Schritte durchgehst, stelle sicher, dass dein VPS bereits Folgendes hat:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>SSH-Key-Authentifizierung mit deaktiviertem Passwort-Login.<\/strong> Die Einrichtung zeigt dir die <a href=\"https:\/\/contabo.com\/blog\/de\/ssh-verbindung-einrichten\/\">Anleitung zur SSH-Schl\u00fcssel-Authentifizierung<\/a>.<\/li>\n\n\n\n<li><strong>Aktivierte Contabo Firewall.<\/strong> Jeder Contabo VPS und VDS enth\u00e4lt eine <a href=\"https:\/\/contabo.com\/de\/firewall\/\">kostenlose Firewall<\/a> auf Netzwerkebene, die du im Customer Control Panel verwaltest \u2013 ohne Installation. Der <a href=\"https:\/\/help.contabo.com\/de\/support\/solutions\/articles\/103000390430-was-ist-contabo-firewall-und-wie-sch\u00fctzt-sie-meinen-vps-vds-\">Self-Help-Artikel<\/a> f\u00fchrt dich Schritt f\u00fcr Schritt durch.<\/li>\n\n\n\n<li><strong>Fail2Ban installiert und konfiguriert.<\/strong> Die <a href=\"https:\/\/contabo.com\/blog\/de\/was-ist-fail2ban-und-wie-nutzt-man-es-auf-einem-vps\/\">Fail2Ban-Anleitung<\/a> zeigt dir, wie du wiederholte Login-Versuche auf Netzwerkebene blockierst.<\/li>\n\n\n\n<li><strong>Ein Nicht-Root-Sudo-User, der den Dienst ausf\u00fchrt.<\/strong> Die <a href=\"https:\/\/contabo.com\/blog\/de\/superuser-und-root-guide\/\">Sudo-User-Anleitung<\/a> erkl\u00e4rt dir, wie du ein <code>git<\/code>-Systemkonto korrekt anlegst.<\/li>\n\n\n\n<li><strong>Regelm\u00e4\u00dfiges Patchen des Hosts.<\/strong> Die <a href=\"https:\/\/contabo.com\/blog\/de\/die-wichtigkeit-von-patching\/\">VPS-Patching-Anleitung<\/a> zeigt dir einen automatisierten Weg, deine OS-Pakete aktuell zu halten.<\/li>\n<\/ul>\n\n\n\n<p>Jeder Punkt ist ein Einstieg in einem Satz; die verlinkten Tutorials decken das komplette Vorgehen ab. \u00dcberspringe diese Basis nicht: Gitea-spezifisches Hardening bringt nichts gegen einen Angreifer, der \u00fcber eine schwache Host-Konfiguration bereits SSH-Zugang hat.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-gitea-spezifisches-hardening-der-teil-den-nichts-anderes-abdeckt\">Gitea-spezifisches Hardening (der Teil, den nichts anderes abdeckt)<\/h2>\n\n\n\n<p>Diese Punkte sind einzigartig f\u00fcr Gitea. Sie tauchen in keiner OS-Anleitung auf, und eine Gitea-Standardinstallation setzt die meisten davon nicht um. Arbeite jeden Abschnitt durch; alle \u00c4nderungen kommen in die <code>app.ini<\/code>, die bei den meisten Linux-Paketinstallationen unter <code>\/etc\/gitea\/app.ini<\/code> liegt oder bei einer Binary-Installation unter <code>custom\/conf\/app.ini<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-die-app-ini-konfiguration-absichern\">Die app.ini-Konfiguration absichern<\/h3>\n\n\n\n<p>F\u00fcnf Einstellungen in der <code>app.ini<\/code> sind einzigartig f\u00fcr Gitea und werden von keiner OS-Hardening-Anleitung abgedeckt. Setze sie alle, bevor du deine Instanz ans Netzwerk h\u00e4ngst:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>INSTALL_LOCK = true<\/code> schlie\u00dft den \/install-Web-Endpoint. Der Web-Installer setzt das nach Abschluss automatisch, aber pr\u00fcfe vor dem Go-live, ob es in der app.ini steht \u2013 fehlt es oder steht es aus irgendeinem Grund auf false, kann jeder, der den Endpoint erreicht, deine Instanz komplett neu konfigurieren.<\/li>\n\n\n\n<li><code>REQUIRE_SIGNIN_VIEW = true<\/code> erzwingt ein Login, bevor jemand ein Repository, ein Issue oder ein Nutzerprofil ansehen kann. F\u00fcr private Team-Instanzen unverzichtbar.<\/li>\n\n\n\n<li><code>RUN_USER = git<\/code> weist Gitea an, unter einem dedizierten Nicht-Root-Systemkonto zu laufen, nicht als root. Pr\u00fcfe deine systemd-Unit und korrigiere das zuerst, falls es falsch ist.<\/li>\n\n\n\n<li><code>SECRET_KEY<\/code> und <code>INTERNAL_TOKEN<\/code> werden beide vom Installer automatisch generiert. Pr\u00fcfe, ob jeder Wert ein langer, zuf\u00e4lliger String ist und kein leerer oder ein Platzhalter. Rotiere sie, wenn du dir \u00fcber ihre Herkunft nicht sicher bist.<\/li>\n<\/ul>\n\n\n\n<p>Nach jeder \u00c4nderung an der <code>app.ini<\/code> neu starten und pr\u00fcfen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl restart gitea &amp;&amp; sudo systemctl status gitea<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-offene-registrierung-deaktivieren-und-sign-up-kontrollieren\">Offene Registrierung deaktivieren und Sign-up kontrollieren<\/h3>\n\n\n\n<p>Setze <code>DISABLE_REGISTRATION = true<\/code> im Abschnitt <code>[service]<\/code> der <code>app.ini<\/code>. Damit kann niemand mehr sein eigenes Konto anlegen; neue Nutzer m\u00fcssen von einem Administrator angelegt werden, entweder \u00fcber <strong>Site Administration &gt; Users<\/strong> oder per CLI-Befehl <code>gitea admin user create<\/code>. Wenn du externes Sign-in per OAuth oder LDAP brauchst, kannst du diese Quellen weiterhin f\u00fcr bestehende Konten konfigurieren: lege den Nutzer zuerst in Gitea an und verkn\u00fcpfe dann die OAuth-Identit\u00e4t \u00fcber sein Profil.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-2fa-und-starke-authentifizierung-erzwingen\">2FA und starke Authentifizierung erzwingen<\/h3>\n\n\n\n<p>Gitea unterst\u00fctzt TOTP-basierte 2FA nativ. Nutzer richten sie unter <strong>Settings &gt; Security &gt; Two-Factor Authentication<\/strong> mit einer beliebigen RFC-6238-kompatiblen App ein (Google Authenticator, Authy, 1Password und \u00c4hnliche).<\/p>\n\n\n\n<p>Um 2FA f\u00fcr alle Nutzer zu erzwingen, f\u00fcge Folgendes in den Abschnitt <code>[service]<\/code> der <code>app.ini<\/code> ein (erfordert Gitea 1.24 oder neuer):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;service]\nTWO_FACTOR_AUTH = enforced<\/code><\/pre>\n\n\n\n<p>Nach dem Neustart wird jeder Nutzer ohne eingerichtete 2FA beim n\u00e4chsten Login auf die Einrichtungsseite umgeleitet und bleibt von den Repositories ausgesperrt, bis er sie abschlie\u00dft. Gitea Enterprise hat daf\u00fcr ein eigenes Flag (<code>ENFORCE_TWO_FACTOR_AUTH<\/code> in <code>[security]<\/code>), aber beim Community-Gitea ab 1.24 deckt <code>TWO_FACTOR_AUTH = enforced<\/code> denselben Bereich ab.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-hygiene-bei-access-tokens-und-deploy-keys\">Hygiene bei Access Tokens und Deploy Keys<\/h3>\n\n\n\n<p>Gib jedem Personal Access Token nur die minimalen Berechtigungen, die er braucht. Gitea unterst\u00fctzt fein abgestufte Token-Scopes (zum Beispiel <code>read:repository<\/code> oder <code>write:package<\/code>) unter <strong>Settings &gt; Applications<\/strong>. Setze f\u00fcr jeden Token ein Ablaufdatum; Tokens, die nie ablaufen, sammeln sich unbemerkt an. F\u00fcr Nur-Lese-Zugriff aus CI\/CD erstelle einen dedizierten Token, der ausschlie\u00dflich auf <code>read:repository<\/code> beschr\u00e4nkt ist, statt einen Personal Token mit Vollzugriff zu nutzen. Rotiere jeden Token bei Verdacht auf eine Kompromittierung sofort.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-zugriffskontrolle-fur-repositories-und-organisationen\">Zugriffskontrolle f\u00fcr Repositories und Organisationen<\/h3>\n\n\n\n<p>Damit alle neuen Repositories standardm\u00e4\u00dfig privat sind, setze Folgendes im Abschnitt <code>[repository]<\/code> der <code>app.ini<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;repository]\nDEFAULT_PRIVATE = true<\/code><\/pre>\n\n\n\n<p>Damit ist die Checkbox \u201ePrivate&#8220; schon angehakt, sobald ein Nutzer ein neues Repository anlegt. Wenn du weiter gehen und verhindern willst, dass Repositories jemals \u00f6ffentlich werden, setze stattdessen <code>FORCE_PRIVATE = true<\/code> \u2013 Administratoren k\u00f6nnen die Sichtbarkeit weiterhin \u00e4ndern, normale Nutzer nicht. F\u00fcr die Zugriffskontrolle nutze Organisationen und Teams statt direkter Berechtigungen pro Nutzer und vergib nur die minimal n\u00f6tige Rolle: Reader, Writer oder Owner. Aktiviere Branch Protection auf Repositories, die in Produktion deployen: gehe zu <strong>Repository Settings &gt; Branches<\/strong>, lege eine Regel f\u00fcr deinen Default-Branch an, verlange mindestens ein Review-Approval und deaktiviere Force-Push.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-reverse-proxy-und-tls-hardening-fur-gitea\">Reverse-Proxy- und TLS-Hardening f\u00fcr Gitea<\/h2>\n\n\n\n<p>Gitea kann TLS direkt verarbeiten, empfohlen ist aber, einen Reverse Proxy davorzusetzen und TLS dort zu terminieren. Dieser Abschnitt behandelt Nginx. In diesem Setup muss Gitea nichts von TLS wissen; es muss nur seine \u00f6ffentliche URL kennen.<\/p>\n\n\n\n<p><strong>app.ini \u2013 erforderliche Einstellungen f\u00fcr jedes Reverse-Proxy-Setup<\/strong><\/p>\n\n\n\n<p>Setze diese in den Abschnitten <code>[server]<\/code> und <code>[session]<\/code>, bevor du den Proxy hochziehst:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;server]\nROOT_URL = https:\/\/git.example.com\/\n\n&#91;session]\nCOOKIE_SECURE = true<\/code><\/pre>\n\n\n\n<p><code>ROOT_URL<\/code> muss exakt der \u00f6ffentlichen HTTPS-URL entsprechen. Eine Abweichung zerschie\u00dft Clone-URLs, OAuth-Redirects und Webhook-Payloads. <code>COOKIE_SECURE = true<\/code> markiert Session-Cookies als Secure, sodass Browser sie nur \u00fcber HTTPS senden; ohne die Einstellung lassen sich Cookies, die \u00fcber einen HTTPS-Proxy ausgestellt wurden, \u00fcber HTTP wiederholen.<\/p>\n\n\n\n<p><strong>Nginx-Server-Block<\/strong><\/p>\n\n\n\n<p>Die Proxy-Header unten sind von Gitea erforderlich, nicht optional. Ohne <code>X-Forwarded-Proto<\/code> und <code>X-Real-IP<\/code> sieht Gitea weder die echte Client-IP noch das Request-Schema, was IP-basiertes Rate Limiting, Audit-Logs und OAuth-Flows zerschie\u00dft.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server {\n    listen 443 ssl;\n    server_name git.example.com;\n\n    ssl_certificate     \/etc\/letsencrypt\/live\/git.example.com\/fullchain.pem;\n    ssl_certificate_key \/etc\/letsencrypt\/live\/git.example.com\/privkey.pem;\n\n    # Security headers\n    add_header Strict-Transport-Security \"max-age=63072000; includeSubDomains; preload\";\n    add_header X-Frame-Options SAMEORIGIN;\n    add_header X-Content-Type-Options nosniff;\n    add_header Referrer-Policy strict-origin-when-cross-origin;\n\n    # Hide Gitea version\n    proxy_hide_header X-Gitea-Version;\n\n    # Rate-limit the login and sign-up routes\n    limit_req zone=gitea_auth burst=5 nodelay;\n\n    location \/ {\n        client_max_body_size 512M;\n        proxy_pass http:\/\/127.0.0.1:3000;\n\n        # Required headers \u2014 do not remove\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        proxy_set_header Connection        $http_connection;\n        proxy_set_header Upgrade           $http_upgrade;\n    }\n}\n\nserver {\n    listen 80;\n    server_name git.example.com;\n    return 301 https:\/\/$host$request_uri;\n}<\/code><\/pre>\n\n\n\n<p>Definiere die Rate-Limit-Zone im <code>http<\/code>-Block der <code>nginx.conf<\/code> (au\u00dferhalb des <code>server<\/code>-Blocks):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>limit_req_zone $binary_remote_addr zone=gitea_auth:10m rate=10r\/m;<\/code><\/pre>\n\n\n\n<p><code>client_max_body_size 512M<\/code> entspricht dem Wert aus der Gitea-Doku. Ohne diese Einstellung geben Repository-Pushes und Datei-Uploads oberhalb des Nginx-Standardlimits (1 MB) einen 413-Fehler zur\u00fcck.<\/p>\n\n\n\n<p>Stelle TLS-Zertifikate \u00fcber Let&#8217;s Encrypt mit Certbot aus; das komplette Vorgehen findest du in der Anleitung <a href=\"https:\/\/help.contabo.com\/de\/support\/solutions\/articles\/103000312197-wie-installiere-ich-ein-ssl-zertifikat-auf-meinem-linux-server-mit-let-s-encrypt-\">Wie installiere ich ein SSL-Zertifikat auf meinem Linux-Server mit Let&#8217;s Encrypt?<\/a>.<\/p>\n\n\n\n<p>Nach jeder Nginx-\u00c4nderung reload statt restart, um aktive Verbindungen nicht zu unterbrechen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nginx -t &amp;&amp; sudo systemctl reload nginx<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-backups-und-update-disziplin\">Backups und Update-Disziplin<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-gitea-sichern\">Gitea sichern<\/h3>\n\n\n\n<p>Gitea bringt einen <code>dump<\/code>-Subbefehl mit, der Repositories, Datenbank, Konfiguration und Attachments in eine einzige Zip-Datei archiviert:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl stop gitea\nsudo -u git gitea dump -c \/etc\/gitea\/app.ini --file \/backups\/gitea-$(date +%Y%m%d).zip\nsudo systemctl start gitea<\/code><\/pre>\n\n\n\n<p>Der Dump enth\u00e4lt die SQLite-Datenbank oder einen einfachen SQL-Export. F\u00fcr PostgreSQL oder MySQL nimm einen separaten Datenbank-Dump, bevor du <code>gitea dump<\/code> ausf\u00fchrst:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># PostgreSQL\npg_dump -U gitea gitea &gt; \/backups\/gitea-db-$(date +%Y%m%d).sql\n\n# MySQL \/ MariaDB\nmysqldump -u gitea -p gitea &gt; \/backups\/gitea-db-$(date +%Y%m%d).sql<\/code><\/pre>\n\n\n\n<p>Bewahre Backups au\u00dferhalb des Servers auf. Contabo bietet zwei sich erg\u00e4nzende Optionen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Auto Backup Add-On<\/strong> \u2013 ein kostenpflichtiges <a href=\"https:\/\/contabo.com\/de\/auto-backup\/\">Add-On f\u00fcr Cloud VPS<\/a>, das t\u00e4glich automatische Backups deiner kompletten VPS-Disk erstellt und diese bis zu 10 Tage lang auf einem separaten Contabo-Speichersystem au\u00dferhalb des Servers ablegt. Das gibt dir einen vollst\u00e4ndigen Wiederherstellungspunkt, praktisch, um ein fehlgeschlagenes Gitea-Upgrade zur\u00fcckzurollen oder einen kompromittierten Host wiederherzustellen.<\/li>\n\n\n\n<li><strong>Manuelles Auslagern per rclone<\/strong> \u2013 das <code>gitea dump<\/code>-Archiv ist ein portabler, Gitea-spezifischer Export unter deiner Kontrolle. Synchronisiere ihn per rclone in den Contabo Object Storage, um ihn \u00fcber die 10 Tage hinaus langfristig aufzubewahren. Das komplette Vorgehen zeigt dir die <a href=\"https:\/\/contabo.com\/blog\/de\/linux-server-backup-mit-rclone\/\">rclone-Backup-Anleitung<\/a>.<\/li>\n<\/ul>\n\n\n\n<p>F\u00fcr eine produktive Gitea-Instanz lohnen sich beide: Auto Backup f\u00fcr die schnelle Wiederherstellung des kompletten Systems, <code>gitea dump<\/code> plus Object Storage f\u00fcr langfristige Archivierung und Portabilit\u00e4t.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-aktuell-bleiben\">Aktuell bleiben<\/h3>\n\n\n\n<p>Gitea ver\u00f6ffentlicht h\u00e4ufig Patch-Versionen, und Security-Fixes kommen in Patch-Releases. Abonniere den Gitea-Release-Feed unter <code>https:\/\/github.com\/go-gitea\/gitea\/releases.atom<\/code>, damit du benachrichtigt wirst. Nimm vor jedem Update einen vollst\u00e4ndigen <code>gitea dump<\/code> und einen Datenbank-Snapshot; die Datenbank-Migrationen von Gitea laufen beim Start automatisch und sind ohne Backup nicht r\u00fcckg\u00e4ngig zu machen. Wenn du ein Team-Deployment betreibst, teste Updates zuerst auf einer Staging-Instanz. Eine einzelne Patch-Version hinterher zu sein ist okay; mehrere Minor-Versionen hinterher zu sein nicht.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-eine-kompromittierung-erkennen\">Eine Kompromittierung erkennen<\/h2>\n\n\n\n<p>Gitea erzeugt Access-Logs, Push-Logs und Admin-Audit-Logs. Das ist die erste Stelle, an der du nachsiehst, wenn du unbefugten Zugriff vermutest. Eine vollst\u00e4ndige Liste der Signale, auf die du achten solltest, und der Reaktionsschritte findest du in der <a href=\"https:\/\/contabo.com\/blog\/indicators-that-your-instance-has-been-compromised\/\">Anleitung zu den Anzeichen einer Kompromittierung<\/a>. Als Grundregel: achte auf unerwartete neue Nutzerkonten, auf SSH-Keys, die zu bestehenden Konten hinzugef\u00fcgt wurden, und auf Repositories, die privat waren und jetzt \u00f6ffentlich sind.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-warum-ein-abgesichertes-gitea-auf-contabo-lauft\">Warum ein abgesichertes Gitea auf Contabo l\u00e4uft<\/h2>\n\n\n\n<p>Wenn du Gitea auf einem Contabo VPS hostest, hast du reichlich Ressourcen. Deine CI-Runner, deine Git-Prozesse und deine Datenbank bekommen alle die CPU und den RAM, f\u00fcr die du bezahlt hast, ohne dass andere Tenants sie dir streitig machen.<\/p>\n\n\n\n<p>F\u00fcr Teams, die der DSGVO oder internen Data-Sovereignty-Richtlinien unterliegen, z\u00e4hlt die EU-Datenhaltung. Ein <a href=\"https:\/\/contabo.com\/de\/locations\/europe\/\">EU-Rechenzentrum<\/a> h\u00e4lt Quellcode und Commit-History in EU-Jurisdiktion, auf einer Infrastruktur, die zu 100 % DSGVO-konform ist.<\/p>\n\n\n\n<p>Snapshots verdienen im Kontext von Gitea-Updates besondere Erw\u00e4hnung. Nimm vor einem gro\u00dfen Upgrade einen <a href=\"https:\/\/help.contabo.com\/de\/support\/solutions\/articles\/103000270385-wie-erstelle-ich-einen-snapshot-von-meinem-server-\">Snapshot des kompletten VPS \u00fcber das Customer Control Panel<\/a>. Schl\u00e4gt die Migration fehl oder bringt sie eine Regression, rollst du in Minuten zur\u00fcck, statt aus einem Datenbank-Backup wiederherzustellen.<\/p>\n\n\n\n<p>VPS-Einstiegspl\u00e4ne beginnen bei unter 7 Euro pro Monat und geben dir genug Spielraum, um Gitea neben einer PostgreSQL-Datenbank und einem Nginx-Proxy zu betreiben, ohne dass die Ressourcen knapp werden.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-faq-gitea-sicherheit\">FAQ: Gitea-Sicherheit<\/h2>\n\n\n\n<div class=\"schema-faq wp-block-yoast-faq-block\"><div class=\"schema-faq-section\" id=\"faq-question-1783342069069\"><strong class=\"schema-faq-question\">Wie deaktiviere ich die \u00f6ffentliche Registrierung in Gitea?<\/strong> <p class=\"schema-faq-answer\">F\u00fcge <code>DISABLE_REGISTRATION = true<\/code> unter <code>[service]<\/code> in der <code>app.ini<\/code> ein und starte Gitea neu. Neue Konten m\u00fcssen dann von einem Administrator angelegt werden, \u00fcber Site Administration > Users oder per <code>gitea admin user create<\/code>. Beachte, dass das auch die OAuth-basierte Kontoerstellung blockiert \u2013 lege Nutzer erst manuell an und verkn\u00fcpfe die OAuth-Identit\u00e4ten \u00fcber ihr Profil.<\/p> <\/div> <div class=\"schema-faq-section\" id=\"faq-question-1783342076579\"><strong class=\"schema-faq-question\">Unterst\u00fctzt Gitea Zwei-Faktor-Authentifizierung?<\/strong> <p class=\"schema-faq-answer\">Ja. Nutzer richten sie unter Settings > Security > Two-Factor Authentication mit einer beliebigen TOTP-App ein. Um sie site-weit zu erzwingen, f\u00fcge <code>TWO_FACTOR_AUTH = enforced<\/code> unter <code>[service]<\/code> in der <code>app.ini<\/code> ein und starte neu (erfordert Gitea 1.24+). Gitea Enterprise hat daf\u00fcr ein eigenes Flag. API-Zugriff per Personal Token ist unabh\u00e4ngig von der Edition nicht durch 2FA gesch\u00fctzt.<\/p> <\/div> <div class=\"schema-faq-section\" id=\"faq-question-1783342083853\"><strong class=\"schema-faq-question\">Wie stelle ich Gitea hinter HTTPS?<\/strong> <p class=\"schema-faq-answer\">Setze <code>ROOT_URL = https:\/\/git.example.com\/<\/code> in <code>[server]<\/code> und <code>COOKIE_SECURE = true<\/code> in <code>[session]<\/code> in der <code>app.ini<\/code>. Richte Nginx auf <code>http:\/\/127.0.0.1:3000<\/code> und \u00fcbergib die erforderlichen Header (Host, X-Real-IP, X-Forwarded-For, X-Forwarded-Proto). Stelle ein Zertifikat per Certbot aus \u2013 das komplette Vorgehen findest du in der Anleitung <a href=\"https:\/\/help.contabo.com\/de\/support\/solutions\/articles\/103000312197-wie-installiere-ich-ein-ssl-zertifikat-auf-meinem-linux-server-mit-let-s-encrypt-\">Wie installiere ich ein SSL-Zertifikat auf meinem Linux-Server mit Let&#8217;s Encrypt?<\/a>.<\/p> <\/div> <div class=\"schema-faq-section\" id=\"faq-question-1783342091139\"><strong class=\"schema-faq-question\">Wie sichere ich einen Gitea-Server?<\/strong> <p class=\"schema-faq-answer\">F\u00fchre <code>gitea dump -c \/etc\/gitea\/app.ini<\/code> aus, um ein Zip-Archiv aus Repositories, Konfiguration, Datenbank und Attachments zu erzeugen. F\u00fcr PostgreSQL oder MySQL nimm vorher einen separaten <code>pg_dump<\/code> oder <code>mysqldump<\/code>. Bewahre Archive au\u00dferhalb des Servers auf \u2013 <a href=\"https:\/\/contabo.com\/de\/auto-backup\/\">Contabo Auto Backup<\/a> deckt t\u00e4gliche Full-Disk-Snapshots ab, oder synchronisiere den Dump per rclone in den Object Storage f\u00fcr die langfristige Aufbewahrung.<\/p> <\/div> <\/div>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Gitea auf dem eigenen VPS gibt dir volle Kontrolle \u00fcber deinen Code, doch eine Standardinstallation l\u00e4sst mehrere Angriffsfl\u00e4chen offen. Diese Checkliste geht jeden Gitea-spezifischen H\u00e4rtungsschritt durch, vom Absichern der app.ini bis zum Reverse Proxy.<\/p>\n","protected":false},"author":65,"featured_media":31949,"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":"","_members_access_role":[],"_members_access_error":""},"categories":[1399],"tags":[],"ppma_author":[1489],"class_list":["post-32010","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\/07\/blog-head_guide-securing-a-self-hosted-gitea-server_DE.webp",1200,630,false],"thumbnail":["https:\/\/contabo.com\/blog\/wp-content\/uploads\/2026\/07\/blog-head_guide-securing-a-self-hosted-gitea-server_DE-150x150.webp",150,150,true],"medium":["https:\/\/contabo.com\/blog\/wp-content\/uploads\/2026\/07\/blog-head_guide-securing-a-self-hosted-gitea-server_DE-600x315.webp",600,315,true],"medium_large":["https:\/\/contabo.com\/blog\/wp-content\/uploads\/2026\/07\/blog-head_guide-securing-a-self-hosted-gitea-server_DE-768x403.webp",768,403,true],"large":["https:\/\/contabo.com\/blog\/wp-content\/uploads\/2026\/07\/blog-head_guide-securing-a-self-hosted-gitea-server_DE.webp",1200,630,false],"1536x1536":["https:\/\/contabo.com\/blog\/wp-content\/uploads\/2026\/07\/blog-head_guide-securing-a-self-hosted-gitea-server_DE.webp",1200,630,false],"2048x2048":["https:\/\/contabo.com\/blog\/wp-content\/uploads\/2026\/07\/blog-head_guide-securing-a-self-hosted-gitea-server_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":"Gitea auf dem eigenen VPS gibt dir volle Kontrolle \u00fcber deinen Code, doch eine Standardinstallation l\u00e4sst mehrere Angriffsfl\u00e4chen offen. Diese Checkliste geht jeden Gitea-spezifischen H\u00e4rtungsschritt durch, vom Absichern der app.ini bis zum Reverse Proxy.","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\/32010","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=32010"}],"version-history":[{"count":1,"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/posts\/32010\/revisions"}],"predecessor-version":[{"id":32023,"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/posts\/32010\/revisions\/32023"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/media\/31949"}],"wp:attachment":[{"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/media?parent=32010"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/categories?post=32010"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/tags?post=32010"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/ppma_author?post=32010"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}