El servidor es un edificio con una sola puerta
Todas las visitas de internet entran por la misma puerta. Justo detrás hay una recepción que mira qué dirección ha escrito la persona en el navegador y la acompaña hasta la habitación correcta. Cada proyecto vive en su propia habitación, aislado de los demás.
La recepción es la única que habla con internet. Tu proyecto solo habla con la recepción.
Esto tiene dos consecuencias prácticas para ti. La primera: tu proyecto no necesita saber nada de HTTPS ni de certificados, la recepción pone el candado por él. La segunda: tu proyecto no abre puertas propias a internet, solo escucha en un puerto interno que la recepción conoce.
Prepara tu proyecto
Para que se pueda publicar, tu proyecto tiene que cumplir esta lista. Casi todo se reduce a "que funcione con Docker".
- Funciona con Docker. Tienes un
Dockerfileo una imagen ya publicada, y undocker-compose.ymlque lo arranca. Si nunca lo has hecho, la guía de inicio de Docker es un buen punto de partida. - Escucha en un puerto y sabes cuál. Por ejemplo el 3000 o el 8080. Es el número que la recepción usará para llegar a tu habitación.
- Escucha en todas las interfaces, no solo en localhost. Dentro de Docker eso suele significar arrancar con
0.0.0.0en vez de127.0.0.1. Si tu app solo escucha en localhost, la recepción no la encontrará. - Las claves y contraseñas van en variables de entorno. Nunca escritas en el código ni subidas al repositorio. Se entregan aparte, en un archivo
.env. - Sabes qué datos tienen que sobrevivir. Una base de datos, archivos subidos, una carpeta de configuración. Todo lo que no esté en un volumen se pierde al reiniciar.
- Sabes qué dirección quieres. Lo explicamos en el siguiente punto.
Elige tu dirección
Hay tres formas de tener una dirección en este servidor. Las dos primeras son para cualquiera.
| Opción | Ejemplo | Qué tienes que hacer |
|---|---|---|
| Subdominio de kipups.com Lo más rápido |
tienda.kipups.com | Nada. Cualquier nombre delante de kipups.com ya llega al servidor. Solo di cuál quieres. |
| Tu propio dominio Si ya tienes uno |
app.midominio.com | Entra donde compraste el dominio y crea un registro A con el nombre que quieras apuntando a 2.25.161.181. En unos minutos estará listo. |
| yoiber.com y yoiber.dev Reservados |
— | Son del responsable del servidor. No se usan para proyectos de terceros. |
Los pasos
Cada paso indica quién lo hace. Tú preparas y entregas; el administrador instala y conecta.
- Entrega el proyecto TúPasa el enlace al repositorio o el nombre de la imagen, el
docker-compose.yml, el puerto en el que escucha, el dominio elegido y las variables de entorno por un canal privado. - Se instala en su habitación AdministradorEl proyecto se copia a una carpeta propia del servidor y se arranca con Docker. Los datos que deban persistir quedan en esa carpeta.
- Se presenta en la recepción AdministradorSe le dice a la recepción que ese dominio va a esa habitación y a ese puerto. En ese momento se pide el certificado, que se renueva solo para siempre.
- Compruebas que funciona TúAbre tu dominio en el navegador. Debe cargar con candado. Si algo falla, pide los registros de tu proyecto y se revisan juntos.
Ejemplo mínimo de docker-compose
Así se ve un proyecto listo para este servidor. Fíjate en tres cosas: no hay línea ports hacia fuera, el contenedor tiene un nombre claro, y está conectado a la red proxy, que es donde vive la recepción.
services:
tienda:
image: ghcr.io/tu-usuario/tienda:latest # o build: .
container_name: tienda
restart: unless-stopped
env_file: .env # claves y contraseñas, fuera del repo
volumes:
- ./data:/app/data # lo que debe sobrevivir a reinicios
expose:
- "3000" # puerto interno, visible solo para la recepción
networks:
- proxy
networks:
proxy:
external: true # la red ya existe en el servidor
Con este archivo, lo único que hay que decirle a la recepción es: tienda.kipups.com va a tienda en el puerto 3000. Si tu proyecto lleva base de datos, añádela como otro servicio en el mismo archivo, sin conectarla a la red proxy: solo tu app necesita hablar con ella.
Reglas de la casa
- Sin puertas propias a internet. Ningún proyecto publica puertos en el servidor. Todo entra por la recepción. Es lo que mantiene a todos protegidos.
- Nadie entra al servidor por SSH salvo el administrador. Quien controla Docker controla todos los proyectos, así que ese acceso no se comparte. Todo lo que necesites se pide.
- Secretos por canal privado. Claves de API, contraseñas de base de datos y similares nunca van en el repositorio ni en un mensaje público.
- Un proyecto, una carpeta. Cada uno vive en su carpeta con su compose y sus datos. Nada se mezcla.
- Recursos con cabeza. El servidor se comparte. Si tu proyecto va a consumir mucha memoria o disco, avísalo antes.
- Copias de seguridad son cosa tuya. Tus datos están en tu carpeta, pero decide tú qué hay que respaldar y con qué frecuencia, y pídelo.
Preguntas frecuentes
¿Tengo que configurar HTTPS yo?
No. La recepción pide el certificado cuando se publica tu dominio y lo renueva sola cada pocos meses. Tu proyecto sirve HTTP normal por dentro.
Mi app usa websockets. ¿Funciona?
Sí. Se activa al presentarla en la recepción. Solo dilo cuando entregues el proyecto.
¿Puedo tener varios dominios para el mismo proyecto?
Sí. Se añaden todos en la recepción apuntando a la misma habitación, y cada uno recibe su certificado.
¿Puedo gestionar yo mis dominios en el panel?
Sí, si lo pides. El administrador puede crearte un usuario en proxy.yoiber.dev con permisos limitados: verás y editarás solo tus dominios y certificados, nunca los de otros.
¿Cómo veo los errores de mi aplicación?
Pide los registros del contenedor. Si necesitas verlos a menudo, se puede acordar una forma de enviártelos.
¿Cómo actualizo mi proyecto?
Publica la nueva versión de la imagen o sube los cambios al repositorio y avisa. Se vuelve a arrancar el contenedor con la versión nueva. Los datos de tu carpeta se conservan.
¿Qué pasa si mi proyecto se cae?
Docker lo reinicia solo. Si se cae repetidamente, casi siempre es un error de la app o una variable de entorno que falta, y se ve en los registros.
Chuleta de Yoiber
Todo se hace desde el servidor con ssh kipups. Los scripts piden la contraseña del panel cuando la necesitan; ninguno la guarda.
Publicar un dominio apuntando a un contenedor y puerto. Pide el certificado y activa websockets.
bash /root/npm-add-host.sh tienda.kipups.com tienda 3000
Dar de alta a un desarrollador en el panel con permisos limitados a lo suyo.
bash /root/npm-add-user.sh correo@ejemplo.com "Nombre"
Instalar un proyecto nuevo. Carpeta propia en /opt, compose en la red proxy, sin ports.
mkdir -p /opt/tienda && cd /opt/tienda
# copiar docker-compose.yml y .env aquí
docker compose up -d
docker logs -f tienda
Dónde está cada cosa. Recepción en /opt/npm, OpenClaw en /opt/openclaw, el panel en proxy.yoiber.dev. El puerto 81 del panel solo responde desde dentro del servidor a propósito.