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.
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

This commit is contained in:
Denozordec
2026-09-04 13:11:33 +07:00
parent 8700dc2957
commit dd3c378b5f
18 changed files with 788 additions and 5 deletions
@@ -6,11 +6,13 @@ services:
- "8080:8080"
environment:
DATABASE_URL: sqlite:/data/app.db
CLOUDFLARE_API_TOKEN: ${CLOUDFLARE_API_TOKEN:-}
JWT_SECRET: ${JWT_SECRET:-change-me-in-production}
AUTH_REQUIRED: ${AUTH_REQUIRED:-false}
AUTH_JWT_SECRET: ${AUTH_JWT_SECRET:-${JWT_SECRET:-change-me-in-production}}
AUTH_ISSUER: ${AUTH_ISSUER:-https://auth.shnt.top}
AUTH_PORTAL_URL: ${AUTH_PORTAL_URL:-https://auth.shnt.top}
AUTH_AUDIT_INGEST_SECRET: ${AUTH_AUDIT_INGEST_SECRET:-}
ADMIN_USERNAME: ${ADMIN_USERNAME:-admin}
ADMIN_PASSWORD_HASH: ${ADMIN_PASSWORD_HASH:-}
LOG_LEVEL: info
+113
View File
@@ -0,0 +1,113 @@
# CDN Manager + Traefik in one Compose stack (production).
# Docs: docs/deploy-traefik.md
#
# On server:
# mkdir -p /opt/cdnmanager/data
# cp deploy/docker-compose.traefik.yml /opt/cdnmanager/docker-compose.yml
# cp deploy/env.traefik.example /opt/cdnmanager/.env # fill secrets
# docker login git.shx.one
# cd /opt/cdnmanager && docker compose pull && docker compose up -d
services:
traefik:
image: traefik:${TRAEFIK_IMAGE_TAG:-v3.7}
container_name: cdnmanager-traefik
restart: unless-stopped
security_opt:
- no-new-privileges:true
ports:
- "${TRAEFIK_HTTP_PORT:-80}:80"
- "${TRAEFIK_HTTPS_PORT:-443}:443"
environment:
CF_DNS_API_TOKEN: ${CF_DNS_API_TOKEN:?set CF_DNS_API_TOKEN in .env}
# Optional if DNS token lacks Zone:Read:
# CF_ZONE_API_TOKEN: ${CF_ZONE_API_TOKEN:-}
command:
- --log.level=${TRAEFIK_LOG_LEVEL:-INFO}
- --api.dashboard=false
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --providers.docker.network=cdnmanager
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
- --entrypoints.web.http.redirections.entrypoint.to=websecure
- --entrypoints.web.http.redirections.entrypoint.scheme=https
- --certificatesresolvers.letsencrypt.acme.email=${LETSENCRYPT_EMAIL:?set LETSENCRYPT_EMAIL in .env}
- --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json
- --certificatesresolvers.letsencrypt.acme.dnschallenge=true
- --certificatesresolvers.letsencrypt.acme.dnschallenge.provider=cloudflare
- --certificatesresolvers.letsencrypt.acme.dnschallenge.delaybeforecheck=15
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- traefik_letsencrypt:/letsencrypt
networks:
- cdnmanager
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
app:
# cdnmanager и cdn-manager — один образ (алиас для drop-in).
image: git.shx.one/denozord/cdnmanager:${CDN_IMAGE_TAG:-latest}
pull_policy: always
container_name: cdnmanager
restart: unless-stopped
depends_on:
- traefik
# No host ports — only Traefik publishes 80/443.
env_file:
- .env
environment:
DATABASE_URL: sqlite:/data/app.db
STATIC_DIR: /app/static
SERVER_PORT: "8080"
NODE_ENV: production
LOG_LEVEL: ${LOG_LEVEL:-info}
CLOUDFLARE_API_TOKEN: ${CLOUDFLARE_API_TOKEN:?set CLOUDFLARE_API_TOKEN in .env}
JWT_SECRET: ${JWT_SECRET:-}
AUTH_REQUIRED: ${AUTH_REQUIRED:-true}
AUTH_JWT_SECRET: ${AUTH_JWT_SECRET:?set AUTH_JWT_SECRET in .env}
AUTH_ISSUER: ${AUTH_ISSUER:-https://auth.shnt.top}
AUTH_PORTAL_URL: ${AUTH_PORTAL_URL:-https://auth.shnt.top}
AUTH_AUDIT_INGEST_SECRET: ${AUTH_AUDIT_INGEST_SECRET:-}
ADMIN_USERNAME: ${ADMIN_USERNAME:-admin}
ADMIN_PASSWORD_HASH: ${ADMIN_PASSWORD_HASH:-}
volumes:
- ./data:/data
networks:
- cdnmanager
labels:
- traefik.enable=true
- traefik.docker.network=cdnmanager
- traefik.http.routers.cdnmanager.rule=Host(`${CDN_DOMAIN:-cdn.shnt.top}`)
- traefik.http.routers.cdnmanager.entrypoints=websecure
- traefik.http.routers.cdnmanager.tls=true
- traefik.http.routers.cdnmanager.tls.certresolver=letsencrypt
- traefik.http.services.cdnmanager.loadbalancer.server.port=8080
healthcheck:
test:
[
"CMD",
"node",
"-e",
"fetch('http://127.0.0.1:8080/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))",
]
interval: 30s
timeout: 5s
retries: 3
start_period: 15s
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
volumes:
traefik_letsencrypt:
name: cdnmanager_traefik_letsencrypt
networks:
cdnmanager:
name: cdnmanager
+36
View File
@@ -0,0 +1,36 @@
# Production .env for deploy/docker-compose.traefik.yml (CDN Manager + Traefik).
# Copy to /opt/cdnmanager/.env and fill secrets. Do not commit.
# --- Traefik / Let's Encrypt (Cloudflare DNS-01) ---
# Token for ACME only (Zone DNS Edit). Separate from CLOUDFLARE_API_TOKEN below.
CF_DNS_API_TOKEN=
[email protected]
CDN_DOMAIN=cdn.shnt.top
# TRAEFIK_IMAGE_TAG=v3.7
# TRAEFIK_HTTP_PORT=80
# TRAEFIK_HTTPS_PORT=443
# TRAEFIK_LOG_LEVEL=INFO
# --- Image ---
CDN_IMAGE_TAG=latest
# drop-in alias (same manifest): git.shx.one/denozord/cdn-manager
# --- CDN Manager (API + SPA) ---
CLOUDFLARE_API_TOKEN=
LOG_LEVEL=info
NODE_ENV=production
# Portal SSO (prod default AUTH_REQUIRED=true)
AUTH_REQUIRED=true
# Same HS256 secret as auth-portal JWT_SECRET (required)
AUTH_JWT_SECRET=
# Optional alias — app also reads JWT_SECRET
JWT_SECRET=
AUTH_ISSUER=https://auth.shnt.top
AUTH_PORTAL_URL=https://auth.shnt.top
# Shared with auth-portal AUDIT_INGEST_SECRET (optional)
AUTH_AUDIT_INGEST_SECRET=
# Legacy local admin — only when AUTH_REQUIRED=false
ADMIN_USERNAME=admin
ADMIN_PASSWORD_HASH=