meeko start
Arranca el servidor de producción de Node con la salida de meeko build, sin Vite ni las fuentes de la aplicación.
meeko start importa .meeko/output/node/index.mjs, el servidor que escribe meeko build con el adaptador node, y lo arranca: SSR, API, RPC, Socket, los archivos de client/ y las páginas de prerender/, con sesiones, cierre ordenado y, desde 1.7, la CSP y las cabeceras de server. No compila nada ni lee app/, server/ o meeko.config.ts: sirve el build tal como quedó.
Es lo mismo que node .meeko/output/node/index.mjs; la CLI sólo añade la lectura del .env del proyecto y un mensaje claro si falta el build.
Uso#
meeko build
meeko starthttp://localhost:4173El starter lo declara como "start": "meeko start .", así que en el servidor basta con npm start.
Tipo#
meeko start [directorio]Opciones#
| Opción | Tipo | Por defecto | Descripción |
|---|---|---|---|
[directorio] |
ruta | . |
Raíz del proyecto, que contiene .meeko/output/node/ y el .env. |
MEEKO_PORT (o PORT) |
número | server.port del build, o 4173 |
Puerto HTTP. PORT vale siempre, porque lo inyectan muchas plataformas. |
MEEKO_HOST |
texto | server.host del build, o 127.0.0.1 |
Dirección. Usa 0.0.0.0 para aceptar tráfico de otras máquinas (un contenedor, por ejemplo). |
MEEKO_PUBLIC_ORIGIN |
origen | ninguno | Origen público HTTPS tras un proxy, para las comprobaciones de Origin de HTTP y Socket. |
MEEKO_REDIS_URL |
URL | ninguna | Redis de las sesiones si server/runtime.ts no declara sessions. Necesita el paquete redis instalado. |
MEEKO_SESSION_TTL, MEEKO_SESSION_SAMESITE |
texto | 7d, Lax |
Duración y SameSite de las sesiones por defecto. |
MEEKO_TRUST_PROXY |
número, true o cloudflare |
ninguno | Proxies de confianza para X-Forwarded-For (rate limit, clientAddress). Desde 1.8, cloudflare lee CF-Connecting-IP tras Cloudflare Tunnel. |
MEEKO_TRUSTED_PROXIES |
CIDR o IP, separados por comas | loopback y redes privadas | Desde 1.8, con MEEKO_TRUST_PROXY=cloudflare: redes de cloudflared y los proxies, las únicas cuyo CF-Connecting-IP se lee. |
start no admite banderas ni más argumentos: meeko start . extra termina con Argumento de más para start: extra.
Resultado#
- En la salida estándar, la URL para abrirla, como
http://localhost:4173: desde1.7.1, loopback (127.0.0.1,::1) y todas las interfaces (0.0.0.0,::) se muestran comolocalhost, aunque el servidor escuche en la dirección configurada. Con0.0.0.0o::siguen líneasRed: http://<IP>:4173con las direcciones de red. La primera línea es siempre la URL local, sola, para los scripts que la leen. - El proceso sigue en marcha hasta
SIGINToSIGTERM, que cierran Socket, HTTP, las tareas dewaitUntily el runtime, por ese orden. Las respuestas abiertas tienenshutdownTimeoutmilisegundos (10 000 por defecto) para terminar. - Las respuestas llevan los assets con
ETag(yimmutablelos que tienen hash), las páginas prerenderizadas desde su archivo y, desde1.7,Content-Security-Policyy las cabeceras deserver.headers. No se comprimen: véase el ejemplo siguiente.
Ejemplos#
Detrás de un proxy HTTPS#
MEEKO_HOST=127.0.0.1 MEEKO_PORT=3000 \
MEEKO_PUBLIC_ORIGIN=https://tienda.example.com \
MEEKO_REDIS_URL=rediss://user:[email protected]:6380 \
MEEKO_TRUST_PROXY=1 \
meeko startEl proxy (nginx, Caddy) termina TLS y reenvía a 127.0.0.1:3000. Sin MEEKO_PUBLIC_ORIGIN, las mutaciones que llegan con Origin: https://tienda.example.com se rechazan.
meeko start no comprime: en producción, ese proxy o una CDN debe hacerlo. Véase Build, despliegue y verificación.
En un contenedor#
FROM node:24-slim
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --omit=dev
COPY .meeko/output/node ./.meeko/output/node
ENV MEEKO_HOST=0.0.0.0
CMD ["npx", "meeko", "start"]Sólo hace falta la carpeta del build y las dependencias de producción, entre ellas @meekojs/meeko (y redis si lo usas). Sin MEEKO_HOST=0.0.0.0, el servidor escucha en el 127.0.0.1 del contenedor y no es accesible desde fuera.
Un host propio con la salida del build#
// server.mjs
import { createNodeApp } from "./.meeko/output/node/index.mjs";
import { serveNode } from "@meekojs/meeko/node";
const app = await createNodeApp();
const server = await serveNode(app, { host: "0.0.0.0", port: 8080, handleSignals: true });
console.log(server.url);index.mjs exporta start(), que es lo que llama meeko start, y createNodeApp(), para quien necesita su propio servidor HTTP.
Sesiones persistentes declaradas en el runtime#
// server/runtime.ts
import { createClient } from "redis";
import { defineServerRuntime, RedisSessionStore, SessionManager } from "@meekojs/meeko/server";
export default defineServerRuntime(async ({ env, production, prerendering }) => {
const redis = createClient({ url: env.REDIS_URL });
await redis.connect();
return {
sessions: new SessionManager({ store: new RedisSessionStore(redis, { prefix: "tienda:prod:session:" }), production: production && !prerendering }),
close: async () => { await redis.quit(); },
};
});Con sessions en el runtime, MEEKO_REDIS_URL deja de leerse: el runtime decide.
Errores comunes#
Ejecutarlo sin meeko build#
meeko startNo hay build de producción en C:\proyectos\tienda\.meeko\output\node\index.mjs; ejecuta meeko build.meeko/ no se versiona: en un despliegue nuevo, o tras meeko clean, no hay build. Construir con otro adaptador (--adapter bun) tampoco escribe .meeko/output/node/.
meeko build && meeko startProducción sin sesiones persistentes#
El starter no necesita server/runtime.ts en desarrollo, porque las sesiones viven en memoria. En producción, meeko start se niega a arrancar con memoria:
meeko startProduction requires a persistent session store: set MEEKO_REDIS_URL (with the redis package installed), or return { sessions } with a persistent SessionStore from server/runtime.tsEl proceso termina con código 1 antes de escuchar.
MEEKO_REDIS_URL=redis://127.0.0.1:6379 meeko startO declara sessions en server/runtime.ts con RedisSessionStore, SqlSessionStore u otro store persistente.
Usarlo con el adaptador static#
# server: { adapter: "static" } en meeko.config.ts
meeko build && meeko startmeeko start sirve el build de Node; el adaptador static genera archivos para un hosting estático: usa meeko preview.
meeko build && meeko previewLa ruta de otro directorio#
# desde la raíz del monorepo
meeko startstart busca el build en ./.meeko/output/node/index.mjs del directorio que recibe y responde No hay build de producción en C:\monorepo\.meeko\output\node\index.mjs; ejecuta meeko build, aunque el build de la aplicación exista en otra carpeta.
meeko start apps/tiendaNotas#
- Sin TypeScript ni Vite. El build de Node no los carga en ejecución; necesita Node 24 y
node_modulescon@meekojs/meeko. Para no depender denode_modules, construye con--adapter buno--adapter deno. - Variables al arrancar.
MEEKO_HOST,MEEKO_PORTyMEEKO_PUBLIC_ORIGINse leen al arrancar, así que el mismo build sirve para varios entornos.HOSTyPUBLIC_ORIGINsiguen valiendo hasta2.0, con un aviso único. .env.meeko startlee el.envdel directorio, comodev;node .meeko/output/node/index.mjsno lo lee. En producción, prefiere el entorno real o el gestor de secretos de la plataforma; el entorno siempre gana al.env.- Seguridad. Pon el servidor detrás de un proxy HTTPS y define
MEEKO_PUBLIC_ORIGIN. Las páginas llevan la CSP deserver.contentSecurityPolicydesde1.7; antes de1.7, sólo el adaptadorstaticla aplicaba. - Windows y POSIX. En Windows,
Ctrl+CenvíaSIGINTy el cierre es ordenado; un gestor de servicios que mata el proceso no lo es. En POSIX,SIGTERM(el dedocker stopy systemd) cierra ordenadamente. - Rendimiento. Las páginas prerenderizadas se leen del disco una vez y se sirven desde memoria con su
ETagy su304; los assets con hash llevancache-control: public, max-age=31536000, immutable.