okengine 0.18.5 → 0.19.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/AGENTS.md +18 -10
- package/README.md +2 -2
- package/package.json +51 -50
- package/site/content/docs/ai/llms-txt.mdx +1 -1
- package/site/content/docs/ai/meta.json +1 -1
- package/site/content/docs/ai/skills.mdx +4 -1
- package/site/content/docs/ai/try-it.mdx +58 -0
- package/site/content/docs/client/auth.mdx +208 -0
- package/site/content/docs/client/calling.mdx +451 -0
- package/site/content/docs/client/index.mdx +209 -0
- package/site/content/docs/client/live.mdx +234 -0
- package/site/content/docs/client/meta.json +5 -0
- package/site/content/docs/client/react.mdx +249 -0
- package/site/content/docs/elements/ai/agents.mdx +232 -0
- package/site/content/docs/elements/ai/index.mdx +341 -0
- package/site/content/docs/elements/ai/mcp.mdx +275 -0
- package/site/content/docs/elements/ai/meta.json +5 -0
- package/site/content/docs/elements/ai/models.mdx +283 -0
- package/site/content/docs/elements/ai/prompts.mdx +256 -0
- package/site/content/docs/elements/channel/email.mdx +266 -0
- package/site/content/docs/elements/channel/index.mdx +344 -0
- package/site/content/docs/elements/channel/meta.json +5 -0
- package/site/content/docs/elements/channel/push.mdx +218 -0
- package/site/content/docs/elements/channel/receipts.mdx +206 -0
- package/site/content/docs/elements/channel/sms.mdx +264 -0
- package/site/content/docs/elements/channel/whatsapp.mdx +220 -0
- package/site/content/docs/elements/clock/index.mdx +300 -0
- package/site/content/docs/elements/clock/meta.json +5 -0
- package/site/content/docs/elements/clock/schedules.mdx +508 -0
- package/site/content/docs/elements/clock/sleep.mdx +445 -0
- package/site/content/docs/elements/flow/consumers.mdx +707 -0
- package/site/content/docs/elements/flow/http.mdx +1080 -0
- package/site/content/docs/elements/flow/index.mdx +618 -0
- package/site/content/docs/elements/flow/meta.json +5 -0
- package/site/content/docs/elements/flow/routing.mdx +559 -0
- package/site/content/docs/elements/flow/workflows.mdx +640 -0
- package/site/content/docs/elements/gate/auth.mdx +371 -0
- package/site/content/docs/elements/gate/authorization.mdx +298 -0
- package/site/content/docs/elements/gate/index.mdx +418 -0
- package/site/content/docs/elements/gate/meta.json +5 -0
- package/site/content/docs/elements/gate/rate-limits.mdx +365 -0
- package/site/content/docs/elements/gate/rls.mdx +303 -0
- package/site/content/docs/elements/gate/tenancy.mdx +372 -0
- package/site/content/docs/elements/index.mdx +20 -10
- package/site/content/docs/elements/signal/broadcast.mdx +517 -0
- package/site/content/docs/elements/signal/index.mdx +352 -0
- package/site/content/docs/elements/signal/live.mdx +590 -0
- package/site/content/docs/elements/signal/meta.json +5 -0
- package/site/content/docs/elements/signal/once.mdx +596 -0
- package/site/content/docs/elements/store/files.mdx +659 -0
- package/site/content/docs/elements/store/index.mdx +310 -0
- package/site/content/docs/elements/store/kv.mdx +629 -0
- package/site/content/docs/elements/store/meta.json +5 -0
- package/site/content/docs/elements/store/search.mdx +946 -0
- package/site/content/docs/elements/store/sql.mdx +937 -0
- package/site/content/docs/elements/vault/config.mdx +256 -0
- package/site/content/docs/elements/vault/index.mdx +356 -0
- package/site/content/docs/elements/vault/meta.json +5 -0
- package/site/content/docs/elements/vault/rotation.mdx +273 -0
- package/site/content/docs/elements/vault/secrets.mdx +285 -0
- package/site/content/docs/index.mdx +63 -36
- package/site/content/docs/meta.json +8 -7
- package/site/content/docs/plugins/cors.mdx +2 -1
- package/site/content/docs/plugins/csrf.mdx +4 -1
- package/site/content/docs/plugins/headers.mdx +2 -1
- package/site/content/docs/plugins/ip-allowlist.mdx +2 -1
- package/site/content/docs/plugins/magic-link.mdx +6 -0
- package/site/content/docs/plugins/maintenance-mode.mdx +2 -1
- package/site/content/docs/plugins/oauth.mdx +1 -1
- package/site/content/docs/plugins/otp.mdx +12 -1
- package/site/content/docs/plugins/passkey.mdx +39 -15
- package/site/content/docs/plugins/two-factor.mdx +91 -34
- package/site/content/docs/plugins/username.mdx +1 -1
- package/site/content/docs/recipes/caddy.mdx +3 -3
- package/site/content/docs/recipes/index.mdx +18 -28
- package/site/content/docs/recipes/mailpit.mdx +1 -1
- package/site/content/docs/recipes/meilisearch.mdx +3 -3
- package/site/content/docs/recipes/meta.json +1 -4
- package/site/content/docs/recipes/nginx.mdx +2 -2
- package/site/content/docs/recipes/openrouter.mdx +283 -0
- package/site/content/docs/recipes/pgdog.mdx +3 -3
- package/site/content/docs/recipes/postgres.mdx +1 -2
- package/site/content/docs/recipes/rustfs.mdx +2 -2
- package/site/content/docs/recipes/traefik.mdx +3 -3
- package/site/content/docs/reference/cli.mdx +231 -0
- package/site/content/docs/reference/configuration.mdx +30 -10
- package/site/content/docs/reference/environment-variables.mdx +93 -20
- package/site/content/docs/reference/errors.mdx +132 -29
- package/site/content/docs/reference/fx.mdx +137 -73
- package/site/content/docs/reference/index.mdx +13 -21
- package/site/content/docs/reference/meta.json +4 -5
- package/site/content/docs/reference/okid.mdx +42 -17
- package/site/content/docs/reference/plugins.mdx +4 -3
- package/site/content/docs/reference/security.mdx +197 -0
- package/site/content/docs/understand/meta.json +5 -0
- package/site/content/docs/understand/the-anatomy.mdx +132 -0
- package/site/content/docs/understand/the-model.mdx +32 -0
- package/site/content/docs/understand/the-problem.mdx +74 -0
- package/site/content/docs/understand/the-vocabulary.mdx +26 -0
- package/src/auth/api-keys.ts +2 -1
- package/src/auth/bindings.ts +64 -16
- package/src/auth/gate-auth.test.ts +6 -1
- package/src/auth/identity.ts +152 -5
- package/src/auth/index.ts +29 -0
- package/src/auth/invites.ts +2 -1
- package/src/auth/method-context.ts +41 -0
- package/src/auth/oauth-as/crypto.ts +2 -1
- package/src/auth/oauth-as/stores.ts +2 -1
- package/src/auth/operator.ts +2 -1
- package/src/auth/sessions-jwt.test.ts +77 -0
- package/src/auth/sessions.ts +20 -4
- package/src/auth/tenants.ts +3 -2
- package/src/auth/two-factor-challenge.test.ts +61 -0
- package/src/auth/two-factor-challenge.ts +284 -0
- package/src/auth/verification.ts +5 -0
- package/src/bench/REPORT.md +49 -0
- package/src/bench/g03-signal-once.bench.ts +1 -1
- package/src/bench/g10-observability-contention.bench.ts +1 -1
- package/src/bench/g17-hybrid-search.bench.ts +572 -0
- package/src/bench/load-app.ts +2 -10
- package/src/cli/ai-setup/ai-setup.test.ts +331 -42
- package/src/cli/ai-setup/apply.ts +294 -52
- package/src/cli/ai-setup/catalog.ts +238 -1342
- package/src/cli/ai-setup/index.ts +14 -99
- package/src/cli/ai-setup/prompts.ts +60 -443
- package/src/cli/ask-seed.test.ts +96 -0
- package/src/cli/ask-seed.ts +82 -0
- package/src/cli/ask-vault-gaps.test.ts +84 -0
- package/src/cli/ask-vault-gaps.ts +146 -0
- package/src/cli/build.ts +2 -2
- package/src/cli/client-add.test.ts +26 -1
- package/src/cli/client-add.ts +106 -27
- package/src/cli/db-seed.ts +2 -0
- package/src/cli/db.ts +150 -11
- package/src/cli/dev.ts +119 -211
- package/src/cli/docker-clean.ts +2 -2
- package/src/cli/docker-cli.test.ts +1 -1
- package/src/cli/doctor-diff.ts +4 -2
- package/src/cli/doctor-pii.test.ts +1 -1
- package/src/cli/doctor.ts +14 -1
- package/src/cli/hero-meta.test.ts +4 -2
- package/src/cli/load-config.images.test.ts +8 -10
- package/src/cli/load-config.ts +1 -1
- package/src/cli/registry.ts +22 -10
- package/src/cli/replay.ts +3 -1
- package/src/cli/start.ts +1 -1
- package/src/cli/tui/keys.ts +2 -3
- package/src/client/auth/cookies.ts +74 -0
- package/src/client/auth/create-auth-client.ts +636 -0
- package/src/client/auth/denials.ts +99 -0
- package/src/client/auth/session.ts +283 -0
- package/src/client/auth.test.ts +251 -0
- package/src/client/auth.ts +39 -114
- package/src/client/create-with-session.ts +245 -0
- package/src/client/create.ts +51 -5
- package/src/client/index.ts +11 -1
- package/src/client/live.ts +11 -79
- package/src/client/notes-contract.test.ts +5 -10
- package/src/client/sse.ts +137 -0
- package/src/client/stream.ts +147 -0
- package/src/client/transport.test.ts +32 -0
- package/src/client/transport.ts +123 -26
- package/src/client/types.ts +118 -14
- package/src/client-react/index.ts +185 -24
- package/src/client-react/use-live-query.ts +13 -3
- package/src/compiler/aot.test.ts +7 -4
- package/src/compiler/effects-embed.test.ts +56 -0
- package/src/compiler/effects-fetch.test.ts +43 -0
- package/src/compiler/effects-infer.ts +58 -2
- package/src/compiler/extract.test.ts +257 -43
- package/src/compiler/extract.ts +566 -48
- package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -4
- package/src/compiler/fixtures/skyport/src/flows/bookings/signals.ts +2 -8
- package/src/compiler/fixtures/skyport.expected.json +4 -4
- package/src/compiler/fixtures/triggers/five-triggers.ts +14 -10
- package/src/compiler/response.ts +2 -2
- package/src/compiler/search-writer-isolation.test.ts +40 -0
- package/src/config/index.ts +11 -0
- package/src/console/server/app.ts +17 -23
- package/src/console/server/bind.ts +4 -0
- package/src/console/server/console.test.ts +2 -2
- package/src/console/server/flows-invoke.test.ts +50 -34
- package/src/console/server/flows.ts +436 -255
- package/src/console/server/runs-ingest.test.ts +6 -3
- package/src/console/server/serve.ts +1 -1
- package/src/console/server/signals.test.ts +1 -5
- package/src/console/server/signals.ts +8 -6
- package/src/console/server/state.ts +6 -1
- package/src/console/server/store.ts +1 -1
- package/src/console/ui-next/dist/assets/FileExportIcon-Ck-5od4R.js +1 -0
- package/src/console/ui-next/dist/assets/MoreHorizontalCircle01Icon-gMNGsE37.js +1 -0
- package/src/console/ui-next/dist/assets/PlusSignIcon-CwG3nxfu.js +1 -0
- package/src/console/ui-next/dist/assets/UnavailableIcon-D9cvHVPr.js +1 -0
- package/src/console/ui-next/dist/assets/UserIcon-DaE2PB5_.js +1 -0
- package/src/console/ui-next/dist/assets/access-page-DFeymU07.js +4 -0
- package/src/console/ui-next/dist/assets/agent-disclosure-U1rdfblp.js +1 -0
- package/src/console/ui-next/dist/assets/cache-glyph-BeFJeqBG.js +1 -0
- package/src/console/ui-next/dist/assets/call-pii-button-CVAONPii.js +1 -0
- package/src/console/ui-next/dist/assets/collapsible-D2A6NJ-3.js +1 -0
- package/src/console/ui-next/dist/assets/copy-inline-button-CAYD18cr.js +1 -0
- package/src/console/ui-next/dist/assets/dagre.esm-B1_XeuLP.js +1 -0
- package/src/console/ui-next/dist/assets/detail-header-DVWNjWjg.js +1 -0
- package/src/console/ui-next/dist/assets/dropdown-menu-4h2LOVXM.js +1 -0
- package/src/console/ui-next/dist/assets/duration-tone-Cgk_h5ja.js +9 -0
- package/src/console/ui-next/dist/assets/element-icons-BI8cJgdh.js +1 -0
- package/src/console/ui-next/dist/assets/explorer-empty-CJs5A-wm.js +1 -0
- package/src/console/ui-next/dist/assets/flows-page-Dss7941e.js +1 -0
- package/src/console/ui-next/dist/assets/highlighted-json-MYZQtRnw.js +154 -0
- package/src/console/ui-next/dist/assets/http-method-Jrh39p7A.js +1 -0
- package/src/console/ui-next/dist/assets/index-D0zS5rKO.css +2 -0
- package/src/console/ui-next/dist/assets/index-DXP2dBIF.js +63 -0
- package/src/console/ui-next/dist/assets/observability-page-HvolXxTI.js +4 -0
- package/src/console/ui-next/dist/assets/react-dom-Ddte4I-Q.js +9 -0
- package/src/console/ui-next/dist/assets/replica-lag-CSh2dzrb.js +18 -0
- package/src/console/ui-next/dist/assets/request-meta-BatF8KrK.js +1 -0
- package/src/console/ui-next/dist/assets/shortcut-keys-3ILd8oGn.js +1 -0
- package/src/console/ui-next/dist/assets/{sql-BskegiFM.js → sql-BsFa4tDR.js} +1 -1
- package/src/console/ui-next/dist/assets/store-page-eiKiHnNe.js +41 -0
- package/src/console/ui-next/dist/assets/trace-detail-sheet-CZkMeKS-.js +2 -0
- package/src/console/ui-next/dist/assets/tree-expand-toggle-CW8y5A2h.js +55 -0
- package/src/console/ui-next/dist/assets/units-page-B_RWJrEO.js +1 -0
- package/src/console/ui-next/dist/assets/{use-vault-list-uk4WVboC.js → use-vault-list-CT4-gajj.js} +1 -1
- package/src/console/ui-next/dist/assets/vault-page-CWrg-A68.js +2 -0
- package/src/console/ui-next/dist/assets/xyflow-CSyC6ryz.css +1 -0
- package/src/console/ui-next/dist/assets/xyflow-yApv7D4e.js +7 -0
- package/src/console/ui-next/dist/index.html +6 -13
- package/src/console/ui-next/seed-invoke-host.ts +21 -18
- package/src/console/ui-next/src/client.ts +7 -2
- package/src/console/ui-next/src/features/flows/graph/element-map.ts +2 -0
- package/src/console/ui-next/src/features/flows/traces/effect-kind.ts +12 -2
- package/src/console/ui-next/src/features/flows/traces/effect-summary.ts +4 -0
- package/src/console/ui-next/src/features/flows/traces/trace-detail-sheet.tsx +8 -0
- package/src/console/ui-next/src/features/flows/traces/waterfall-bars.ts +4 -0
- package/src/console/ui-next/src/features/flows/traces/waterfall-tooltip.ts +9 -3
- package/src/console/ui-next/src/features/store/detail/reveal-cell.tsx +7 -11
- package/src/console/ui-next/src/features/store/detail/store-row-detail-sheet.tsx +2 -2
- package/src/console/ui-next/src/features/store/lib/fields-from-table.ts +2 -0
- package/src/console/ui-next/src/features/store/lib/grid-model.test.ts +25 -1
- package/src/console/ui-next/src/features/store/lib/grid-model.ts +36 -1
- package/src/console/ui-next/src/features/store/query/query-results.tsx +3 -3
- package/src/console/ui-next/src/features/units/detail/effects-summary.tsx +2 -0
- package/src/console/ui-next/src/features/units/lib/call-read-safe.ts +3 -1
- package/src/console/ui-next/src/features/units/lib/fields-from-schema.ts +6 -0
- package/src/docker/ai-model-status.test.ts +1 -12
- package/src/docker/ai-model-status.ts +10 -38
- package/src/docker/compose-up.test.ts +100 -0
- package/src/docker/compose-up.ts +292 -0
- package/src/docker/compose.ts +4 -14
- package/src/docker/derive.ts +9 -34
- package/src/docker/docker.test.ts +16 -261
- package/src/docker/images-config.test.ts +13 -25
- package/src/docker/index.ts +1 -24
- package/src/docker/recipes/index.ts +0 -23
- package/src/docker/recipes/pgdog.ts +6 -4
- package/src/docker/stack-id.test.ts +2 -2
- package/src/docker/stack-id.ts +0 -1
- package/src/docker/types.ts +2 -2
- package/src/drivers/ai-anthropic.ts +10 -0
- package/src/drivers/ai-openai-compatible.ts +34 -7
- package/src/drivers/ai-providers.test.ts +0 -107
- package/src/drivers/ai-stream.test.ts +0 -34
- package/src/drivers/ai-types.ts +17 -8
- package/src/drivers/channel-fcm.ts +6 -1
- package/src/drivers/channel-msegat.ts +6 -1
- package/src/drivers/channel-resend.ts +5 -1
- package/src/drivers/channel-smtp.ts +5 -1
- package/src/drivers/channel-sndr.ts +10 -1
- package/src/drivers/channel-taqnyat-mail.ts +5 -1
- package/src/drivers/channel-taqnyat-whatsapp.ts +6 -1
- package/src/drivers/channel-taqnyat.ts +6 -1
- package/src/drivers/channel-types.ts +10 -0
- package/src/drivers/channel-unifonic.ts +6 -1
- package/src/drivers/channel-wa-cloud.ts +6 -1
- package/src/drivers/channel-webpush.ts +6 -1
- package/src/drivers/external.ts +33 -0
- package/src/drivers/index.ts +0 -10
- package/src/drivers/meilisearch.ts +6 -0
- package/src/drivers/oauth-types.ts +4 -0
- package/src/drivers/postgres.test.ts +74 -3
- package/src/drivers/postgres.ts +175 -6
- package/src/drivers/signal-types.ts +5 -5
- package/src/drivers/types.ts +7 -0
- package/src/drivers/vault-types.ts +5 -0
- package/src/elements/ai/declare.ts +17 -4
- package/src/elements/ai/eval.ts +1 -1
- package/src/elements/ai/mcp-http.ts +1 -1
- package/src/elements/ai/pii.ts +1 -1
- package/src/elements/ai/providers.test.ts +289 -0
- package/src/elements/ai/providers.ts +169 -0
- package/src/elements/ai/runtime.ts +68 -5
- package/src/elements/ai/schema.ts +2 -2
- package/src/elements/ai.test.ts +7 -7
- package/src/elements/ai.ts +17 -1
- package/src/elements/channel/runtime.ts +105 -12
- package/src/elements/clock/cron-fields.test.ts +144 -0
- package/src/elements/clock/cron-fields.ts +185 -0
- package/src/elements/clock/declare.ts +247 -3
- package/src/elements/clock.ts +21 -1
- package/src/elements/index.ts +15 -0
- package/src/elements/signal/chaos-child.ts +1 -2
- package/src/elements/signal/declare.ts +65 -37
- package/src/elements/signal/delivery-modes.test.ts +11 -31
- package/src/elements/signal/dry-run-replay.test.ts +1 -7
- package/src/elements/signal/dry-run-write-isolation.test.ts +1 -7
- package/src/elements/signal/key-ordering.test.ts +6 -26
- package/src/elements/signal/lease-reclaim.test.ts +2 -6
- package/src/elements/signal/optional-emit.test.ts +6 -9
- package/src/elements/signal/order-lifecycle.test.ts +4 -17
- package/src/elements/signal/orphan-messages.test.ts +4 -15
- package/src/elements/signal/reconcile.test.ts +2 -2
- package/src/elements/signal/runtime.ts +1 -1
- package/src/elements/signal/schema-emit.test.ts +4 -8
- package/src/elements/signal.test.ts +24 -49
- package/src/elements/signal.ts +9 -2
- package/src/elements/store/domain-ddl.test.ts +1 -1
- package/src/elements/store/live-http.test.ts +9 -4
- package/src/elements/store/prepare-row.test.ts +123 -0
- package/src/elements/store/resource.ts +43 -12
- package/src/elements/store/schema-decl.ts +117 -0
- package/src/elements/store/search-backfill.ts +205 -0
- package/src/elements/store/search-bind.ts +66 -0
- package/src/elements/store/search-bm25.ts +78 -0
- package/src/elements/store/search-ddl.ts +156 -0
- package/src/elements/store/search-embed-flow.ts +141 -0
- package/src/elements/store/search-errors.ts +34 -0
- package/src/elements/store/search-fusion.ts +112 -0
- package/src/elements/store/search-lsh.ts +179 -0
- package/src/elements/store/search-runtime.ts +300 -0
- package/src/elements/store/search.test.ts +144 -0
- package/src/elements/store/sql-session.test.ts +1 -0
- package/src/elements/store/sql-session.ts +83 -3
- package/src/elements/store/table.ts +23 -2
- package/src/elements/store/upsert-app.test.ts +1 -3
- package/src/elements/store.ts +50 -0
- package/src/full.ts +4 -2
- package/src/http.ts +4 -1
- package/src/i18n/catalogs/ar.ts +14 -6
- package/src/i18n/catalogs/en.ts +14 -6
- package/src/index.ts +6 -1
- package/src/kernel/adopt-barrel-fresh.test.ts +7 -7
- package/src/kernel/adopt-routes.ts +9 -1
- package/src/kernel/app-auth.ts +5 -0
- package/src/kernel/app.ts +102 -9
- package/src/kernel/auto-cache.test.ts +6 -12
- package/src/kernel/auto-registry.test.ts +3 -3
- package/src/kernel/boot-bind/ai.test.ts +22 -19
- package/src/kernel/boot-bind/ai.ts +5 -43
- package/src/kernel/boot-bind/clock.ts +23 -5
- package/src/kernel/boot-bind/honor-config.test.ts +4 -4
- package/src/kernel/boot.test.ts +11 -6
- package/src/kernel/boot.ts +66 -16
- package/src/kernel/boundary-contract.ts +93 -0
- package/src/kernel/budget.test.ts +1 -1
- package/src/kernel/call.ts +89 -0
- package/src/kernel/capability.ts +6 -0
- package/src/kernel/client-descriptor.ts +123 -0
- package/src/kernel/clock-timezone.test.ts +80 -0
- package/src/kernel/correlation.test.ts +1 -1
- package/src/kernel/dry-run.ts +11 -8
- package/src/kernel/effects-stamping.test.ts +42 -9
- package/src/kernel/effects.test.ts +4 -2
- package/src/kernel/effects.ts +51 -9
- package/src/kernel/errors-channel.ts +17 -0
- package/src/kernel/errors-live-resume.ts +3 -2
- package/src/kernel/errors-tenant.ts +7 -4
- package/src/kernel/errors.registry-helpers.ts +96 -0
- package/src/kernel/errors.registry.test.ts +139 -25
- package/src/kernel/errors.ts +102 -23
- package/src/kernel/external-effects.test.ts +196 -0
- package/src/kernel/flow.test.ts +13 -4
- package/src/kernel/flow.ts +69 -71
- package/src/kernel/fx-ask-telemetry.test.ts +2 -2
- package/src/kernel/fx-dead-letters.test.ts +3 -3
- package/src/kernel/fx-fetch.ts +55 -0
- package/src/kernel/fx-live-stream.ts +2 -2
- package/src/kernel/fx-live.test.ts +8 -8
- package/src/kernel/fx.test.ts +17 -11
- package/src/kernel/fx.ts +180 -57
- package/src/kernel/horizontal-child.ts +1 -1
- package/src/kernel/http-query.test.ts +3 -6
- package/src/kernel/index.ts +13 -3
- package/src/kernel/instance-id.ts +1 -1
- package/src/kernel/instances.test.ts +40 -0
- package/src/kernel/instances.ts +47 -9
- package/src/kernel/live-http.test.ts +6 -7
- package/src/kernel/live-http.ts +6 -2
- package/src/kernel/live-resume.test.ts +1 -1
- package/src/kernel/mcp-tool.test.ts +3 -3
- package/src/kernel/on.ts +98 -4
- package/src/kernel/pipeline.test.ts +12 -15
- package/src/kernel/plugin-elements.test.ts +1 -1
- package/src/kernel/stamp-http.test.ts +3 -3
- package/src/kernel/triggers.ts +210 -95
- package/src/kernel-entry.ts +0 -1
- package/src/manifest/diff.ts +11 -1
- package/src/manifest/fixtures/skyport.excerpt.json +1 -1
- package/src/manifest/types.ts +46 -2
- package/src/mcp/docs-index.ts +3 -3
- package/src/mcp/docs-mcp.test.ts +2 -2
- package/src/mcp/docs-tools.ts +1 -1
- package/src/okid.test.ts +56 -0
- package/src/okid.ts +55 -11
- package/src/plugins/anonymous.ts +8 -4
- package/src/plugins/auth/shared.ts +27 -3
- package/src/plugins/auth-delivery.mailpit.integration.test.ts +1 -1
- package/src/plugins/auth-methods.security.test.ts +561 -23
- package/src/plugins/config-source.ts +1 -1
- package/src/plugins/csrf.test.ts +65 -0
- package/src/plugins/index.ts +2 -0
- package/src/plugins/magic-link.ts +36 -16
- package/src/plugins/oauth/shared.ts +3 -1
- package/src/plugins/oauth.ts +22 -14
- package/src/plugins/otp.ts +37 -21
- package/src/plugins/passkey-webauthn.ts +9 -6
- package/src/plugins/passkey.ts +98 -26
- package/src/plugins/pre-account-hijack.test.ts +223 -0
- package/src/plugins/two-factor.ts +466 -37
- package/src/plugins/username.ts +19 -7
- package/src/release/build-lib.ts +1 -0
- package/src/release/limits.ts +2 -2
- package/src/release/measure.ts +1 -1
- package/src/runs/collect.test.ts +0 -2
- package/src/runtime/json-code-block.test.ts +250 -20
- package/src/runtime/json-code-block.ts +1261 -41
- package/src/term.test.ts +1 -1
- package/src/test/create-test-app.test.ts +12 -12
- package/src/test/live-signals.test.ts +6 -6
- package/src/test/provisions.integration.test.ts +10 -14
- package/src/test/reset-element-registries.ts +1 -1
- package/src/test/tenant-isolation.test.ts +12 -6
- package/site/content/docs/deployment/docker-swarm.mdx +0 -164
- package/site/content/docs/deployment/docker.mdx +0 -227
- package/site/content/docs/deployment/index.mdx +0 -83
- package/site/content/docs/deployment/kubernetes.mdx +0 -176
- package/site/content/docs/deployment/meta.json +0 -5
- package/site/content/docs/deployment/reverse-proxy.mdx +0 -234
- package/site/content/docs/elements/ai.mdx +0 -385
- package/site/content/docs/elements/channel.mdx +0 -346
- package/site/content/docs/elements/clock.mdx +0 -244
- package/site/content/docs/elements/flow.mdx +0 -420
- package/site/content/docs/elements/gate.mdx +0 -436
- package/site/content/docs/elements/signal.mdx +0 -380
- package/site/content/docs/elements/store.mdx +0 -1099
- package/site/content/docs/elements/vault.mdx +0 -405
- package/site/content/docs/get-started/basic-usage.mdx +0 -173
- package/site/content/docs/get-started/index.mdx +0 -43
- package/site/content/docs/get-started/installation.mdx +0 -220
- package/site/content/docs/get-started/introduction.mdx +0 -144
- package/site/content/docs/get-started/meta.json +0 -13
- package/site/content/docs/get-started/project-structure.mdx +0 -925
- package/site/content/docs/get-started/testing.mdx +0 -328
- package/site/content/docs/get-started/why.mdx +0 -114
- package/site/content/docs/recipes/llama-cpp.mdx +0 -151
- package/site/content/docs/recipes/ollama.mdx +0 -142
- package/site/content/docs/recipes/sglang.mdx +0 -105
- package/site/content/docs/recipes/vllm.mdx +0 -106
- package/site/content/docs/reference/cli.md +0 -232
- package/site/content/docs/reference/client.mdx +0 -469
- package/site/content/docs/reference/security.md +0 -74
- package/src/cli/ai-setup/detect-ollama.ts +0 -213
- package/src/cli/ai-setup/recommend.test.ts +0 -225
- package/src/cli/ai-setup/recommend.ts +0 -225
- package/src/cli/dev-controls.test.ts +0 -122
- package/src/cli/dev-controls.ts +0 -164
- package/src/cli/tui/DevLive.tsx +0 -126
- package/src/console/ui-next/dist/assets/access-page-3-EFj-2G.js +0 -4
- package/src/console/ui-next/dist/assets/agent-disclosure-BP0Y0Sux.js +0 -1
- package/src/console/ui-next/dist/assets/cache-glyph-B5X-NM0-.js +0 -1
- package/src/console/ui-next/dist/assets/call-pii-button-ChAUiLo9.js +0 -1
- package/src/console/ui-next/dist/assets/collapsible-DGnOM2ph.js +0 -1
- package/src/console/ui-next/dist/assets/copy-inline-button-DBHhgHKP.js +0 -1
- package/src/console/ui-next/dist/assets/dagre.esm-ZwcdTuZZ.js +0 -1
- package/src/console/ui-next/dist/assets/detail-header-DhHM1iaZ.js +0 -1
- package/src/console/ui-next/dist/assets/dropdown-menu-_NjTEo5_.js +0 -1
- package/src/console/ui-next/dist/assets/duration-tone-sC3lGABz.js +0 -9
- package/src/console/ui-next/dist/assets/element-icons-BVXtRyd3.js +0 -1
- package/src/console/ui-next/dist/assets/explorer-empty-2uIhBu0_.js +0 -1
- package/src/console/ui-next/dist/assets/flows-page-cVFnA4HH.js +0 -1
- package/src/console/ui-next/dist/assets/highlighted-json-Awq7gYdu.js +0 -154
- package/src/console/ui-next/dist/assets/http-method-_UHM2ODJ.js +0 -1
- package/src/console/ui-next/dist/assets/index-CMIgUbD0.js +0 -66
- package/src/console/ui-next/dist/assets/index-Ck88Jmv8.css +0 -2
- package/src/console/ui-next/dist/assets/link-BX6Vqztd.js +0 -1
- package/src/console/ui-next/dist/assets/observability-page-CQ3p34ip.js +0 -4
- package/src/console/ui-next/dist/assets/preload-helper-oH4irX4C.js +0 -1
- package/src/console/ui-next/dist/assets/react-D8E3mtu1.js +0 -1
- package/src/console/ui-next/dist/assets/react-dom-Bph1y7z7.js +0 -9
- package/src/console/ui-next/dist/assets/replica-lag-DKRrbvdo.js +0 -18
- package/src/console/ui-next/dist/assets/request-meta-DV0ywz7t.js +0 -1
- package/src/console/ui-next/dist/assets/shortcut-JQIZlWfm.js +0 -1
- package/src/console/ui-next/dist/assets/shortcut-keys-DKxNTe_m.js +0 -1
- package/src/console/ui-next/dist/assets/skeleton-D-czQJT6.js +0 -1
- package/src/console/ui-next/dist/assets/store-page-02xOiqIK.js +0 -41
- package/src/console/ui-next/dist/assets/trace-detail-sheet-B09O8rA6.js +0 -2
- package/src/console/ui-next/dist/assets/tree-expand-toggle-BtyhmWb4.js +0 -55
- package/src/console/ui-next/dist/assets/units-page-l8FeKfnP.js +0 -1
- package/src/console/ui-next/dist/assets/useMutation-B8EO02Ej.js +0 -1
- package/src/console/ui-next/dist/assets/useRender-BE2A9BWC.js +0 -1
- package/src/console/ui-next/dist/assets/vault-page-CL-d_mLE.js +0 -2
- package/src/console/ui-next/dist/assets/xyflow-D7n4g6go.js +0 -7
- package/src/console/ui-next/dist/assets/xyflow-DZ0Ws1xk.css +0 -1
- package/src/docker/ollama-pull.ts +0 -232
- package/src/docker/recipes/llama-cpp.ts +0 -298
- package/src/docker/recipes/ollama.ts +0 -44
- package/src/docker/recipes/sglang.ts +0 -55
- package/src/docker/recipes/vllm.ts +0 -44
- package/src/drivers/ai-ollama-tools.integration.test.ts +0 -109
- package/src/drivers/ai-ollama.integration.test.ts +0 -184
- package/src/drivers/ai-ollama.ts +0 -389
- package/src/drivers/ollama.ts +0 -14
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Kubernetes
|
|
3
|
-
description: Run an OKE app as a plain Deployment — PgDog, readiness vs liveness probes, graceful SIGTERM, shared drivers, and honest multi-instance limits.
|
|
4
|
-
icon: Container
|
|
5
|
-
source: README.md
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
OKE apps are safe to run as more than one replica when shared drivers back
|
|
9
|
-
Clock, Journal, Gate, and Store. Kubernetes is full orchestration with the
|
|
10
|
-
largest ecosystem — use a **Deployment**, never a StatefulSet.
|
|
11
|
-
|
|
12
|
-
<Callout title="The one rule">
|
|
13
|
-
Treat every replica as replaceable. Put durable state in Postgres / Redis / S3, probe `GET
|
|
14
|
-
/_/ready` for readiness and app `GET /health` for liveness, and set
|
|
15
|
-
`terminationGracePeriodSeconds` high enough for lease release on SIGTERM.
|
|
16
|
-
</Callout>
|
|
17
|
-
|
|
18
|
-
## Quick start
|
|
19
|
-
|
|
20
|
-
<Steps>
|
|
21
|
-
|
|
22
|
-
<Step>
|
|
23
|
-
### Deploy as a Deployment
|
|
24
|
-
|
|
25
|
-
Use a plain Kubernetes **Deployment** (or compatible replica set). Do **not**
|
|
26
|
-
use a StatefulSet — there is no per-pod volume identity, ordered startup, or
|
|
27
|
-
sticky network id to preserve. Scale with `replicas: N`.
|
|
28
|
-
|
|
29
|
-
</Step>
|
|
30
|
-
|
|
31
|
-
<Step>
|
|
32
|
-
### Share backing services
|
|
33
|
-
|
|
34
|
-
Pin `dev`/`prod` drivers to shared stores:
|
|
35
|
-
|
|
36
|
-
| Concern | Driver | Shared backend |
|
|
37
|
-
| ----------------------------- | ---------------------------- | ------------------------------------------------- |
|
|
38
|
-
| SQL / durable journal / clock | `postgres` | Postgres (optionally via PgDog) |
|
|
39
|
-
| Gate rate counters | `redis` (`drivers.store.kv`) | Redis / Valkey / Dragonfly (`images["store.kv"]`) |
|
|
40
|
-
| Files | `s3` | S3-compatible object store |
|
|
41
|
-
| Signal | see known limits below | — |
|
|
42
|
-
|
|
43
|
-
</Step>
|
|
44
|
-
|
|
45
|
-
<Step>
|
|
46
|
-
### Probe readiness and liveness
|
|
47
|
-
|
|
48
|
-
- **Readiness:** `GET /_/ready` — returns `200 { ready: true }` only after boot and the durable orphan scan finish. While booting or scanning orphans it returns `503 { ready: false, reason: "booting" | "orphan_scan" }`.
|
|
49
|
-
- **Liveness:** app-authored `GET /health` (create-oke ships one) — cheap “process is alive,” not orphan-scan aware.
|
|
50
|
-
|
|
51
|
-
Wire `readinessProbe` to `/_/ready` and `livenessProbe` to `/health`.
|
|
52
|
-
|
|
53
|
-
</Step>
|
|
54
|
-
|
|
55
|
-
</Steps>
|
|
56
|
-
|
|
57
|
-
## PgDog pooling
|
|
58
|
-
|
|
59
|
-
Bun.SQL defaults to **10** connections per process — fine for one pod.
|
|
60
|
-
Scale the Deployment and `N × pool` can exceed Postgres `max_connections`.
|
|
61
|
-
|
|
62
|
-
When both `store.sql` and `pgdog` are pinned (`dev`/`prod` default in templates),
|
|
63
|
-
`DATABASE_URL` points at PgDog on port `6432` — transaction pooling, wire-protocol
|
|
64
|
-
transparent to Bun.SQL / Drizzle. Point the cluster Service at that pooler.
|
|
65
|
-
|
|
66
|
-
**Why PgDog.** Transaction pooling fixes the connection math. Naive poolers can
|
|
67
|
-
leak session state (`SET`, RLS vars, `LISTEN`/`NOTIFY`) across clients; PgDog
|
|
68
|
-
re-applies those under transaction mode.
|
|
69
|
-
|
|
70
|
-
Read-replica routing (`BEGIN READ ONLY` → replica) is documented readiness —
|
|
71
|
-
not configured as a generated Kubernetes manifest this round.
|
|
72
|
-
|
|
73
|
-
## Redis-protocol images (Redis · Valkey · Dragonfly)
|
|
74
|
-
|
|
75
|
-
`images["store.kv"]` defaults to Redis (most mature). Pin Valkey or Dragonfly
|
|
76
|
-
the same way — driver id stays `redis`, same `REDIS_URL`. Image table + one-line
|
|
77
|
-
licenses: [Store · KV](/docs/elements/store#kv).
|
|
78
|
-
|
|
79
|
-
## Readiness vs liveness
|
|
80
|
-
|
|
81
|
-
| Endpoint | Role | Kubernetes |
|
|
82
|
-
| -------------- | ------------------------------------------------------ | ------------------------------------------------ |
|
|
83
|
-
| `GET /_/ready` | Kernel readiness (`booting` → `orphan_scan` → `ready`) | `readinessProbe` — no traffic until Ready |
|
|
84
|
-
| `GET /health` | App liveness (create-oke) — cheap “process alive” | `livenessProbe` — restart if the process is dead |
|
|
85
|
-
|
|
86
|
-
**Consequence:** orphan scan delays Ready (and traffic) on purpose so a new
|
|
87
|
-
pod is not hit mid-takeover. Do not point liveness at `/_/ready` — a long orphan
|
|
88
|
-
resume would kill the pod instead of waiting.
|
|
89
|
-
|
|
90
|
-
## Graceful shutdown
|
|
91
|
-
|
|
92
|
-
On `SIGTERM` / `SIGINT`, `installGracefulShutdown` (wired by `oke dev`’s app
|
|
93
|
-
runner; call it next to `createBunRuntime().serve` in custom entries):
|
|
94
|
-
|
|
95
|
-
1. Stops accepting new connections
|
|
96
|
-
2. Releases **Clock** cron leases and **Journal** run leases held by this instance
|
|
97
|
-
3. Closes element runtimes and exits
|
|
98
|
-
|
|
99
|
-
Signal message leases have no proactive release today — survivors reclaim after
|
|
100
|
-
the visibility TTL (default 30s). Set `terminationGracePeriodSeconds` ≥ your
|
|
101
|
-
longest lease TTL (typically ≥ 30s) so release finishes before kubelet SIGKILL.
|
|
102
|
-
|
|
103
|
-
## Ingress (TLS / routing)
|
|
104
|
-
|
|
105
|
-
Use cluster-native **Ingress** or Gateway API for HTTPS.
|
|
106
|
-
Compose `images.proxy` recipes (Caddy / Traefik / nginx) target plain Docker and Swarm —
|
|
107
|
-
see [Reverse proxy](/docs/deployment/reverse-proxy) when you are not on Kubernetes.
|
|
108
|
-
|
|
109
|
-
Still set serve `allowedHosts` to the public hostname
|
|
110
|
-
([Security](/docs/reference/security)).
|
|
111
|
-
|
|
112
|
-
## Known multi-instance limits
|
|
113
|
-
|
|
114
|
-
Be honest about what is still process-local:
|
|
115
|
-
|
|
116
|
-
| Surface | Multi-instance today |
|
|
117
|
-
| ---------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
|
|
118
|
-
| Clock (`postgres` / shared `file`) | Shared leader election |
|
|
119
|
-
| Journal (`postgres` / shared `file`) | Shared durable runs + orphan resume |
|
|
120
|
-
| Gate rates (`drivers.store.kv: redis`) | Shared counters |
|
|
121
|
-
| Store SQL / KV redis / files `s3` | Shared |
|
|
122
|
-
| Store files `fs` | **Per-instance filesystem** — boot warns; use `s3` when scaled |
|
|
123
|
-
| Signal `redis` | Emit relays to Redis; **consume / `live` / `drain` are process-local outbox** until Streams consume ships |
|
|
124
|
-
| Channel suppression / consent / receipts | **Default stores are process-local** — opt-out on replica A is invisible to B until a durable driver ships |
|
|
125
|
-
|
|
126
|
-
## Troubleshooting
|
|
127
|
-
|
|
128
|
-
<Accordions>
|
|
129
|
-
<Accordion title="Pods pass liveness but get no traffic after deploy">
|
|
130
|
-
|
|
131
|
-
Check readiness: `/_/ready` stays `503` with `reason: "orphan_scan"` until the
|
|
132
|
-
durable orphan resume finishes. A long resume delays Ready; that is intentional
|
|
133
|
-
so traffic does not hit a pod mid-takeover.
|
|
134
|
-
|
|
135
|
-
</Accordion>
|
|
136
|
-
<Accordion title="Rate limits look twice as high after scaling to 2">
|
|
137
|
-
|
|
138
|
-
`drivers.store.kv` must be `redis` with `REDIS_URL` set. A missing URL now
|
|
139
|
-
**fails boot** (no silent memory fallback). Declaring `memory` for local is fine;
|
|
140
|
-
`dev`/`prod` should stay on redis.
|
|
141
|
-
|
|
142
|
-
</Accordion>
|
|
143
|
-
<Accordion title="Files uploaded on pod A are missing on pod B">
|
|
144
|
-
|
|
145
|
-
`drivers.store.files: "fs"` is single-host. Switch `dev`/`prod` to `s3`
|
|
146
|
-
(create-oke templates already do).
|
|
147
|
-
|
|
148
|
-
</Accordion>
|
|
149
|
-
<Accordion title="Pod killed during orphan scan">
|
|
150
|
-
|
|
151
|
-
Liveness is pointed at `/_/ready`. Move liveness to `/health`; keep readiness
|
|
152
|
-
on `/_/ready` so the pod stays Alive while Waiting for Ready.
|
|
153
|
-
|
|
154
|
-
</Accordion>
|
|
155
|
-
</Accordions>
|
|
156
|
-
|
|
157
|
-
## Learn more
|
|
158
|
-
|
|
159
|
-
- [Deployment](/docs/deployment) — choose compose, Swarm, or Kubernetes
|
|
160
|
-
- [Docker](/docs/deployment/docker) — plain compose
|
|
161
|
-
- [Docker Swarm](/docs/deployment/docker-swarm) — `docker stack deploy`
|
|
162
|
-
- [Reverse proxy](/docs/deployment/reverse-proxy) — Caddy / Traefik / nginx (non-K8s)
|
|
163
|
-
- [Store](/docs/elements/store) — PgDog and facets
|
|
164
|
-
- [Clock](/docs/elements/clock) — shared CronStore / leader election
|
|
165
|
-
- [Flow](/docs/elements/flow) — durable journal
|
|
166
|
-
- [Signal](/docs/elements/signal) — delivery modes and redis honesty
|
|
167
|
-
- [Channel](/docs/elements/channel) — suppression process-local limit
|
|
168
|
-
- [CLI](/docs/reference/cli) — `oke docker --prod`, `oke start`
|
|
169
|
-
|
|
170
|
-
## Next
|
|
171
|
-
|
|
172
|
-
<Cards>
|
|
173
|
-
<Card title="Deployment" href="/docs/deployment" />
|
|
174
|
-
<Card title="Docker" href="/docs/deployment/docker" />
|
|
175
|
-
<Card title="Docker Swarm" href="/docs/deployment/docker-swarm" />
|
|
176
|
-
</Cards>
|
|
@@ -1,234 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Reverse proxy
|
|
3
|
-
description: Opt-in Caddy, Traefik, or nginx for edge routing on plain Docker and Swarm — custom domains, Let's Encrypt, and the socket-proxy security model.
|
|
4
|
-
icon: Globe
|
|
5
|
-
source: README.md
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
Pin `images.proxy` when you need an edge in front of the app on plain `docker compose` or
|
|
9
|
-
Docker Swarm. Kubernetes uses cluster Ingress / Gateway API instead — this page
|
|
10
|
-
is for the compose recipes.
|
|
11
|
-
|
|
12
|
-
<Callout title="The one rule">
|
|
13
|
-
Leave the no-proxy default until you need an edge on compose. Then pick **Caddy** (automatic
|
|
14
|
-
HTTPS), **Traefik** (`--scale app=N`), or **nginx** (HTTP; TLS elsewhere). Never mount raw
|
|
15
|
-
`docker.sock` into Traefik.
|
|
16
|
-
</Callout>
|
|
17
|
-
|
|
18
|
-
## Quick start
|
|
19
|
-
|
|
20
|
-
<Steps>
|
|
21
|
-
|
|
22
|
-
<Step>
|
|
23
|
-
### Opt in (pick one)
|
|
24
|
-
|
|
25
|
-
```typescript title="oke.config.ts"
|
|
26
|
-
images: {
|
|
27
|
-
"store.sql": "postgres:18-alpine",
|
|
28
|
-
// …
|
|
29
|
-
proxy: "caddy:2-alpine", // or "traefik:v3.7" / "nginx:1.31-alpine"
|
|
30
|
-
},
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
Pin **one** proxy image — never two. `create-oke` asks **Add a reverse proxy…?** (or
|
|
34
|
-
`--proxy`). Re-run `oke docker --prod`.
|
|
35
|
-
|
|
36
|
-
</Step>
|
|
37
|
-
|
|
38
|
-
<Step>
|
|
39
|
-
### Set the public host and ACME email
|
|
40
|
-
|
|
41
|
-
```bash title=".env.local"
|
|
42
|
-
OKE_PROXY_HOST=app.example.com
|
|
43
|
-
OKE_PROXY_ACME_EMAIL=admin@example.com
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
`.env.local` is preserved across regeneration. Point DNS `A`/`AAAA` at the host.
|
|
47
|
-
|
|
48
|
-
</Step>
|
|
49
|
-
|
|
50
|
-
<Step>
|
|
51
|
-
### Bring the stack up
|
|
52
|
-
|
|
53
|
-
```bash
|
|
54
|
-
cd docker
|
|
55
|
-
docker compose -f compose.yml -f compose.store.sql.yml \
|
|
56
|
-
-f compose.proxy.yml -f compose.prod.yml up -d
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
Pass every `-f` file `oke docker` listed. The edge publishes `80`/`443`; `app`
|
|
60
|
-
stays on the internal `oke` network (no host bind on `6530`).
|
|
61
|
-
|
|
62
|
-
Add your public hostname to serve `allowedHosts`
|
|
63
|
-
([Security](/docs/reference/security)).
|
|
64
|
-
|
|
65
|
-
</Step>
|
|
66
|
-
|
|
67
|
-
</Steps>
|
|
68
|
-
|
|
69
|
-
## Which proxy?
|
|
70
|
-
|
|
71
|
-
| Choice | Best for | How routing works |
|
|
72
|
-
| ------------------------------- | ---------------------------------------------------------- | ------------------------------------------------------------------ |
|
|
73
|
-
| **Caddy** (`caddy:2-alpine`) | hello / minimal / standard — single instance, simplest TLS | Generated `Caddyfile` → `reverse_proxy app:6530`; automatic HTTPS |
|
|
74
|
-
| **Traefik** (`traefik:v3.7`) | Horizontally scaled plain compose | Docker labels on `app`; replicas auto-discovered and load-balanced |
|
|
75
|
-
| **nginx** (`nginx:1.31-alpine`) | Static HTTP edge; TLS elsewhere | Generated `nginx.conf` → `proxy_pass` to `app:6530` on `:80` |
|
|
76
|
-
| _(omit `images.proxy`)_ | Local / private networks | App publishes `6530` — **default, unchanged** |
|
|
77
|
-
|
|
78
|
-
**Consequence:** Caddy is the recommended default when you just need a certificate.
|
|
79
|
-
Choose Traefik when `docker compose up --scale app=N` is the deployment shape.
|
|
80
|
-
Choose nginx when another edge already terminates TLS.
|
|
81
|
-
|
|
82
|
-
## Caddy
|
|
83
|
-
|
|
84
|
-
Emits `docker/Caddyfile`:
|
|
85
|
-
|
|
86
|
-
```text
|
|
87
|
-
{$OKE_PROXY_HOST:localhost} {
|
|
88
|
-
reverse_proxy app:6530
|
|
89
|
-
}
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
| Setting | What it does |
|
|
93
|
-
| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
94
|
-
| `OKE_PROXY_HOST` | Site address. `localhost` → local TLS; a public DNS name → Let's Encrypt HTTP-01 |
|
|
95
|
-
| `OKE_PROXY_ACME_EMAIL` | Written into `.env.local` for the proxy role. Traefik consumes it; for Caddy, add a global `email` block if you want a specific ACME contact |
|
|
96
|
-
|
|
97
|
-
Custom domain:
|
|
98
|
-
|
|
99
|
-
1. DNS for `app.example.com` → this host
|
|
100
|
-
2. `OKE_PROXY_HOST=app.example.com` in `.env.local`
|
|
101
|
-
3. Ports `80`/`443` reachable from the public internet
|
|
102
|
-
4. `allowedHosts` includes `app.example.com`
|
|
103
|
-
|
|
104
|
-
Override the file via `compose.override.yml` or replace `docker/Caddyfile` —
|
|
105
|
-
`oke docker` regenerates the default on the next run.
|
|
106
|
-
|
|
107
|
-
## Traefik
|
|
108
|
-
|
|
109
|
-
Generated `compose.proxy.yml` labels `app`:
|
|
110
|
-
|
|
111
|
-
| Label | Meaning |
|
|
112
|
-
| --------------------------------------------------------- | -------------------------------------------- |
|
|
113
|
-
| `traefik.enable=true` | Advertise this service to Traefik |
|
|
114
|
-
| `traefik.http.routers.app.rule=Host(…)` | Match `OKE_PROXY_HOST` (default `localhost`) |
|
|
115
|
-
| `traefik.http.routers.app.entrypoints=websecure` | HTTPS entrypoint |
|
|
116
|
-
| `traefik.http.routers.app.tls.certresolver=letsencrypt` | ACME via Let's Encrypt |
|
|
117
|
-
| `traefik.http.services.app.loadbalancer.server.port=6530` | Upstream port on the compose network |
|
|
118
|
-
|
|
119
|
-
HTTP (`:80`) redirects to HTTPS. ACME email comes from
|
|
120
|
-
`OKE_PROXY_ACME_EMAIL` (default `admin@example.com`) on the Traefik command line.
|
|
121
|
-
|
|
122
|
-
Scaled replicas need no label edits — `docker compose up --scale app=N` registers
|
|
123
|
-
every replica through the Docker provider.
|
|
124
|
-
|
|
125
|
-
## nginx
|
|
126
|
-
|
|
127
|
-
| Piece | Meaning |
|
|
128
|
-
| -------------- | ----------------------------------------------------------------------- |
|
|
129
|
-
| Generated file | `docker/nginx.conf` — `proxy_pass` to `app:6530` on `:80` |
|
|
130
|
-
| TLS | None in-container — put Cloudflare / an ALB in front, or switch recipes |
|
|
131
|
-
| Full recipe | [nginx](/docs/recipes/nginx) |
|
|
132
|
-
|
|
133
|
-
## Why docker-socket-proxy (Traefik)
|
|
134
|
-
|
|
135
|
-
Traefik's Docker provider watches the Engine API for containers and labels.
|
|
136
|
-
The naive setup mounts `/var/run/docker.sock` into Traefik itself.
|
|
137
|
-
|
|
138
|
-
That socket is root-equivalent for the host Docker daemon. If the edge process
|
|
139
|
-
is compromised (public `80`/`443`), an attacker with the raw socket can start
|
|
140
|
-
privileged containers, mount the host filesystem, or escape the container.
|
|
141
|
-
|
|
142
|
-
Traefik [documents this risk](https://doc.traefik.io/traefik/reference/install-configuration/providers/docker/)
|
|
143
|
-
and recommends a filtered proxy. OKE **never** mounts `docker.sock` into Traefik —
|
|
144
|
-
a companion `tecnativa/docker-socket-proxy` mounts it read-only and exposes only:
|
|
145
|
-
|
|
146
|
-
| Flag | Why Traefik needs it |
|
|
147
|
-
| ------------ | -------------------------- |
|
|
148
|
-
| `CONTAINERS` | List / inspect for labels |
|
|
149
|
-
| `EVENTS` | Watch start/stop for scale |
|
|
150
|
-
| `PING` | Health of the Engine API |
|
|
151
|
-
| `VERSION` | API negotiation |
|
|
152
|
-
| `NETWORKS` | Network membership |
|
|
153
|
-
|
|
154
|
-
Destructive Engine calls (`images`, `volumes`, exec, swarm admin, …) stay denied.
|
|
155
|
-
Traefik uses `--providers.docker.endpoint=tcp://socket-proxy:2375` on the
|
|
156
|
-
internal `oke` network only — do **not** publish `2375` on the host.
|
|
157
|
-
|
|
158
|
-
**Consequence:** a compromised Traefik still talks to a narrow API surface, not
|
|
159
|
-
the full Docker control plane.
|
|
160
|
-
|
|
161
|
-
## Environment
|
|
162
|
-
|
|
163
|
-
| Variable | Default | Used by |
|
|
164
|
-
| ---------------------- | ------------------- | ----------------------------------------- |
|
|
165
|
-
| `OKE_PROXY_HOST` | `localhost` | Caddy site address; Traefik `Host()` rule |
|
|
166
|
-
| `OKE_PROXY_ACME_EMAIL` | `admin@example.com` | Traefik ACME account email |
|
|
167
|
-
|
|
168
|
-
## Where this applies
|
|
169
|
-
|
|
170
|
-
| Surface | Edge / ingress |
|
|
171
|
-
| --------------------------------------------- | -------------------------------------------------------- |
|
|
172
|
-
| [Docker](/docs/deployment/docker) | Opt-in Caddy / Traefik / nginx (`images.proxy`) |
|
|
173
|
-
| [Docker Swarm](/docs/deployment/docker-swarm) | Same proxy recipes + Swarm routing mesh |
|
|
174
|
-
| [Kubernetes](/docs/deployment/kubernetes) | Ingress / Gateway API (cluster-native — not this recipe) |
|
|
175
|
-
|
|
176
|
-
## Troubleshooting
|
|
177
|
-
|
|
178
|
-
<Accordions>
|
|
179
|
-
<Accordion title="compose up --scale app=N fails with port already allocated">
|
|
180
|
-
|
|
181
|
-
You still have `6530:6530` on `app`. Confirm `images.proxy` is set and
|
|
182
|
-
`compose.proxy.yml` is in the `-f` list so derivation omitted the host bind.
|
|
183
|
-
|
|
184
|
-
</Accordion>
|
|
185
|
-
<Accordion title="Let's Encrypt challenge fails">
|
|
186
|
-
|
|
187
|
-
`OKE_PROXY_HOST` must be a public DNS name pointing at this host; ports `80`/`443`
|
|
188
|
-
reachable. Set `OKE_PROXY_ACME_EMAIL` for Traefik. For localhost-only smoke tests, prefer Caddy.
|
|
189
|
-
|
|
190
|
-
</Accordion>
|
|
191
|
-
<Accordion title="Traefik starts but never routes to app">
|
|
192
|
-
|
|
193
|
-
Confirm app labels are present (`traefik.enable=true`) in `compose.proxy.yml`,
|
|
194
|
-
containers share the `oke` network, and `socket-proxy` is healthy. Traefik must
|
|
195
|
-
not mount `docker.sock` itself.
|
|
196
|
-
|
|
197
|
-
</Accordion>
|
|
198
|
-
<Accordion title="oke dev: service app has neither an image nor a build context">
|
|
199
|
-
|
|
200
|
-
`oke dev` starts infra only; the app stays on the host at `:6530`.
|
|
201
|
-
Proxy recipes route to a Compose `app` service — use `oke docker` for that.
|
|
202
|
-
Re-run `oke dev` after upgrading so compose drops the label-only `app`.
|
|
203
|
-
|
|
204
|
-
</Accordion>
|
|
205
|
-
<Accordion title="Host header rejected (403)">
|
|
206
|
-
|
|
207
|
-
Serve validates `Host`. Add your public hostname to `allowedHosts`
|
|
208
|
-
([Security](/docs/reference/security)).
|
|
209
|
-
|
|
210
|
-
</Accordion>
|
|
211
|
-
<Accordion title="Caddy serves localhost certs on my public host">
|
|
212
|
-
|
|
213
|
-
`OKE_PROXY_HOST` is still `localhost` (or unset). Set the public DNS name in
|
|
214
|
-
`.env.local` and recreate the proxy container so it reloads the Caddyfile.
|
|
215
|
-
|
|
216
|
-
</Accordion>
|
|
217
|
-
</Accordions>
|
|
218
|
-
|
|
219
|
-
## Learn more
|
|
220
|
-
|
|
221
|
-
- [Deployment](/docs/deployment) — pick compose, Swarm, or Kubernetes
|
|
222
|
-
- [Docker](/docs/deployment/docker) — plain compose path (includes proxy opt-in)
|
|
223
|
-
- [Docker Swarm](/docs/deployment/docker-swarm) — `docker stack deploy`
|
|
224
|
-
- [CLI](/docs/reference/cli) — `oke docker`, `oke docker --prod`
|
|
225
|
-
- [Configuration](/docs/reference/configuration) — `images` pins
|
|
226
|
-
- [Security](/docs/reference/security) — `allowedHosts` behind a reverse proxy
|
|
227
|
-
|
|
228
|
-
## Next
|
|
229
|
-
|
|
230
|
-
<Cards>
|
|
231
|
-
<Card title="Deployment" href="/docs/deployment" />
|
|
232
|
-
<Card title="Docker" href="/docs/deployment/docker" />
|
|
233
|
-
<Card title="Docker Swarm" href="/docs/deployment/docker-swarm" />
|
|
234
|
-
</Cards>
|