Files
CASAN/AINative_OKR_CASAN5/infra/local-prod/docker-compose.yml
T
thanhnvandClaude Opus 4.8 e891981b59 feat(plan-01): Phase 4b — external callers to packages paths + registry (Task 1.7)
Point the canonical entry points at the new package layout; the .specify compat facade
is retained as an intentional backward-compat layer (see below).

- .gitea/workflows/{ci,harness-ci}.yml: invoke packages/casan-harness/scripts/bash|tests
  (state paths .specify/logs kept). CI now runs on the new structure.
- infra/local-prod/docker-compose.yml: dashboard-server.py -> packages path (logs/alerts
  env stay under .specify state).
- scripts/casan-step.mjs + run-casan-pipeline.mjs: resolve the harness under
  packages/casan-harness, falling back to .specify so the adversarial/sourcegen sandboxes
  (which stage a .specify/ tree) keep working; requirement input prefers apps/okr/domain/input.
- project-registry.json: record the new layout (harness_root, state_root, governance_root,
  per-project domain_root) so Plan-06 can register a second app with its own domain.
  verify-harness-reuse.sh already resolves via CASAN_HARNESS_ROOT -> HARNESS_REUSE_VALID (3 projects).

Facade decision: the .specify/{scripts,tests,security,...} symlinks are KEPT as a
documented compat layer. A full hard cutover (removing them) still needs ~15 literal
`.specify/...` refs repointed (loop_common/evidence-pack/secrets-scan config+test paths,
run-casan-pipeline step scripts, and the signed policy-bundle.yaml path list which then
needs manifest regen + re-sign). That is a scoped follow-up; the physical separation
(code in packages/, domain in apps/, packages holds no domain data, single CASAN_* path
indirection) is complete and the full gate is green via BOTH entry paths: PASS=64 FAIL=0 SKIP=3.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-08 11:36:24 +09:00

141 lines
3.8 KiB
YAML

name: casan-local-prod
services:
vault:
image: hashicorp/vault:1.15
cap_add:
- IPC_LOCK
environment:
VAULT_DEV_ROOT_TOKEN_ID: root
VAULT_DEV_LISTEN_ADDRESS: 0.0.0.0:8200
ports:
- "18200:8200"
healthcheck:
test: ["CMD", "wget", "-q", "-O", "-", "http://127.0.0.1:8200/v1/sys/health"]
interval: 5s
timeout: 3s
retries: 20
idp:
build:
context: ./idp
environment:
CASAN_IDP_PORT: "8080"
CASAN_IDP_ISSUER: http://127.0.0.1:18081
ports:
- "18081:8080"
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8080/healthz', timeout=2)"]
interval: 5s
timeout: 3s
retries: 20
minio:
image: minio/minio:RELEASE.2025-09-07T16-13-09Z
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: casanadmin
MINIO_ROOT_PASSWORD: casanadmin123
MINIO_BROWSER_REDIRECT_URL: http://127.0.0.1:19091
ports:
- "19090:9000"
- "19091:9001"
volumes:
- minio-data:/data
healthcheck:
test: ["CMD", "curl", "-fsS", "http://127.0.0.1:9000/minio/health/live"]
interval: 5s
timeout: 3s
retries: 20
minio-init:
image: minio/mc:RELEASE.2025-08-13T08-35-41Z
depends_on:
minio:
condition: service_healthy
entrypoint: /bin/sh
command:
- -c
- |
set -eu
mc alias set local http://minio:9000 casanadmin casanadmin123
mc mb --ignore-existing --with-lock local/casan-worm
mc retention set --default COMPLIANCE 1d local/casan-worm
mc anonymous set none local/casan-worm
echo MINIO_WORM_READY bucket=casan-worm mode=COMPLIANCE retention=1d
minio-mc:
image: minio/mc:RELEASE.2025-08-13T08-35-41Z
profiles: ["tools"]
depends_on:
minio:
condition: service_healthy
entrypoint: /bin/sh
alert-webhook:
build:
context: ./mock-http
command: ["python", "/app/mock_http.py", "alert"]
environment:
CASAN_MOCK_PORT: "8080"
ports:
- "19092:8080"
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8080/healthz', timeout=2)"]
interval: 5s
timeout: 3s
retries: 20
billing-api:
build:
context: ./mock-http
command: ["python", "/app/mock_http.py", "billing"]
environment:
CASAN_MOCK_PORT: "8080"
ports:
- "19093:8080"
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8080/healthz', timeout=2)"]
interval: 5s
timeout: 3s
retries: 20
dashboard:
image: python:3.12-slim
working_dir: /workspace
command: ["python", "packages/casan-harness/scripts/bash/dashboard-server.py", "8787"]
environment:
CASAN_DASHBOARD_BIND: 0.0.0.0
CASAN_DASHBOARD_STALE_S: "315360000"
CASAN_DASHBOARD_METRICS: /workspace/.specify/logs/cost/metrics.jsonl
CASAN_DASHBOARD_HTML: /workspace/docs/output/casan/central-agentops-dashboard.html
CASAN_DASHBOARD_ALERTS: /workspace/.specify/agentops/alerts.log
volumes:
- ../..:/workspace:ro
expose:
- "8787"
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8787/healthz', timeout=2)"]
interval: 5s
timeout: 3s
retries: 20
dashboard-nginx:
image: nginx:1.27-alpine
depends_on:
dashboard:
condition: service_healthy
ports:
- "18080:80"
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
- ./nginx/htpasswd:/etc/nginx/.htpasswd:ro
healthcheck:
test: ["CMD", "wget", "-q", "-O", "-", "http://127.0.0.1/healthz"]
interval: 5s
timeout: 3s
retries: 20
volumes:
minio-data: