1. 项目概述
Ferry是一款基于Go语言开发的轻量级工单管理系统,采用前后端分离架构,支持Docker容器化部署。作为一名运维工程师,我在实际部署过程中遇到了不少坑,特别是镜像拉取和配置文件修改的问题。本文将详细记录从零开始部署Ferry工单系统的完整过程,包含MySQL、Redis的Docker化部署,以及Ferry系统本身的安装配置。
2. 环境准备
2.1 基础环境要求
在开始部署前,需要确保你的服务器满足以下基本条件:
- 操作系统:推荐使用CentOS 7+/Ubuntu 18.04+等主流Linux发行版
- Docker版本:20.10.0+
- 硬件配置:至少2核CPU、4GB内存、50GB磁盘空间
- 网络环境:能够正常访问Docker Hub镜像仓库
提示:如果是在内网环境部署,建议提前配置好Docker镜像加速器,可以显著提升镜像拉取速度。
2.2 Docker安装与配置
如果你的系统尚未安装Docker,可以按照以下步骤进行安装:
bash复制# 卸载旧版本Docker(如有)
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 安装依赖包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加Docker官方仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装Docker CE
sudo yum install -y docker-ce docker-ce-cli containerd.io
# 启动Docker服务并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
# 验证安装
sudo docker --version
3. MySQL容器部署
3.1 MySQL镜像拉取
bash复制# 拉取最新版MySQL镜像
docker pull mysql:latest
3.2 数据持久化配置
为了保证MySQL数据在容器重启后不会丢失,我们需要创建数据卷:
bash复制# 创建MySQL数据卷
docker volume create mysql_data
3.3 启动MySQL容器
bash复制docker run -d \
--name mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=yourpassword \
-v mysql_data:/var/lib/mysql \
--restart=always \
mysql:latest \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci
参数说明:
-d:后台运行容器--name:指定容器名称-p:端口映射(主机端口:容器端口)-e:设置环境变量(这里是root密码)-v:挂载数据卷--restart=always:容器退出时自动重启- 最后两个参数设置MySQL的字符集为utf8mb4,支持完整的Unicode字符
3.4 验证MySQL运行状态
bash复制# 查看容器状态
docker ps | grep mysql
# 进入MySQL容器测试连接
docker exec -it mysql mysql -uroot -p
4. Redis容器部署
4.1 Redis镜像拉取
bash复制# 拉取最新版Redis镜像
docker pull redis:latest
4.2 配置文件准备
创建本地目录存放Redis配置和数据:
bash复制mkdir -p /usr/local/redis/conf /usr/local/redis/data
创建并编辑Redis配置文件:
bash复制vi /usr/local/redis/conf/redis.conf
添加以下内容:
conf复制# 设置Redis密码
requirepass yourpassword
# 开启RDB持久化
save 900 1
save 300 10
save 60 10000
# 关闭保护模式,允许远程访问
protected-mode no
# 绑定所有网卡
bind 0.0.0.0
# 开启AOF持久化
appendonly yes
# 设置最大内存
maxmemory 1gb
maxmemory-policy allkeys-lru
4.3 启动Redis容器
bash复制docker run -d \
--name redis \
--restart=always \
-p 6379:6379 \
-v /usr/local/redis/conf/redis.conf:/etc/redis/redis.conf \
-v /usr/local/redis/data:/data \
redis:latest \
redis-server /etc/redis/redis.conf
4.4 验证Redis运行状态
bash复制# 查看容器状态
docker ps | grep redis
# 进入Redis容器测试连接
docker exec -it redis redis-cli
127.0.0.1:6379> AUTH yourpassword
OK
127.0.0.1:6379> SET test "docker redis success"
OK
127.0.0.1:6379> GET test
"docker redis success"
5. Ferry工单系统部署
5.1 获取Ferry镜像
由于直接从GitHub或Gitee拉取镜像可能会遇到网络问题,这里我们使用本地镜像文件:
- 下载镜像文件(假设文件名为lanyulei.tar)
- 创建临时目录并解压镜像:
bash复制mkdir -p /tmp/ferry_image
tar -xvf lanyulei.tar -C /tmp/ferry_image
- 检查并修改旧IP地址(如果有):
bash复制# 查找包含旧IP的文件
grep -r "192.168.1.x" /tmp/ferry_image/
# 替换为新IP(假设新IP为192.168.31.241)
sed -i 's/192.168.1.x/192.168.31.241/g' /tmp/ferry_image/blobs/sha256/19aed1c2a0785f8529828113e42a4e311e4ad00ad95121da7d779fb6e599422b
# 重新打包镜像
cd /tmp/ferry_image
tar -cvf ../lanyulei_new.tar .
5.2 导入镜像并启动容器
bash复制# 导入镜像
docker load -i /tmp/lanyulei_new.tar
# 查看镜像
docker images | grep ferry
# 创建配置目录
mkdir -p /root/ferry/config
# 启动容器
docker run -itd \
--name ferry \
-v /root/ferry/config:/opt/workflow/ferry/config \
-p 8002:8002 \
lanyulei/ferry:1.0.1
5.3 配置Ferry系统
编辑配置文件:
bash复制vi /root/ferry/config/settings.yml
修改以下关键配置:
yaml复制database:
host: 192.168.31.241 # MySQL服务器IP
port: 3306
user: root
password: yourpassword
dbname: ferry
prefix: ""
log_mode: true
redis:
host: 192.168.31.241 # Redis服务器IP
port: 6379
password: yourpassword
db: 0
5.4 验证Ferry运行状态
bash复制# 查看容器日志
docker logs ferry
# 预期看到以下关键信息表示成功
# "mysql connect success!"
# "数据库结构初始化成功"
# "数据库基础数据初始化成功"
# "starting api server"
6. 常见问题排查
6.1 MySQL连接失败
错误现象:
code复制dial tcp 192.168.1.x:3306: connect: no route to host
解决方案:
- 检查MySQL容器是否正常运行
- 确认settings.yml中的MySQL配置正确
- 检查防火墙是否放行3306端口
6.2 Redis连接失败
错误现象:
code复制redis连接失败: dial tcp 192.168.1.x:6379: connect: connection refused
解决方案:
- 检查Redis容器是否正常运行
- 确认redis.conf中的protected-mode设置为no
- 检查Redis密码是否正确
6.3 容器启动后立即退出
错误现象:
容器启动后状态变为Exited
解决方案:
- 查看详细日志:docker logs ferry
- 常见原因包括:
- 配置文件路径错误
- 依赖服务(MySQL/Redis)不可达
- 端口冲突
6.4 镜像拉取失败
错误现象:
code复制Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled
解决方案:
- 配置Docker镜像加速器
- 或者使用本地镜像文件(如本文所述方法)
7. 系统访问与使用
部署成功后,可以通过以下方式访问Ferry系统:
- 前台地址:http://服务器IP:8002
- Swagger API文档:http://服务器IP:8002/swagger/index.html
默认管理员账号:
- 用户名:admin
- 密码:123456
安全提示:首次登录后请立即修改默认密码,并创建新的管理员账号。
8. 维护与升级建议
8.1 数据备份策略
- MySQL数据备份:
bash复制# 导出数据库
docker exec mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /backup/mysql/all-databases.sql
# 定期备份脚本示例
0 2 * * * docker exec mysql sh -c 'exec mysqldump ferry -uroot -p"yourpassword"' > /backup/mysql/ferry-$(date +\%Y\%m\%d).sql
- Redis数据备份:
bash复制# 手动执行RDB持久化
docker exec redis redis-cli -a yourpassword save
# 备份RDB文件
cp /usr/local/redis/data/dump.rdb /backup/redis/dump-$(date +\%Y\%m\%d).rdb
8.2 系统监控
建议配置以下监控项:
- 容器状态监控
- MySQL/Redis资源使用情况
- Ferry服务HTTP状态码
- 关键接口响应时间
8.3 版本升级
升级步骤:
- 备份当前数据和配置
- 停止并删除旧容器
- 拉取新版本镜像
- 启动新容器
- 验证数据迁移情况
9. 性能优化建议
9.1 MySQL优化
bash复制# 启动MySQL容器时添加性能参数
docker run -d \
...
-e MYSQL_INNODB_BUFFER_POOL_SIZE=1G \
-e MYSQL_INNODB_LOG_FILE_SIZE=256M \
-e MYSQL_INNODB_FLUSH_LOG_AT_TRX_COMMIT=2 \
mysql:latest
9.2 Redis优化
修改redis.conf:
conf复制# 增加最大连接数
maxclients 10000
# 优化内存分配
maxmemory-policy volatile-lru
# 启用连接池
timeout 300
tcp-keepalive 60
9.3 Ferry配置优化
在settings.yml中添加:
yaml复制server:
http_port: 8002
read_timeout: 30
write_timeout: 30
max_header_bytes: 1048576
max_body_bytes: 10485760
10. 安全加固措施
10.1 容器安全
- 限制容器资源使用:
bash复制docker update --cpus 2 --memory 2g --memory-swap 4g ferry
- 启用用户命名空间隔离
10.2 网络隔离
创建自定义Docker网络:
bash复制docker network create ferry_network
docker network connect ferry_network mysql
docker network connect ferry_network redis
docker network connect ferry_network ferry
10.3 定期安全扫描
bash复制# 使用Trivy扫描镜像漏洞
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy image lanyulei/ferry:1.0.1
11. 扩展功能实现
11.1 集成邮件通知
修改settings.yml:
yaml复制email:
host: smtp.example.com
port: 587
user: your_email@example.com
password: yourpassword
from: no-reply@example.com
ssl: false
11.2 添加LDAP认证
配置LDAP集成:
yaml复制ldap:
enabled: true
host: ldap.example.com
port: 389
base_dn: "dc=example,dc=com"
user_dn: "cn=admin,dc=example,dc=com"
password: "adminpassword"
user_filter: "(&(objectClass=person)(uid=%s))"
12. 使用Docker Compose部署(可选)
对于更复杂的部署场景,可以使用docker-compose.yml:
yaml复制version: '3'
services:
mysql:
image: mysql:latest
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: yourpassword
MYSQL_DATABASE: ferry
volumes:
- mysql_data:/var/lib/mysql
ports:
- "3306:3306"
restart: always
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
redis:
image: redis:latest
container_name: redis
volumes:
- ./redis/conf/redis.conf:/etc/redis/redis.conf
- redis_data:/data
ports:
- "6379:6379"
restart: always
command: redis-server /etc/redis/redis.conf
ferry:
image: lanyulei/ferry:1.0.1
container_name: ferry
volumes:
- ./ferry/config:/opt/workflow/ferry/config
ports:
- "8002:8002"
restart: always
depends_on:
- mysql
- redis
volumes:
mysql_data:
redis_data:
启动命令:
bash复制docker-compose up -d
13. 实际使用心得
在多次部署Ferry系统的过程中,我总结了以下几点经验:
-
网络问题处理:国内环境直接从Docker Hub拉取镜像可能会很慢甚至失败,建议:
- 配置镜像加速器
- 使用本地镜像文件
- 或者搭建私有镜像仓库
-
配置文件管理:Ferry的配置文件是关键,建议:
- 使用版本控制系统管理配置变更
- 每次修改前备份原文件
- 使用配置校验工具检查语法
-
日志分析技巧:当遇到问题时:
- 使用
docker logs -f ferry实时查看日志 - 关注ERROR和FATAL级别的日志
- 对高频出现的警告日志也要重视
- 使用
-
性能瓶颈定位:系统运行缓慢时:
- 首先检查MySQL和Redis的连接数
- 查看容器资源使用情况(CPU、内存)
- 分析慢查询日志
-
备份策略:一定要建立完善的备份机制:
- 数据库每日全量备份+binlog
- 配置文件变更时立即备份
- 定期验证备份的可恢复性
-
安全加固:生产环境必须:
- 修改所有默认密码
- 限制管理后台访问IP
- 定期更新镜像版本
-
用户培训:工单系统的使用需要:
- 编写简明操作手册
- 录制操作视频
- 定期收集用户反馈优化流程
通过这套系统的部署和使用,我们团队的工作流程得到了显著改善,工单处理效率提升了约40%。特别是在问题追踪和团队协作方面,Ferry提供了很好的可视化支持。