[{"data":1,"prerenderedAt":233},["ShallowReactive",2],{"seo-verification":3,"blog-alojar-gitea-en-un-vps-ma-es":6,"promo-bar-likely":232},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-alojar-gitea-en-un-vps-ma-es",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":36,"sections":37,"ctaTitle":170,"ctaBody":171,"ctaButton":172,"ctaUrl":173,"relatedPosts":174},74,"alojar-gitea-en-un-vps",{"fr":12,"en":13,"ar":14,"es":10},"heberger-gitea","host-gitea-on-your-own-vps","استضافة-gitea-على-خادم-vps-الخاص-بك","Alojar Gitea en su propio VPS en 2026","Despliegue Gitea 1.25 en un VPS con Docker y SSL: Gitea Actions CI\u002FCD, comparativa vs Forgejo v16, administración y errores SSH y HTTPS.",13,1,false,"2026-04-07T00:00:00+00:00","2026-11-08T16:32:50+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},7,"Autoalojamiento","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fheberger-gitea-poster.svg",{"categorySlug":34,"appSlug":35},"desarrollo","gitea","Gitea es una forja Git autoalojada escrita en Go, reconocida por su ligereza y su rapidez. Desplegarla en su propio VPS le ofrece un GitHub privado sin suscripción por usuario ni límite de repositorios privados. En 2026, Gitea 1.25 es la versión actual y Forgejo v16 se ha impuesto como el fork comunitario de referencia — esta guía cubre la instalación de Gitea, la puesta en marcha de pipelines CI\u002FCD con Gitea Actions, la comparativa con Forgejo, la administración diaria y la resolución de los errores más frecuentes.",[38,42,52,55,77,80,83,123,144,147,150,153,156,159,162,164,167],{"type":39,"title":40,"body":41},"h2","Por qué autoalojar Gitea en un VPS","Gitea consume apenas 200 a 300 MB de RAM en reposo, lo que la convierte en una de las forjas Git más eficientes para autoalojar. En un VPS, usted conserva el control total de su código fuente: ningún dato es analizado por un tercero, ninguna limitación arbitraria sobre el número de repositorios privados o de colaboradores, y ningún coste que crezca con su equipo. Para una agencia o un desarrollador independiente, un único VPS puede alojar el conjunto de los proyectos de clientes con permisos aislados por organización. Gitea integra de forma nativa un CI\u002FCD compatible con los flujos de trabajo de GitHub Actions (Gitea Actions), un registro de paquetes y un editor web, lo que cubre la casi totalidad de un ciclo de desarrollo sin dependencia externa.",{"type":43,"title":44,"items":45},"ul","Beneficios concretos de un Gitea autoalojado",[46,47,48,49,50,51],"Huella de memoria mínima: funciona con holgura en un VPS de 2 GB de RAM incluso con varias decenas de usuarios.","Repositorios privados sin facturación por puesto ni límite impuesto, a diferencia de los planes SaaS.","Gitea Actions integrado para ejecutar sus pipelines CI\u002FCD sin servicio externo.","Registro de paquetes (Docker, npm, Composer, Maven) alojado en la misma instancia.","Autenticación granular: LDAP, OAuth2, tokens de acceso personales y claves SSH por usuario.","Copia de seguridad trivial: todo cabe en un volumen de datos y una base de datos.",{"type":39,"title":53,"body":54},"Requisitos de hardware y software","Gitea es muy frugal. Para un equipo pequeño (hasta 20 usuarios), un VPS con 2 vCPU y 2 GB de RAM basta de sobra; prevea 4 GB si activa Gitea Actions con runners locales que compilan código. Reserve al menos 20 a 40 GB de almacenamiento SSD según el tamaño de sus repositorios. En cuanto al software: Docker Engine y el plugin Docker Compose instalados, un nombre de dominio (o subdominio del tipo `git.yourdomain.com`) que apunte a la IP del VPS mediante un registro A, y el puerto 22 reservado al SSH del servidor — Gitea expondrá su propio SSH en otro puerto para evitar el conflicto.",{"type":56,"title":57,"steps":58},"steps","Desplegar Gitea con Docker y SSL",[59,62,65,68,71,74],{"title":60,"body":61},"Preparar el VPS y Docker","Conéctese por SSH, actualice el sistema y luego instale Docker y el plugin Compose. Cree un directorio dedicado: `mkdir -p \u002Fopt\u002Fgitea && cd \u002Fopt\u002Fgitea`. Cree también un volumen de datos que sobreviva a las actualizaciones del contenedor.",{"title":63,"body":64},"Redactar el docker-compose.yml","Defina dos servicios: `gitea` (imagen `gitea\u002Fgitea:1.25`) y una base `postgres:16`. Monte `.\u002Fgitea:\u002Fdata` para la persistencia, fije `USER_UID`\u002F`USER_GID` en 1000, y mapee el SSH de Gitea al puerto 2222 del host: `\"2222:22\"`. Deje el puerto HTTP 3000 interno, será servido por el reverse proxy.",{"title":66,"body":67},"Lanzar los contenedores","Ejecute `docker compose up -d` y luego `docker compose logs -f gitea` para seguir la inicialización. Compruebe que la conexión a PostgreSQL funciona antes de continuar.",{"title":69,"body":70},"Configurar el reverse proxy","Con Caddy, basta una sola línea: `git.yourdomain.com { reverse_proxy localhost:3000 }`. Caddy obtiene y renueva automáticamente el certificado Let's Encrypt. Con Nginx, cree un bloque `server` que haga de proxy hacia `http:\u002F\u002F127.0.0.1:3000` y utilice `certbot --nginx` para el SSL.",{"title":72,"body":73},"Finalizar la instalación web","Abra `https:\u002F\u002Fgit.yourdomain.com`, complete el asistente indicando la URL base HTTPS y el host de la base de datos (`db:5432`). Defina correctamente el `ROOT_URL`, de lo contrario los enlaces de clonado serán erróneos. Despliegue «Ajustes opcionales > Ajustes de la cuenta de administrador», cree allí su cuenta de administrador y valide.",{"title":75,"body":76},"Asegurar el SSH de los repositorios","Configure sus clientes para clonar mediante `ssh:\u002F\u002Fgit@git.yourdomain.com:2222\u002F...`, o añada un bloque `Host` en `~\u002F.ssh\u002Fconfig` para ocultar el puerto. Desactive el registro público en la administración si la instancia es privada.",{"type":39,"title":78,"body":79},"Gitea Actions: CI\u002FCD autoalojado en su VPS","Gitea Actions es el motor CI\u002FCD nativo de Gitea, compatible con la sintaxis de los flujos de trabajo de GitHub Actions. Permite ejecutar pipelines directamente en su infraestructura, sin dependencia de ningún servicio externo.\n\nPara activarlo, añada a su `app.ini`:\n\n```ini\n[actions]\nENABLED = true\n```\n\nRegistre después un runner `act_runner` en un contenedor separado en el mismo VPS. Limite su RAM mediante `mem_limit` para que una compilación exigente no ahogue a Gitea. Para pipelines pesados (compilación, pruebas de integración), dedique un segundo VPS al runner.\n\nUn flujo de trabajo mínimo para un proyecto Node.js va en `.gitea\u002Fworkflows\u002Fci.yml`:\n\n```yaml\non: [push, pull_request]\njobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      - uses: actions\u002Fsetup-node@v4\n        with:\n          node-version: '22'\n      - run: npm ci\n      - run: npm test\n```\n\nEl runner ejecuta este flujo de trabajo en cada push. Puede combinar múltiples trabajos, usar matrices de versiones y compartir artefactos entre pasos — exactamente como GitHub Actions, pero en su propio servidor.",{"type":81,"body":82},"tip","Limite la RAM del contenedor `act_runner` a 2 GB mediante `mem_limit: 2g` en su `docker-compose.yml` si su VPS dispone de 4 GB en total. Así, incluso una compilación que consuma todo lo que se le asigna deja 2 GB para Gitea — suficiente para seguir atendiendo los push y pull requests durante la compilación. Para compilaciones que producen artefactos voluminosos (imágenes Docker, binarios), añada un volumen separado montado en `\u002Fhome\u002Frunner\u002Fwork` para no llenar el volumen de datos principal de Gitea.",{"type":84,"title":85,"headers":86,"rows":90},"comparison","Gitea o Forgejo en 2026: ¿cuál elegir?",[87,88,89],"Criterio","Gitea 1.25","Forgejo v16",[91,95,99,103,107,111,115,119],[92,93,94],"Gobernanza","Sociedad comercial (Gitea Ltd)","Asociación sin ánimo de lucro (Codeberg e.V.)",[96,97,98],"Licencia","MIT","MIT — 100 % software libre, sin edición empresarial",[100,101,102],"Recomendado por Awesome-Selfhosted","No (retirado en 2022)","Sí — recomendación por defecto desde 2024",[104,105,106],"Federación ActivityPub","No prevista","En despliegue progresivo desde Forgejo v7 (abril de 2024), GA en v16",[108,109,110],"Compatibilidad con la API de Gitea","Referencia","Compatible: misma API, mismos webhooks, mismo formato de datos",[112,113,114],"Seguridad — auditorías públicas","Escasas","Auditorías de código publicadas por la comunidad Codeberg",[116,117,118],"Hoja de ruta comunitaria","Dirigida por Gitea Ltd","Gobernanza abierta, RFC públicas, voto de los contribuidores",[120,121,122],"Migración desde Gitea","N\u002FA","Sin pérdida de datos: mismo esquema de base y mismo formato de volumen",{"type":56,"title":124,"steps":125},"Migrar de Gitea a Forgejo",[126,129,132,135,138,141],{"title":127,"body":128},"Hacer una copia de seguridad de la instancia Gitea","Antes de cualquier operación, haga un dump completo: `docker exec -u git gitea gitea admin dump -c \u002Fdata\u002Fgitea\u002Fconf\u002Fapp.ini`. Recupere el archivo generado fuera del contenedor y compruebe que el volumen `.\u002Fgitea` está incluido en su snapshot del VPS.",{"title":130,"body":131},"Comprobar la compatibilidad de versión","Forgejo v16 admite la migración desde Gitea 1.20 y posteriores. Si su instancia funciona con una versión anterior, suba primero a Gitea 1.21 o 1.22 mediante `docker compose pull && docker compose up -d`, y luego compruebe la ausencia de errores en los logs antes de continuar.",{"title":133,"body":134},"Sustituir la imagen Docker","En su `docker-compose.yml`, sustituya `image: gitea\u002Fgitea:latest` por `image: codeberg.org\u002Fforgejo\u002Fforgejo:latest`. El volumen de datos (`.\u002Fgitea:\u002Fdata`) y la base PostgreSQL permanecen sin cambios — Forgejo lee el mismo esquema y el mismo `app.ini`.",{"title":136,"body":137},"Reiniciar y dejar que migre","Ejecute `docker compose pull && docker compose up -d`. Forgejo aplica automáticamente las migraciones de esquema necesarias al arrancar. Siga `docker compose logs -f forgejo` hasta el mensaje que indica que el servidor HTTP escucha en el puerto 3000.",{"title":139,"body":140},"Regenerar las claves SSH","Como en toda actualización que cambia el binario referenciado en `authorized_keys`, regenere las entradas: `docker exec -u git forgejo forgejo admin regenerate keys`. Compruebe después que un `git clone` por SSH funciona desde un puesto cliente.",{"title":142,"body":143},"Probar y validar","Abra la interfaz web, compruebe los repositorios, los webhooks y los runners de Forgejo Actions. Los runners `act_runner` registrados con Gitea son compatibles — vuelva a conectarlos al nuevo token de registro si la clave ha cambiado.",{"type":81,"title":145,"body":146},"Forgejo v16: las novedades clave (julio de 2026)","Forgejo v16.0.0 introduce la federación ActivityPub en disponibilidad general para las issues y las pull requests: una issue abierta en una instancia Forgejo puede recibir comentarios de usuarios de otra instancia, sin cuenta compartida. La versión integra también un gestor de secretos de instancia (cifrado AES-256 en reposo), un nuevo motor de búsqueda de código basado en el índice Bleve v2 con soporte de expresiones regulares, y mejoras significativas del planificador de tareas en segundo plano. En el plano de la seguridad, los tokens de API se almacenan ahora hasheados en base de datos (bcrypt) y no en texto plano — una migración automática al arrancar convierte los tokens existentes.",{"type":39,"title":148,"body":149},"Administración diaria: webhooks, repositorios y limpieza de huérfanos","Una vez Gitea en producción, vuelven regularmente algunas operaciones de mantenimiento.\n\n**Gestionar los webhooks.** Gitea registra el historial de cada envío en «Configuración del repositorio → Webhooks → Entregas recientes». Un webhook fallido (timeout, error HTTP 5xx) puede reproducirse manualmente desde ese historial. Si sus runners están en la misma red privada que Gitea, añada sus rangos IP a `ALLOWED_HOST_LIST` en la sección `[webhook]` de `app.ini` — de lo contrario las llamadas hacia `localhost` se bloquean por defecto desde Gitea 1.20.\n\n**Purgar los repositorios huérfanos.** Un repositorio eliminado mediante la interfaz deja sus datos Git (`objects\u002F`) en disco hasta la próxima ejecución de las tareas en segundo plano. Fuerce un paso inmediato desde el admin: «Administración del sitio → Tareas en segundo plano → Ejecutar: Purgar repos eliminados». El espacio liberado solo es visible tras `docker exec -u git gitea gitea admin storage --remove-unlisted`.\n\n**Cuota de almacenamiento por organización.** Para instancias multi-inquilino, fije una cuota de repositorios por organización en `app.ini` bajo `[repository]`: `MAX_CREATION_LIMIT = 50`. Esto impide que una cuenta cree cientos de repositorios sin supervisión y llene el volumen de datos.",{"type":39,"title":151,"body":152},"Resolución avanzada de problemas: SSH y clonado HTTPS","**`Permission denied (publickey)` tras una actualización.** La ruta del binario referenciado en `authorized_keys` ha cambiado (comprobado en 1.27). El servicio Gitea responde con normalidad por HTTPS, lo que enmascara el problema. Corrija con: `docker exec -u git gitea gitea admin regenerate keys`. Compruebe que un `git clone` por SSH funciona antes de dar por terminada la actualización.\n\n**Timeout o error SSL al clonar por HTTPS.** Tres causas comunes: el `ROOT_URL` en `app.ini` no coincide con el dominio HTTPS real (enlaces rotos + posible bucle de redirección), el reverse proxy no reenvía la cabecera `X-Forwarded-Proto: https` (Gitea genera entonces URLs en HTTP), o el certificado Let's Encrypt ha caducado (Caddy y certbot lo renuevan automáticamente, pero solo si el DNS sigue apuntando al VPS). Verifique `ROOT_URL` primero: es la causa más frecuente tras una migración de dominio.\n\n**Clonado SSH lento o que se bloquea.** El upload-pack SSH usa el mismo proceso Git que las operaciones web. Si su `act_runner` está utilizando todos los núcleos de CPU disponibles durante una compilación, las operaciones Git pueden quedar a la espera. Añada `cpus: '1.5'` al runner en el compose para reservarle núcleos sin privarlo por completo.\n\n**`Database migration failed: column already exists`.** La base recibió una migración parcial (parada durante la actualización). Restaure el dump realizado antes de la actualización, parta de un volumen limpio y vuelva a lanzar.",{"type":39,"title":154,"body":155},"Gitea 28.1.0: la comparación de PR falla con exit 128","Tras actualizar a Gitea 28.1.0, la vista de comparación de pull requests falla silenciosamente en repositorios grandes (superiores a 1,4 GB) con el error `exit 128 \"unable to fetch head branch\"`. La causa raíz es un archivo de bloqueo obsoleto (`commit-graph.lock`) dejado por un `git fetch` ejecutado sin el indicador `--no-write-commit-graph` — comportamiento introducido en esta versión (issue upstream #39795, reportada el 15 de octubre de 2026).\n\n**Diagnóstico.** Compruebe la presencia del archivo de bloqueo en el repositorio afectado:\n\n```bash\ndocker exec -u git gitea find \u002Fdata\u002Fgitea\u002Frepositories -name 'commit-graph.lock'\n```\n\n**Corrección inmediata.** Elimine el archivo de bloqueo obsoleto:\n\n```bash\ndocker exec -u git gitea find \u002Fdata\u002Fgitea\u002Frepositories -name 'commit-graph.lock' -delete\n```\n\nLa comparación de PR se restaura de inmediato sin necesidad de reiniciar el contenedor.\n\n**Recomendación.** La corrección definitiva fue integrada en PR #39798 y se incluye en Gitea 28.1.1+. Planifique la actualización a 28.1.1 o superior cuanto antes; las instancias que gestionan repositorios de gran tamaño se ven afectadas sistemáticamente tras un fetch concurrente.",{"type":39,"title":157,"body":158},"Gitea Actions: valores YAML multilínea corruptos desde v28","Desde Gitea v28, los escalares de bloque plegado YAML (`>`) utilizados en campos `with:` de pasos de flujo de trabajo son malinterpretados en ejecución: los valores multilínea se truncan o concatenan sin saltos de línea, produciendo errores silenciosos difíciles de diagnosticar (issue upstream #39775, reportada el 15 de octubre de 2026).\n\n**Síntoma típico.** Un parámetro `with:` definido en varias líneas con `>`:\n\n```yaml\n- uses: some-action@v1\n  with:\n    config: >\n      línea uno\n      línea dos\n      línea tres\n```\n\n…es recibido por la acción como `línea uno línea dos línea tres` (los saltos de línea se pierden), en lugar del valor esperado con separación por líneas.\n\n**Soluciones alternativas.** Dos enfoques equivalentes:\n\n1. Reemplace `>` (plegado) por `|` (literal) — los saltos de línea se conservan tal cual:\n\n```yaml\n  with:\n    config: |\n      línea uno\n      línea dos\n      línea tres\n```\n\n2. Utilice una cadena entre comillas con `\\n` explícitos si el valor debe permanecer en una sola línea lógica.\n\nEste comportamiento afecta a todos los flujos de trabajo que usan bloques `>` dentro de `with:` desde la migración a v28; los bloques `|` y los escalares en línea no se ven afectados. Se está evaluando una corrección oficial en el repositorio upstream.",{"type":39,"title":160,"body":161},"Pasar a Gitea 1.27 sin perder los accesos SSH","La versión 1.27 modifica la ruta interna del binario `gitea` referenciado en `authorized_keys`. Durante la actualización, las entradas existentes apuntan a la ruta antigua: cualquier intento de clonado o de push por SSH falla en silencio con `Permission denied (publickey)`, sin mensaje de error del lado del servidor que apunte a la actualización. Después de cada actualización a la 1.27 (o a cualquier versión que cambie esa ruta), ejecute dentro del contenedor: `docker exec -u git gitea gitea admin regenerate keys`. El comando reescribe todas las entradas `authorized_keys` con la ruta correcta del binario. Compruebe después que un `git clone` por SSH funciona antes de dar por terminada la actualización.",{"type":81,"body":163},"`JWT_SECRET_URI` y `JWT_SECRET` no deben coexistir en `app.ini`. Si ambas claves están presentes, Gitea o Forgejo carga una u otra según el orden de lectura, lo que invalida en silencio todos los tokens OAuth2 y Actions emitidos antes de la actualización. Los usuarios ven errores de autenticación intermitentes, sin ningún mensaje que señale `app.ini` como causa. Elija un solo mecanismo: `JWT_SECRET` (valor en texto plano) o `JWT_SECRET_URI` (ruta hacia un archivo secreto), y elimine el otro. Reinicie el contenedor tras la modificación.",{"type":39,"title":165,"body":166},"Para ir más lejos: Forgejo y CI\u002FCD avanzado","Si desea profundizar en la automatización alrededor de su forja Git, el artículo \u003Ca href=\"\u002Fes\u002Fblog\u002Falojar-forgejo-en-un-vps\">Alojar Forgejo en su VPS\u003C\u002Fa> detalla la configuración de una instancia Forgejo con runners Actions dedicados, la configuración del registro OCI integrado y el endurecimiento de la seguridad (fail2ban, restricción de rangos IP). Para equipos que quieran una cadena de despliegue continuo completa, es el complemento natural de esta guía.",{"type":81,"title":168,"body":169},"La documentación oficial","Para la configuración avanzada y las opciones propias de la herramienta, consulte la \u003Ca href=\"https:\u002F\u002Fdocs.gitea.com\" target=\"_blank\" rel=\"noopener noreferrer\">documentación oficial de Gitea\u003C\u002Fa> o la \u003Ca href=\"https:\u002F\u002Fforgejo.org\u002Fdocs\u002Flatest\u002F\" target=\"_blank\" rel=\"noopener noreferrer\">documentación de Forgejo\u003C\u002Fa>. Esta guía cubre la puesta en línea en un VPS y la migración; las documentaciones de los editores siguen siendo la referencia para los ajustes finos y los casos de uso específicos.","Despliegue Gitea o Forgejo en unos minutos en un VPS Cloud de ServOrbit","Nuestro VPS Cloud, entregado con Docker preconfigurado, le permite montar su forja con SSL automático, sin manipulaciones de sistema. Recursos dedicados, snapshots e IP fija incluidos.","Lanzar mi VPS Cloud","\u002Fvps-cloud",[175,192,209],{"id":176,"slug":177,"slugs":178,"title":182,"excerpt":183,"readTime":184,"views":185,"isPinned":19,"noindex":19,"publishedAt":186,"updatedAt":187,"category":188,"categories":189,"featuredImage":30,"bgImage":31,"posterImage":191,"relatedSolution":30},75,"alojar-forgejo-en-un-vps",{"fr":179,"en":180,"ar":181,"es":177},"heberger-forgejo","host-forgejo-on-your-own-vps","استضافة-forgejo-على-خادم-vps-الخاص-بك","Alojar Forgejo en su VPS: guía completa 2025","Instale Forgejo en su VPS con Docker, SSL, runners Actions y seguridad reforzada. Guía paso a paso de 1900 palabras para una forja Git soberana.",10,9,"2026-04-06T00:00:00+00:00","2026-11-08T01:13:14+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[190],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-forgejo-poster.svg",{"id":193,"slug":194,"slugs":195,"title":199,"excerpt":200,"readTime":201,"views":18,"isPinned":19,"noindex":19,"publishedAt":202,"updatedAt":21,"category":203,"categories":204,"featuredImage":30,"bgImage":31,"posterImage":206,"relatedSolution":207},71,"alojar-nextcloud-en-su-propio-vps",{"fr":196,"en":197,"ar":198,"es":194},"heberger-nextcloud","hosting-nextcloud-on-your-own-vps","استضافة-nextcloud-على-خادمك-الـvps-الخاص","Alojar Nextcloud en VPS: guía NC 35, PHP 8.3 y MariaDB 11","Aloje Nextcloud en un VPS: Docker Compose, Redis, copia MariaDB, subidas de más de 40 GB tras Cloudflare y una alternativa a Office 2021.",20,"2026-04-10T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[205],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-nextcloud-poster.svg",{"categorySlug":25,"appSlug":208},"nextcloud",{"id":210,"slug":211,"slugs":212,"title":216,"excerpt":217,"readTime":218,"views":18,"isPinned":19,"noindex":19,"publishedAt":219,"updatedAt":220,"category":221,"categories":227,"featuredImage":30,"bgImage":31,"posterImage":229,"relatedSolution":230},43,"desplegar-una-aplicacion-nodejs-en-un-vps",{"fr":213,"en":214,"ar":215,"es":211},"deployer-nodejs-vps","deploy-a-nodejs-application-on-a-vps","نشر-تطبيق-nodejs-على-vps","Desplegar una aplicación Node.js en un VPS","Despliegue una aplicación Node.js en producción en un VPS: PM2, reverse proxy Nginx, SSL Let's Encrypt y arranque automático con el sistema.",8,"2026-05-08T00:00:00+00:00","2026-11-08T01:13:12+00:00",{"id":222,"name":223,"slug":224,"color":225,"icon":226},4,"Desarrollo","developpement","bg-warning\u002F10 text-warning","dev",[228],{"id":222,"name":223,"slug":224,"color":225,"icon":226},"\u002Fblog\u002Fcovers\u002Fdeployer-nodejs-vps-poster.svg",{"categorySlug":34,"appSlug":231},"nodejs-stack",true,1794270525228]