# Docker Compose 部署

使用 Docker Compose 部署 FluxiQ PIX，适用于开发、测试或小规模生产环境。

## 前提条件

- Docker 24+ 和 Docker Compose v2
- 8 GB RAM (开发) 或 32 GB RAM (生产)
- 端口 4001-4003、5432、6379、4222 可用

## 开发环境

### docker-compose.yml

```yaml
version: "3.8"

services:
  postgres:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: monetarie
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 3s
      retries: 10

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 3s
      retries: 5

  nats:
    image: nats:2.10-alpine
    command: ["--jetstream", "--store_dir=/data"]
    ports:
      - "4222:4222"
      - "8222:8222"
    volumes:
      - natsdata:/data

  pix-backend:
    image: pix-backend:latest
    build:
      context: ./backend
      dockerfile: Dockerfile
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
      nats:
        condition: service_started
    ports:
      - "4001:4001"
      - "4002:4002"
      - "4003:4003"
    environment:
      DB_HOST: postgres
      DB_PORT: "5432"
      DB_USER: postgres
      DB_PASS: postgres
      DB_NAME: monetarie
      REDIS_HOST: redis
      REDIS_PORT: "6379"
      NATS_HOST: nats
      NATS_PORT: "4222"
      NATS_ENABLED: "true"
      SECRET_KEY_BASE: "dev-only-secret-key-base-replace-in-production-min-64-chars!!"
      SIMULATOR_ENABLED: "true"
      BACEN_ENABLED: "false"
      MIX_ENV: prod

volumes:
  pgdata:
  natsdata:
```

### 启动和初始化

```bash
# 启动所有服务
docker compose up -d

# 等待后端就绪
docker compose logs -f pix-backend

# 运行迁移
docker compose exec pix-backend bin/monetarie_pix eval "Shared.Release.migrate()"

# 填充种子数据
docker compose exec pix-backend bin/monetarie_pix eval "Shared.Release.seed()"
```

## 生产环境

生产 Docker Compose 部署需要添加以下增强：

### 资源限制

```yaml
services:
  pix-backend:
    deploy:
      resources:
        limits:
          cpus: "4"
          memory: 4G
        reservations:
          cpus: "2"
          memory: 2G
    restart: always

  postgres:
    deploy:
      resources:
        limits:
          cpus: "4"
          memory: 8G
    command: >
      postgres
        -c max_connections=6000
        -c shared_buffers=2GB
        -c effective_cache_size=6GB
        -c work_mem=64MB
```

### TLS 配置

```yaml
services:
  nginx:
    image: nginx:1.25-alpine
    ports:
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - ./certs:/etc/ssl/certs:ro
    depends_on:
      - pix-backend
```

### 高可用 (Docker Compose)

使用 Docker Compose 实现高可用，在负载均衡器后部署多个后端实例：

```yaml
services:
  pix-backend-1:
    <<: *backend-base
    hostname: pix-backend-1

  pix-backend-2:
    <<: *backend-base
    hostname: pix-backend-2

  haproxy:
    image: haproxy:2.9
    ports:
      - "4003:4003"
    volumes:
      - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
```

## 监控 (可选)

添加 Prometheus 和 Grafana 实现可观测性：

```yaml
services:
  prometheus:
    image: prom/prometheus:v2.50.0
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro

  grafana:
    image: grafana/grafana:10.3.0
    ports:
      - "3000:3000"
    environment:
      GF_SECURITY_ADMIN_PASSWORD: admin
```

## 常用命令

```bash
# 查看日志
docker compose logs -f pix-backend

# 重启后端
docker compose restart pix-backend

# 运行数据库迁移
docker compose exec pix-backend bin/monetarie_pix eval "Shared.Release.migrate()"

# 打开 PostgreSQL 终端
docker compose exec postgres psql -U postgres -d monetarie

# 检查 NATS 流
docker compose exec nats nats stream ls

# 停止所有 (保留数据)
docker compose down

# 停止所有 (删除数据)
docker compose down -v
```

## 预期结果

完成此部署后：

- 所有服务正在运行且健康
- 数据库已应用 25 个迁移并加载种子数据
- 后端 API 可在端口 4003 访问
- NATS JetStream 已配置 7 个流
- 所有端点健康检查通过
