【Seatable运维实战】Docker-Compose部署与跨服务器数据迁移全流程解析
1. 为什么选择Docker-Compose部署SeatableSeatable作为一款开源的企业级协同表格工具越来越受到中小企业和个人开发者的青睐。而Docker-Compose的部署方式可以说是目前最省心、最可靠的方案。我经历过从手动部署到Compose编排的完整迁移过程实测下来至少节省了80%的运维时间。传统部署方式需要逐个安装MySQL、Redis、Memcached等依赖服务光是版本兼容性问题就够头疼的。有次我在CentOS 7上折腾MySQL 8.0的权限配置整整浪费了一个下午。而Docker-Compose把所有这些依赖都打包成标准化容器就像把整个厨房的厨具都预制好放在智能橱柜里你需要做的只是按个启动按钮。更重要的是数据迁移的便利性。去年我们公司机房搬迁时用这套方案在30分钟内就完成了全部业务迁移。新服务器启动后团队成员甚至没察觉到服务切换所有表格数据、文件附件都保持原样。这种平滑迁移的能力对于需要频繁调整基础设施的成长型企业特别重要。2. 部署前的关键准备2.1 操作系统与Docker环境配置虽然官方文档说支持多种Linux发行版但我强烈推荐Ubuntu 22.04 LTS。这个长期支持版本不仅稳定性有保障对Docker的兼容性也最好。曾经在CentOS Stream上遇到cgroup v2的兼容性问题导致容器内存限制失效这种坑新手最好避开。安装Docker时有个小技巧优先使用snap安装方式。它不仅自动配置好开机启动还会处理好用户组权限。我见过不少新手卡在Permission denied错误上就是因为没把当前用户加入docker组。用snap安装的话这些琐事都不用操心sudo snap install docker sudo docker version # 验证安装如果公司网络限制严格记得提前拉取镜像。有一次在内网环境部署发现缺了mariadb:10.11镜像又得找运维开临时外网权限非常耽误事。建议把这些基础镜像打包备用docker save -o seatable-bundle.tar seatable/seatable-developer:latest mariadb:10.11 redis:5.0.7 memcached:1.6.182.2 目录规划与权限设置数据目录的规划直接影响后续迁移的便利性。我习惯在/opt下创建标准化结构/opt/seatable/ ├── docker-compose.yml ├── .env ├── mysql-data/ # 数据库文件 └── seatable-data/ # 应用数据关键是要提前设置好目录权限避免容器运行时出现写入失败sudo mkdir -p /opt/seatable/{mysql-data,seatable-data} sudo chown -R 1000:1000 /opt/seatable # 适配默认容器用户UID3. 编写高效的Compose文件3.1 环境变量配置技巧.env文件是整套部署的灵魂我建议把敏感信息和管理员账号单独管理。比如用ansible-vault加密存储部署时再解密注入。以下是最关键的几个参数SEATABLE_SERVER_HOSTNAMEyour.domain.com # 强烈建议用域名而非IP SEATABLE_ADMIN_EMAILadminexample.com SEATABLE_ADMIN_PASSWORDStrongPass!2023 # 包含特殊字符更安全 TIME_ZONEAsia/Shanghai遇到过时区问题导致的计划任务异常所以TIME_ZONE一定要设对。有一次海外团队反映定时提醒总晚8小时就是因为容器用了UTC时间。3.2 网络与健康检查配置原生的docker-compose.yml需要增加两个关键优化自定义网络避免端口冲突我习惯加个前端网络和后端隔离网络健康检查特别是对mariadb增加健康检测确保服务完全就绪services: seatable-server: depends_on: mariadb: condition: service_healthy # 关键配置 healthcheck: test: [CMD, curl, -f, http://localhost] mariadb: healthcheck: test: [CMD, mysqladmin, ping, -p${SEATABLE_MYSQL_ROOT_PASSWORD}]4. 数据迁移的完整流程4.1 迁移前的准备工作迁移就像给服务器做器官移植手术准备工作决定成败。我总结了一套标准checklist完整备份不要只用cp命令建议打包压缩并校验md5tar -czvf seatable-backup-$(date %Y%m%d).tar.gz /opt/seatable md5sum seatable-backup-*.tar.gz checksum.txt停服窗口沟通提前通知团队最好选在非工作时间操作新环境预验证先在新服务器空跑容器测试端口和网络4.2 分步迁移操作指南迁移过程最怕的就是步骤遗漏我习惯把操作写成脚本。以下是经过20次迁移验证的可靠流程#!/bin/bash # 1. 停止旧服务 docker-compose down # 2. 备份数据带时间戳 backup_dir/backups/seatable-$(date %Y%m%d) mkdir -p $backup_dir rsync -av /opt/seatable/{mysql-data,seatable-data} $backup_dir # 3. 传输到新服务器 rsync -av $backup_dir new-server:/opt/seatable/ # 4. 更新.env中的IP/域名 sed -i s/OLD_IP/NEW_IP/g /opt/seatable/.env # 5. 启动新容器 docker-compose up -d # 6. 域名转换关键步骤 docker exec seatable bash -c cd /opt/seatable/seatable-server-*/dtable-web seatable.sh python-env manage.py domain_transfer -all \ -od http://OLD_IP \ -nd http://NEW_IP 4.3 迁移后验证要点迁移完成不是终点必须做全面验证基础功能检查管理员登录新建/编辑表格上传附件数据完整性验证# 进入MySQL容器检查 docker exec -it seatable-mariadb mysql -uroot -p SHOW DATABASES; USE dtable_db; SHOW TABLES;链接转换验证 在任意表格中检查历史附件链接是否自动更新为新域名5. 常见问题排查手册5.1 容器启动失败排查如果docker-compose up报错按这个顺序检查查看容器日志docker logs seatable --tail 100检查端口冲突ss -tulnp | grep :80\b验证存储权限docker exec seatable ls -l /shared最近遇到个典型问题某次迁移后附件无法上传发现是seatable-data目录的属主变成了root。用这条命令修复sudo chown -R 1000:1000 /opt/seatable/seatable-data5.2 性能调优建议当用户量增长后需要调整几个关键参数增加容器资源限制seatable-server: deploy: resources: limits: cpus: 2 memory: 4G优化MySQL配置 在mariadb服务下添加environment: - innodb_buffer_pool_size1G - innodb_log_file_size256M启用Redis缓存 确保.env中配置了SEATABLE_REDIS_HOSTredis SEATABLE_REDIS_PORT63796. 进阶维护技巧6.1 自动化备份方案我设计了一套全自动备份策略结合crontab每天凌晨执行# /etc/cron.daily/seatable-backup #!/bin/bash backup_dir/backups/seatable-$(date %Y%m%d) mkdir -p $backup_dir # 导出数据库 docker exec seatable-mariadb mysqldump -uroot -p$DB_PASS --all-databases $backup_dir/full.sql # 打包应用数据 tar -czvf $backup_dir/data.tar.gz /opt/seatable/seatable-data # 保留最近7天 find /backups -type d -mtime 7 -exec rm -rf {} \;记得给脚本加执行权限并测试恢复流程。曾经有团队只备份不验证真要用时发现备份文件损坏。6.2 版本升级指南小版本升级如4.2→4.3相对简单修改.env中的SEATABLE_IMAGE标签执行滚动更新docker-compose pull docker-compose up -d大版本升级如3.x→4.x建议在新环境部署新版使用官方迁移工具转移数据并行运行一段时间验证兼容性去年我们从3.0升到4.0时就发现部分自定义脚本不兼容新版API。幸亏用了渐进式迁移否则直接升级肯定要出大问题。