环境准备
阿里云ECS主机
阿里云RDS mariadb10.3
此处的深坑:jira无法连接阿里云的polardb,应该是mysql连接器的事情,但是没有找到合适的连接器,暂时放弃掉。
安装完成docker及docker-compose,下载镜像
cptactionhank/atlassian-jira-software:8.1.0
cptactionhank/atlassian-confluence:latest
phpmyadmin/phpmyadmin:latest,用于管理MYSQL数据库
nginx:latest,用nginx做反向代理(此处有隐患,后面描述,在二次安装的时候,抛开了nginx)
数据库先建库
注意字符集,jira的字符集为:utf8mb4,confluence的字符集为:utf8-bin
jira和confluence安装在同一宿主机,以换取集成的方便性。
各种破解所需工具和文件
jira破解包:atlassian-extras-3.2.jar
confluence破解程序:confluence_keygen.jar
这次安装,建立三个docker-compose.yml,把三个容器分别拉起,这个时候需要先建立一个network,使用bridge模式
安装过程
docker network create -d bridge jira-wiki
安装jira
mkdir /opt/jiar_confluence
vi docker-compose.yml
内容如下
version: '2'
services:
nginx:
image: nginx:latest
container_name: nginx
restart: always
links:
- jira:jira
- confluence:confluence
ports:
- 8080:8080
- 8090:8090
- 8091:8091
- 8088:80
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock
- /opt/jira_confluence/nginx-etc:/etc/nginx
- /var/tmp/nginx:/var/log/nginx
networks:
default:
external:
name: jira-wiki
version: '2'
services:
jira:
image: cptactionhank/atlassian-jira-software:8.1.0
container_name: jira
user: root:root
mem_limit: 20480m
restart: always
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/tmp/jira:/var/atlassian/jira/log
- /var/tmp/jira-tomcat:/opt/atlassian/jira/logs
- /opt/jira_confluence/jira/setenv.sh:/opt/atlassian/jira/bin/setenv.sh
networks:
default:
external:
name: jira-wiki
注意:version一定要用2,可以在容器使用mem_limit限定内存使用量,对于JAVA应用来说,这是保证宿主机不宕机的基本保护。
随便拉起一个jira容器
mkdir /opt/jira_confluence/jira
cd /opt/jira_confluence/jira
docker cp base-jira/opt/atlassian/jira/bin/setenv.sh ./
编辑setenv.sh,JVM虚拟机内存使用,时区
JVM_MINIMUM_MEMORY="8192m"
JVM_MAXIMUM_MEMORY="16384m"
JVM_REQUIRED_ARGS='-Djava.awt.headless=true -Datlassian.standalone=JIRA -Dorg.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true -Dmail.mime.decodeparameters=true -Dorg.dom4j.factory=com.atlassian.core.xml.InterningDocumentFactory -Duser.timezone=Asia/Shanghai'
将nginx的代理设定好,在nginx.conf内设定upstream段,在./conf.d/default.conf设定proxy_pass段
示例如下:
upstream jira {
server jira:8080; # 此处的jira,就是docker-compose中的对应services名称
}
server {
listen 8080;
server_name 域名;
#charset koi8-r;
access_log /var/log/nginx/jira.access.log main;
location / {
proxy_pass http://jira; # 此处的jira,就是upstream处定义的名称
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
proxy_connect_timeout 150;
proxy_send_timeout 100;
proxy_read_timeout 100;
proxy_buffers 4 32k;
client_max_body_size 64M; # 如果有大文件上载,此处需要修订
client_body_buffer_size 512K;
}
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
启动jira安装程序
docker-compose up -d
访问:域名:8080,进入jira安装页面
页面右上角选择语言为中文,选择我将设置他自己
下一步设置数据库连接,测试通过后,点击下一步
把serverID保存
点击生成jira使用许可证
选择jira software (server)
写入serverID
点击生成授权码
点击yes
回到安装页面,点击下一步
创建admin账户,邮件部分选择以后再说。
将破解文件拷贝到容器内
docker cp atlassian-extras-3.2.jar jira:/opt/atlassian/jira/atlassian-jira/WEB-INF/lib
重启容器
docker restart jira
登陆jira>>右上角设置按钮>>应用程序,查看许可证信息。
安装confluence
随便拉起一个confluence容器,将setenv.sh拷贝出来
mkdir /opt/jira_confluence/confluence
cd /opt/jira_confluence/confluence
docker cp base-jira/opt/atlassian/jira/bin/setenv.sh ./
vi setenv.sh
修改
CATALINA_OPTS="-Xms8192m -Xmx16384m -XX:+UseG1GC ${CATALINA_OPTS}"
CATALINA_OPTS="-Duser.timezone=GMT+08"
CATALINA_OPTS="-Dconfluence.document.conversion.fontpath=/usr/share/fonts/msttcore/ ${CATALINA_OPTS}"
准备windows字体
将C:\windows\fonts* 上传至服务器windowsfonts目录
如同上面的nginx反向代理配置,修改nginx配置文件。
新建一个docker-compose.yml
补充如下内容:
version: '2'
services:
confluence:
image: cptactionhank/atlassian-confluence:latest
container_name: confluence
user: root:root
mem_limit: 20480m
restart: always
volumes:
- /etc/localtime:/etc/localtime:ro
- /opt/jira_confluence/confluence/setenv.sh:/opt/atlassian/confluence/bin/setenv.sh
- /opt/jira_confluence/windowsfonts:/usr/share/fonts/msttcore
networks:
default:
external:
name: jira-wiki
启动容器
docker-compose.yml
检查confluence容器内,有没有/use/share/fonts/msttcore目录,目录内有没有字体内容,如果没有,则进入confluence容器,建立/usr/share/fonts/msttcore目录,然后stop容器,再start容器,不要使用restart。
开始安装confluence
访问域名:8090
语言选择中文
选择产品安装,点击下一步
页面上连个选择框都勾选,点击下一步
停留在该页面,将serverID记录下来
在服务器上,将需要破解的文件拷贝出来
docker cp confluence:/opt/atlassian/confluence/confluence/WEB-INF/lib/atlassian-extras-decoder-v2-3.4.1.jar ./atlassian-extras-2.4.jar
在一台安装了java的windows主机上,把atlassina-extras-2.4.jar从服务器拷贝下来,执行java -jar confluence_keygen.jar,在窗口内输入serverID,点选.patch,选择刚才的jar文件,会生成破解文件,点选生成.gen,会生成KEY
将破解后的jar文件,上传至服务器,并拷贝进入容器
docker cp ./atlassian-extras-2.4.jar confluence:/opt/atlassian/confluence/confluence/WEB-INF/lib/atlassian-extras-decoder-v2-3.4.1.jar
然后重新启动容器:docker restart confluence
访问域名:8090,将刚才生成的KEY填入,点击下一步
然后选择数据库相关信息,就可以了。
注意:数据库需要设置隔离级别:transaction-isolation=READ-COMMITTED
confluence集成jira
confluence安装时,会有选择自建账号还是与jira集成,点击与jira集成。
填入jira的访问地址,呼应开头的深坑:使用http://jira:8080,即可访问,切记不要通过nginx代理的域名+端口访问。
填入jira的超级管理员用户名/密码
切记:勾选confluence超级用户组和普通用户组权限
教训
踩完坑,强烈建议nginx,jira,confluence使用三个不同的docker-compose.yml,在宿主机建立一个bridge网络,联通三个容器即可。
破解完后,所有容器采用restart命令启动,切记不可使用docker-compose restart。
nginx配置https反向代理jira和confulunce的补充。(排除所有坑)
nginx.conf内容
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 65535;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
## added by zhaosanbao
proxy_connect_timeout 300; #单位秒
proxy_send_timeout 300; #单位秒
proxy_read_timeout 300; #单位秒
upstream wiki {
server 172.31.0.100:8090;
}
upstream wikisyn {
server 172.31.0.100:8091;
## 此处特别重要。
}
upstream jira {
server 172.31.0.200:8080;
}
conf.d下的配置
jira.conf内容:
server {
listen 80;
listen [::]:80;
server_name jira的域名;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
return 301 https://$host$request_uri;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
server {
listen 443 ssl http2;
server_name jira的域名;
ssl_certificate cert/xxx.pem;
ssl_certificate_key cert/xxx.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #使用此加密套件。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; #使用该协议进行配置。
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://jira/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_connect_timeout 150;
proxy_pass_request_headers on;
proxy_send_timeout 100;
proxy_buffers 4 32k;
client_max_body_size 64M;
client_body_buffer_size 256K;
}
}
wiki.conf的内容:
server {
listen 80;
listen [::]:80;
server_name wiki的域名;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
return 301 https://$host$request_uri;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
server {
listen 443 ssl http2;
server_name wiki的域名;
ssl_certificate cert/xxxxxx.pem;
ssl_certificate_key cert/xxxxxx.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #使用此加密套件。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; #使用该协议进行配置。
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://wiki/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_pass_request_headers on;
proxy_connect_timeout 150;
proxy_send_timeout 100;
proxy_buffers 4 32k;
client_max_body_size 64M;
client_body_buffer_size 256K;
}
location /synchrony {
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://wikisyn/synchrony;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection “Upgrade”;
}
}
