4.2 Docker 部署

Docker 部署

部署后首次使用的关键前置:创建正式短链前,先完成公开短域名的 DNS、HTTPS 和反向代理。程序按应用实际收到的 Host + 短码 精确查找;标准 80/443 使用 Host $host,公开 URL 带非标准端口时使用 $http_host。只设置 X-Forwarded-Host 不会生效。

官方镜像包含已构建的管理端与后端,默认暴露容器端口 8080。必须持久化配置、上传数据和日志目录。

最小单机示例

services:
  dwz-server:
    image: docker.cnb.cool/mliev/dwz/dwz-server:latest
    restart: unless-stopped
    ports:
      - "8080:8080"
    environment:
      TZ: Asia/Shanghai
    volumes:
      - ./config:/app/config
      - ./data:/app/data
      - ./logs:/app/logs
mkdir -p config data logs
docker compose up -d
docker compose logs -f dwz-server

浏览器访问 http://服务器地址:8080/,在向导中选择 SQLite、内存缓存和本地发号器。SQLite 文件和 install.lock 会保存在主机的 ./config

MySQL 与 Redis 示例

下面示例把数据库和 Redis 留在 Compose 私有网络中,不对主机映射 33066379

services:
  dwz-server:
    image: docker.cnb.cool/mliev/dwz/dwz-server:latest
    restart: unless-stopped
    ports:
      - "8080:8080"
    environment:
      TZ: Asia/Shanghai
      HTTP_ADDR: ":8080"
      DATABASE_DRIVER: mysql
      DATABASE_HOST: mysql
      DATABASE_PORT: "3306"
      DATABASE_DBNAME: dwz
      DATABASE_USERNAME: dwz
      DATABASE_PASSWORD: "${DWZ_DB_PASSWORD}"
      CACHE_DRIVER: redis
      ID_GENERATOR_DRIVER: redis
      REDIS_HOST: redis
      REDIS_PORT: "6379"
      REDIS_PASSWORD: "${DWZ_REDIS_PASSWORD}"
      JWT_SECRET: "${DWZ_JWT_SECRET}"
    volumes:
      - ./config:/app/config
      - ./data:/app/data
      - ./logs:/app/logs
    depends_on:
      mysql:
        condition: service_healthy
      redis:
        condition: service_healthy

  mysql:
    image: mysql:8.4
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: dwz
      MYSQL_USER: dwz
      MYSQL_PASSWORD: "${DWZ_DB_PASSWORD}"
      MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
    volumes:
      - mysql-data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-p${MYSQL_ROOT_PASSWORD}"]
      interval: 10s
      timeout: 5s
      retries: 10

  redis:
    image: redis:7-alpine
    restart: unless-stopped
    command: ["redis-server", "--appendonly", "yes", "--requirepass", "${DWZ_REDIS_PASSWORD}"]
    volumes:
      - redis-data:/data
    healthcheck:
      test: ["CMD-SHELL", "redis-cli -a \"${DWZ_REDIS_PASSWORD}\" ping | grep PONG"]
      interval: 10s
      timeout: 5s
      retries: 10

volumes:
  mysql-data:
  redis-data:

将密码放入权限受控的 .env 或密钥管理系统,不要提交到代码仓库。容器中的 localhost 指容器本身,因此数据库主机应填写服务名 mysql,Redis 主机填写 redis

反向代理

代理应保留原始 Host,短链会用请求 Host 匹配后台配置的域名:

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

公开短链使用应用实际收到的 Host + 短码 精确匹配记录。标准 80/443 使用 $host;只有公开 URL 确实带非标准端口时才改用 $http_host,并在后台域名中填写相同端口。只设置 X-Forwarded-Host 不能代替真正的 Host。完整 Q/A 和双入口验收命令见宝塔面板安装教程

升级

docker compose pull
docker compose up -d
docker compose logs --tail=200 dwz-server
curl --fail http://127.0.0.1:8080/health

升级前备份数据库、config/data/。服务启动时会自动执行待应用的 Goose 迁移;不要并行启动大量新版本实例执行首次升级。

相关说明:数据库与迁移缓存、Redis 与 ID 发号器