跳到主内容

Docker 部署

使用 Docker Compose 一键部署 ShopFaaS 私有化实例。含 docker-compose.yml 完整配置、部署流程、反向代理、升级与备份恢复。

Docker 部署是私有化部署的推荐方式,通过 Docker Compose 编排所有组件,简化安装与升级流程。

前置条件

部署流程

  1. 准备部署目录

    mkdir -p ~/shopfaas && cd ~/shopfaas
  2. 创建 docker-compose.yml

    services:
      postgres:
        image: pgvector/pgvector:pg18
        container_name: shopfaas-postgres
        restart: unless-stopped
        environment:
          POSTGRES_DB: shopfaas
          POSTGRES_USER: shopfaas
          POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-change-me-in-production}
        volumes:
          - postgres_data:/var/lib/postgresql
        ports:
          - "5432:5432"
        healthcheck:
          test: ["CMD-SHELL", "pg_isready -U shopfaas"]
          interval: 10s
          timeout: 5s
          retries: 5
    
      redis:
        image: redis:8-alpine
        container_name: shopfaas-redis
        restart: unless-stopped
        command: redis-server --requirepass ${REDIS_PASSWORD:-change-me-in-production}
        volumes:
          - redis_data:/data
        ports:
          - "6379:6379"
        healthcheck:
          test: ["CMD", "redis-cli", "ping"]
          interval: 10s
          timeout: 5s
          retries: 5
    
      rustfs:
        image: rustfs/rustfs:latest  # 实际版本为 1.0.0-beta.10
        container_name: shopfaas-rustfs
        restart: unless-stopped
        environment:
          RUSTFS_ACCESS_KEY: ${RUSTFS_ACCESS_KEY:-shopfaas}
          RUSTFS_SECRET_KEY: ${RUSTFS_SECRET_KEY:-change-me-in-production}
        volumes:
          - rustfs_data:/data
        ports:
          - "9000:9000"
    
      shopfaas:
        # 双 tag 策略:latest 指向最新稳定版,同时建议显式拉取 v${VERSION} 用于版本固定
        image: shopfaas/shopfaas-store:latest
        container_name: shopfaas-app
        restart: unless-stopped
        # 需以 root 运行:挂载 docker.sock 实现一键自动更新
        user: root
        depends_on:
          postgres:
            condition: service_healthy
          redis:
            condition: service_healthy
          rustfs:
            condition: service_started
        environment:
          DATABASE_URL: postgres://shopfaas:${POSTGRES_PASSWORD:-change-me-in-production}@postgres:5432/shopfaas
          REDIS_URL: redis://:${REDIS_PASSWORD:-change-me-in-production}@redis:6379
          S3_ENDPOINT: http://rustfs:9000
          S3_ACCESS_KEY_ID: ${RUSTFS_ACCESS_KEY:-shopfaas}
          S3_SECRET_ACCESS_KEY: ${RUSTFS_SECRET_KEY:-change-me-in-production}
          S3_BUCKET: shopfaas
          DEPLOY_MODE: private
          # 启用店内一键自动更新(通过 docker.sock 拉取并替换镜像)
          STORE_AUTO_UPDATE_ENABLED: "true"
          # 宿主机部署目录,用于挂载数据与配置(自动更新时仅替换镜像,不动此目录)
          HOST_DEPLOY_DIR: ${HOST_DEPLOY_DIR:-/opt/shopfaas}
          # 完整环境变量见 /docs/self-hosted/env-vars/
        ports:
          - "4322:4322"
        volumes:
          - shopfaas_storages:/app/storages
          # 挂载 docker.sock 实现一键更新:店内点击「检查更新」即可拉取新镜像并重启
          - /var/run/docker.sock:/var/run/docker.sock
          # 自动更新数据卷(存放拉取的镜像层、临时文件等)
          - shopfaas_update_data:/app/.update
    
    volumes:
      postgres_data:
      redis_data:
      rustfs_data:
      shopfaas_storages:
      shopfaas_update_data:
        name: shopfaas-update-data
  3. 创建环境变量文件

    cat > .env << 'EOF'
    # 数据库密码(生产环境必须修改)
    POSTGRES_PASSWORD=your-strong-password-here
    
    # Redis 密码
    REDIS_PASSWORD=your-strong-password-here
    
    # 对象存储密钥
    RUSTFS_ACCESS_KEY=shopfaas
    RUSTFS_SECRET_KEY=your-strong-secret-here
    
    # 宿主机部署目录(可选,默认 /opt/shopfaas)
    HOST_DEPLOY_DIR=/opt/shopfaas
    EOF
  4. 启动服务

    # 拉取镜像并启动
    docker compose up -d
    
    # 查看启动状态
    docker compose ps
    
    # 查看应用日志
    docker compose logs -f shopfaas
  5. 数据库自动初始化

    数据库初始化已在镜像中完成,首次启动容器时自动执行(建表 + 写入 init-data),无需手动运行命令。

    容器启动时会检测数据库是否已初始化,未初始化则自动按 docs/schemas/ 下的 SQL 文件创建表结构并写入种子数据(权限码、系统角色、默认配置),幂等可重复执行。

  6. 访问店铺

    启动完成后,访问:

    • 店铺前台:http://your-server-ip:4322
    • 店铺后台:http://your-server-ip:4322/admin
    • 默认店长账号:admin / admin123

