Guía de despliegue

Desplegar Plane en VPS: guía y regresiones post-2.3.7

Desplegar en un VPS Cloud →

Tutorial

Desplegar Plane en VPS: guía y regresiones post-2.3.7

Automatización13 min de lectura8 pasos

La factura de Linear o Jira crece con cada nuevo puesto, y confiar los tickets de sus proyectos a un proveedor externo no siempre es aceptable. Plane es una alternativa con licencia AGPL-3.0, distribuida como edición Community autoalojable con un instalador oficial de Docker Compose. Esta guía muestra cómo desplegarla en un VPS Linux, colocarla detrás de un proxy inverso HTTPS, entender qué exige realmente la imagen AIO y diagnosticar los fallos que reaparecen en los tickets públicos: imagen de MinIO inexistente, bucle de redirección en la página de perfil y problemas tras una actualización de versión.

Contenido· Por qué alojar Plane usted mismo en lugar de pagar por puesto1/11
  1. 01Por qué alojar Plane usted mismo en lugar de pagar por puesto
  2. 02Lo que gana al alojar Plane en su propio VPS
  3. 03Requisitos dimensionados para un despliegue estable
  4. 04Desplegar Plane Community en ocho pasos
  5. 05Configuración posterior a la instalación: las variables que importan
  6. 06Almacenamiento de objetos: la imagen de MinIO inexistente y la corrección de la versión 1.4.3
  7. 07Tras una actualización de versión: lo que el ticket 8708 establece y lo que no
  8. 08Instalador Compose o imagen AIO: lo que exige cada uno
  9. 09Solución de problemas: bucle de redirección entre /profile/ y /?next_path=/profile/
  10. 10Solución de problemas: otros errores frecuentes y sus remedios
  11. 11Conservar el control de su infraestructura sin mantener la capa de sistema

Por qué alojar Plane usted mismo en lugar de pagar por puesto

Una herramienta de seguimiento de tickets concentra lo más locuaz de un equipo: decisiones, archivos adjuntos, nombres de clientes, plazos. Alojarla en su VPS traslada el coste del número de puestos a la capacidad del servidor: usted paga recursos, no usuarios. Plane supera las 61 000 estrellas en GitHub, su código se publica bajo AGPL-3.0 y el editor anuncia en su blog más de 100 000 despliegues con Docker y más de 44 000 con Kubernetes, lo que da una idea de la base instalada y de la cantidad de experiencia pública disponible.

Hay una contrapartida que conviene conocer antes de empezar. La pila Community incluye varios servicios: interfaz web, API, workers, servidor en tiempo real, base de datos PostgreSQL, caché Valkey, cola de mensajes RabbitMQ, almacenamiento de objetos compatible con S3 y proxy inverso. El instalador oficial los orquesta con Docker Compose, pero usted sigue siendo responsable de las copias de seguridad, las actualizaciones y el estado del almacenamiento de objetos. Las secciones siguientes detallan cada punto, distinguiendo lo que los mantenedores han confirmado de lo que solo han informado los usuarios.

Lo que gana al alojar Plane en su propio VPS

  • Un coste ligado a la máquina, no a los puestos — el precio del VPS no varía con el número de cuentas; lo que limita al equipo son la memoria y el disco.
  • Datos bajo su control — tickets, comentarios, archivos y miembros permanecen en su base PostgreSQL y en su almacenamiento de objetos, en su propio disco.
  • Una licencia AGPL-3.0 — el código es auditable; la licencia obliga a publicar sus modificaciones si expone una versión modificada a usuarios.
  • Issues, ciclos, módulos, páginas e inbox — seguimiento de tareas, sprints, agrupaciones funcionales, documentación ligera y solicitudes entrantes, sin módulo aparte.
  • Un instalador oficial — el script setup.sh obtiene un docker-compose.yaml y un plane.env publicados con la versión, y gestiona inicio, parada, actualización y copia de seguridad.
  • Actualizaciones a su ritmo — usted elige el momento de la actualización de versión, tras una copia de seguridad, y el script archiva el antiguo archivo Compose antes de reemplazarlo.
  • Un almacenamiento que puede sacar del VPS — la base PostgreSQL y el almacenamiento S3 pueden vivir fuera del VPS; la documentación de Plane lo recomienda para producción.
  • Una API REST documentada — útil para sincronizar issues desde un pipeline de CI o desde GitHub.

