近期机房搬迁,帮忙将 Jira 与 Confluence 做了一次迁移。由于之前的维护人员几乎没有留下任何信息,环境比较乱,这里顺手改成了 Docker 方式部署。大问题没有,小坑比较多,此文用流水账的形式记录了一下搬迁时的大致步骤,以便不时之需。
环境说明
旧实例采用的物理机裸机部署,新实例改用 docker
部署方案。
操作系统: CentOS 7.9.2009
数据库: 一主一从 MySQL 5.7.35 (可以参考:MySQL 主从同步配置 | Alliot’s blog)
路径:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 jira 192.168.21.31
tree -L 1 /data/jira
/data/jira
├── data
├── docker_config
└── script
confluence 192.168.21.32
tree -L 1 /data/confluence
/data/confluence
├── data
├── docker_config
└── script
两者的 rsyncd 路径配置均为:
[DATA]
path = /data/
创建数据库:1
2
3
4
5
6
7# 创建数据库,主要是注意编码格式
mysql> CREATE DATABASE jira CHARACTER SET utf8 COLLATE utf8_bin;
mysql> CREATE DATABASE confluence CHARACTER SET utf8 COLLATE utf8_bin;
# 创建数据库连接用户并授权
mysql> GRANT ALL PRIVILEGES ON confluence.* TO 'confluence'@'192.168.%' IDENTIFIED BY 'your_password';
mysql> GRANT ALL PRIVILEGES ON jira.* TO 'jira'@'192.168.%' IDENTIFIED BY 'your_password';
Jira
部署新服务
部署与密钥生成部分请直接移步之前的文章: Atlassian全家桶及其插件激活方法 | Alliot’s blog
需要注意是,生产环境别忘根据硬件配置来指定内存限制:1
docker run -itd -p 8080:8080 --name jira -v "/data/jira/data:/var/atlassian/jira" --env "CATALINA_OPTS=-Xms8192m -Xmx8192m -Datlassian.plugins.enable.wait=300" jira/jira:v7.13.0
启动完成后,打开 IP:8080 进入安装向导,根据向导配置好新的数据库后停止容器。
同步数据目录
Jira 的数据目录为 <Jira PATH>/application-data/jira/data
因此我们只需要进入旧的 Jira 服务器中,通过 rsync
将数据同步到新服务器即可,执行:1
2 路径与IP根据自己的实际情况修改
rsync -avP --delete --exclude=logs --exclude=temp /data01/atlassian/application-data/jira/data/ 192.168.21.31::DATA/jira/data/data/
导入数据库
进入新库,获取当前的 license 备用:1
2
3
4
5
6
7
8
9mysql> use jira;
mysql> SELECT * FROM productlicense\G
*************************** 1. row ***************************
ID: 10200
LICENSE: 这里是license
*************************** 2. row ***************************
ID: 10201
LICENSE: 这里是license
2 rows in set (0.01 sec)
备份新库后,进入新库删除jira数据库内容,并导入旧库数据:1
2
3
4mysql> drop database jira;
mysql> CREATE DATABASE jira CHARACTER SET utf8 COLLATE utf8_bin;
mysql> use jira;
mysql> source jira-bak.sql;
等待数据导入完成后,用上面得到的 license 替换(这一步很重要,否则新的 Jira 实例会起不来):1
2update productlicense set license ='上面得到的 license' WHERE id=10200;
update productlicense set license ='上面得到的 license' WHERE id=10201;
重新启动新 Jira 实例
1 | docker restart jira |
部分问题处理
日志中出现数据库连接相关的警告
编辑 data/ 路径下的 dbconfig.xml
,加入 &useSSL=false&
即可:1
2<jdbc-datasource>
<url>jdbc:mysql://address=(protocol=tcp)(host=192.168.21.31)(port=3306)/jira?useUnicode=true&useSSL=false&characterEncoding=UTF8&sessionVariables=default_storage_engine=InnoDB</url>
原先的logo图缺失
同步 /var/atlassian/jira/logos/
路径下的资源。
部分插件图片缺失
同步 /opt/atlassian/jira/atlassian-jira/images
路径下的资源。
启用HTTPS
采用 Nginx 反向代理到 Docker 的方式。
部分配置参考:1
2
3
4
5
6
7
8
9
10
11location / {
proxy_pass http://127.0.0.1:8080; # 代理到 Jira 所在后端
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Forwarded-Proto https;
proxy_read_timeout 1200s;
client_max_body_size 0;
}
Jira 与 Confluence 均必须做 http -> https 的跳转:1
2
3
4
5server {
listen 80;
server_name www.iots.vip; # 域名
return 301 https://www.iots.vip$request_uri; # 301 到 https
}
修改容器内的 /opt/atlassian/jira/conf/server.xml
connector 部分配置:1
2
3
4Connector port="8080" relaxedPathChars="[]|" relaxedQueryChars="[]|{}^\`"<>"
maxThreads="150" minSpareThreads="25" connectionTimeout="20000" enableLookups="false"
maxHttpHeaderSize="8192" protocol="HTTP/1.1" useBodyEncodingForURI="true" redirectPort="8443"
acceptCount="100" disableUploadTimeout="true" bindOnInit="false" proxyName="www.iots.vip" proxyPort="443" scheme="https" secure="true"/>
这里主要修改的是 scheme 为 https。之后登陆后台,将 BaseURL 修改为带 HTTPS 的 URL 重启即可。
Confluence
Confluence 需要同步的仅仅是 attachments 目录(如果数据量非常大,重新索引会花费大量时间的话,也可以将 index 目录同步),以及数据库,但是需要注意的是,
部署新服务
部署与密钥生成部分请直接移步之前的文章: Atlassian全家桶及其插件激活方法 | Alliot’s blog,同样的,生产环境别忘记配置内存限制:1
docker run -itd -p 8090:8090 --name confluence -v "/data/confluence/data:/var/atlassian/confluence" --env "CATALINA_OPTS=-Xms8192m -Xmx8192m -Datlassian.plugins.enable.wait=300" confluence/confluence:6.13.0
启动完成后,打开 IP:8090,同样的,根据向导配置好新的数据库后停止容器。
同步数据目录
登陆旧的 Confluence 实例,通过 rsync
同步附件数据到新服务器中:1
rsync -avP --delete /data01/atlassian/application-data/confluence/attachments/ 192.168.21.32::DATA/confluence/data/attachments/
导入数据库
同 Jira,先 DROP
掉新安装的库,重新建库,然后导入旧库备份过来的数据。
重新启动Confluence实例
1 | docker restart confluence |
部分问题处理
日志中出现数据库连接相关的警告
编辑 data/ 路径下的 confluence.cfg.xml
,找到数据库连接串,类似如下行:1
<property name="hibernate.connection.url">jdbc:mysql://192.168.21.31:3306/confluence</property>
在 jdbc 连接串后加入 ?useSSL=false
,完成后如下:1
<property name="hibernate.connection.url">jdbc:mysql://192.168.21.31:3306/confluence?useSSL=false</property>
重启容器即可。
登陆失败
这种情况通常是出现在 Confluence 使用 Jira 作为认证手段的情况下,而由于 Jira 迁移变换了 IP,Confluence 无法链接到 Jira。这时候需要用 Confluence 本身的管理员账号登陆后台管理,重新更改 “后台 -> 用户目录”( URL: confluence地址/plugins/servlet/embedded-crowd/directories/list)
同时,需要去到 Jira 后台修改 “后台 -> 用户管理 -> Jira用户服务器” 中的 IP 地址列表。(URL: jira地址/secure/admin/ConfigureCrowdServer.jspa)
重置管理员密码
参考官方文档: Restore Passwords To Recover Admin User Rights
登陆数据库后执行:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15# 查看当前存在的管理员账号,以及激活状态
SELECT u.id, u.user_name, u.active FROM cwd_user u
JOIN cwd_membership m ON u.id=m.child_user_id JION cwd_group g ON m.parent_id=g.id JOIN cwd_directory d ON d.id=g.directory_id
WHERE g.group_name = 'confluence-administrators' AND d.directory_name= 'Confluence Internal Directory' ;
# 将 admin 用户设为活跃状态
UPDATE cwd_user
SET active = 'T'
WHERE user_name ='admin';
# 更新 admin 用户的密码为 admin
UPDATE cwd_user SET credential =
'x61Ey612Kl2gpFL56FT9weDnpSo4AV8j8+qx2AuTHdRyY036xxzTTrw10Wq3+4qQyB+XURPWx1ONxp3Y3pB37A=='
WHERE id=1212121;
启用HTTPS
需要修改的配置文件路径为 /opt/atlassian/confluence/conf/server.xml
:1
2
3
4
5<Connector port="8090" connectionTimeout="20000" redirectPort="8443"
maxThreads="48" minSpareThreads="10"
enableLookups="false" acceptCount="10" debug="0" URIEncoding="UTF-8"
protocol="org.apache.coyote.http11.Http11NioProtocol"
proxyName="www.iots.vip" proxyPort="443" scheme="https"/>
其他配置同 Jira。