反向代理配置

生产环境建议使用 Nginx 反向代理并配置 HTTPS:

server {
    listen 80;
    server_name your-domain.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name your-domain.com;

    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;

    client_max_body_size 50M;

    location / {
        proxy_pass http://127.0.0.1:4322;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

升级

升级时仅替换镜像,数据库迁移由容器启动时自动执行:

# 1. 备份数据库
docker compose exec postgres pg_dump -U shopfaas shopfaas > backup_$(date +%Y%m%d).sql

# 2. 拉取新版本镜像
#    - latest tag 滚动更新;若需固定版本,显式拉取 v${VERSION}:
#      docker pull shopfaas/shopfaas-store:v1.2.0
#      并将 docker-compose.yml 中 image 改为 shopfaas/shopfaas-store:v1.2.0
docker compose pull shopfaas

# 3. 重启服务(容器启动时自动执行数据库迁移,无需手动 init-db)
docker compose up -d shopfaas

# 4. 查看迁移日志(可选)
docker compose logs -f shopfaas

备份与恢复

备份

# 数据库备份
docker compose exec postgres pg_dump -U shopfaas shopfaas > backup_$(date +%Y%m%d).sql

# 文件备份(对象存储)
docker compose exec rustfs tar czf - /data > rustfs_backup_$(date +%Y%m%d).tar.gz

恢复

# 数据库恢复
docker compose exec -T postgres psql -U shopfaas shopfaas < backup_20260101.sql

# 文件恢复
docker compose exec -T rustfs tar xzf - -C / < rustfs_backup_20260101.tar.gz

建议设置定时任务(cron)每日自动备份。

故障排查

服务无法启动

# 查看日志
docker compose logs postgres
docker compose logs redis
docker compose logs shopfaas

数据库连接失败

  • 检查 DATABASE_URL 中的密码是否与 POSTGRES_PASSWORD 一致
  • 确认 PostgreSQL 容器健康:docker compose ps postgres

对象存储连接失败

  • 检查 S3_ACCESS_KEY_IDRUSTFS_ACCESS_KEY 是否一致
  • 确认 RustFS 容器已启动

一键更新失败

  • 确认 /var/run/docker.sock 已正确挂载到 shopfaas 容器
  • 确认 STORE_AUTO_UPDATE_ENABLED=true
  • 查看应用日志:docker compose logs shopfaas

相关文档

此页面有帮助吗?

在 GitHub 上编辑此页