{"id":32021,"date":"2026-07-03T08:14:00","date_gmt":"2026-07-03T06:14:00","guid":{"rendered":"https:\/\/contabo.com\/blog\/?p=32021"},"modified":"2026-07-07T12:44:16","modified_gmt":"2026-07-07T10:44:16","slug":"asegurar-servidor-gitea-hardening","status":"publish","type":"post","link":"https:\/\/contabo.com\/blog\/es\/asegurar-servidor-gitea-hardening\/","title":{"rendered":"Asegurar un servidor Gitea autoalojado: checklist de hardening"},"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_ES.webp\" alt=\"Asegurar un servidor Gitea autoalojado: checklist de hardening\" class=\"wp-image-31956\" srcset=\"https:\/\/contabo.com\/blog\/wp-content\/uploads\/2026\/07\/blog-head_guide-securing-a-self-hosted-gitea-server_ES.webp 1200w, https:\/\/contabo.com\/blog\/wp-content\/uploads\/2026\/07\/blog-head_guide-securing-a-self-hosted-gitea-server_ES-600x315.webp 600w, https:\/\/contabo.com\/blog\/wp-content\/uploads\/2026\/07\/blog-head_guide-securing-a-self-hosted-gitea-server_ES-768x403.webp 768w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/figure>\n\n\n\n<p><strong>En resumen.<\/strong> Una instalaci\u00f3n de Gitea por defecto deja abierto el instalador web, permite el registro libre y crea los repositorios como p\u00fablicos. Esta checklist cubre los cinco ajustes de <code>app.ini<\/code> que cierran esos huecos (<code>INSTALL_LOCK<\/code>, <code>DISABLE_REGISTRATION<\/code>, <code>REQUIRE_SIGNIN_VIEW<\/code>, <code>RUN_USER<\/code>, llaves secretas), adem\u00e1s de 2FA obligatoria (Gitea 1.24+), alcance de los tokens de acceso, repositorios privados por defecto, protecci\u00f3n de ramas y una configuraci\u00f3n blindada de proxy inverso Nginx con los headers que Gitea necesita.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-antes-de-empezar-la-base-de-seguridad-del-vps\">Antes de empezar: la base de seguridad del VPS<\/h2>\n\n\n\n<p>El hardening de Gitea se apoya en un host ya asegurado. Antes de recorrer los pasos de abajo, aseg\u00farate de que tu VPS ya tenga:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Autenticaci\u00f3n con llaves SSH y el login por contrase\u00f1a deshabilitado.<\/strong> La <a href=\"https:\/\/contabo.com\/blog\/how-to-set-up-ssh\/\">gu\u00eda de autenticaci\u00f3n con llaves SSH<\/a> te muestra c\u00f3mo configurarlo.<\/li>\n\n\n\n<li><strong>El firewall de Contabo activado.<\/strong> Cada VPS y VDS de Contabo incluye un <a href=\"https:\/\/contabo.com\/es\/firewall\/\">firewall gratuito<\/a> a nivel de red que administras desde el Customer Control Panel, sin instalar nada. El <a href=\"https:\/\/help.contabo.com\/en\/support\/solutions\/articles\/103000390430-firewall-what-is-it-and-how-does-it-protect-my-vps-vds-\">art\u00edculo de autoayuda te gu\u00eda paso a paso<\/a>.<\/li>\n\n\n\n<li><strong>Fail2Ban instalado y configurado.<\/strong> La <a href=\"https:\/\/contabo.com\/blog\/what-is-fail2ban-and-how-to-use-it-on-a-vps\/\">gu\u00eda de Fail2Ban<\/a> te muestra c\u00f3mo bloquear intentos de login repetidos a nivel de red.<\/li>\n\n\n\n<li><strong>Un usuario sudo sin privilegios de root ejecutando el servicio.<\/strong> La <a href=\"https:\/\/contabo.com\/blog\/a-practical-guide-to-superuser-accounts-sudo-root\/\">gu\u00eda del usuario sudo<\/a> explica la forma correcta de provisionar una cuenta de sistema <code>git<\/code>.<\/li>\n\n\n\n<li><strong>Parcheo regular del host.<\/strong> La <a href=\"https:\/\/contabo.com\/blog\/the-importance-of-patching-and-patching-best-practices-linux-windows\/\">gu\u00eda de parcheo del VPS<\/a> te muestra un enfoque automatizado para mantener los paquetes de tu sistema operativo al d\u00eda.<\/li>\n<\/ul>\n\n\n\n<p>Cada punto es una entrada de una sola l\u00ednea; los tutoriales enlazados cubren el procedimiento completo. No te saltes esta base: el hardening espec\u00edfico de Gitea no sirve de nada contra un atacante que ya tiene acceso SSH por una configuraci\u00f3n d\u00e9bil del host.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-hardening-especifico-de-gitea-la-parte-que-nada-mas-cubre\">Hardening espec\u00edfico de Gitea (la parte que nada m\u00e1s cubre)<\/h2>\n\n\n\n<p>Estos puntos son exclusivos de Gitea. No aparecen en ninguna gu\u00eda de sistema operativo, y una instalaci\u00f3n de Gitea por defecto no aplica la mayor\u00eda. Recorre cada secci\u00f3n; todos los cambios van en <code>app.ini<\/code>, que en la mayor\u00eda de las instalaciones por paquete de Linux vive en <code>\/etc\/gitea\/app.ini<\/code>, o en <code>custom\/conf\/app.ini<\/code> en una instalaci\u00f3n por binario.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-blindar-la-configuracion-de-app-ini\">Blindar la configuraci\u00f3n de app.ini<\/h3>\n\n\n\n<p>Cinco ajustes de <code>app.ini<\/code> son exclusivos de Gitea y no los cubre ninguna gu\u00eda de hardening del sistema operativo. Config\u00faralos todos antes de exponer tu instancia a la red:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>INSTALL_LOCK = true<\/code> cierra el endpoint web \/install. El instalador web lo activa solo al terminar, pero verifica que est\u00e9 presente en app.ini antes de salir a producci\u00f3n \u2014 si falta o qued\u00f3 en false por cualquier raz\u00f3n, cualquiera que llegue al endpoint puede reconfigurar tu instancia desde cero.<\/li>\n\n\n\n<li><code>REQUIRE_SIGNIN_VIEW = true<\/code> obliga a iniciar sesi\u00f3n antes de ver cualquier repositorio, issue o perfil de usuario. Esencial para instancias privadas de equipo.<\/li>\n\n\n\n<li><code>RUN_USER = git<\/code> le indica a Gitea que corra bajo una cuenta de sistema dedicada sin privilegios de root, no como root. Revisa tu unit de systemd y corrige esto primero si est\u00e1 mal.<\/li>\n\n\n\n<li><code>SECRET_KEY<\/code> e <code>INTERNAL_TOKEN<\/code> los genera autom\u00e1ticamente el instalador. Verifica que cada uno sea una cadena larga y aleatoria, no un valor en blanco o un placeholder. R\u00f3talos si no est\u00e1s seguro de su origen.<\/li>\n<\/ul>\n\n\n\n<p>Despu\u00e9s de cualquier cambio en <code>app.ini<\/code>, reinicia y verifica:<\/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-deshabilitar-el-registro-abierto-y-controlar-el-alta\">Deshabilitar el registro abierto y controlar el alta<\/h3>\n\n\n\n<p>Configura <code>DISABLE_REGISTRATION = true<\/code> en la secci\u00f3n <code>[service]<\/code> de <code>app.ini<\/code>. Esto impide que cualquiera cree su propia cuenta; los usuarios nuevos los tiene que provisionar un administrador desde <strong>Site Administration > Users<\/strong> o con el comando de CLI <code>gitea admin user create<\/code>. Si necesitas inicio de sesi\u00f3n externo con OAuth o LDAP, puedes configurar esas fuentes para cuentas ya existentes: crea primero el usuario en Gitea y luego vincula la identidad de OAuth desde su perfil.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-forzar-2fa-y-autenticacion-fuerte\">Forzar 2FA y autenticaci\u00f3n fuerte<\/h3>\n\n\n\n<p>Gitea soporta 2FA basada en TOTP de forma nativa. Los usuarios la activan desde <strong>Settings > Security > Two-Factor Authentication<\/strong> con cualquier app compatible con RFC 6238 (Google Authenticator, Authy, 1Password y similares).<\/p>\n\n\n\n<p>Para forzar la 2FA en todos los usuarios, agrega lo siguiente a la secci\u00f3n <code>[service]<\/code> de <code>app.ini<\/code> (requiere Gitea 1.24 o posterior):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;service]\nTWO_FACTOR_AUTH = enforced<\/code><\/pre>\n\n\n\n<p>Tras reiniciar, cualquier usuario que no haya activado 2FA ser\u00e1 redirigido a la p\u00e1gina de activaci\u00f3n en su siguiente inicio de sesi\u00f3n y quedar\u00e1 bloqueado de los repositorios hasta completarla. Gitea Enterprise tiene su propio flag para esto (<code>ENFORCE_TWO_FACTOR_AUTH<\/code> en <code>[security]<\/code>), pero en Gitea community 1.24+, <code>TWO_FACTOR_AUTH = enforced<\/code> cubre el mismo terreno.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-higiene-de-tokens-de-acceso-y-llaves-de-despliegue\">Higiene de tokens de acceso y llaves de despliegue<\/h3>\n\n\n\n<p>Dale a cada token de acceso personal solo los permisos m\u00ednimos que necesita. Gitea soporta alcances de token detallados (por ejemplo, <code>read:repository<\/code> o <code>write:package<\/code>) en <strong>Settings > Applications<\/strong>. Ponle fecha de expiraci\u00f3n a cada token; los que nunca expiran se acumulan en silencio. Para acceso de solo lectura desde CI\/CD, crea un token dedicado con alcance \u00fanicamente a <code>read:repository<\/code> en lugar de usar un token personal con acceso total. Rota cualquier token de inmediato si sospechas que qued\u00f3 expuesto.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-control-de-acceso-a-repositorios-y-organizaciones\">Control de acceso a repositorios y organizaciones<\/h3>\n\n\n\n<p>Para que todos los repositorios nuevos sean privados por defecto, configura lo siguiente en la secci\u00f3n <code>[repository]<\/code> de <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>Esto deja la casilla \u00abPrivate\u00bb ya marcada cada vez que un usuario crea un repositorio nuevo. Si quieres ir m\u00e1s all\u00e1 e impedir que los repositorios se hagan p\u00fablicos alguna vez, configura <code>FORCE_PRIVATE = true<\/code> en su lugar: los administradores todav\u00eda pueden cambiar la visibilidad, pero los usuarios normales no. Para el control de acceso, usa organizaciones y equipos en lugar de permisos directos por usuario, y asigna el rol m\u00ednimo necesario: Reader, Writer u Owner. Activa la protecci\u00f3n de ramas en los repositorios que reciben despliegues a producci\u00f3n: ve a <strong>Repository Settings > Branches<\/strong>, agrega una regla para tu rama por defecto, exige al menos una aprobaci\u00f3n de revisi\u00f3n y deshabilita el force-push.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-hardening-del-proxy-inverso-y-tls-para-gitea\">Hardening del proxy inverso y TLS para Gitea<\/h2>\n\n\n\n<p>Gitea puede manejar TLS directamente, pero el enfoque recomendado es poner un proxy inverso por delante y terminar TLS ah\u00ed. Esta secci\u00f3n cubre Nginx. En este esquema Gitea no necesita saber nada de TLS; solo necesita conocer su URL p\u00fablica.<\/p>\n\n\n\n<p><strong>app.ini \u2013 ajustes requeridos para cualquier esquema con proxy inverso<\/strong><\/p>\n\n\n\n<p>Configura estos en las secciones <code>[server]<\/code> y <code>[session]<\/code> antes de levantar el proxy:<\/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> tiene que coincidir exactamente con la URL p\u00fablica HTTPS. Una discrepancia rompe las URLs de clonado, los redirects de OAuth y los payloads de webhooks. <code>COOKIE_SECURE = true<\/code> marca las cookies de sesi\u00f3n como Secure para que los navegadores solo las env\u00eden por HTTPS; sin esto, las cookies emitidas a trav\u00e9s de un proxy HTTPS se pueden reenviar por HTTP.<\/p>\n\n\n\n<p><strong>Bloque server de Nginx<\/strong><\/p>\n\n\n\n<p>Los headers de proxy de abajo los requiere Gitea, no son opcionales. Sin <code>X-Forwarded-Proto<\/code> ni <code>X-Real-IP<\/code>, Gitea no puede ver la IP real del cliente ni determinar el esquema de la petici\u00f3n, lo que rompe el rate limiting por IP, los logs de auditor\u00eda y los flujos de OAuth.<\/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>Define la zona de rate limiting en el bloque <code>http<\/code> de <code>nginx.conf<\/code> (fuera del bloque <code>server<\/code>):<\/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> coincide con el valor de la documentaci\u00f3n de Gitea. Sin \u00e9l, los pushes de repositorio y las subidas de archivos que superan el l\u00edmite por defecto de Nginx (1 MB) devuelven un error 413.<\/p>\n\n\n\n<p>Emite los certificados TLS con Let&#8217;s Encrypt y Certbot; consulta la gu\u00eda <a href=\"https:\/\/help.contabo.com\/es\/support\/solutions\/articles\/103000312197--c\u00f3mo-instalo-un-certificado-ssl-en-mi-servidor-linux-utilizando-let-s-encrypt-\">\u00bfC\u00f3mo instalo un certificado SSL en mi servidor Linux con Let&#8217;s Encrypt?<\/a> para el procedimiento completo.<\/p>\n\n\n\n<p>Despu\u00e9s de cualquier cambio en Nginx, haz reload en lugar de restart para no cortar las conexiones activas:<\/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-respaldos-y-disciplina-de-actualizacion\">Respaldos y disciplina de actualizaci\u00f3n<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-respaldar-gitea\">Respaldar Gitea<\/h3>\n\n\n\n<p>Gitea trae un subcomando <code>dump<\/code> que archiva repositorios, base de datos, configuraci\u00f3n y adjuntos en un solo archivo zip:<\/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>El dump incluye la base de datos SQLite o una exportaci\u00f3n SQL plana. Para PostgreSQL o MySQL, toma un dump de base de datos por separado antes de correr <code>gitea dump<\/code>:<\/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>Guarda los respaldos fuera del servidor. Contabo ofrece dos opciones que se complementan:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Auto Backup, el complemento<\/strong> \u2013 un <a href=\"https:\/\/contabo.com\/es\/auto-backup\/\">complemento de pago para Cloud VPS<\/a> que crea respaldos autom\u00e1ticos diarios de todo el disco de tu VPS, guardados fuera del servidor en un sistema de almacenamiento aparte de Contabo hasta por 10 d\u00edas. Esto te da un punto de restauraci\u00f3n completo del sistema, \u00fatil para revertir una actualizaci\u00f3n fallida de Gitea o recuperarte de un host comprometido.<\/li>\n\n\n\n<li><strong>Descarga manual con rclone<\/strong> \u2013 el archivo de <code>gitea dump<\/code> es una exportaci\u00f3n port\u00e1til, espec\u00edfica de Gitea y bajo tu control. Sincron\u00edzalo con Object Storage de Contabo usando rclone para retenci\u00f3n de largo plazo m\u00e1s all\u00e1 de los 10 d\u00edas. La <a href=\"https:\/\/contabo.com\/blog\/es\/copia-de-seguridad-en-linux-usando-rclone\/\">gu\u00eda de respaldo con rclone<\/a> cubre el procedimiento completo.<\/li>\n<\/ul>\n\n\n\n<p>Para una instancia de Gitea en producci\u00f3n, vale la pena correr ambos: Auto Backup para recuperaci\u00f3n r\u00e1pida de todo el sistema, <code>gitea dump<\/code> m\u00e1s Object Storage para archivado de largo plazo y portabilidad.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-mantenerte-al-dia\">Mantenerte al d\u00eda<\/h3>\n\n\n\n<p>Gitea publica versiones de parche con frecuencia, y las correcciones de seguridad viajan en las releases de parche. Suscr\u00edbete al feed de releases de Gitea en <code>https:\/\/github.com\/go-gitea\/gitea\/releases.atom<\/code> para recibir avisos. Antes de cualquier actualizaci\u00f3n, toma un <code>gitea dump<\/code> completo y un snapshot de la base de datos; las migraciones de base de datos de Gitea corren autom\u00e1ticamente al arrancar y no son reversibles sin un respaldo. Si tienes un despliegue de equipo, prueba primero las actualizaciones en una instancia de staging. Estar una sola versi\u00f3n de parche atr\u00e1s es aceptable; estar varias versiones menores atr\u00e1s no.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-detectar-un-compromiso\">Detectar un compromiso<\/h2>\n\n\n\n<p>Gitea genera logs de acceso, logs de push y logs de auditor\u00eda de administraci\u00f3n. Es el primer lugar donde revisar si sospechas de un acceso no autorizado. La <a href=\"https:\/\/contabo.com\/blog\/indicators-that-your-instance-has-been-compromised\/\">gu\u00eda de indicadores de que tu instancia fue comprometida<\/a> trae la lista completa de se\u00f1ales que vigilar y los pasos de respuesta. Como base, vigila cuentas de usuario nuevas inesperadas, llaves SSH agregadas a cuentas existentes y repositorios que eran privados y ahora son p\u00fablicos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-por-que-correr-un-gitea-blindado-en-contabo\">Por qu\u00e9 correr un Gitea blindado en Contabo<\/h2>\n\n\n\n<p>Alojar Gitea en un VPS de Contabo te da recursos de sobra. Tus CI runners, tus procesos de Git y tu base de datos reciben el CPU y la RAM que pagaste, sin competir con otros inquilinos.<\/p>\n\n\n\n<p>Para equipos sujetos al GDPR o a pol\u00edticas internas de soberan\u00eda de datos, la residencia de datos en la UE importa. Elegir un <a href=\"https:\/\/contabo.com\/es\/locations\/europe\/\">centro de datos en la UE<\/a> mantiene el c\u00f3digo fuente y el historial de commits bajo jurisdicci\u00f3n de la UE, en una infraestructura 100 % conforme al GDPR.<\/p>\n\n\n\n<p>Los snapshots merecen una menci\u00f3n especial en el contexto de las actualizaciones de Gitea. Antes de correr una actualizaci\u00f3n mayor, <a href=\"https:\/\/help.contabo.com\/es\/support\/solutions\/articles\/103000270385--c\u00f3mo-puedo-crear-una-instant\u00e1nea-de-mi-servidor-\">toma un snapshot de todo el VPS<\/a> desde el Customer Control Panel. Si la migraci\u00f3n falla o introduce una regresi\u00f3n, reviertes en minutos en lugar de restaurar desde un respaldo de base de datos.<\/p>\n\n\n\n<p>Los planes de VPS de entrada arrancan en menos de 7 d\u00f3lares al mes y te dan margen suficiente para correr Gitea junto a una base de datos PostgreSQL y un proxy Nginx sin presi\u00f3n de recursos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-faq-seguridad-de-gitea\">FAQ: seguridad de Gitea<\/h2>\n\n\n\n<div class=\"schema-faq wp-block-yoast-faq-block\"><div class=\"schema-faq-section\" id=\"faq-question-1783419814549\"><strong class=\"schema-faq-question\">\u00bfC\u00f3mo deshabilito el registro p\u00fablico en Gitea?<\/strong> <p class=\"schema-faq-answer\">Agrega <code>DISABLE_REGISTRATION = true<\/code> bajo <code>[service]<\/code> en <code>app.ini<\/code> y reinicia Gitea. Las cuentas nuevas tendr\u00e1 que crearlas un administrador desde Site Administration > Users o con <code>gitea admin user create<\/code>. Ten en cuenta que esto tambi\u00e9n bloquea la creaci\u00f3n de cuentas v\u00eda OAuth: crea primero los usuarios manualmente y vincula las identidades de OAuth desde su perfil.<\/p> <\/div> <div class=\"schema-faq-section\" id=\"faq-question-1783419825810\"><strong class=\"schema-faq-question\">\u00bfGitea soporta autenticaci\u00f3n de dos factores?<\/strong> <p class=\"schema-faq-answer\">S\u00ed. Los usuarios la activan desde Settings > Security > Two-Factor Authentication con cualquier app TOTP. Para forzarla en todo el sitio, agrega <code>TWO_FACTOR_AUTH = enforced<\/code> bajo <code>[service]<\/code> en <code>app.ini<\/code> y reinicia (requiere Gitea 1.24+). Gitea Enterprise tiene un flag aparte para esto. El acceso a la API v\u00eda tokens personales no queda protegido por 2FA sin importar la edici\u00f3n.<\/p> <\/div> <div class=\"schema-faq-section\" id=\"faq-question-1783419833295\"><strong class=\"schema-faq-question\">\u00bfC\u00f3mo pongo Gitea detr\u00e1s de HTTPS?<\/strong> <p class=\"schema-faq-answer\">Configura <code>ROOT_URL = https:\/\/git.example.com\/<\/code> en <code>[server]<\/code> y <code>COOKIE_SECURE = true<\/code> en <code>[session]<\/code> en <code>app.ini<\/code>. Apunta Nginx a <code>http:\/\/127.0.0.1:3000<\/code> y pasa los headers requeridos (Host, X-Real-IP, X-Forwarded-For, X-Forwarded-Proto). Emite un certificado con Certbot: consulta la gu\u00eda <a href=\"https:\/\/help.contabo.com\/es\/support\/solutions\/articles\/103000312197--c\u00f3mo-instalo-un-certificado-ssl-en-mi-servidor-linux-utilizando-let-s-encrypt-\">\u00bfC\u00f3mo instalo un certificado SSL en mi servidor Linux con Let&#8217;s Encrypt?<\/a> para el procedimiento completo.<\/p> <\/div> <div class=\"schema-faq-section\" id=\"faq-question-1783419844461\"><strong class=\"schema-faq-question\">\u00bfC\u00f3mo respaldo un servidor Gitea?<\/strong> <p class=\"schema-faq-answer\">Corre <code>gitea dump -c \/etc\/gitea\/app.ini<\/code> para producir un archivo zip con repositorios, configuraci\u00f3n, base de datos y adjuntos. Para PostgreSQL o MySQL, toma antes un <code>pg_dump<\/code> o <code>mysqldump<\/code> por separado. Guarda los archivos fuera del servidor: <a href=\"https:\/\/contabo.com\/es\/auto-backup\/\">Contabo Auto Backup<\/a> cubre snapshots diarios de todo el disco, o sincroniza el dump con Object Storage usando rclone para retenci\u00f3n de largo plazo.<\/p> <\/div> <\/div>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Correr Gitea en tu propio VPS te da control total sobre tu c\u00f3digo, pero una instalaci\u00f3n por defecto deja varias superficies de ataque abiertas. Esta checklist recorre cada paso de hardening espec\u00edfico de Gitea, desde blindar app.ini hasta asegurar tu proxy inverso.<\/p>\n","protected":false},"author":65,"featured_media":31953,"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":[1988],"tags":[],"ppma_author":[1489],"class_list":["post-32021","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutoriales"],"uagb_featured_image_src":{"full":["https:\/\/contabo.com\/blog\/wp-content\/uploads\/2026\/07\/blog-head_guide-securing-a-self-hosted-gitea-server_EN.webp",1200,630,false],"thumbnail":["https:\/\/contabo.com\/blog\/wp-content\/uploads\/2026\/07\/blog-head_guide-securing-a-self-hosted-gitea-server_EN-150x150.webp",150,150,true],"medium":["https:\/\/contabo.com\/blog\/wp-content\/uploads\/2026\/07\/blog-head_guide-securing-a-self-hosted-gitea-server_EN-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_EN-768x403.webp",768,403,true],"large":["https:\/\/contabo.com\/blog\/wp-content\/uploads\/2026\/07\/blog-head_guide-securing-a-self-hosted-gitea-server_EN.webp",1200,630,false],"1536x1536":["https:\/\/contabo.com\/blog\/wp-content\/uploads\/2026\/07\/blog-head_guide-securing-a-self-hosted-gitea-server_EN.webp",1200,630,false],"2048x2048":["https:\/\/contabo.com\/blog\/wp-content\/uploads\/2026\/07\/blog-head_guide-securing-a-self-hosted-gitea-server_EN.webp",1200,630,false]},"uagb_author_info":{"display_name":"Julia Mink","author_link":"https:\/\/contabo.com\/blog\/es\/author\/julia-mink\/"},"uagb_comment_info":0,"uagb_excerpt":"Correr Gitea en tu propio VPS te da control total sobre tu c\u00f3digo, pero una instalaci\u00f3n por defecto deja varias superficies de ataque abiertas. Esta checklist recorre cada paso de hardening espec\u00edfico de Gitea, desde blindar app.ini hasta asegurar tu proxy inverso.","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\/es\/wp-json\/wp\/v2\/posts\/32021","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/contabo.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/contabo.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/contabo.com\/blog\/es\/wp-json\/wp\/v2\/users\/65"}],"replies":[{"embeddable":true,"href":"https:\/\/contabo.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=32021"}],"version-history":[{"count":1,"href":"https:\/\/contabo.com\/blog\/es\/wp-json\/wp\/v2\/posts\/32021\/revisions"}],"predecessor-version":[{"id":32022,"href":"https:\/\/contabo.com\/blog\/es\/wp-json\/wp\/v2\/posts\/32021\/revisions\/32022"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/contabo.com\/blog\/es\/wp-json\/wp\/v2\/media\/31953"}],"wp:attachment":[{"href":"https:\/\/contabo.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=32021"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/contabo.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=32021"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/contabo.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=32021"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/contabo.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=32021"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}