Requisitos dimensionados para un despliegue estable

La documentación de Plane indica 2 núcleos y 4 GB de RAM como mínimo, con 8 GB recomendados en producción. Cuente con 2 vCPU y 8 GB de RAM si el equipo supera la decena de personas o si usa mucho las páginas y los ciclos: PostgreSQL, RabbitMQ, los workers y la API comparten la misma máquina. Prevea 20 GB de disco o más: las imágenes de Docker y la base pesan poco al principio, son los archivos subidos los que hacen crecer el volumen uploads.

Necesita un Docker reciente con el plugin Compose (el script llama a docker compose), un nombre de dominio o subdominio cuyo registro A apunte al VPS y los puertos 80 y 443 abiertos. Un certificado TLS es indispensable en producción: sin HTTPS, contraseñas y sesiones circulan en claro.

Desplegar Plane Community en ocho pasos

  1. Preparar el host e instalar Docker

    En un VPS Debian o Ubuntu actualizado, instale Docker con el script oficial: curl -fsSL https://get.docker.com | sh. Active el servicio con systemctl enable --now docker y compruebe docker version y docker compose version. Abra los puertos 80 y 443 en el cortafuegos y limite el puerto 22 a sus direcciones.

  2. Descargar el instalador oficial

    Cree una carpeta dedicada con mkdir -p /opt/plane-selfhost && cd /opt/plane-selfhost y descargue el script de la última versión: curl -fsSL -o setup.sh https://github.com/makeplane/plane/releases/latest/download/setup.sh y chmod +x setup.sh. El script trabaja en la carpeta actual: crea allí la subcarpeta plane-app.

  3. Lanzar la instalación

    Ejecute ./setup.sh como root o con un usuario del grupo docker y elija la opción 1 (Install). El script descarga docker-compose.yaml y plane.env en plane-app/ y, en las versiones recientes, genera credenciales para el almacenamiento de objetos integrado. Salga del menú con la opción 8 antes de configurar: la documentación pide detener la pila antes de editar plane.env.

  4. Rellenar plane.env

    Abra plane-app/plane.env y fije como mínimo APP_DOMAIN=plane.your-domain.com, WEB_URL=https://plane.your-domain.com y CORS_ALLOWED_ORIGINS=https://plane.your-domain.com. Para que Nginx conserve los puertos 80 y 443, añada LISTEN_HTTP_PORT=8080. Compruebe que SECRET_KEY y LIVE_SERVER_SECRET_KEY tienen valores únicos, nunca ejemplos: openssl rand -hex 32 genera uno.

  5. Iniciar la pila y comprobar los contenedores

    Vuelva a ejecutar ./setup.sh y elija la opción 2 (Start). El primer inicio descarga las imágenes y después el contenedor migrator prepara la base y se detiene. Compruebe el estado con docker compose -f plane-app/docker-compose.yaml --env-file plane-app/plane.env ps: todos los demás contenedores deben estar en ejecución. La opción 6 del menú muestra los registros.

  6. Obtener un certificado TLS con Certbot

    Instale Nginx y Certbot con apt install -y nginx certbot python3-certbot-nginx y solicite el certificado: certbot certonly --nginx -d plane.your-domain.com. Los archivos se depositan en /etc/letsencrypt/live/plane.your-domain.com/. El nombre de dominio debe apuntar ya al VPS.

  7. Configurar Nginx como proxy inverso HTTPS

    Cree un sitio de Nginx que escuche en el puerto 443 con el certificado obtenido y reenvíe todo a http://127.0.0.1:8080. Añada las cabeceras Host, X-Real-IP, X-Forwarded-For y X-Forwarded-Proto, así como Upgrade y Connection para los WebSocket del servidor en tiempo real. Un segundo bloque server redirige el puerto 80 a HTTPS con return 301 https://$host$request_uri;. Active el sitio y ejecute nginx -t && systemctl reload nginx. Docker publica el puerto 8080 sin pasar por UFW: ciérrelo desde el exterior con el cortafuegos de su proveedor.

  8. Crear el administrador de la instancia y el equipo

    Abra https://plane.your-domain.com/god-mode/ para crear la cuenta de administrador de la instancia. Conserve la barra final: un usuario informa de que una dirección sin ella se quedaba bloqueada, algo que los mantenedores no han confirmado. Abra después la aplicación, cree el espacio de trabajo y el primer proyecto e invite a sus colaboradores.

