Files
Denozordec dd3c378b5f
quality / commitlint (push) Skipped
CD / update-wiki (push) Successful in 6s
quality / changes (push) Successful in 5s
quality / docker-check (push) Skipped
quality / web (push) Successful in 56s
quality / api (push) Successful in 41s
CD / quality (push) Successful in 1m47s
CD / publish (push) Successful in 33s
Update CDN Manager: Add integration for new settings route, enhance permissions for nodes and aliases, and improve Docker configuration documentation. Update UI components for better navigation and user experience.
2026-09-04 13:11:33 +07:00

184 lines
5.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Запуск CDN Manager на сервере (Docker CLI)
Без Traefik (plain `docker run` / простой Compose). **Production HTTPS:** [`deploy-traefik.md`](./deploy-traefik.md).
## Traefik (кратко)
```bash
mkdir -p /opt/cdnmanager/data
cp deploy/docker-compose.traefik.yml /opt/cdnmanager/docker-compose.yml
cp deploy/env.traefik.example /opt/cdnmanager/.env
docker login git.shx.one
cd /opt/cdnmanager && docker compose pull && docker compose up -d
```
Один alpine-контейнер: API + SPA + SQLite. Образы `cdnmanager` и `cdn-manager` — один манифест (drop-in alias).
Registry по умолчанию: `git.shx.one/denozord/…` (подставьте свой owner при необходимости).
## Требования
- Docker Engine 24+ (или Docker Desktop)
- Cloudflare API token: **Zone DNS Edit** + **Zone Read**
- Для SSO: auth-portal с тем же `JWT_SECRET` / `AUTH_ISSUER` и origin CDNManager в `RETURN_TO_ALLOWLIST`
## 1. Pull образа
```bash
docker pull git.shx.one/denozord/cdnmanager:latest
# эквивалент (тот же образ):
docker pull git.shx.one/denozord/cdn-manager:latest
```
Тег релиза: `vX.Y.Z` или `X.Y.Z` (см. Gitea Releases).
## 2. Запуск одной командой (`docker run`)
### Dev / без portal (локальный admin)
```bash
docker volume create cdnmanager-data
docker run -d \
--name cdnmanager \
--restart unless-stopped \
-p 8080:8080 \
-v cdnmanager-data:/data \
-e DATABASE_URL=sqlite:/data/app.db \
-e STATIC_DIR=/app/static \
-e SERVER_PORT=8080 \
-e AUTH_REQUIRED=false \
-e JWT_SECRET=change-me-in-production \
-e ADMIN_USERNAME=admin \
-e CLOUDFLARE_API_TOKEN=cf_xxxxxxxx \
git.shx.one/denozord/cdnmanager:latest
```
Логин UI: `admin` / `admin` (если `ADMIN_PASSWORD_HASH` пуст — dev default).
### Production + auth-portal SSO
```bash
docker volume create cdnmanager-data
docker run -d \
--name cdnmanager \
--restart unless-stopped \
-p 8080:8080 \
-v cdnmanager-data:/data \
-e DATABASE_URL=sqlite:/data/app.db \
-e STATIC_DIR=/app/static \
-e SERVER_PORT=8080 \
-e AUTH_REQUIRED=true \
-e JWT_SECRET='<тот же секрет что у auth-portal>' \
-e AUTH_JWT_SECRET='<тот же секрет>' \
-e AUTH_ISSUER=https://auth.shnt.top \
-e AUTH_PORTAL_URL=https://auth.shnt.top \
-e AUTH_AUDIT_INGEST_SECRET='<AUDIT_INGEST_SECRET портала>' \
-e CLOUDFLARE_API_TOKEN=cf_xxxxxxxx \
-e LOG_LEVEL=info \
git.shx.one/denozord/cdnmanager:latest
```
Проверка:
```bash
curl -sS http://127.0.0.1:8080/health
# {"status":"ok",…}
```
Откройте `http://<host>:8080` → редирект на auth-portal → после логина handoff на `/auth/callback`.
## 3. Docker Compose
Файлы в репозитории:
- корневой [`docker-compose.yml`](../docker-compose.yml)
- пример [`deploy/compose/docker-compose.example.yaml`](../deploy/compose/docker-compose.example.yaml)
Создайте `.env` рядом с compose:
```env
JWT_SECRET=change-me-strong
AUTH_REQUIRED=true
AUTH_JWT_SECRET=change-me-strong
AUTH_ISSUER=https://auth.shnt.top
AUTH_PORTAL_URL=https://auth.shnt.top
AUTH_AUDIT_INGEST_SECRET=change-me-audit
CLOUDFLARE_API_TOKEN=cf_xxxxxxxx
ADMIN_USERNAME=admin
```
```bash
# из корня репозитория или каталога с compose
docker compose pull
docker compose up -d
docker compose ps
docker compose logs -f --tail=100
```
Остановка:
```bash
docker compose down
# данные в volume сохраняются; удалить volume:
# docker compose down -v
```
## 4. За reverse proxy (Traefik / Caddy)
Пробросьте HTTPS на контейнер `:8080`. Пример labels Traefik (Host `cdn.shnt.top`):
```yaml
labels:
- traefik.enable=true
- traefik.http.routers.cdnmanager.rule=Host(`cdn.shnt.top`)
- traefik.http.routers.cdnmanager.entrypoints=websecure
- traefik.http.routers.cdnmanager.tls=true
- traefik.http.services.cdnmanager.loadbalancer.server.port=8080
```
На auth-portal добавьте в `RETURN_TO_ALLOWLIST`: `https://cdn.shnt.top`.
В Admin → Apps выставьте URL App Switcher для `cdn` на этот origin.
## 5. Обновление
```bash
docker pull git.shx.one/denozord/cdnmanager:latest
docker stop cdnmanager && docker rm cdnmanager
# затем снова docker run … (тот же volume /data)
```
Или:
```bash
docker compose pull
docker compose up -d
```
Миграции SQLite применяются при старте API автоматически.
## 6. Сборка своего образа (опционально)
См. [`deploy/docker/README.md`](../deploy/docker/README.md) — `docker buildx bake` из `deploy/docker`.
## Переменные окружения
| Переменная | Обязательно | Описание |
|------------|-------------|----------|
| `DATABASE_URL` | да | `sqlite:/data/app.db` |
| `STATIC_DIR` | да (prod) | `/app/static` — SPA |
| `SERVER_PORT` | нет | default `8080` в образе / `8081` в local `.env` |
| `CLOUDFLARE_API_TOKEN` | для sync | Zone DNS Edit + Zone Read |
| `AUTH_REQUIRED` | prod SSO | `true` |
| `AUTH_JWT_SECRET` / `JWT_SECRET` | при SSO | = portal |
| `AUTH_ISSUER` | при SSO | = portal `ISSUER` |
| `AUTH_PORTAL_URL` | при SSO | URL UI портала |
| `AUTH_AUDIT_INGEST_SECRET` | опц. | dual-write audit |
| `ADMIN_*` | только `AUTH_REQUIRED=false` | локальный admin |
Подробнее SSO: [`integrate-auth-portal.md`](./integrate-auth-portal.md).