JoyLau's Blog

JoyLau 的技术学习与思考

背景

记录一下 Atlassian 旗下的 Confluence 和 Jira 免费 License 申请

服务搭建

docker-compose.yml

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
version: "3"
services:
confluence:
image: atlassian/confluence
container_name: confluence
restart: always
ports:
- 8090:8090
- 8091:8091
volumes:
- ./confluence-data:/var/atlassian/application-data/confluence
mysql:
image: mysql:8.0.22
container_name: mysql
security_opt:
- seccomp:unconfined
ports:
- 6101:3306
restart: always
volumes:
- ./mysql-data:/var/lib/mysql
- ./my.cnf:/etc/mysql/my.cnf
environment:
- MYSQL_ROOT_PASSWORD=Kaiyuan@2020
- TZ=Asia/Shanghai
jira:
image: atlassian/jira-software
container_name: jira
restart: always
ports:
- 8080:8080
volumes:
- ./jira-data:/var/atlassian/application-data/jira

my.cnf

1
2
3
4
5
6
7
8
9
10
11
12
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL

# Custom config should go here
!includedir /etc/mysql/conf.d/
max_connections=1024

sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
transaction-isolation=READ-COMMITTED

License 申请

Atlassian 的网站
点击 New Trial License 申请新的 License
选择 Confluence 再选择 Confluence (Data Center)
填入 Server ID 即可申请免费的一个月的 License
一个月到期后再次申请即可

背景

有时我们自建了 Jira 站点,又搭建了 Confluence 服务,想着不用再做一次用户的新增,可以使用 Jira 的用户到 Confluence 中使用

操作

第一步 在 Jira 中配置用户服务器

image-20221028183734308

其中 IP 地址指的是 confluence 服务所在的地址,相当于白名单地址的意思

第二步 配置 Confluence

配置 Confluence 的 用户目录 选项

image-20221028184043190

点击 “测试并保存” 完成数据的同步

背景

有时 Nacos 单机 MySQL 版重启服务器后无法提供服务, 是因为重启时均启动 nacos 服务和 MySQL 服务,而MySQL 服务启动的较慢, nacos 在启动的时候还连接不上数据库导致 Nacos 服务无法正常提供服务
这里我的解决方式是使用 Nacos 单机 Derby 版

部署

docker-compose.yml 文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: "2"
services:
nacos:
image: nacos/nacos-server:v2.1.0
container_name: nacos
restart: always
environment:
- PREFER_HOST_MODE=ip
- MODE=standalone
- NACOS_AUTH_ENABLE=true
volumes:
- ./standalone-logs/:/home/nacos/logs
- ./data:/home/nacos/data
ports:
- "8848:8848"

在 当前目录下新建文件夹 datastandalone-logs 启动服务即可

背景

有时服务器断电后再开机启动需要启动一些服务,除了正常的 rc 命令可以实现外,之前我常用的是 systemctl service, 今天发现 crontab 的 reboot 标签也可以实现

使用

crontab -e

1
2
3
4
# 启动后 120 秒启动 canal adapter
@reboot sleep 120; cd /data/msmp-service/canal/canal.adapter-1.1.5/bin && sh restart.sh

@reboot sleep 600; cd /data/gateway && sh handler.sh restart

保存后即可生效

一般情况下,我会 sleep 一段时间再启动服务,因为要等其他 systemd 服务启动完成,比如数据库服务

查看证书有效期

kubeadm alpha certs check-expiration

更新证书,如果是HA集群模式,所有master需要执行

kubeadm alpha certs renew all

证书过期kubectl命令无法使用

cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config

查看 kubectl 命令是否可用

如果不可用的话,使用下面命令重启 kube-apiserver, kube-controller-manager, kube-scheduler、etcd

docker ps | grep -v pause | grep -E "etcd|scheduler|controller|apiserver" | awk '{print $1}' | awk '{print "docker","restart",$1}' | bash

脚本

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/* 
* typora插入图片调用此脚本,上传图片到 MinIO
*/

const path = require('path')
// minio for node.js
const Minio = require('minio')
const { promises } = require('fs')

const endPoint = "xxxx"
const port = xxxx
const accessKey = "xxxx"
const secretKey = "xxxx"
const bucketName = "typora"
const filePath = new Date().getFullYear() + "-" + (new Date().getMonth() + 1) + "/" + new Date().getDate()


// 解析参数, 获取图片的路径,有可能是多张图片
const parseArgv = () => {
const imageList = process.argv.slice(2).map(u => path.resolve(u))
console.info("选择的文件列表:", imageList)
return imageList
}
// 永久地址的策略
const policy = () => {
return {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"*"
]
},
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket",
"s3:ListBucketMultipartUploads"
],
"Resource": [
"arn:aws:s3:::" + bucketName
]
},
{
"Effect": "Allow",
"Principal": {
"AWS": [
"*"
]
},
"Action": [
"s3:ListMultipartUploadParts",
"s3:PutObject",
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::" + bucketName + "/*"
]
}
]
}
}

// 入口
const uploadImageFile = async (imageList = []) => {
// 创建连接
const minioClient = new Minio.Client({
endPoint: endPoint,
port: port,
useSSL: false,
accessKey: accessKey,
secretKey: secretKey
})
// 判断桶是否存在
minioClient.bucketExists(bucketName, function (err, exists) {
if (!exists) {
// 创建桶
minioClient.makeBucket(bucketName, '', function (err) {
if (err) throw err
// 设置桶策略
minioClient.setBucketPolicy(bucketName, JSON.stringify(policy()), function (err) {
if (err) throw err
})
})
}
// 开始上传图片
imageList.map(image => {
// 图片重命名
const name = `${Date.now()}${path.extname(image)}`
// 将图片上传到 bucket 上
minioClient.fPutObject(bucketName, filePath + "/" + name, image, {}, function(info) {
const url = `http://${endPoint}:${port}/${bucketName}/${filePath}/${name}`
// Typora会提取脚本的输出作为地址,将markdown上图片链接替换掉
console.log(url)
})
})
})
}

// 执行脚本
uploadImageFile(parseArgv())

在该脚本目录下执行
npm intsall minio

配置

在脚本中配置 MinIO 服务端的配置项

在 Typora 进行如下配置

image-20220318152717467

该脚本支持

  • 自动创建 bucket
  • 多文件批量上传

导出主库全部数据

mysqldump -A -F --single-transaction --master-data=1 > /tmp/full.sql

-A: 导出全部数据
-F: 同参数–flush-logs, dump 前生成新的 bin log 日志
–master-data=1:参数会在 sql 中打印出 binlog 的信息

例如:
CHANGE MASTER TO MASTER_LOG_FILE='binlog.000248', MASTER_LOG_POS=156;

当指定为 2 时,改行为注释的情况,为 1 时不注释
这时就相当于改变了从主库读取 binlog 的文件和位置信息,
之后将导出的数据导入从库

mysql -p < /tmp/full.sql

耐心的等待

完成后查看从节点的信息:

show slave status;

主要看 Master_Log_File 和 Read_Master_Log_Pos 的数据是否和上面的一致

此时再开启主从同步

start slave ;

完成;

查看信息

使用 choose 标签

1
2
3
4
5
6
7
8
<choose>
<when test="isReSend">
and (info.batchId is not null)
</when>
<otherwise>
and (info.batchId = '' or info.batchId is null)
</otherwise>
</choose>

或者

1
2
3
4
5
6
7
8
<choose>
<when test="isReSend==true">
and (info.batchId is not null)
</when>
<otherwise>
and (info.batchId = '' or info.batchId is null)
</otherwise>
</choose>
0%