Despliegue
Compilación de producción, Docker, BoxLang MiniServer y una lista de verificación para salir a producción.
En esta página
Despliegue
Compilación de producción
npm run build
Compila y añade huellas digitales al frontend en public/includes/ - consulta Frontend.
Docker
Un Dockerfile y archivos Compose especÃficos por base de datos viven en resources/docker/. MySQL es el predeterminado; se proveen alternativas de PostgreSQL y MSSQL para los otros destinos probados por CI. MariaDB puede usar la configuración de MySQL y el controlador JDBC mysql. box.json también define los scripts docker:build, docker:run, docker:bash y docker:stack (ejecútalos con box run-script <name>) como atajos para los comandos de un solo argumento a continuación - no reemplazan la instalación requerida del CLI de BoxLang para los comandos box locales, y no tienen relación con npm run (no existe npm run docker:*).
Desarrollo local con Docker Compose
resources/docker/docker-compose.yml ejecuta la aplicación (construida desde resources/docker/Dockerfile.dev, que instala CommandBox de forma nativa sobre la imagen oficial ortussolutions/boxlang:cli para que la versión del motor coincida con .bvmrc) junto a un contenedor MySQL 8, con todo el repositorio montado como bind mount en el contenedor de la aplicación para que las ediciones en el host se apliquen sin reconstruir - no se requiere instalación local de BoxLang/MySQL. Ejecuta docker compose directamente (en lugar de a través del script del paquete docker:stack) para que comandos multi-palabra como up -d se pasen correctamente:
npm install
npm run build
docker compose -f resources/docker/docker-compose.yml up -d
docker compose -f resources/docker/docker-compose.yml exec coldbox_app box install
docker compose -f resources/docker/docker-compose.yml exec coldbox_app box migrate up
docker compose -f resources/docker/docker-compose.yml exec coldbox_app box migrate seed run
Visita http://127.0.0.1:8080. MySQL es accesible desde el host en 127.0.0.1:3406 (elegido para evitar colisiones con un MySQL/MariaDB que ya se esté ejecutando en 3306); el contenedor de la aplicación se comunica con él a través de la red Docker interna en el puerto real de MySQL, 3306.
El archivo compose no ejecuta Vite - inÃcialo por separado en el host para HMR:
npm install
npm run dev
También hay disponible un archivo Compose especÃfico para MSSQL para probar contra SQL Server 2022. Instala el controlador bx-mssql en el contenedor de la aplicación, crea la base de datos cbgenesis, y guarda sus datos bajo resources/docker/.db/mssql/:
npm install
npm run build
docker compose -f resources/docker/docker-compose.mssql.yml up -d
docker compose -f resources/docker/docker-compose.mssql.yml exec coldbox_app box install
docker compose -f resources/docker/docker-compose.mssql.yml exec coldbox_app box migrate up
docker compose -f resources/docker/docker-compose.mssql.yml exec coldbox_app box migrate seed run
La aplicación sigue disponible en http://127.0.0.1:8080; SQL Server es accesible desde el host en 127.0.0.1:1434. La contraseña sa predeterminada está pensada solo para pruebas locales. Establece MSSQL_SA_PASSWORD antes de iniciar el stack para sobrescribirla. Detén este stack con:
docker compose -f resources/docker/docker-compose.mssql.yml down
La alternativa de PostgreSQL usa PostgreSQL 16, publica el puerto de host 5433, e instala bx-postgresql automáticamente:
npm install
npm run build
docker compose -f resources/docker/docker-compose.postgresql.yml up -d
docker compose -f resources/docker/docker-compose.postgresql.yml exec coldbox_app box install
docker compose -f resources/docker/docker-compose.postgresql.yml exec coldbox_app box migrate up
docker compose -f resources/docker/docker-compose.postgresql.yml exec coldbox_app box migrate seed run
El archivo Compose de MySQL predeterminado permanece sin cambios. Detén cualquiera de las alternativas con su archivo Compose correspondiente y down.
docker compose -f resources/docker/docker-compose.yml down
Imagen de producción
box run-script docker:build
box run-script docker:run
Compila el frontend antes de crear una imagen de producción:
npm run build
BoxLang MiniServer
Una alternativa al servidor de desarrollo bx-cli para ejecutar la aplicación compilada directamente:
cd my-app
boxlang-miniserver --port 8080 --webroot ./public --dev
El MiniServer no proporciona box install, migraciones ni comandos de TestBox. Usa el CLI de BoxLang requerido para esas tareas.
Lista de verificación para producción
ENVIRONMENT=production y BOXLANG_DEBUG=false en .env.
Apunta app/config/modules/cbmailservices.bx a un driver SMTP/Postmark/SendGrid real - consulta Correo electrónico.
El seeder crea admin@cbgenesis.com / test, marcado como pendiente de restablecimiento. Iniciar sesión con esa contraseña no otorga una sesión: se te envÃa directamente al formulario de restablecimiento de contraseña y debes establecer una nueva primero. El hash de arranque es público (viene incluido en el repositorio), asà que nunca borres esa marca para seguir usando test. Consulta Primeros pasos.
reinitPassword lee COLDBOX_REINIT_PASSWORD del entorno. Déjalo sin definir en producción y cada arranque recurrirá a un UUID aleatorio nuevo que nadie conoce, lo que cierra ?fwreinit por completo. DefÃnelo solo si necesitas reiniciar una instancia en ejecución, y trátalo como una credencial. Establecerlo como una cadena vacÃa deja el reinicio abierto para cualquiera, que es exactamente lo que hace development(), y producción no debe hacerlo.
Mediante la configuración SSL en server.json, o el proxy inverso / balanceador de carga de tu elección.
cbTrustProxyHeaders está activado por defecto, coincidiendo con un despliegue tÃpico detrás de un proxy inverso o balanceador de carga. Si la aplicación está directamente expuesta a internet en su lugar, desactÃvalo - consulta Desplegando detrás de un proxy inverso. Invertir esto anula la limitación de tasa o la rompe para todos los que están detrás del proxy.
app/config/modules/cbsecurity-passkeys.bx viene con marcadores de posición solo para desarrollo (relyingPartyId: "localhost", allowedOrigins: ["http://localhost:8080"]). Configúralos a tu dominio real de producción antes de salir a producción, o el registro de passkeys fallará - consulta Seguridad y permisos.
npm run build para obtener assets minificados y con huella digital.
Elimina o restringe el endpoint público /healthcheck si no deberÃa ser accesible desde fuera de tu infraestructura.
Desplegando detrás de un proxy inverso
RateLimiter, el registro de auditorÃa, y los correos de seguridad de "restablecimiento solicitado desde IP" leen todos la IP del llamante a través de getRealIP() de cbsecurity. Esa función tiene dos posibles fuentes para la IP, y solo tú -la persona que despliega esta aplicación- sabes cuál es la correcta para tu configuración:
- La dirección de socket sin procesar (
cgi.remote_addr) - correcta cuando la aplicación está directamente expuesta a internet. Si un proxy inverso está delante, esta es siempre la dirección propia del proxy, no la del visitante. - Los encabezados de solicitud
X-Forwarded-For/X-Cluster-Client-IP- correctos solo cuando algo delante de la aplicación (nginx, un balanceador de carga, un CDN) elimina cualquier valor que envió el cliente y establece el encabezado por sà mismo. Si nada hace eso, cualquier llamante puede establecer este encabezado con cualquier valor, incluyendo uno distinto en cada solicitud.
El ajuste cbTrustProxyHeaders (predeterminado true, editable en /settings) elige entre ambos. Dejarlo activado cuando en realidad no estás detrás de un proxy que sanea el encabezado reabre exactamente el bypass de lÃmite de tasa que existe para cerrar - un llamante puede falsificar un nuevo valor de X-Forwarded-For en cada intento de inicio de sesión y nunca ser bloqueado. Desactivarlo cuando sà estás detrás de tal proxy hace que todos los visitantes compartan la IP del proxy - un llamante bloqueado bloquea a todos los que están detrás de él, y el registro de auditorÃa registra la dirección del proxy para cada acción.
Si despliegas directamente expuesto a internet, sin nada delante de la aplicación, desactiva esto. Si despliegas detrás de un proxy inverso, confirma que realmente sobrescribe X-Forwarded-For (en lugar de añadir a, o dejar pasar, un valor suministrado por el cliente) antes de dejarlo activado.