Guía de despliegue

Stack Dev Docker en VPS: entorno listo para programar

Desplegar en un VPS Cloud →

Tutorial

Stack Dev Docker en VPS: entorno listo para programar

Desarrollo10 min de lectura6 pasos

Un entorno de desarrollo remoto evita saturar el equipo local y ofrece una IP estable para los webhooks, las demostraciones y las pruebas de integración. En un VPS ServOrbit, Docker Compose se convierte en un taller completo: Nginx, PHP-FPM o Node, PostgreSQL, Redis, Mailpit y Adminer trabajan juntos en contenedores aislados, persistentes y accesibles por SSH desde cualquier estación de trabajo. Esta guía detalla la composición del stack, la configuración de los servicios y las buenas prácticas para el trabajo en equipo sin conflictos.

Contenido· ¿Por qué alojar un Stack Dev Docker en un VPS?1/12
  1. 01¿Por qué alojar un Stack Dev Docker en un VPS?
  2. 02Lo que puede hacer con un Stack Dev Docker
  3. 03Requisitos previos: configuración mínima recomendada
  4. 04Componentes del stack: el papel de cada servicio
  5. 05Instalar un Stack Dev Docker en su VPS ServOrbit
  6. 06Configuración de los servicios: volúmenes, redes y variables de entorno
  7. 07Acceso desde el portátil: SSH tunneling y reverse proxy
  8. 08Buenas prácticas: desarrollo frente a producción
  9. 09Recarga en caliente con docker compose watch
  10. 10Variantes de stack según el tipo de proyecto
  11. 11Resolución de problemas: 4 errores frecuentes
  12. 12La documentación oficial

¿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

  1. 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.

  2. 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.

  3. 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.

  4. 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 con docker compose ps en el directorio /opt/docker-dev-stack.

  5. 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.yml para añadir o quitar servicios según sus necesidades. Vuelva a lanzar el stack con docker compose up -d para 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/.

  6. 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

StackServicios principalesCaso de usoRAM recomendada
LAMPNginx + PHP-FPM 8.3, MariaDB 10.11, RedisWordPress, OctoberCMS, Laravel4 GB
MERNNode.js 22, MongoDB 7, RedisREST API + React/Vue SPA4 GB
Django / PostgreSQLPython 3.12, PostgreSQL 16, Redis, CeleryApps Python, ML, Django REST API4 GB
PHP + PostgreSQLNginx + PHP-FPM 8.3, PostgreSQL 16, Redis, MailpitSymfony, API Platform, Drupal4 GB
Full NodeNode.js 22, PostgreSQL 16, Redis, MailpitNestJS, Express, Fastify4 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.

Despliegue un Stack Dev Docker en pocos minutos en un VPS Cloud ServOrbit

Disfrute de un VPS Cloud de alta disponibilidad con instalación en 1 clic de su entorno Docker, soporte incluido y una modalidad mensual sin compromiso.

¿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