Files
crank/docs/deployment.md
T
github-ops 549390913c
Deploy / deploy (push) Successful in 2m38s
CI / Rust Checks (push) Successful in 5m32s
CI / UI Checks (push) Successful in 5s
CI / Deployment Manifests (push) Successful in 3s
CI / Frontend E2E (push) Successful in 4m2s
chore: publish clean community baseline
2026-06-17 07:48:57 +00:00

4.2 KiB

Deployment

Документ описывает поддерживаемый путь деплоя Crank Community.

Crank Community запускается как три application containers за reverse proxy:

  • ui
  • admin-api
  • mcp-server

Приложение использует внешний PostgreSQL. Compose manifest не поднимает PostgreSQL самостоятельно.

Runtime topology

reverse proxy
  /            -> ui:3000
  /api/admin/  -> admin-api:3001
  /mcp/        -> mcp-server:3002

admin-api  -> PostgreSQL
mcp-server -> PostgreSQL
admin-api  -> optional Valkey/Redis
mcp-server -> optional Valkey/Redis

Deployment files

  • deploy/community/docker-compose.yml
  • deploy/community/.env.example
  • .gitea/workflows/ci.yml
  • .gitea/workflows/deploy.yml
  • .gitea/workflows/release.yml

Порты

Default service ports:

  • ui: 3000
  • admin-api: 3001
  • mcp-server: 3002
  • optional valkey: 6379, только loopback

CRANK_PUBLISH_BIND управляет публикацией application ports:

  • 127.0.0.1, если reverse proxy работает на том же host;
  • 0.0.0.0, если reverse proxy работает на другом host.

Reverse proxy

Пример nginx:

server {
    listen 80;
    server_name crank.example.com;

    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name crank.example.com;

    ssl_certificate /etc/letsencrypt/live/crank.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/crank.example.com/privkey.pem;

    client_max_body_size 25m;

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_http_version 1.1;

    location / {
        proxy_pass http://192.168.1.106:3000;
    }

    location /api/admin/ {
        proxy_pass http://192.168.1.106:3001/;
    }

    location /mcp/ {
        proxy_pass http://192.168.1.106:3002/;
        proxy_buffering off;
        proxy_request_buffering off;
        proxy_read_timeout 300s;
        proxy_send_timeout 300s;
    }
}

Замените 192.168.1.106 на адрес deployment host.

Compose

Проверка manifest:

docker compose \
  -f deploy/community/docker-compose.yml \
  --env-file deploy/community/.env.example \
  config -q

Запуск без внешнего cache:

docker compose \
  -f deploy/community/docker-compose.yml \
  --env-file deploy/community/.env.example \
  up -d

Запуск со встроенным Valkey:

docker compose \
  -f deploy/community/docker-compose.yml \
  --env-file deploy/community/.env.example \
  --profile cache \
  up -d

Для встроенного Valkey:

CRANK_CACHE_BACKEND=valkey
CRANK_CACHE_URL=redis://valkey:6379/0
CRANK_CACHE_DEFAULT_TTL_MS=60000

Health checks

curl http://127.0.0.1:3001/health
curl http://127.0.0.1:3002/health

Ожидаемые ответы:

{"service":"admin-api","status":"ok"}
{"service":"mcp-server","status":"ok"}

UI root должен возвращать 200 OK:

curl -I http://127.0.0.1:3000/

Gitea CI/CD

Репозиторий использует Gitea Actions:

  • .gitea/workflows/ci.yml запускает Rust, UI, E2E и deployment manifest checks.
  • .gitea/workflows/deploy.yml собирает images и деплоит main.
  • .gitea/workflows/release.yml собирает release artifacts для tags.

Deploy workflow читает из Gitea secrets только OpenBao bootstrap credentials:

  • BAO_ADDR
  • BAO_ROLE_ID
  • BAO_SECRET_ID

Дальше workflow читает KV v2 secrets из OpenBao:

ci/shared/registry
ci/shared/deploy-ssh
ci/projects/crank/deploy
ci/projects/crank/runtime

Operational notes

  • Бэкапы БД должны жить вне application host.
  • Runtime secrets хранятся в OpenBao, не в Git.
  • Для rollback используйте immutable image tags.
  • CRANK_PUBLISH_BIND=0.0.0.0 нужен только если другой host должен обращаться к published ports напрямую.