**整理补个文档:**这周折腾了两天Jira和Confluence,准备用这个来代替现在使用的phabricator,Phabricator这个是开源的,Jira和Confluence时Atlassian公司的商业产品,具体如何选择看公司爱好吧。为简化测试和正式部署使用,采取Docker的方式进行安装部署。这里记录一下安装过程和一些避坑建议。另外多说一句Altlassian公司的产品还都蛮好用的,譬如Sourcetree。以下的脚本在【Github】上都有

**JIRA是Atlassian公司出品的项目与事务跟踪工具,被广泛应用于缺陷跟踪、客户服务、需求收集、流程审批、任务跟踪、项目跟踪和敏捷管理等工作领域。 Confluence是一个专业的企业知识管理与协同软件,也可以用于构建企业wiki。使用简单,但它强大的编辑和站点管理特征能够帮助团队成员之间共享信息、文档协作、集体讨论,信息推送。 Phabricator**是一套基于Web的软件开发协作工具,一个Web应用用于帮助软件公司构建更好的软件。原是facebook员工开发的可视化代码评审工具,主要功能有CodeReview、代码托管、Bug跟踪、Task管理、Wiki文档等功能。

环境准备

本地实践环境:

OS:CentOS Linux release 7.2.1511 (Core) Docker:v1.13.1

启动Docker并将Docker添加至开机启动

  • 在Centos7上
1
2
3
yum install docker -y
systemctl enable docker.service
systemctl start docker.service
  • 在Centos6及Amazon Linux上
1
2
3
yum install docker -y
chkconfig --add docker
/etc/init.d/docker start

Iptables及SELinux设置

  • 在Centos7上
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#SELinux disabled
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
getenforce
#Iptables setup
yum install iptables-services
iptables -I  INPUT -p tcp --dport 3306 -j ACCEPT
iptables -I  INPUT -p tcp --dport 18080 -j ACCEPT
iptables -I  INPUT -p tcp --dport 8090 -j ACCEPT
service iptables save
#Other Command(Don't config)
#systemctl stop firewalld.service
#systemctl disable firewalld.service

安装Myql

使用官方镜像直接启动容器即可。不过使用Jira和Confluence时需要添加几个mysql启动配置,具体可参考【Mysql镜像说明】packetlog_file_size参数为应用要求防止大文件无法存储,utf8是为了支持中文

1
2
3
4
docker run --name mysql -p 3306:3306 -v /data/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=yourpasswd -idt mysql/mysql-server:latest --character-set-server=utf8 --collation-server=utf8_bin --max_allowed_packet=512M --innodb_log_file_size=2GB
#docker run -it --rm docker.io/mysql/mysql-server --verbose --help
docker ps -a #查看容器状态
docker exec -it mysql /bin/bash #进入容器,PS由于mysql启动后root用户监听localhost所以创建Database时需要进入容器内部
  • 创建Jira数据库
1
2
3
4
5
#mysql> show variables like 'char%';
mysql> CREATE DATABASE jira_db CHARACTER SET utf8 COLLATE utf8_bin;
mysql> grant ALL PRIVILEGES on jira_db.* to jira_user@"%" Identified by "yourpassword;
mysql> SHOW CREATE DATABASE jira_db;
mysql> flush privileges;
  • 创建Confluence数据库
1
2
3
4
5
#mysql> show variables like 'char%';
mysql> create database confluence CHARACTER SET utf8 COLLATE utf8_bin;
mysql> grant ALL PRIVILEGES on confluence.* to confluence_user@"%" Identified by "yourpassword";
mysql> SHOW CREATE DATABASE confluence;
mysql> flush privileges;
  • 创建数据库备份用户
1
2
mysql> grant select on *.* to backup_user@"%" Identified by "yourpassword";
mysql> flush privileges;

安装Jira

使用官方镜像直接启动Jira容器。这个服务没有太多问题,注意端口是否监听正确及相关端口(数据库端口、应用端口)是否放开,这里的端口放开是指本机防火墙,外网防火墙不应放行数据库端口

1
2
3
4
5
6
7
8
docker run -p 18080:8080 -dit --name jira docker.io/cptactionhank/atlassian-jira
#Manage Application
docker ps
docker exec -it jira /bin/bash
docker stop jira
docker start jira
docker logs jira
docker logs -f jira

在浏览器访问http://host_address:18080跟着提示安装即可。

安装Confluence

由于Jira使用的是MySQL方便起见Confluence也要用Mysql,但是使用官方镜像会有以下问题

a.官方的对于PostSQL支持可以,但无法直接连接mysql需要自行安装支持java连接mysql的组件 b.中文Office在Confluence的预览查看会出现乱码情况,需要修改confluence连接参数及自行添加中文字体库 c.官方使用了不受支持的openjdk,需要更改jdk环境为Oracle JDK

鉴于这种情况使用这个官方镜像就很不理智了,还希望使用docker,只能自己做一个镜像了

