# Развертывание

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

Crank запускается как три контейнера за reverse proxy:

- `ui`
- `admin-api`
- `mcp-server`

Можно использовать внешний PostgreSQL или локальный PostgreSQL из compose-профиля `local-db`.

## Схема

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

admin-api  -> PostgreSQL
mcp-server -> PostgreSQL
admin-api  -> Valkey/Redis, опционально
mcp-server -> Valkey/Redis, опционально
```

## Файлы запуска

- `deploy/community/docker-compose.yml`
- `deploy/community/.env.example`
- `deploy/community/docker-compose.images.yml`
- `deploy/community/.env.images.example`

## Порты

Порты по умолчанию:

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

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

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

## Reverse proxy

Пример `nginx`:

```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-файла:

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

Запуск с внешним PostgreSQL:

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

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

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

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

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

## Запуск готовых образов

```bash
mkdir -p crank
cd crank
curl -fsSLo docker-compose.yml https://git.itexp.me/bsodfather/crank/raw/branch/main/deploy/community/docker-compose.images.yml
curl -fsSLo .env.example https://git.itexp.me/bsodfather/crank/raw/branch/main/deploy/community/.env.images.example
cp .env.example .env
docker compose --profile local-db up -d
```

Если используется внешний PostgreSQL, заполните `POSTGRES_HOST`, `POSTGRES_PORT`, `POSTGRES_DB`, `POSTGRES_USER`, `POSTGRES_PASSWORD` и запустите:

```bash
docker compose up -d
```

## Проверка состояния

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

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

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

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

```bash
curl -I http://127.0.0.1:3000/
```

## Эксплуатация

- Делайте регулярные бэкапы PostgreSQL.
- Не храните реальные секреты в Git.
- Для rollback используйте конкретные image tags, а не только `main`.
- `CRANK_PUBLISH_BIND=0.0.0.0` нужен только если reverse proxy работает на другом host.
