# Redis / PostgreSQL / MinIO / Mosquitto(MQTT) / Zenoh Router / Caddy 服务 Compose 配置 # 数据目录: ./data/{redis,postgres,minio,mosquitto,zenoh,caddy} (相对本文件所在目录,持久化) # 默认端口: redis 6379, postgres 5432, minio 9000/9001, # mosquitto 1883, zenoh router 7447(tcp)/7447(udp)/8000, # caddy 80/443(HTTP/HTTPS 统一入口) services: redis: image: docker.io/library/redis:7-alpine container_name: chongming-redis restart: unless-stopped command: redis-server --appendonly yes ports: - "6379:6379" volumes: - ./data/redis:/data healthcheck: test: [ "CMD", "redis-cli", "ping" ] interval: 5s timeout: 3s retries: 5 postgres: image: docker.io/library/postgres:16-alpine container_name: chongming-postgres restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} ports: - "5432:5432" volumes: - ./data/postgres:/var/lib/postgresql/data healthcheck: test: [ "CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}" ] interval: 5s timeout: 3s retries: 5 minio: image: docker.io/minio/minio:latest container_name: chongming-minio restart: unless-stopped command: server /data --console-address ":9001" environment: MINIO_ROOT_USER: ${MINIO_ROOT_USER} MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD} ports: - "9000:9000" # S3 API - "9001:9001" # Web Console volumes: - ./data/minio:/data healthcheck: test: [ "CMD", "mc", "ready", "local" ] interval: 5s timeout: 3s retries: 5 # MQTT Broker —— 项目默认内嵌 amqtt,若要切换为外部 broker, # 需把 config.toml 的 [development.mqtt].use_embedded_broker 置为 false # 并指向宿主 1883(如 host = "127.0.0.1")。 mosquitto: image: docker.io/library/eclipse-mosquitto:2 container_name: chongming-mosquitto restart: unless-stopped ports: - "1883:1883" # MQTT volumes: # 官方镜像默认要求 /mosquitto/config/mosquitto.conf 存在; # 匿名 + 不持久化时,改用镜像自带的空配置文件即可。 - ./data/mosquitto:/mosquitto environment: # 匿名启动,无需授权;如需账号可在 config/mosquitto.conf 中配置 - MOSQUITTO_DISABLE_TLS=true healthcheck: test: [ "CMD-SHELL", "pkill -0 $$(pgrep mosquitto) || exit 1" ] interval: 10s timeout: 5s retries: 3 # Zenoh Router —— 项目 zenoh 以 peer 模式连接 tcp/127.0.0.1:7447, # 本容器作为 router 在 7447(tcp) 提供路由汇聚。 zenoh: image: docker.io/eclipse/zenoh:latest container_name: chongming-zenoh restart: unless-stopped ports: - "7447:7447/tcp" # Zenoh 数据面 - "7447:7447/udp" # Zenoh scouting # 使用镜像默认入口即可:eclipse/zenoh 默认以 router 模式启动 zenohd, # 监听默认端口(7447 tcp/udp、8000)。旧写法硬编码 /usr/local/bin/zenohd # 在 latest 镜像中路径不存在,会报 exec: no such file or directory。 healthcheck: test: [ "CMD", "zenohd", "--help" ] interval: 10s timeout: 5s retries: 3 # Caddy —— 统一 HTTP/HTTPS 反向代理入口(本地 IP + 自签证书) # 反代: chongming Web(8000, 宿主机) / MinIO Console(9001) / MinIO API(9000) # 配置在 ./caddy/Caddyfile,证书状态持久化于 ./data/caddy caddy: image: docker.io/library/caddy:2-alpine container_name: chongming-caddy restart: unless-stopped ports: - "80:80" - "443:443" - "443:443/udp" # HTTP/3 (QUIC, 可选) volumes: - ./caddy/Caddyfile:/etc/caddy/Caddyfile:ro - ./data/caddy:/data # 自签证书 / ACME 状态持久化 - ./data/caddy/config:/config extra_hosts: # Linux 下从容器访问宿主机(反代 systemd 托管的 chongming:8000) - "host.docker.internal:host-gateway" depends_on: - minio healthcheck: test: [ "CMD-SHELL", "wget -qO- http://127.0.0.1:80 >/dev/null 2>&1 || exit 1" ] interval: 10s timeout: 3s retries: 5