Configuración posterior a la instalación: las variables que importan

WEB_URL y CORS_ALLOWED_ORIGINS: la documentación pide fijar ambas a la dirección que realmente usa el navegador. Es la primera comprobación si el comportamiento es extraño tras iniciar sesión.

LISTEN_HTTP_PORT y LISTEN_HTTPS_PORT: puertos publicados por el proxy integrado, 80 y 443 por defecto. Cámbielos si Nginx ya ocupa los puertos estándar.

TRUSTED_PROXIES y NUM_PROXIES: determinan la dirección IP del cliente que ve la API y, por tanto, la limitación de tasa. Detrás de su propio proxy inverso, el README del instalador pide aumentar NUM_PROXIES en una unidad por salto adicional; si se deja vacío, se aplica el comportamiento por defecto.

UNSPLASH_ACCESS_KEY: opcional, alimenta el selector de imágenes de portada. Déjela vacía si no usa Unsplash; es el primer ajuste que hay que revisar ante un bucle de redirección, descrito más abajo.

APP_RELEASE: la versión seguida, stable al principio. El script la resuelve a un número de versión durante la instalación y en cada actualización.

Detenga la pila con la opción 3 antes de modificar plane.env y reinicie con la opción 4.

Antes de cualquier actualización, haga una copia de seguridad: la opción 7 del script, más un volcado de PostgreSQL con docker compose -f plane-app/docker-compose.yaml --env-file plane-app/plane.env exec -T plane-db pg_dump -U plane plane > plane-backup-$(date +%F).sql. Después ejecute la opción 5 (Upgrade): el script compara la versión instalada con la última, pide confirmación, archiva el antiguo docker-compose.yaml en plane-app/archive/ y conserva una copia plane.env.bak. Revise plane.env después para detectar nuevas variables. No actualice nunca con docker compose down -v: la opción -v elimina el volumen uploads y, con él, sus archivos adjuntos. Las notas de la versión v1.4.3, publicada en octubre de 2026, corrigen varios fallos de control de acceso y piden a las instancias autoalojadas que actualicen.

Almacenamiento de objetos: la imagen de MinIO inexistente y la corrección de la versión 1.4.3

Síntoma. En una instalación nueva o en una actualización, la descarga de imágenes falla en el servicio de almacenamiento con el mensaje pull access denied for minio/minio, repository does not exist or may require 'docker login'. El registro responde 401 en lugar de 404 a un cliente anónimo, de ahí que el mensaje parezca un problema de credenciales: ningún docker login cambia nada.

Confirmado por el equipo de Plane. La organización minio ha desaparecido de Docker Hub. La PR #9829, fusionada en septiembre de 2026, lo constata y cambia las imágenes a quay.io. Las notas de la versión v1.4.3 precisan después que el almacenamiento de objetos integrado usa la imagen pgsty/silo, fijada a una etiqueta de versión en lugar de latest. Un colaborador del repositorio indicó además en el ticket #9834, abierto en septiembre de 2026, que la versión se había actualizado con otra imagen.

