4.2 KiB
4.2 KiB
Deployment
Документ описывает поддерживаемый путь деплоя Crank Community.
Crank Community запускается как три application containers за reverse proxy:
uiadmin-apimcp-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.ymldeploy/community/.env.example.gitea/workflows/ci.yml.gitea/workflows/deploy.yml.gitea/workflows/release.yml
Порты
Default service ports:
ui:3000admin-api:3001mcp-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_ADDRBAO_ROLE_IDBAO_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 напрямую.