本文属于「自托管 Docker 部署实战」系列(共 35 篇),第 11 篇。 示例中的 IP(192.0.2.10)、域名(example.com)、密码均为占位符,请按实际环境替换。

它是什么

国产开源表单/问卷系统(填表鸭),Java + MySQL。

前置条件

  • 一台 Linux 服务器(1C1G 起步;Java 类应用建议 2C4G 以上);
  • 已安装 Docker 与 Compose v2,执行 docker compose version 有版本号输出;
  • 所有示例里的 IP / 域名 / 密码都是占位符,实际部署请替换成自己的。
# 安装 Docker(已安装可跳过)
curl -fsSL https://get.docker.com | sh

# 目录约定:一个服务一个目录,后文的 ./data 均指栈目录内
mkdir -p /srv/docker/active/<stack> && cd /srv/docker/active/<stack>

镜像地址

tduckcloud/tduck-platform:latest
mysql:8.0

目录结构

/srv/docker/active/tduck/
├── docker-compose.yaml
├── .env
├── upload/               # 用户上传附件
└── mysql-data/

部署步骤

# docker-compose.yaml
services:
  tduck-platform:
    image: "tduckcloud/tduck-platform:latest"
    container_name: tduck-platform
    restart: always
    ports:
      - "8999:8999"
    depends_on:
      mysql:
        condition: service_healthy
    volumes:
      - upload-volume:/application/BOOT-INF/lib/upload
      - ./upload:/application/file
    environment:
      - JAVA_OPTS=-Duser.language=zh -XX:+UseG1GC
      - TZ=Asia/Shanghai
      - spring.datasource.url=jdbc:mysql://mysql:3306/tduck?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&zeroDateTimeBehavior=convertToNull&rewriteBatchedStatements=true
      - spring.datasource.username=tduck
      - spring.datasource.password=${TDUCK_DB_PASSWORD}

  mysql:
    image: mysql:8.0
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_DATABASE=tduck
      - MYSQL_USER=tduck
      - MYSQL_PASSWORD=${TDUCK_DB_PASSWORD}
      - TZ=Asia/Shanghai
    volumes:
      - ./mysql-data:/var/lib/mysql
      - ./init-db:/docker-entrypoint-initdb.d
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 10

volumes:
  upload-volume:
docker compose up -d
# 访问 http://<SERVER_IP>:8999

关键配置

  • 首次启动需要导入初始化 SQL(放 init-db/),否则报缺表;
  • 上传目录是 /application/file,卷要持久化;
  • 数据库连接串里的 mysql 是服务名,不要写宿主 IP;
  • 上传文件大小限制在应用配置里改,不在 Nginx 一处改完就行。

注意事项

  • MySQL 初始化脚本只在数据目录为空时执行,重装要先清 mysql-data;
  • 附件多了会撑爆磁盘,定期清理;
  • 公网部署前改默认管理员密码。

备份与升级

# 1) 数据库
docker exec tduck-mysql sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" --single-transaction tduck' | gzip > "tduck-db-$(date +%F).sql.gz"

# 2) 上传附件
tar czf "tduck-upload-$(date +%F).tar.gz" ./upload

# 3) 升级
docker compose pull
docker compose up -d
  • 数据库和附件必须成对备份,只恢复数据库会丢附件;
  • 升级前确认新版是否需要数据库迁移脚本。