Files
telemtPanel/deploy/docker-compose.traefik.yml
Denozordec 9ac385d332
Build and Push Telemt Panel Docker Image / build-and-push (push) Successful in 3m34s
Build and Push Telemt Panel Docker Image / create-release (push) Skipped
Update Docker image references from 'telemtPanel' to 'telemtpanel' across configuration files and documentation for consistency.
2026-08-04 18:36:44 +07:00

108 lines
3.6 KiB
YAML

# Telemt Panel + Traefik (production).
# Docs: docs/install.md
#
# On server:
# mkdir -p /opt/telemt-panel/data
# cp deploy/docker-compose.traefik.yml /opt/telemt-panel/docker-compose.yml
# cp deploy/env.traefik.example /opt/telemt-panel/.env
# docker login git.shts.su
# cd /opt/telemt-panel && docker compose pull && docker compose up -d
services:
traefik:
image: traefik:${TRAEFIK_IMAGE_TAG:-v3.7}
container_name: telemt-panel-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}
command:
- --log.level=${TRAEFIK_LOG_LEVEL:-INFO}
- --api.dashboard=false
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --providers.docker.network=telemt-panel
- --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:
- telemt-panel
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
app:
image: git.shts.su/denozord/telemtpanel:${PANEL_IMAGE_TAG:-latest}
pull_policy: always
container_name: telemt-panel
restart: unless-stopped
depends_on:
- traefik
env_file:
- .env
environment:
DATABASE_URL: sqlite:/data/app.db
STATIC_DIR: /app/static
NODE_ENV: production
SERVER_PORT: 8080
PANEL_MODE: ${PANEL_MODE:-fleet}
JWT_SECRET: ${JWT_SECRET:?set JWT_SECRET in .env}
PANEL_ENCRYPTION_KEY: ${PANEL_ENCRYPTION_KEY:?set PANEL_ENCRYPTION_KEY in .env}
PANEL_PUBLIC_URL: ${PANEL_PUBLIC_URL:?set PANEL_PUBLIC_URL in .env}
TELEMT_API_URL: ${TELEMT_API_URL:-http://127.0.0.1:9091}
BOOTSTRAP_USERNAME: ${BOOTSTRAP_USERNAME:-admin}
BOOTSTRAP_PASSWORD: ${BOOTSTRAP_PASSWORD:-}
LOG_LEVEL: ${LOG_LEVEL:-info}
volumes:
- ./data:/data
networks:
- telemt-panel
labels:
- traefik.enable=true
- traefik.docker.network=telemt-panel
- traefik.http.routers.telemt-panel.rule=Host(`${PANEL_DOMAIN:-panel.example.com}`)
- traefik.http.routers.telemt-panel.entrypoints=websecure
- traefik.http.routers.telemt-panel.tls=true
- traefik.http.routers.telemt-panel.tls.certresolver=letsencrypt
- traefik.http.services.telemt-panel.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: telemt_panel_traefik_letsencrypt
networks:
telemt-panel:
name: telemt-panel