Solo informado por usuarios. La solución provisional con quay.io/minio/minio funcionó para algunos y, después, varios participantes informaron de errores 401 en ese registro a partir del 24 de septiembre de 2026. Esos mensajes son anteriores a la corrección de la versión; no los aplique a una instalación reciente.

Qué hacer. En una instalación nueva, use el script de la última versión y compruebe con grep -n 'image:' plane-app/docker-compose.yaml que ninguna línea cita minio/minio. En una instalación existente que aún la cita, haga una copia de seguridad y ejecute la opción 5 del script. Para producción, la propia PR #9829 recomienda preferir un almacenamiento S3 externo al MinIO integrado, cuya rama comunitaria está congelada aguas arriba según su autor: es una orientación del equipo de Plane, no una garantía.

Tras una actualización de versión: lo que el ticket 8708 establece y lo que no

En marzo de 2026, un usuario abrió el ticket #8708 para describir una instalación difícil. Tras pasar de la versión 2.3.3 a la 2.3.7, los permisos de los archivos subidos estaban rotos; un volumen declarado con comillas simples en un archivo de la imagen AIO se interpretaba mal; y el primer botón propuesto al administrador llevaba a /god-mode sin barra final, una página que se quedaba bloqueada.

Lo que los mantenedores confirmaron cabe en una frase: la versión 2.3.7 no es una versión oficial, se produjo para un cliente concreto y la 2.4.0 resuelve el problema. No confirmaron ninguna de las tres anomalías. El autor respondió que el defecto de las comillas persistía en el Dockerfile y el ticket se cerró sin corrección asociada.

Retenga tres consignas. Instale solo versiones publicadas en la página Releases del repositorio, cuya última es v1.4.3; no descargue una versión intermedia. Haga una copia de seguridad antes de cada actualización de versión. Tras actualizar, abra un adjunto antiguo y uno reciente: si la apertura falla, inspeccione los permisos del volumen de uploads con docker volume inspect antes de modificar nada, con la copia de seguridad a mano.

Instalador Compose o imagen AIO: lo que exige cada uno

Desplace la tabla

CriterioInstalador Compose (Community)Imagen AIO Community
Servicios incluidosPostgreSQL, Valkey, RabbitMQ, almacenamiento de objetos y proxy en la pila ComposeAplicaciones, API, workers y proxy Caddy en un único contenedor
Servicios externosNinguno obligatorio; recomendados en producciónPostgreSQL, Redis, RabbitMQ y almacenamiento S3 que debe aportar usted
Punto de entrada`./setup.sh` y el archivo `plane.env``docker run` con `DOMAIN_NAME`, `DATABASE_URL`, `REDIS_URL`, `AMQP_URL` y las variables S3
SecretosValores que revisar en `plane.env``SECRET_KEY` y `LIVE_SERVER_SECRET_KEY` obligatorias: el contenedor se detiene si están vacías
ActualizaciónOpción 5 del script, con archivo del antiguo archivo ComposeDescargar la nueva imagen y recrear el contenedor
Uso descritoServidor único, con almacenamiento externo aconsejado en producciónDespliegue sencillo y pruebas, según su README

Solución de problemas: bucle de redirección entre /profile/ y /?next_path=/profile/