制作镜像

  • 准备工作
  • Step 1: 下载java-mysql 可以从Mysql官方【下载地址】进行下载解压,只需要其中的两个文件,按下面的目录结构存放就可以了 Step 2: 准备中文字体库 这个可以从身边现成的windows机器上直接压缩拷贝过来就行了,windows下的字体存放在C:\Windows\Fonts,然后按下面的目录结构存放就可以了,注意这个压缩包需要和我下面目录的一直,不然需要自行更改Dockerfile文件,还有这个压缩包应该是解压完后是Fonts/字体这样的结构。
  • 构建的目录结构
1
2
3
4
5
6
├── chinese-win.tar.gz
├── Dockerfile
├── entrypoint.sh
├── java-mysql
    ├── mysql-connector-java-5.1.46-bin.jar
    └── mysql-connector-java-5.1.46.jar
  • 构建文件及启动脚本 主构建文件Dockerfile如下
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
FROM anapsix/alpine-java:8_jdk
LABEL "Author":"arvon2014@gmail.com" \
      "Date":"2018-04-11"
ENV RUN_USER  daemon
ENV RUN_GROUP daemon
ENV CONFLUENCE_HOME /var/atlassian/application-data/confluence
ENV CONFLUENCE_INSTALL_DIR   /opt/atlassian/confluence
#
VOLUME ["${CONFLUENCE_HOME}"]
#
EXPOSE 8090
EXPOSE 8091
WORKDIR $CONFLUENCE_HOME
RUN apk update -qq \
    && update-ca-certificates \
    && apk add ca-certificates wget curl openssh bash procps openssl perl ttf-dejavu tini\
    && rm -rf /var/lib/{apt,dpkg,cache,log}/ /tmp/* /var/tmp/* \
    && mkdir -p  ${CONFLUENCE_INSTALL_DIR}
ARG CONFLUENCE_VERSION=6.8.1
ARG DOWNLOAD_URL=http://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-${CONFLUENCE_VERSION}.tar.gz
RUN curl -L --silent                  ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$CONFLUENCE_INSTALL_DIR"
ADD chinese-win.tar.gz  /usr/share/fonts/
#RUN fc-cache -fv
#ADD atlassian-confluence-6.8.1.tar.gz $CONFLUENCE_INSTALL_DIR/
RUN chown -R ${RUN_USER}:${RUN_GROUP} ${CONFLUENCE_INSTALL_DIR}/ \
    && sed -i -e 's/-Xms\([0-9]\+[kmg]\) -Xmx\([0-9]\+[kmg]\)/-Xms\${JVM_MINIMUM_MEMORY:=\1} -Xmx\${JVM_MAXIMUM_MEMORY:=\2} \${JVM_SUPPORT_RECOMMENDED_ARGS} -Dconfluence.home=\${CONFLUENCE_HOME}/g' ${CONFLUENCE_INSTALL_DIR}/bin/setenv.sh \
#    && sed -i -e '/.*-Dconfluence.context.path=.*/a\CATALINA_OPTS="-Dconfluence.document.conversion.fontpath=/usr/share/fonts/Fonts/ ${CATALINA_OPTS}"' ${CONFLUENCE_INSTALL_DIR}/bin/setenv.sh \
    && sed -i -e 's/port="8090"/port="8090" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${CONFLUENCE_INSTALL_DIR}/conf/server.xml
COPY entrypoint.sh              /entrypoint.sh
COPY java-mysql/mysql-connector-java-5.1.46.jar /opt/atlassian/confluence/confluence/WEB-INF/lib/mysql-connector-java-5.1.46.jar
COPY java-mysql/mysql-connector-java-5.1.46-bin.jar /opt/atlassian/confluence/confluence/WEB-INF/lib/mysql-connector-java-5.1.46-bin.jar
#
RUN chown -R ${RUN_USER}:${RUN_GROUP} ${CONFLUENCE_INSTALL_DIR}/
#
CMD ["/entrypoint.sh", "-fg"]
ENTRYPOINT ["/sbin/tini", "--"]
#
#CMD tail -f /entrypoint.sh
  • 启动脚本entrypoint.sh如下
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash
set -euo pipefail
# Setup Catalina Opts
: ${CATALINA_CONNECTOR_PROXYNAME:=}
: ${CATALINA_CONNECTOR_PROXYPORT:=}
: ${CATALINA_CONNECTOR_SCHEME:=http}
: ${CATALINA_CONNECTOR_SECURE:=false}
: ${CATALINA_OPTS:=}
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyName=${CATALINA_CONNECTOR_PROXYNAME}"
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyPort=${CATALINA_CONNECTOR_PROXYPORT}"
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorScheme=${CATALINA_CONNECTOR_SCHEME}"
CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorSecure=${CATALINA_CONNECTOR_SECURE}"
export CATALINA_OPTS
# Start Confluence as the correct user
if [ "${UID}" -eq 0 ]; then
    echo "User is currently root. Will change directory ownership to ${RUN_USER}:${RUN_GROUP}, then downgrade permission to ${RUN_USER}"
    PERMISSIONS_SIGNATURE=$(stat -c "%u:%U:%a" "${CONFLUENCE_HOME}")
    EXPECTED_PERMISSIONS=$(id -u ${RUN_USER}):${RUN_USER}:700
    if [ "${PERMISSIONS_SIGNATURE}" != "${EXPECTED_PERMISSIONS}" ]; then
        chmod -R 700 "${CONFLUENCE_HOME}" &&
            chown -R "${RUN_USER}:${RUN_GROUP}" "${CONFLUENCE_HOME}"
    fi
    # Now drop privileges
    exec su -s /bin/bash "${RUN_USER}" -c "$CONFLUENCE_INSTALL_DIR/bin/start-confluence.sh $@"
