Files

184 lines
6.4 KiB
YAML
Raw Permalink Normal View History

name: ${COMPOSE_PROJECT_NAME:-zhixing-system}
x-observability-labels: &observability-labels
observability.logs: "true"
observability.project: "zhixing-system"
observability.env: "production"
x-container-logging: &container-logging
driver: json-file
options:
max-size: "20m"
max-file: "5"
services:
server:
labels:
<<: *observability-labels
observability.service: "server"
logging: *container-logging
build:
context: ./zhixing-server
target: production
restart: unless-stopped
environment:
2026-08-07 09:56:28 +08:00
TZ: Asia/Shanghai
ZHIXING_APP_ENV: production
ZHIXING_DATABASE_URL: ${ZHIXING_DATABASE_URL:?Set ZHIXING_DATABASE_URL to the 1Panel PostgreSQL URL}
ZHIXING_LOG_LEVEL: ${ZHIXING_LOG_LEVEL:-INFO}
ZHIXING_MARKET_DATA_CSV_ROOT: /app/data/market-data
ZHIXING_MARKET_DATA_COVERAGE_THRESHOLD: ${ZHIXING_MARKET_DATA_COVERAGE_THRESHOLD:-0.99}
ZHIXING_MARKET_DATA_MAX_WORKERS: ${ZHIXING_MARKET_DATA_MAX_WORKERS:-8}
ZHIXING_MARKET_DATA_MAX_RETRIES: ${ZHIXING_MARKET_DATA_MAX_RETRIES:-3}
ZHIXING_MARKET_DATA_RETRY_BACKOFF_SECONDS: ${ZHIXING_MARKET_DATA_RETRY_BACKOFF_SECONDS:-1.0}
ZHIXING_MARKET_DATA_REQUEST_INTERVAL_SECONDS: ${ZHIXING_MARKET_DATA_REQUEST_INTERVAL_SECONDS:-0.2}
ZHIXING_MARKET_DATA_ADVISORY_LOCK_KEY: ${ZHIXING_MARKET_DATA_ADVISORY_LOCK_KEY:-7380521}
ZHIXING_SECTOR_RADAR_COVERAGE_THRESHOLD: ${ZHIXING_SECTOR_RADAR_COVERAGE_THRESHOLD:-0.99}
ZHIXING_SECTOR_RADAR_MAX_RETRIES: ${ZHIXING_SECTOR_RADAR_MAX_RETRIES:-3}
ZHIXING_SECTOR_RADAR_RETRY_BACKOFF_SECONDS: ${ZHIXING_SECTOR_RADAR_RETRY_BACKOFF_SECONDS:-1.0}
ZHIXING_SECTOR_RADAR_REQUEST_INTERVAL_SECONDS: ${ZHIXING_SECTOR_RADAR_REQUEST_INTERVAL_SECONDS:-0.2}
ZHIXING_SECTOR_RADAR_ADVISORY_LOCK_KEY: ${ZHIXING_SECTOR_RADAR_ADVISORY_LOCK_KEY:-7380522}
2026-08-12 09:45:16 +08:00
ZHIXING_SELECTION_MAX_WORKERS: ${ZHIXING_SELECTION_MAX_WORKERS:-4}
ZHIXING_SELECTION_BATCH_SIZE: ${ZHIXING_SELECTION_BATCH_SIZE:-200}
ZHIXING_SELECTION_PATTERN_SCORING_ENABLED: ${ZHIXING_SELECTION_PATTERN_SCORING_ENABLED:-true}
ZHIXING_TUSHARE_TOKEN: ${ZHIXING_TUSHARE_TOKEN:-}
init: true
expose:
- "8000"
healthcheck:
test:
- CMD
- python
- -c
- "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8000/healthz')"
interval: 30s
timeout: 5s
retries: 3
start_period: 10s
volumes:
- market-data:/app/data/market-data
networks:
- default
- 1panel-network
web:
labels:
<<: *observability-labels
observability.service: "web"
logging: *container-logging
build:
context: ./zhixing-web
target: production
restart: unless-stopped
depends_on:
server:
condition: service_healthy
environment:
2026-08-07 09:56:28 +08:00
TZ: Asia/Shanghai
API_UPSTREAM: http://server:8000
init: true
ports:
- "127.0.0.1:${ZHIXING_WEB_PORT:-8111}:80"
migrate:
labels:
<<: *observability-labels
observability.service: "migrate"
logging: *container-logging
profiles: ["jobs"]
build:
context: ./zhixing-server
target: production
command: ["alembic", "upgrade", "head"]
depends_on:
market-data-init:
condition: service_completed_successfully
environment:
2026-08-07 09:56:28 +08:00
TZ: Asia/Shanghai
ZHIXING_DATABASE_URL: ${ZHIXING_DATABASE_URL:?Set ZHIXING_DATABASE_URL to the 1Panel PostgreSQL URL}
networks:
- 1panel-network
# Named volumes are initialized as root; normalize ownership before app jobs run.
market-data-init:
labels:
<<: *observability-labels
observability.service: "market-data-init"
logging: *container-logging
profiles: ["jobs"]
build:
context: ./zhixing-server
target: production
user: "0:0"
2026-08-07 09:56:28 +08:00
environment:
TZ: Asia/Shanghai
command:
- sh
- -c
- mkdir -p /app/data/market-data && chown -R 10001:10001 /app/data/market-data
volumes:
- market-data:/app/data/market-data
market-sync:
labels:
<<: *observability-labels
observability.service: "market-sync"
logging: *container-logging
profiles: ["jobs"]
build:
context: ./zhixing-server
target: production
command: ["market-data-sync"]
depends_on:
migrate:
condition: service_completed_successfully
environment:
2026-08-07 09:56:28 +08:00
TZ: Asia/Shanghai
ZHIXING_DATABASE_URL: ${ZHIXING_DATABASE_URL:?Set ZHIXING_DATABASE_URL to the 1Panel PostgreSQL URL}
ZHIXING_MARKET_DATA_CSV_ROOT: /app/data/market-data
ZHIXING_MARKET_DATA_COVERAGE_THRESHOLD: ${ZHIXING_MARKET_DATA_COVERAGE_THRESHOLD:-0.99}
ZHIXING_MARKET_DATA_MAX_WORKERS: ${ZHIXING_MARKET_DATA_MAX_WORKERS:-8}
ZHIXING_MARKET_DATA_MAX_RETRIES: ${ZHIXING_MARKET_DATA_MAX_RETRIES:-3}
ZHIXING_MARKET_DATA_RETRY_BACKOFF_SECONDS: ${ZHIXING_MARKET_DATA_RETRY_BACKOFF_SECONDS:-1.0}
ZHIXING_MARKET_DATA_REQUEST_INTERVAL_SECONDS: ${ZHIXING_MARKET_DATA_REQUEST_INTERVAL_SECONDS:-0.2}
ZHIXING_MARKET_DATA_ADVISORY_LOCK_KEY: ${ZHIXING_MARKET_DATA_ADVISORY_LOCK_KEY:-7380521}
ZHIXING_TUSHARE_TOKEN: ${ZHIXING_TUSHARE_TOKEN:-}
volumes:
- market-data:/app/data/market-data
networks:
- 1panel-network
sector-radar-build:
labels:
<<: *observability-labels
observability.service: "sector-radar-build"
logging: *container-logging
profiles: ["jobs"]
build:
context: ./zhixing-server
target: production
entrypoint: ["sector-radar-build"]
command: []
depends_on:
migrate:
condition: service_completed_successfully
environment:
TZ: Asia/Shanghai
ZHIXING_DATABASE_URL: ${ZHIXING_DATABASE_URL:?Set ZHIXING_DATABASE_URL to the 1Panel PostgreSQL URL}
ZHIXING_SECTOR_RADAR_COVERAGE_THRESHOLD: ${ZHIXING_SECTOR_RADAR_COVERAGE_THRESHOLD:-0.99}
ZHIXING_SECTOR_RADAR_MAX_RETRIES: ${ZHIXING_SECTOR_RADAR_MAX_RETRIES:-3}
ZHIXING_SECTOR_RADAR_RETRY_BACKOFF_SECONDS: ${ZHIXING_SECTOR_RADAR_RETRY_BACKOFF_SECONDS:-1.0}
ZHIXING_SECTOR_RADAR_REQUEST_INTERVAL_SECONDS: ${ZHIXING_SECTOR_RADAR_REQUEST_INTERVAL_SECONDS:-0.2}
ZHIXING_SECTOR_RADAR_ADVISORY_LOCK_KEY: ${ZHIXING_SECTOR_RADAR_ADVISORY_LOCK_KEY:-7380522}
ZHIXING_TUSHARE_TOKEN: ${ZHIXING_TUSHARE_TOKEN:-}
networks:
- 1panel-network
volumes:
market-data:
networks:
1panel-network:
name: 1panel-network
external: true