@oktis-works/cms 0.1.14 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets.d.ts +94 -0
- package/dist/assets.d.ts.map +1 -0
- package/dist/assets.js +671 -0
- package/dist/assets.js.map +1 -0
- package/dist/bluegreen.d.ts +121 -0
- package/dist/bluegreen.d.ts.map +1 -0
- package/dist/bluegreen.js +393 -0
- package/dist/bluegreen.js.map +1 -0
- package/dist/commands.d.ts +6 -0
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +116 -61
- package/dist/commands.js.map +1 -1
- package/dist/config-wizard.d.ts +39 -0
- package/dist/config-wizard.d.ts.map +1 -0
- package/dist/config-wizard.js +308 -0
- package/dist/config-wizard.js.map +1 -0
- package/dist/docker.d.ts +148 -0
- package/dist/docker.d.ts.map +1 -0
- package/dist/docker.js +324 -0
- package/dist/docker.js.map +1 -0
- package/dist/doctor.d.ts +2 -0
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +51 -0
- package/dist/doctor.js.map +1 -1
- package/dist/env-file.d.ts +45 -0
- package/dist/env-file.d.ts.map +1 -0
- package/dist/env-file.js +200 -0
- package/dist/env-file.js.map +1 -0
- package/dist/env-schema.d.ts +28 -0
- package/dist/env-schema.d.ts.map +1 -0
- package/dist/env-schema.js +497 -0
- package/dist/env-schema.js.map +1 -0
- package/dist/guards.d.ts +40 -0
- package/dist/guards.d.ts.map +1 -0
- package/dist/guards.js +159 -0
- package/dist/guards.js.map +1 -0
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +12 -3
- package/dist/parser.js.map +1 -1
- package/dist/project-config.js +2 -2
- package/dist/prompt.d.ts +81 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +379 -0
- package/dist/prompt.js.map +1 -0
- package/dist/redeploy.d.ts +109 -0
- package/dist/redeploy.d.ts.map +1 -0
- package/dist/redeploy.js +363 -0
- package/dist/redeploy.js.map +1 -0
- package/dist/scaffold-docs.d.ts +25 -6
- package/dist/scaffold-docs.d.ts.map +1 -1
- package/dist/scaffold-docs.js +711 -33
- package/dist/scaffold-docs.js.map +1 -1
- package/dist/scaffold.d.ts +17 -1
- package/dist/scaffold.d.ts.map +1 -1
- package/dist/scaffold.js +77 -14
- package/dist/scaffold.js.map +1 -1
- package/dist/theme-build.d.ts +35 -0
- package/dist/theme-build.d.ts.map +1 -0
- package/dist/theme-build.js +86 -0
- package/dist/theme-build.js.map +1 -0
- package/dist/update.d.ts +51 -0
- package/dist/update.d.ts.map +1 -0
- package/dist/update.js +210 -0
- package/dist/update.js.map +1 -0
- package/package.json +7 -7
package/dist/assets.d.ts
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/** Espelhos em disco (mantidos em sincronia por teste). */
|
|
2
|
+
export declare const ASSET_MIRROR: {
|
|
3
|
+
readonly dockerfile: "infrastructure/docker/Dockerfile";
|
|
4
|
+
readonly entrypoint: "infrastructure/docker/entrypoint.sh";
|
|
5
|
+
readonly dockerignore: "infrastructure/docker/.dockerignore";
|
|
6
|
+
readonly composeInfra: "infrastructure/compose/docker-compose.infra.yml";
|
|
7
|
+
readonly composeDeploy: "infrastructure/compose/docker-compose.deploy.yml";
|
|
8
|
+
readonly nginxTemplate: "infrastructure/nginx/templates/default.conf.template";
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Uma imagem para os quatro papéis: mesma camada de dependências em cache,
|
|
12
|
+
* processo escolhido pelo `command` do compose. Quatro Dockerfiles seriam
|
|
13
|
+
* quatro builds idênticos consumindo o mesmo node_modules.
|
|
14
|
+
*/
|
|
15
|
+
export declare const DOCKERFILE = "# syntax=docker/dockerfile:1\n# @oktis-works - Imagem \u00FAnica do OkCMS (entrypoints: api | admin | web | worker)\n#\n# Gerada pelo scaffold da CLI. Can\u00F4nica em\n# infrastructure/docker/Dockerfile neste monorepo.\n#\n# SEGURAN\u00C7A: a ferramenta de linha de comando N\u00C3O entra nesta imagem. O\n# container exp\u00F5e apenas os processos da aplica\u00E7\u00E3o \u2014 sem instalador de\n# pacotes, sem acesso ao socket do Docker, sem capacidade de alterar o\n# pr\u00F3prio estado. Deploy e configura\u00E7\u00E3o sempre rodam no host.\nFROM oven/bun:1-alpine AS base\nWORKDIR /app\nENV NODE_ENV=production\n\n# --- depend\u00EAncias -----------------------------------------------------------\n# Manifest + lock primeiro: trocar s\u00F3 o c\u00F3digo n\u00E3o invalida este `install`.\nFROM base AS deps\nCOPY package.json bun.lock* package-lock.json* yarn.lock* pnpm-lock.yaml* ./\n# Fallbacks: lock ausente/divergente (npm/yarn) ou bun antigo sem --production\nRUN bun install --production --frozen-lockfile \\\n || bun install --production \\\n || bun install\n\n# --- runtime ----------------------------------------------------------------\nFROM base AS runtime\n# 1. c\u00F3digo do projeto (.dockerignore remove .env, node_modules e .data)\nCOPY . .\n# 2. node_modules limpo do est\u00E1gio de deps, por cima \u2014 nunca o do host\nCOPY --from=deps /app/node_modules ./node_modules\n\nRUN mkdir -p /app/.data/storage /app/.data/cache /app/logs\n\nEXPOSE 3000 3001 3011\n\n# `docker compose ... command: api` escolhe o papel; ver docker/entrypoint.sh\nENTRYPOINT [\"/app/docker/entrypoint.sh\"]\nCMD [\"api\"]\n";
|
|
16
|
+
/** Dispatcher de papéis. Fora da lista, executa o comando literal. */
|
|
17
|
+
export declare const ENTRYPOINT_SH = "#!/bin/sh\n# @oktis-works - Entrada \u00FAnica da imagem okcms/app\n#\n# O compose escolhe o papel com `command: api|web|admin|worker`. Qualquer\n# outro valor \u00E9 repassado literalmente (`docker run okcms/app sh`), o que\n# mantem o container inspecion\u00E1vel sem reescrever a imagem.\nset -eu\n\napi_entry=\"node_modules/@oktis-works/api/dist/index.js\"\nweb_entry=\"node_modules/@oktis-works/web/dist/index.js\"\nadmin_entry=\"node_modules/@oktis-works/admin/bin/admin.js\"\nworker_entry=\"node_modules/@oktis-works/worker/dist/index.js\"\n\ncase \"${1:-api}\" in\n api)\n shift\n exec bun \"$api_entry\" \"$@\"\n ;;\n web)\n shift\n exec bun \"$web_entry\" \"$@\"\n ;;\n admin)\n shift\n exec bun \"$admin_entry\" \"$@\"\n ;;\n worker)\n shift\n exec bun \"$worker_entry\" \"$@\"\n ;;\n *)\n exec \"$@\"\n ;;\nesac\n";
|
|
18
|
+
/**
|
|
19
|
+
* Camada de segurança do build: além do ganho de cache, impede dois acidentes
|
|
20
|
+
* caros — assinar a imagem com o `.env` real e instalar `node_modules` do host
|
|
21
|
+
* (arquitetura diferente / código não auditado).
|
|
22
|
+
*/
|
|
23
|
+
export declare const DOCKERIGNORE = "# @oktis-works - build context da imagem okcms/app\n# .env NUNCA entra na imagem: ele carrega senha de banco e JWT_SECRET e a\n# imagem \u00E9 distribu\u00EDda/copiada. Em runtime ele vem do host via env_file.\n\n.env\n.env.*\n!.env.example\n\n# depend\u00EAncias do host (a imagem instala as suas)\nnode_modules\n**/node_modules\n.tsbuildinfo\n**/*.tsbuildinfo\n# NB: N\u00C3O ignorar dist/ \u2014 plugins instalados em plugins/*/dist s\u00E3o runtime.\n\n# dados e estado local\n.data\n**/.data\nlogs\n**/logs\n*.log\ncoverage\n**/coverage\n\n# montado em runtime, n\u00E3o copiado\ndeploy/\n\n# VCS e tooling \u2014 n\u00E3o \u00E9 c\u00F3digo de runtime\n.git\n.github\n.gitignore\n.sdd\n.vscode\n.idea\n.claude\n*.md\n!README.md\n\n# infraestrutura montada em runtime, n\u00E3o copiada para dentro\ndocker-compose*.yml\ndeploy/nginx/certs\n";
|
|
24
|
+
/**
|
|
25
|
+
* Banco, cache e proxy — únicos e estáveis por toda a vida do site. Moram num
|
|
26
|
+
* projeto PRÓPRIO para que `docker compose -p okcms-blue down` não derrube o
|
|
27
|
+
* banco junto com a lane antiga.
|
|
28
|
+
*/
|
|
29
|
+
export declare const COMPOSE_INFRA = "# @oktis-works - Infraestrutura compartilhada do deploy em produ\u00E7\u00E3o\n# Gerada pela CLI. Can\u00F4nica em infrastructure/compose/docker-compose.infra.yml\n#\n# Projeto Docker PR\u00D3PRIO (okcms): postgres, redis e proxy \u00FAnicos. As lanes\n# blue/green s\u00E3o projetos separados (okcms-blue / okcms-green) que entram\n# nesta rede como externa \u2014 por isso `down` numa lane nunca toca no banco.\n#\n# docker compose -p okcms -f docker-compose.infra.yml up -d\nname: okcms\n\nservices:\n postgres:\n image: postgres:16-alpine\n container_name: okcms-postgres\n restart: unless-stopped\n environment:\n POSTGRES_DB: ${DB_NAME:-okcms}\n POSTGRES_USER: ${DB_USER:-postgres}\n POSTGRES_PASSWORD: ${DB_PASSWORD:?defina DB_PASSWORD no .env}\n volumes:\n - postgres-data:/var/lib/postgresql/data\n ports:\n # Somente loopback: o host consegue rodar `okcms db:migrate` e\n # `db:backup` sem expor o Postgres para a rede. Em produ\u00E7\u00E3o gerenciada\n # remova este bloco e aponte DB_HOST/DATABASE_URL para o provedor.\n - \"127.0.0.1:${DB_HOST_PORT:-5432}:5432\"\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}\"]\n interval: 10s\n timeout: 5s\n retries: 10\n labels:\n # classifica\u00E7\u00E3o lida pelo `okcms update`: data = intoc\u00E1vel\n okcms.role: data\n networks: [okcms]\n\n redis:\n image: redis:7-alpine\n container_name: okcms-redis\n restart: unless-stopped\n environment:\n REDIS_PASSWORD: ${REDIS_PASSWORD:-}\n command:\n - sh\n - -c\n - |\n if [ -n \"$${REDIS_PASSWORD:-}\" ]; then\n exec redis-server --appendonly yes --requirepass \"$$REDIS_PASSWORD\"\n else\n exec redis-server --appendonly yes\n fi\n # Nenhuma porta publicada: s\u00F3 quem est\u00E1 em okcms-net alcan\u00E7a o Redis.\n volumes:\n - redis-data:/data\n healthcheck:\n test: [\"CMD\", \"redis-cli\", \"ping\"]\n interval: 10s\n timeout: 5s\n retries: 10\n labels:\n okcms.role: data\n networks: [okcms]\n\n proxy:\n image: nginx:1.27-alpine\n container_name: okcms-proxy\n restart: unless-stopped\n ports:\n - \"80:80\"\n - \"8080:8080\"\n environment:\n # entram no envsubst nativo do nginx \u2192 gravam conf.d/default.conf\n SERVER_NAME: ${SERVER_NAME:-_}\n ADMIN_SERVER_NAME: ${ADMIN_SERVER_NAME:-admin.localhost}\n volumes:\n - ./deploy/nginx/templates:/etc/nginx/templates:ro\n # conf.d precisa ser grav\u00E1vel: a CLI reescreve 00-upstreams.conf no swap\n - ./deploy/nginx/conf.d:/etc/nginx/conf.d:rw\n labels:\n okcms.role: proxy\n networks: [okcms]\n\nnetworks:\n okcms:\n # nome fixo \u2014 as lanes o declaram como external\n name: okcms-net\n\nvolumes:\n postgres-data:\n name: okcms-postgres-data\n redis-data:\n name: okcms-redis-data\n";
|
|
30
|
+
/**
|
|
31
|
+
* Um arquivo, dois projetos Docker. O "lane" é o NOME DO PROJETO — não há
|
|
32
|
+
* serviço repetido por perfil nem perfil a ativar manualmente; basta
|
|
33
|
+
* `-p okcms-blue` ou `-p okcms-green`. Os containers herdam o prefixo
|
|
34
|
+
* `okcms-<lane>-`, que é exatamente o que os upstreams do nginx apontam.
|
|
35
|
+
*/
|
|
36
|
+
export declare const COMPOSE_DEPLOY = "# @oktis-works - Lanes blue/green do OkCMS\n# Gerada pela CLI. Can\u00F4nica em infrastructure/compose/docker-compose.deploy.yml\n#\n# Um ARQUIVO, DOIS projetos Docker. O lane \u00E9 o nome do projeto:\n#\n# docker compose -p okcms-blue -f docker-compose.deploy.yml up -d --build\n# docker compose -p okcms-green -f docker-compose.deploy.yml up -d --build\n#\n# Containers ficam okcms-<lane>-<servi\u00E7o> \u2014 os upstreams do nginx apontam\n# para esses nomes (gerados em deploy/nginx/conf.d/00-upstreams.conf).\n#\n# A rede okcms-net \u00E9 EXTERNA (criada pelo docker-compose.infra.yml) e os\n# servi\u00E7os de infra N\u00C3O aparecem aqui de prop\u00F3sito: sem isso, `down` de uma\n# lane derrubaria o banco junto com a lane antiga.\n#\n# Pap\u00E9is (label okcms.role, lida pelo `okcms update`):\n# edge api/web/admin \u2192 trocados por completo a cada deploy (blue/green)\n# worker fila BullMQ \u2192 NUNCA blue/green; drenado com SIGTERM no swap\n# data postgres/redis\u2192 intoc\u00E1veis; moram no docker-compose.infra.yml\n#\n# NB: o `down` de lane derruba CONTAINERS e REDES, mas nunca passa de\n# ``` -v ```: o volume okcms-storage \u00E9 compartilhado entre blue e green,\n# \u00E9 ele que mant\u00E9m a m\u00EDdia viva atrav\u00E9s dos deploys.\n\nx-app: &app\n image: okcms/app:${OKCMS_VERSION:-latest}\n build:\n context: .\n dockerfile: docker/Dockerfile\n env_file:\n # .env primeiro (portas do operador) \u2014 o environment abaixo sobrescreve\n - .env\n restart: unless-stopped\n networks: [okcms]\n environment:\n NODE_ENV: production\n DB_HOST: postgres\n REDIS_HOST: redis\n volumes:\n - ./plugins:/app/plugins\n - ./themes:/app/themes\n # m\u00EDdia compartilhada entre as duas lanes: deploy n\u00E3o perde arquivo\n - storage-data:/app/.data/storage\n - cache-data:/app/.data/cache\n\nx-api-health: &api-health\n test:\n - CMD\n - bun\n - -e\n - \"fetch('http://127.0.0.1:'+(process.env.PORT||3000)+'/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\"\n interval: 10s\n timeout: 5s\n retries: 12\n start_period: 25s\n\nx-web-health: &web-health\n test:\n - CMD\n - bun\n - -e\n - \"fetch('http://127.0.0.1:'+(process.env.WEB_PORT||3001)+'/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\"\n interval: 10s\n timeout: 5s\n retries: 12\n start_period: 25s\n\nx-admin-health: &admin-health\n # o admin \u00E9 Astro standalone: serve / e n\u00E3o tem /health dedicado\n test:\n - CMD\n - bun\n - -e\n - \"fetch('http://127.0.0.1:'+(process.env.PORT||3011)+'/').then(r=>process.exit(r.status<500?0:1)).catch(()=>process.exit(1))\"\n interval: 10s\n timeout: 5s\n retries: 12\n start_period: 30s\n\nservices:\n # ---------------------------------------------------------------- api\n api-blue:\n <<: *app\n container_name: okcms-api-blue\n command: [\"api\"]\n labels:\n okcms.role: edge\n okcms.lane: blue\n okcms.service: api\n healthcheck: *api-health\n\n api-green:\n <<: *app\n container_name: okcms-api-green\n command: [\"api\"]\n labels:\n okcms.role: edge\n okcms.lane: green\n okcms.service: api\n healthcheck: *api-health\n\n # ---------------------------------------------------------------- web\n web-blue:\n <<: *app\n container_name: okcms-web-blue\n command: [\"web\"]\n labels:\n okcms.role: edge\n okcms.lane: blue\n okcms.service: web\n healthcheck: *web-health\n\n web-green:\n <<: *app\n container_name: okcms-web-green\n command: [\"web\"]\n labels:\n okcms.role: edge\n okcms.lane: green\n okcms.service: web\n healthcheck: *web-health\n\n # -------------------------------------------------------------- admin\n # admin l\u00EA `PORT` (astro standalone) e n\u00E3o `ADMIN_PORT`: o environment do\n # service substitui o do anchor `<<`, ent\u00E3o os tr\u00EAs comuns s\u00E3o repetidos.\n admin-blue:\n <<: *app\n container_name: okcms-admin-blue\n command: [\"admin\"]\n environment:\n NODE_ENV: production\n DB_HOST: postgres\n REDIS_HOST: redis\n PORT: ${ADMIN_PORT:-3011}\n labels:\n okcms.role: edge\n okcms.lane: blue\n okcms.service: admin\n healthcheck: *admin-health\n\n admin-green:\n <<: *app\n container_name: okcms-admin-green\n command: [\"admin\"]\n environment:\n NODE_ENV: production\n DB_HOST: postgres\n REDIS_HOST: redis\n PORT: ${ADMIN_PORT:-3011}\n labels:\n okcms.role: edge\n okcms.lane: green\n okcms.service: admin\n healthcheck: *admin-health\n\n # ------------------------------------------------------------- worker\n # Uma fila n\u00E3o suporta duas inst\u00E2ncias \"fantasma\": o worker s\u00F3 sobe depois\n # do swap e o da lane antiga drena com SIGTERM (stop_grace_period) antes.\n worker-blue:\n <<: *app\n container_name: okcms-worker-blue\n command: [\"worker\"]\n stop_grace_period: 30s\n labels:\n okcms.role: worker\n okcms.lane: blue\n okcms.service: worker\n\n worker-green:\n <<: *app\n container_name: okcms-worker-green\n command: [\"worker\"]\n stop_grace_period: 30s\n labels:\n okcms.role: worker\n okcms.lane: green\n okcms.service: worker\n\nnetworks:\n okcms:\n name: okcms-net\n external: true\n\nvolumes:\n # compartilhado entre blue e green de prop\u00F3sito: m\u00EDdia sobrevive ao deploy\n storage-data:\n name: okcms-storage\n cache-data:\n name: okcms-cache\n";
|
|
37
|
+
/**
|
|
38
|
+
* Roteamento production. Os upstreams ficam em arquivo SEPARADO
|
|
39
|
+
* (`00-upstreams.conf`) justamente para que o swap seja uma reescrita de um
|
|
40
|
+
* arquivo minúsculo + `nginx -s reload` — sem tocar no `server` block e sem
|
|
41
|
+
* reiniciar o container.
|
|
42
|
+
*
|
|
43
|
+
* `SERVER_NAME` / `ADMIN_SERVER_NAME` entram pelo envsubst nativo do nginx;
|
|
44
|
+
* as variáveis em `$host`/`$upstream_*` são do nginx e ficam intactas porque
|
|
45
|
+
* o envsubst só substitui a lista de variáveis definidas no ambiente.
|
|
46
|
+
*/
|
|
47
|
+
export declare const NGINX_TEMPLATE = "# @oktis-works - Roteamento do proxy OkCMS (template)\n# Gerado pela CLI. Can\u00F4nica em infrastructure/nginx/templates/default.conf.template\n#\n# O nginx oficial processa /etc/nginx/templates/*.template no start, com\n# envsubst limitado \u00E0s vari\u00E1veis definidas no ambiente (SERVER_NAME e\n# ADMIN_SERVER_NAME, vindas do .env). Tudo que for $host, $remote_addr ou\n# $upstream_* \u00E9 do nginx e N\u00C3O \u00E9 substitu\u00EDdo.\n#\n# Os upstreams moram em conf.d/00-upstreams.conf: a CLI os reescreve no swap\n# e recarrega com `nginx -s reload` \u2014 troca de lane sem derrubar conex\u00E3o.\n\nmap $http_upgrade $connection_upgrade {\n default upgrade;\n '' close;\n}\n\n# ---------------------------------------------------------------- admin ----\n# O admin \u00E9 um Astro standalone servido na RAIZ (n\u00E3o em /admin): ele gera\n# URLs /_astro/... e n\u00E3o tem base path configurado, ent\u00E3o public\u00E1-lo em\n# /admin/ quebraria os assets. Ele precisa de host pr\u00F3prio.\nserver {\n listen 80;\n server_name ${ADMIN_SERVER_NAME};\n\n location / {\n proxy_pass $upstream_admin;\n proxy_http_version 1.1;\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n proxy_set_header X-Forwarded-Host $host;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection $connection_upgrade;\n proxy_read_timeout 120s;\n }\n}\n\n# admin por porta \u2014 funciona sem DNS nenhum (http://<host>:8080/)\nserver {\n listen 8080 default_server;\n server_name _;\n\n location / {\n proxy_pass $upstream_admin;\n proxy_http_version 1.1;\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection $connection_upgrade;\n proxy_read_timeout 120s;\n }\n}\n\n# ---------------------------------------------------------- site p\u00FAblico ---\nserver {\n listen 80 default_server;\n server_name ${SERVER_NAME};\n\n client_max_body_size 100m;\n gzip on;\n gzip_types text/plain text/css application/json application/javascript\n image/svg+xml;\n\n # healthcheck do edge: sempre no api (\u00E9 quem fala com o banco)\n location = /health {\n access_log off;\n proxy_pass $upstream_api;\n proxy_http_version 1.1;\n proxy_set_header Host $host;\n }\n\n # API + m\u00EDdia (/api/v1/media/file/<tenant>/<arquivo>)\n location /api/ {\n proxy_pass $upstream_api;\n proxy_http_version 1.1;\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n proxy_set_header X-Forwarded-Host $host;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection $connection_upgrade;\n proxy_read_timeout 120s;\n }\n\n # STORAGE_PUBLIC_BASE=/storage \u2192 rota o mesmo arquivo para a API.\n # O local driver publica <base>/<tenant>/<arquivo>, que \u00E9 exatamente o\n # formato de /api/v1/media/file/<tenant>/<arquivo>.\n location /storage/ {\n rewrite ^/storage/(.*)$ /api/v1/media/file/$1 break;\n proxy_pass $upstream_api;\n proxy_http_version 1.1;\n proxy_set_header Host $host;\n proxy_set_header X-Forwarded-Proto $scheme;\n proxy_cache_valid 200 30d;\n expires 30d;\n }\n\n # assets de tema servidos pelo web (resolver de path do Theme SDK)\n location /themes/ {\n proxy_pass $upstream_web;\n proxy_http_version 1.1;\n proxy_set_header Host $host;\n proxy_set_header X-Forwarded-Proto $scheme;\n }\n\n # SSR do site p\u00FAblico\n location / {\n proxy_pass $upstream_web;\n proxy_http_version 1.1;\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n proxy_set_header X-Forwarded-Host $host;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection $connection_upgrade;\n proxy_read_timeout 120s;\n }\n}\n";
|
|
48
|
+
export type Lane = 'blue' | 'green';
|
|
49
|
+
export interface UpstreamPorts {
|
|
50
|
+
api: number;
|
|
51
|
+
web: number;
|
|
52
|
+
admin: number;
|
|
53
|
+
}
|
|
54
|
+
export declare const DEFAULT_UPSTREAM_PORTS: UpstreamPorts;
|
|
55
|
+
/**
|
|
56
|
+
* Conteúdo de `deploy/nginx/conf.d/00-upstreams.conf`.
|
|
57
|
+
*
|
|
58
|
+
* Só a linha de cada `map` muda no swap — é esse o truque do blue/green via
|
|
59
|
+
* arquivo: reescrever 3 linhas é atômico e `nginx -s reload` re-lê sem
|
|
60
|
+
* fechar conexão estabelecida.
|
|
61
|
+
*/
|
|
62
|
+
export declare function renderUpstreams(lane: Lane, ports?: UpstreamPorts): string;
|
|
63
|
+
export declare const DEPLOY_PATHS: {
|
|
64
|
+
readonly dockerignore: ".dockerignore";
|
|
65
|
+
readonly dockerfile: "docker/Dockerfile";
|
|
66
|
+
readonly entrypoint: "docker/entrypoint.sh";
|
|
67
|
+
readonly composeInfra: "docker-compose.infra.yml";
|
|
68
|
+
readonly composeDeploy: "docker-compose.deploy.yml";
|
|
69
|
+
readonly nginxTemplate: "deploy/nginx/templates/default.conf.template";
|
|
70
|
+
readonly nginxUpstreams: "deploy/nginx/conf.d/00-upstreams.conf";
|
|
71
|
+
};
|
|
72
|
+
/** Arquivo gerado pelo envsubst no start do nginx — fica fora do git. */
|
|
73
|
+
export declare const NGINX_GENERATED = "deploy/nginx/conf.d/default.conf";
|
|
74
|
+
/** Entradas de `.gitignore` que evitam commitar artefato gerado. */
|
|
75
|
+
export declare const DEPLOY_GITIGNORE: string[];
|
|
76
|
+
export interface ProjectAsset {
|
|
77
|
+
path: string;
|
|
78
|
+
content: string;
|
|
79
|
+
/** permissão no disco — só o entrypoint é executável. */
|
|
80
|
+
mode?: number;
|
|
81
|
+
}
|
|
82
|
+
/** Lê as portas reais do `.env`, com fallback para os defaults dos apps. */
|
|
83
|
+
export declare function portsFromEnv(record: Record<string, string>): UpstreamPorts;
|
|
84
|
+
/**
|
|
85
|
+
* Todos os arquivos de deploy do projeto, prontos para escrita.
|
|
86
|
+
* `lane`/`ports` só definem o upstream INICIAL (lane vazia → blue); depois
|
|
87
|
+
* disso quem reescreve esse arquivo é o `okcms update`, a cada swap.
|
|
88
|
+
*
|
|
89
|
+
* `00-upstreams.conf` é versionado de propósito (sem segredo, aponta para um
|
|
90
|
+
* container que ainda vai existir) — sem ele um clone limpo sobe um nginx
|
|
91
|
+
* sem upstream nenhum. Já `default.conf` é gerado pelo envsubst e fica fora.
|
|
92
|
+
*/
|
|
93
|
+
export declare function deployAssets(lane?: Lane, ports?: UpstreamPorts): ProjectAsset[];
|
|
94
|
+
//# sourceMappingURL=assets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../src/assets.ts"],"names":[],"mappings":"AAaA,2DAA2D;AAC3D,eAAO,MAAM,YAAY;;;;;;;CAOf,CAAC;AAMX;;;;GAIG;AACH,eAAO,MAAM,UAAU,mmDAqCtB,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,aAAa,62BAkCzB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,YAAY,k1BAyCxB,CAAC;AAMF;;;;GAIG;AACH,eAAO,MAAM,aAAa,g8FA4FzB,CAAC;AAMF;;;;;GAKG;AACH,eAAO,MAAM,cAAc,0gLA6L1B,CAAC;AAMF;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,svIA2H1B,CAAC;AAEF,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpC,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,sBAAsB,EAAE,aAAqD,CAAC;AAE3F;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,GAAE,aAAsC,GAAG,MAAM,CAoBjG;AAMD,eAAO,MAAM,YAAY;;;;;;;;CAQf,CAAC;AAEX,yEAAyE;AACzE,eAAO,MAAM,eAAe,qCAAqC,CAAC;AAElE,oEAAoE;AACpE,eAAO,MAAM,gBAAgB,UAM5B,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,aAAa,CAU1E;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,IAAI,GAAE,IAAa,EACnB,KAAK,GAAE,aAAsC,GAC5C,YAAY,EAAE,CAUhB"}
|