Files
deploy/docker-compose-infra-main.yml
T
19904408334 0b7f1f9667 fix(deploy): 更新 PostgreSQL 备份配置与凭据
- 更换超级用户名及口令为占位值,健康检查不再指定用户
- 备份任务改为按北京时间每天 02:00 执行,并增加调度日志
- 备份命令改用环境变量连接,移除硬编码 `-U postgres`
2026-09-04 14:33:11 +08:00

278 lines
8.5 KiB
YAML
Raw 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.
# ============================================================
# 红动未来 - 第三方中间件
# ============================================================
# 启动:docker compose -f deploy/docker-compose-infra-main.yml up -d
# 停止:docker compose -f deploy/docker-compose-infra-main.yml down
# ============================================================
name: redfuture
networks:
redfuture-net:
driver: bridge
services:
# ---- PostgreSQL (pgvector) ----
postgres:
image: docker.m.daocloud.io/pgvector/pgvector:pg16
container_name: postgres
restart: unless-stopped
ports:
- "15432:5432"
environment:
# 仅首次初始化空数据卷时生效;库内超级用户已被 ALTER ROLE 改名、口令已改,
# 这里写成与新库一致的名字/口令(占位符,需你自行替换成实际值)。
POSTGRES_USER: sql9f15b63fd203b36e
POSTGRES_PASSWORD: 1ec94b1acdaf57b66030242d418fad5a
POSTGRES_DB: postgres
volumes:
- /data/pgsql:/var/lib/postgresql/data
command: ["postgres", "-c", "wal_level=replica", "-c", "max_wal_senders=10", "-c", "max_replication_slots=10", "-c", "hot_standby=on"]
networks:
- redfuture-net
healthcheck:
# 健康检查只探“服务在不在”,不带 -U 指定角色,避免跟着超级用户名改来改去
test: ["CMD-SHELL", "pg_isready"]
interval: 10s
timeout: 5s
retries: 5
# ---- PostgreSQL 自动备份 (每日凌晨 2:00) ----
postgres-backup:
image: docker.m.daocloud.io/pgvector/pgvector:pg16
container_name: postgres-backup
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
volumes:
- /data/pgsql/backup:/backup
environment:
TZ: Asia/Shanghai # 使下面的 02:00 与备份文件名时间都按北京时间计算
PGUSER: sql9f15b63fd203b36e # ← 改为你 ALTER ROLE 后的新超级用户名
PGPASSWORD: 1ec94b1acdaf57b66030242d418fad5a # ← 改为新超级用户口令
PGHOST: postgres
PGPORT: 5432
BACKUP_DIR: /backup
RETENTION_DAYS: 7
networks:
- redfuture-net
entrypoint: ["/bin/sh", "-c"]
command:
- |
set -e
mkdir -p "/backup"
echo "[$(date '+%F %T %Z')] postgres-backup started. Will run once per day at 02:00."
while true; do
# 睡到下一个 02:00(容器 TZ=Asia/Shanghai → 即北京时间凌晨2点)
now=$(date +%s)
target=$(date -d "today 02:00" +%s)
[ "$target" -le "$now" ] && target=$(date -d "tomorrow 02:00" +%s)
echo "[$(date '+%F %T')] next backup scheduled at $(date -d "@$target" '+%F %T')"
sleep $(( target - now ))
f="backup_$(date +%Y%m%d_%H%M%S).sql.gz"
tmp="/backup/$${f}.tmp"
echo "[$(date '+%F %T')] Starting backup: $${f}"
# 连接身份取自上面环境变量 PGUSER/PGPASSWORD(无需在命令里再写 -U
if pg_dumpall -h postgres > "$${tmp}" && gzip -f "$${tmp}" && mv "$${tmp}.gz" "/backup/$${f}"; then
echo "[$(date '+%F %T')] Backup complete"
else
echo "[$(date '+%F %T')] Backup FAILED, removing partial file"
rm -f "$${tmp}" "$${tmp}.gz"
fi
find /backup -name "backup_*.sql.gz" -mtime +7 -delete 2>/dev/null || true
done
# ---- Redis ----
redis:
image: docker.m.daocloud.io/redis:7.4.8
container_name: redis
restart: unless-stopped
ports:
- "6379:6379"
# command: redis-server --requirepass Bjang09@686^*^
volumes:
- /data/redis:/data
networks:
- redfuture-net
healthcheck:
test: ["CMD", "redis-cli", "--raw", "incr", "ping"]
interval: 10s
timeout: 5s
retries: 5
# ---- Consul ----
consul:
image: docker.m.daocloud.io/consul:1.15.4
container_name: consul
restart: unless-stopped
ports:
- "8500:8500"
init: true
command: agent -server -bootstrap -ui -data-dir=/consul/data -bind=0.0.0.0 -client=0.0.0.0
volumes:
- /data/consul:/consul/data
networks:
- redfuture-net
# ---- MinIO ----
minio:
image: docker.m.daocloud.io/minio/minio
container_name: minio
restart: unless-stopped
ports:
- "9000:9000"
- "9001:9001"
environment:
MINIO_ROOT_USER: admin
MINIO_ROOT_PASSWORD: Bjang09@686^*^
command: server /data --console-address ":9001"
volumes:
- /data/minio:/data
networks:
- redfuture-net
# ---- MeiliSearch ----
meilisearch:
image: docker.m.daocloud.io/getmeili/meilisearch:v1.40.0
container_name: meilisearch
restart: unless-stopped
ports:
- "7700:7700"
environment:
MEILI_MASTER_KEY: wMW7BPM3CLwnEGpPbaoci-HvB8R37wV-5tGIizsDQSQ
volumes:
- /data/meilisearch:/meili_data
networks:
- redfuture-net
# ---- NATS (with JetStream) ----
nats:
image: docker.m.daocloud.io/nats:latest
container_name: nats
restart: unless-stopped
ports:
- "4222:4222"
- "8222:8222"
command: -js -sd /data -m 8222
volumes:
- /data/nats:/data
depends_on:
redis:
condition: service_healthy
networks:
- redfuture-net
# ---- Jaeger (All-in-One 分布式追踪) ----
jaeger:
image: docker.m.daocloud.io/jaegertracing/all-in-one:latest
container_name: jaeger
restart: unless-stopped
ports:
- "16686:16686"
- "4317:4317"
- "4318:4318"
- "14250:14250"
environment:
COLLECTOR_OTLP_ENABLED: "true"
COLLECTOR_ZIPKIN_ENABLED: "false"
LOG_LEVEL: "info"
networks:
- redfuture-net
# ---- Gitea (Git 代码托管) ----
gitea:
image: docker.m.daocloud.io/gitea/gitea:latest
container_name: gitea
restart: unless-stopped
ports:
- "3000:3000"
- "2222:2222"
environment:
USER_UID: 1000
USER_GID: 1000
GITEA__server__SSH_PORT: "2222"
volumes:
- /data/gitea:/data
networks:
- redfuture-net
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/api/healthz"]
interval: 30s
timeout: 5s
retries: 3
# ---- Gitea CI/CD Runner (act_runner) ----
# host 模式:job 在 runner 容器内直接执行(kubectl/docker 可直接用)
# k3s 在 121.37.117.181,经宿主机 systemd 服务 k3s-ssh-tunnel.service
# (ssh -L 16443:127.0.0.1:6443) 隧道访问,故 runner 必须与隧道同网络命名空间
gitea-runner:
build:
context: ./gitea-runner
dockerfile: Dockerfile
image: redfuture-runner:latest
container_name: gitea-runner
restart: unless-stopped
network_mode: host
depends_on:
gitea:
condition: service_healthy
environment:
GITEA_INSTANCE_URL: http://127.0.0.1:3000
GITEA_RUNNER_REGISTRATION_TOKEN: 9lGvGJxk7M781IYBWDV0ZuZpXV5RkGKlIpkhRVNs
GITEA_RUNNER_NAME: gitea-runner
# host 标签:job 直接在 runner 容器内执行,才能使用挂载的 kubectl/kubeconfig
GITEA_RUNNER_LABELS: "ubuntu-latest:host"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /data/gitea-runner:/data
- /data/gitea-runner/bin/kubectl:/usr/local/bin/kubectl
- /data/gitea-runner/bin/docker:/usr/local/bin/docker
- /data/gitea-runner/.kube/config:/root/.kube/config
# dev 宿主机本地 k3s (127.0.0.1:6443),与 181 集群(16443)分开
- /etc/rancher/k3s/k3s.yaml:/root/.kube/k3s-dev.yaml
healthcheck:
test: ["CMD-SHELL", "test -f /data/.runner"]
interval: 30s
timeout: 5s
retries: 5
# ---- 本地镜像仓库 (CI 构建产物中转,k3s containerd 拉取) ----
# 仅绑定 127.0.0.1,供本机 runner push / k3s containerd pull
registry:
image: docker.m.daocloud.io/registry:2
container_name: registry
restart: unless-stopped
ports:
- "127.0.0.1:5000:5000"
volumes:
- /data/registry:/var/lib/registry
networks:
- redfuture-net
# ---- Nginx 反向代理 ----
nginx:
build:
context: ./nginx-proxy
dockerfile: Dockerfile
container_name: nginx
restart: unless-stopped
ports:
- "80:80"
- "443:443"
networks:
- redfuture-net
# ---- media 运行时基础镜像(ffmpeg/python/node/chromium/hyperframes ----
media-deps:
build:
context: ../
dockerfile: deploy/media-deps/Dockerfile
image: redfuture-media-deps:latest
container_name: media-deps
restart: "no"
networks:
- redfuture-net