¿Por qué alojar un Stack Dev Docker en un VPS?
Un entorno de desarrollo local funciona, pero sigue ligado a una sola máquina: cambiar de equipo, incorporar a un nuevo colaborador o acceder desde otro país se convierten en fricciones. Al centralizar su stack Docker en un VPS, dispone de un servidor de desarrollo compartido, siempre encendido, accesible por SSH o desde el navegador esté donde esté. También gana en reproducibilidad: cada servicio se define en un archivo docker-compose.yml, lo que elimina el famoso problema de «en mi máquina funciona».
Lo que puede hacer con un Stack Dev Docker
- Lanzar simultáneamente varios servicios (Nginx, MySQL, Redis, PHP-FPM, Node.js) en contenedores aislados sin conflictos de puertos ni de versiones
- Compartir un entorno de desarrollo idéntico entre todos los miembros de un equipo gracias al archivo docker-compose.yml versionado en Git
- Probar migraciones de base de datos o actualizaciones de dependencias en un contenedor efímero sin arriesgar el entorno principal
- Alojar un servidor CI/CD ligero (Gitea, Drone CI) directamente en el mismo VPS para automatizar sus despliegues internos
- Acceder a sus servicios de desarrollo mediante subdominios o reverse proxies Traefik/Nginx sin abrir puertos innecesarios
- Hacer copias de seguridad y restaurar todo su stack con unos pocos comandos gracias a los volúmenes Docker y a los snapshots del VPS
Requisitos previos: configuración mínima recomendada
Un stack completo con PostgreSQL, Redis, Nginx y una aplicación consume en la práctica 4 GB de RAM como mínimo — por debajo, el OOM killer de Docker interrumpe PostgreSQL o Redis en mitad de una migración sin ningún mensaje de error a nivel de aplicación. El VPS debe funcionar con Ubuntu 22.04 LTS o Debian 12, con Docker Engine 26+ y Docker Compose v2.22+ instalados (el comando se escribe docker compose, sin guión). Verifique la versión con docker compose version: la funcionalidad watch usada más adelante requiere v2.22 como mínimo, lanzada en septiembre de 2023.
Componentes del stack: el papel de cada servicio
El stack de referencia de ServOrbit reúne seis servicios complementarios.
Nginx actúa como reverse proxy frontal: recibe las peticiones HTTP en el puerto 80 y las enruta hacia PHP-FPM (vía FastCGI) o hacia un servidor Node.js. La configuración nginx/default.conf se monta como volumen para poder editarse sin reconstruir la imagen.
PHP-FPM 8.3 (o Node.js 22 según el perfil del stack) ejecuta el código de la aplicación. Ambas variantes están disponibles en el Marketplace de ServOrbit; el docker-compose.yml incluye los dos servicios — desactive el que no necesite con profiles.
PostgreSQL 16 almacena los datos persistentes. El puerto 5432 no está expuesto en el host por defecto — solo la red interna de Docker dev_net tiene acceso, lo que evita cualquier exposición accidental en la IP pública del VPS.
Redis 7 actúa como caché y broker de mensajes. Como PostgreSQL, permanece en la red interna (puerto 6379) y es accesible desde el código de la aplicación mediante el nombre de servicio redis.
Mailpit 1.x sustituye a un servidor SMTP real en desarrollo: captura todos los correos salientes y los expone en una interfaz web en el puerto 8025. No se requiere ninguna configuración SMTP especial en el lado de la aplicación — simplemente apunte a mailpit:1025.
Adminer (puerto 8080) ofrece una interfaz web ligera para gestionar PostgreSQL o MySQL sin un cliente pesado. Solo es accesible desde la propia máquina o mediante un SSH tunnel.
Instalar un Stack Dev Docker en su VPS ServOrbit
Contratar un VPS Cloud ServOrbit
Vaya a la página /vps-cloud y elija un plan adaptado a su uso. Para un stack de desarrollo estándar (unos cuantos contenedores, base de datos, reverse proxy), un VPS con 2 vCPU y 4 GB de RAM constituye un buen punto de partida. Finalice el pedido: su VPS se aprovisiona en menos de 60 segundos con Ubuntu 22.04 LTS.
Acceder al Marketplace en su área de cliente
Inicie sesión en su área de cliente ServOrbit y abra la sección «Marketplace» desde el panel de control de su VPS. El Marketplace enumera todas las aplicaciones disponibles con instalación en 1 clic, organizadas por categoría. Seleccione la categoría «Desarrollo» para filtrar los stacks orientados a desarrollo.
Iniciar la instalación del Stack Dev Docker
Haga clic en la tarjeta «Stack Dev Docker» y después en el botón «Instalar». La automatización despliega Docker Engine, Docker Compose y un archivo docker-compose.yml preconfigurado con los servicios esenciales (Nginx, PHP-FPM, PostgreSQL 16, Redis, Mailpit para las pruebas de correo, Adminer). La instalación completa suele tardar entre 2 y 4 minutos según el tamaño del VPS.
Obtener sus credenciales y acceder a la interfaz
Una vez finalizada la instalación, el área de cliente muestra la información de conexión generada automáticamente: dirección IP del VPS, contraseña de PostgreSQL y la URL de acceso a Mailpit (por defecto en el puerto 8025). Conéctese por SSH con
ssh root@<IP_VPS>para comprobar el estado de los contenedores condocker compose psen el directorio/opt/docker-dev-stack.Configurar su primer proyecto y personalizar el stack
Copie su código fuente en
/opt/docker-dev-stack/app/o modifique el archivo/opt/docker-dev-stack/docker-compose.ymlpara añadir o quitar servicios según sus necesidades. Vuelva a lanzar el stack condocker compose up -dpara aplicar los cambios. Para exponer sus servicios en un nombre de dominio, configure un registro DNS que apunte a la IP de su VPS y adapte la configuración de Nginx incluida en el directorio/opt/docker-dev-stack/nginx/.Conectarse por primera vez
No hay ninguna cuenta que crear: la URL abre directamente el buzón de correo de prueba Mailpit, sin contraseña. PostgreSQL (5432) y Redis (6379) solo son accesibles desde la propia máquina; las credenciales de Postgres están en /opt/docker-dev-stack/.env.
Configuración de los servicios: volúmenes, redes y variables de entorno
El docker-compose.yml del stack declara tres volúmenes con nombre — postgres_data, redis_data y app_data — montados respectivamente en /var/lib/postgresql/data, /data y /var/www/html. Estos volúmenes sobreviven a un docker compose down: los datos de la base y los archivos subidos permanecen intactos entre reinicios.
Todos los servicios comparten la red interna dev_net de tipo bridge. Nginx es el único servicio que expone un puerto en el host (80); los demás permanecen aislados y se comunican por nombre de servicio — postgres, redis, mailpit.
Las variables sensibles (contraseña de PostgreSQL, clave secreta de la aplicación) nunca se escriben directamente en docker-compose.yml. Se leen desde /opt/docker-dev-stack/.env mediante la directiva env_file. Este archivo está excluido del repositorio Git mediante .gitignore. Las variables de entorno no sensibles (puerto, versión de PHP, nombre de la base) pueden aparecer directamente en el archivo Compose bajo la clave environment, para que sean visibles al revisar el código.
Acceso desde el portátil: SSH tunneling y reverse proxy
PostgreSQL, Adminer y Redis no están expuestos en la IP pública del VPS. Para acceder a ellos desde su equipo local, abra un SSH tunnel: ssh -L 5432:localhost:5432 -L 8080:localhost:8080 root@<IP_VPS> crea dos reenvíos locales — el puerto 5432 de su portátil apunta a PostgreSQL y el 8080 a Adminer. Su cliente SQL habitual se conecta entonces en localhost:5432 como si la base de datos estuviera funcionando en local.
Para los servicios HTTP (Nginx, Mailpit), hay dos opciones. Si dispone de un nombre de dominio, configure un registro A que apunte a la IP del VPS y ajuste Nginx para servir dev.yourdomain.com en HTTP plano (sin TLS, ya que es un entorno de desarrollo). Si trabaja sin dominio, el SSH tunnel es suficiente: ssh -L 8025:localhost:8025 root@<IP_VPS> da acceso a Mailpit en localhost:8025.
Buenas prácticas: desarrollo frente a producción
En desarrollo, el archivo .env centraliza todos los secretos. En producción, los secretos de Docker (docker secret) o un gestor de secretos externo (Vault, AWS Secrets Manager) sustituyen al archivo plano — un .env versionado por accidente expone credenciales en el historial de Git.
Los límites de recursos (deploy.resources.limits) merecen configurarse desde el desarrollo: PostgreSQL puede consumir toda la RAM disponible si una consulta se desvía. Comience con memory: 512m en PostgreSQL, memory: 256m en Redis y memory: 256m en PHP-FPM, y ajuste según los perfiles de uso reales.
Nunca monte el socket de Docker (/var/run/docker.sock) en un contenedor de aplicación salvo que sea estrictamente necesario: un contenedor con acceso al socket puede lanzar otros contenedores con privilegios de root en el host. En desarrollo el riesgo es limitado, pero los hábitos adquiridos aquí suelen reproducirse en producción.
Recarga en caliente con docker compose watch
Docker Compose v2.22+ incorpora docker compose watch, disponible desde septiembre de 2023. Actívelo añadiendo un bloque develop.watch en el servicio app de su docker-compose.yml: especifique los directorios a vigilar y la acción asociada (sync para copiar archivos al contenedor sin reiniciarlo, rebuild para reconstruir la imagen). Luego ejecute docker compose watch en lugar de docker compose up -d: los cambios de archivos se propagan en tiempo real al contenedor, sin reinicios manuales. Compruebe su versión previamente con docker compose version.
Variantes de stack según el tipo de proyecto
Desplace la tabla
| Stack | Servicios principales | Caso de uso | RAM recomendada |
|---|---|---|---|
| LAMP | Nginx + PHP-FPM 8.3, MariaDB 10.11, Redis | WordPress, OctoberCMS, Laravel | 4 GB |
| MERN | Node.js 22, MongoDB 7, Redis | REST API + React/Vue SPA | 4 GB |
| Django / PostgreSQL | Python 3.12, PostgreSQL 16, Redis, Celery | Apps Python, ML, Django REST API | 4 GB |
| PHP + PostgreSQL | Nginx + PHP-FPM 8.3, PostgreSQL 16, Redis, Mailpit | Symfony, API Platform, Drupal | 4 GB |
| Full Node | Node.js 22, PostgreSQL 16, Redis, Mailpit | NestJS, Express, Fastify | 4 GB |
Resolución de problemas: 4 errores frecuentes
Puerto ya en uso. El error Bind for 0.0.0.0:80 failed: port is already allocated indica que un servicio del host (Apache, nginx del sistema) ya está escuchando en el puerto 80. Detenga el servicio del sistema (systemctl stop nginx o systemctl stop apache2) o cambie el puerto del host en docker-compose.yml ("8080:80") y acceda al stack en el puerto 8080.
Permisos de volumen. El error Permission denied en un volumen montado suele deberse a un uid/gid del contenedor diferente al del host. Añada user: "1000:1000" en el servicio afectado, o cambie los permisos del directorio del host con chown -R 1000:1000 /opt/docker-dev-stack/app.
Red bridge no encontrada. El mensaje network dev_net declared as external, but could not be found aparece si usa external: true en una red aún no creada. Elimine external: true: Docker Compose crea la red automáticamente en el primer docker compose up.
RAM insuficiente. PostgreSQL muestra FATAL: out of memory o se reinicia en bucle si el VPS está subdimensionado. Compruebe con free -m: deben estar disponibles al menos 4 GB para el stack completo. Reduzca shared_buffers en la configuración de PostgreSQL (command: postgres -c shared_buffers=128MB) o pase a un plan VPS superior.
Consejo pro: tome un snapshot bajo demanda de su VPS ServOrbit desde el área de cliente antes de modificar a fondo la configuración de Docker. Un snapshot le permite volver a un estado estable en un clic si una actualización de contenedor o un cambio en el archivo Compose rompe su entorno. Piense también en utilizar un archivo .env para almacenar sus variables sensibles (contraseñas, claves API) y en excluirlo de su repositorio Git mediante .gitignore: incluso en un servidor de desarrollo, es un buen hábito que conviene adquirir desde el principio.
La documentación oficial
Para la configuración avanzada, las opciones propias de la herramienta y los cambios de versión, consulte la documentación oficial de Docker Compose. Esta guía cubre la puesta en línea en un VPS ServOrbit; la documentación del editor sigue siendo la referencia para los ajustes finos.