else
    exec "$CONFLUENCE_INSTALL_DIR/bin/start-confluence.sh" "$@"
fi
  • 构建镜像
1
2
3
ls #进入dockerfile同级目录
docker build -t confluence-oracle-jdk:v6.8.1 . --no-cache #构建镜像,这个需要一点时间,建议使用Tmux
docker images #查看镜像

启动Confluence

主要问题一般会出在构建阶段,如果启动失败可以尝试注释Dockerfile的启动命令,然后进入容器手动调试

1
2
3
4
5
6
7
8
docker run -v /data/confluence:/var/atlassian/application-data/confluence --name="confluence" -d -p 8090:8090 -p 8091:8091 confluence-oracle-jdk:v6.8.1 #调试期间可以加上 --rm参数
#Manage Confluence
docker ps
docker exec -it confluence /bin/bash
docker stop confluence
docker start confluence
docker logs confluence
docker logs -f confluence

容器启动后跟Jira一样检查端口和防火墙配置,确认没问题后,在浏览器访问http://host_address:8090跟着提示安装,注意在web界面连接数据库的时候需要选择String模式,然后按照如下参数填写,如果没来得及修改,可以在/data/confluence/confluence.cfg.xml这个配置里修改重启。另外如需链接Jira在最后根据提示选择就可以了,别的就没啥了。

1
2
jdbc:mysql://host_address:3306/confluence?sessionVariables=tx_isolation='READ-COMMITTED'&useSSL=false&useUnicode=true&characterEncoding=utf8
# Answer:https://confluence.atlassian.com/confkb/confluence-fails-to-start-and-throws-mysql-session-isolation-level-repeatable-read-is-no-longer-supported-error-241568536.html

数据备份

奉上一个拙劣的脚本,还能使就懒的改了,对了在非Amazon Linux上,传S3记得装pip install awscli --upgrade

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#* * 3 * * sh /data/arvon/scripts
ipaddr='10.0.1.7'
username='backup_user'
password='yourpasswd'
dest_dir='/data/mysql_data_bak'
###
function dump_db(){
all_area=`echo "show databases" | mysql -h${ipaddr} -u${username} -p${password} |egrep -v "information_schema|mysql|performance_schema|Database|sys"`
mkdir ${dest_dir}/`date +%F` -p
for area in $all_area;do
    mysqldump -h${ipaddr} -u${username} -p${password} --default-character-set=utf8 --comments=FALSE --tables --no-create-info=FALSE --add-drop-table=TRUE --no-data=FALSE ${area}  >${dest_dir}/`date +%F`/`date +%F`_${area}.sql
    cd ${dest_dir}/`date +%F`  && tar czvf `date +%F`_${area}.sql.tar.gz `date +%F`_${area}.sql && rm -rf `date +%F`_${area}.sql
    echo "[`date +%F_%R`] [INFO] Now the `date +%F`_${area}.sql have been backuped" >> /var/log/mysql_back.log
done
}
function load_db(){
#usage:load_db 2017-05-23
time_want=$1
mysql -h${ipaddr} -u${username} -p${password} --default-character-set=utf8 --execute="DROP DATABASE IF EXISTS  ${area}";
mysql -h${ipaddr} -u${username} -p${password} --default-character-set=utf8 --execute="CREATE DATABASE IF NOT EXISTS  ${area} DEFAULT CHARACTER SET utf8";
mysql -h${ipaddr} -u${username} -p${password} --default-character-set=utf8 --database= ${area} <${dest_dir}/${time_want}_${area}.sql;
}
function upload_s3(){
export AWS_ACCESS_KEY_ID=xxxx
export AWS_SECRET_ACCESS_KEY=xxxx
aws --region=cn-northwest-1 s3 cp  /data/mysql_data_bak/`date +%F`  s3://itbackups/confluence-jira-mysql/`date +%F`  --recursive
}

dump_db
upload_s3
#load_db 2017-05-23