Jira与Confluence迁移至Docker

  近期机房搬迁,帮忙将 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
9
mysql> 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
4
mysql> drop database jira;
mysql> CREATE DATABASE jira CHARACTER SET utf8 COLLATE utf8_bin;
mysql> use jira;
mysql> source jira-bak.sql;

等待数据导入完成后,用上面得到的 license 替换(这一步很重要,否则新的 Jira 实例会起不来):

1
2
update productlicense set license ='上面得到的 license' WHERE id=10200;
update productlicense set license ='上面得到的 license' WHERE id=10201;

重新启动新 Jira 实例

1
docker restart jira

部分问题处理

日志中出现数据库连接相关的警告

  编辑 data/ 路径下的 dbconfig.xml,加入 &amp;useSSL=false&amp; 即可:

1
2
<jdbc-datasource>
<url>jdbc:mysql://address=(protocol=tcp)(host=192.168.21.31)(port=3306)/jira?useUnicode=true&amp;useSSL=false&amp;characterEncoding=UTF8&amp;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
11
location / {
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
5
server {
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
4
Connector port="8080" relaxedPathChars="[]|" relaxedQueryChars="[]|{}^&#x5c;&#x60;&quot;&lt;&gt;"
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。