Síntoma (ticket #6694, abierto en marzo de 2025 y aún abierto el 24 de octubre de 2026). Detrás de un nombre de dominio, abrir https://your-domain.com/profile/ redirige a https://your-domain.com/?next_path=/profile/ y la página entra en bucle. En el registro de la API del autor, casi todas las peticiones responden 200, salvo una que reaparece en cada vuelta: GET /api/unsplash/?query= HTTP/1.1" 401, seguida de Unauthorized: /api/unsplash/.

Establecido. El autor usaba Docker Compose con un Nginx externo delante de Plane. Los mantenedores preguntaron por el modo de despliegue y luego por la presencia de un proxy inverso, y respondieron en marzo de 2025 que estaban investigando. No han publicado ninguna causa.

Informado. En julio de 2026, un participante encontró el mismo síntoma: había introducido la clave secreta de Unsplash en lugar de la clave de acceso en UNSPLASH_ACCESS_KEY. Una PR propuesta por un colaborador externo, la #10108, aún abierta el 31 de octubre de 2026, plantea la explicación: la API devuelve tal cual el 401 de Unsplash y la aplicación web trata cualquier 401 como una sesión caducada, de ahí la redirección; propone responder 502 en su lugar. Es una hipótesis de colaborador, respaldada por un solo testimonio, no una constatación de los mantenedores, y no cubre necesariamente todos los bucles de redirección.

Qué hacer, por orden. Primero, busque la línea en el registro: docker compose -f plane-app/docker-compose.yaml --env-file plane-app/plane.env logs api | grep unsplash. Si no aparece, su bucle tiene otra causa: revise WEB_URL y CORS_ALLOWED_ORIGINS. Si aparece con un 401, revise UNSPLASH_ACCESS_KEY en plane.env y en la sección Images del panel /god-mode/: hace falta la clave de acceso (Access Key), no la clave secreta. Si no usa Unsplash, vacíe el valor y reinicie la pila; según la PR, una clave ausente devuelve una lista vacía sin error.

Solución de problemas: otros errores frecuentes y sus remedios

Redirecciones a http://localhost o recursos que no cargan. WEB_URL y CORS_ALLOWED_ORIGINS no coinciden con la dirección pública. Corrija ambas y después detenga y reinicie la pila.

pull access denied for minio/minio. Vea la sección sobre el almacenamiento de objetos: pase a una versión reciente con la opción 5 del script.

502 Bad Gateway devuelto por Nginx. El proxy integrado no escucha en el puerto previsto. Compare LISTEN_HTTP_PORT en plane.env con el destino de proxy_pass y pruebe curl -I http://127.0.0.1:8080 desde el VPS. Si la respuesta tarda, docker compose -f plane-app/docker-compose.yaml --env-file plane-app/plane.env ps muestra qué contenedor se reinicia en bucle.

Los correos de invitación no salen. Indique el servidor SMTP en los ajustes de correo de la instancia, desde /god-mode/, y envíe una invitación de prueba. Compruebe también que el proveedor no filtre el puerto SMTP de salida.

Lentitud con muchos usuarios. Observe docker stats: si la memoria está saturada, aumente la RAM antes de cualquier otro ajuste y plantéese después sacar PostgreSQL y el almacenamiento de objetos del VPS.

Conservar el control de su infraestructura sin mantener la capa de sistema

Alojar Plane usted mismo demuestra que la dependencia de las suscripciones SaaS no es una fatalidad: el instalador oficial, un VPS bien dimensionado y un proxy inverso TLS bastan para un equipo de tamaño profesional. ServOrbit ofrece VPS root con IPv4 dedicada, listos en pocos minutos, en los que tiene acceso root completo para instalar Docker y gestionar sus propias herramientas. Si desea delegar la capa de sistema — actualizaciones del kernel, refuerzo de SSH, copias de seguridad —, la opción de administración del VPS le permite conservar el control de sus datos y externalizar el mantenimiento del host. Para profundizar en su práctica DevOps, consulte la guía sobre la automatización de sus servidores con Ansible y la guía de Docker Compose para producción.

Desplegar Plane desde el Marketplace de ServOrbit

ServOrbit ofrece Plane preconfigurado en VPS: PostgreSQL 16, Redis 7, RabbitMQ y MinIO montados automáticamente. Dominio requerido incluido en la receta — primer acceso en unos minutos, datos bajo su control.

¿Necesita ayuda?

Consulte nuestro centro de ayuda y nuestra FAQ, o contacte con nuestro equipo: llamada, WhatsApp o correo electrónico. Soporte en francés, inglés y árabe.

Escribir por WhatsAppse abre en una pestaña nueva