树莓派4B“重启计划”Ⅲ——docker和mariadb、g

已经给树莓派安装了ubuntu系统,并且配置了内网穿透和开机自启,现在我甚至可以从公交车上使用手机连接到树莓派中进行操作。

然后,下一步我需要的是docker服务。

安装docker服务

安装docker服务只需要一个命令。

1
lua复制代码sudo apt install docker.io

执行完成后docker服务已经自行启动,但是还需要稍微进行一些配置。

为了能快速拉取镜像,需要给docker服务添加镜像源,镜像源的配置文件位于/etc/docker/daemon.json,这个文件默认是不存在的,需要自行创建,执行sudo vim /etc/docker/daemon.json编辑文件,在“registry-mirrors”字段下添加镜像源 ,保存文件后重启服务。

1
2
3
4
5
6
7
8
9
10
11
ruby复制代码ubuntu@ubuntu:~$ sudo vim /etc/docker/daemon.json
ubuntu@ubuntu:~$ cat /etc/docker/daemon.json
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"https://docker.mirrors.ustc.edu.cn",
"http://hub-mirror.c.163.com"
]
}
ubuntu@ubuntu:~$ sudo systemctl daemon-reload
ubuntu@ubuntu:~$ sudo systemctl restart docker

国内可选的镜像源有:

配置完毕后可以使用docker pull命令拉取想要的镜像,我需要的镜像有:

1
2
3
4
5
arduino复制代码docker pull redis:6.2.6  # redis服务
docker pull mariadb:10.6.4 # mariadb数据库,mysql的开源分支
docker pull ubuntu:focal # ubuntu系统focal版,因为当前使用的树莓派系统本身也是focal版,这个镜像可以用于以后制作其他需要的镜像
docker pull python:3.9.7-bullseye # python镜像,可以用于学习python、编译so文件、编译readthedocs的文档。
docker pull nginx:1.20.1 # nginx镜像,可做web项目的反向代理

镜像全部拉取完毕后可以执行docker images命令查看:

1
2
3
4
5
6
7
ruby复制代码ubuntu@ubuntu:~$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
python 3.9.7-bullseye 1c3e5106c1ab 5 days ago 860MB
mariadb 10.6.4 6819e5d163d1 2 weeks ago 393MB
ubuntu focal d5ca7a445605 2 weeks ago 65.6MB
redis 6.2.6 c3d77c9fc5b8 2 weeks ago 107MB
nginx 1.20.1 5eb25865d142 2 weeks ago 126MB

恢复mariadb数据库

MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可,MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。鉴于mysql早已被oracle收购了,所以我只好零成本切换到mariadb。

上次在树莓派使用apt安装了mariadb数据库,存了一些重要数据如gitea的私人仓库数据,后来树莓派raspbian系统所在的U盘坏掉了,但是data目录被抢救下来了,这次使用docker部署mariadb 10.6.4,顺便使用data目录做数据恢复。

1.启动数据库

首先需要从新启动一个数据库服务,使用docker启动数据库只需要一个命令:

1
2
3
4
ini复制代码docker run --name recovery_db -d -v /mnt/mysqlrecovery:/var/lib/mysql \
-e MARIADB_ROOT_PASSWORD=jwirLAST -p 3406:3306 mariadb:10.6.4 \
--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci \
--lower_case_table_names=1

命令行参数说明

docker run命令用于运行容器。

–name指定此容器名称为recovery_db,注意名称不能与其他容器的名称相同;

-d选项指定容器在后台运行,区别于-it选项指定容器以交互方式运行;

-v选项用于映射文件目录,此处是把容器内的/var/lib/mysql(数据文件路径)映射到容器外的/data/mysqlrecovery,注意外部目录需要先准备好,需要映射多个路径可以连续使用多个-v;

-e参数用于指定环境变量,此处按照mariadb官方docker镜像的说明通过MARIADB_ROOT_PASSWORD环境变量指定容器内mariadb的root密码, 和-v选项一样可以连续使用;

-p选项用于做端口映射,此处是把树莓派的3406端口映射到容器内的3306端口供mariadb服务监听并提供服务,-p参数也可连续使用;

mariadb:10.6.4是指定要使用的docker镜像为mariadb,标签为10.6.4。

命令最后的部分是指定服务端的编码集和指定表名不区分大小写字母。

执行命令之后,使用docker ps命令可以看到名称为recovery_db的容器已经开始运行,使用ls -l /data/mysqlrecovery命令可以看到/mnt/mysqlrecovery目录正在被初始化,出现了mariadb的数据库文件。

image.png

根据树莓派的io效率,可能需要等待两三分钟,等数据目录初始化完毕之后就可以使用客户端连接树莓派的3406端口进行验证了,个人推荐使用heidisql工具。

image.png

2.复制文件

经过上一步操作,mariadb数据库服务已经开始运行,可以正常使用,之后的步骤都是做数据恢复,我之前抢救出的数据库文件在/home/ubuntu/backups/mysql.zip,需要解压文件、停服务、覆盖文件、启动服务、导出脚本。

1
2
3
4
5
6
7
8
9
shell复制代码mkdir /mnt/temp && cd /mnt/temp  # 创建并切换工作目录
cp /home/ubuntu/backups/mysql.zip . && unzip -q mysql.zip # 复制并静默解压文件
ls -l /mnt/temp/mysql
docker stop recovery_db # 停服务
docker ps -a | grep recovery_db # 确认服务状态
cp -rp /mnt/temp/mysql/gitea /mnt/mysqlrecovery/gitea # 复制gitea数据库
cp /mnt/temp/mysql/ibdata1 /mnt/mysqlrecovery/ibdata1 # 复制表结构文件
docker start recovery_db # 启动数据库服务
docker ps -a | grep recovery_db # 确认服务状态

数据库启动后,重新使用heidisql或其他支持mysql的客户端连接数据库,可以看到名为gitea的数据库已恢复。

image.png

image.png

复制数据库文件时需要注意文件的属主和权限,否则数据库无法正常使用。

3.删旧启新

使用数据库客户端工具导出gitea库的数据,以sql文件形式保存,执行docker stop recovery_db && docker rm recovery_db命令,停止并删除recovery_db容器,执行rm -rf /mnt/mysqlrecovery命令删除不再使用的数据库文件。

依照第一步重新启动新的数据库容器,等待数据库可用。

1
2
3
4
shell复制代码docker run --name work_db -d -v /data/mysqldata:/var/lib/mysql --restart=always \
-e MARIADB_ROOT_PASSWORD=jwirLAST -p 3306:3306 mariadb:10.6.4 \
--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci \
--lower_case_table_names=1

4.导入sql脚本

使用上一步导出的sql文件导入数据到新的数据库。

另可参考官方教程

恢复gitea版本仓库

Gitea是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 语言编写,遵循 MIT 开源许可证,你可以从这里查看gitea的完整代码。gitea具有开源化、易安装、跨平台和轻量级四大特点,即使在树莓派上也能完美运行。

gitea支持使用docker部署使用二进制方式部署等多种方式,本文属于数据恢复的范畴,采用二进制方式启动gitea服务,与重新部署略有不同。

环境准备

首先需要创建git账号,之后的gitea服务将以git账号权限启动。

1
2
shell复制代码groupadd git  # 添加用户组,组名git
useradd -d /home/git -m -g git -s /bin/bash git # 在git组下创建账号git,指定家目录和登录shell

之前抢救的gitea版本仓库文件备份包位于/home/ubuntu/backups/giteadata.tar.bz2,需要使用git用户解压文件到/home/git/gitea

1
2
3
4
shell复制代码cp /home/ubuntu/backups/giteadata.tar.bz2 /home/git/
chown git.git /home/git/giteadata.tar.bz2
su - git
tar xf giteadata.tar.bz2

解压完成后,配置文件位于/home/git/gitea/custom/conf/app.ini,版本仓库位于/home/git/gitea/gitea-repositories

1
2
3
4
5
6
7
yaml复制代码git@ubuntu:~/gitea$ ls -l /home/git/gitea
total 97920
drwxrwxrwx 3 git git 4096 4月 22 2020 custom
drwxrwxrwx 11 git git 4096 11月 6 20:14 data
-rwxr-xr-x 1 git git 100246088 11月 8 19:39 gitea
drwxrwxrwx 3 git git 4096 4月 22 2020 gitea-repositories
drwxrwxrwx 2 git git 4096 11月 22 00:09 log

下载最新版gitea,树莓派4B使用arm64架构CPU,可以使用gitea-1.15.6-linux-arm64.xz包,树莓派3B及之前的版本,需要下载gitea-1.15.6-linux-arm-6.xzgitea-1.15.6-linux-arm-5.xz,下载后执行xz -d命令解压文件,替换到/home/git/gitea/gitea

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
shell复制代码git@ubuntu:~/temp$ wget https://dl.gitea.io/gitea/1.15.6/gitea-1.15.6-linux-arm64.xz
--2021-11-22 23:34:26-- https://dl.gitea.io/gitea/1.15.6/gitea-1.15.6-linux-arm64.xz
Resolving dl.gitea.io (dl.gitea.io)... 2606:4700:3034::ac43:bad3, 2606:4700:3036::6815:3c07, 104.21.60.7, ...
Connecting to dl.gitea.io (dl.gitea.io)|2606:4700:3034::ac43:bad3|:443... connected.
HTTP request sent, awaiting response... 307 Temporary Redirect
Location: https://storage.gitea.io/gitea-artifacts/gitea/1.15.6/gitea-1.15.6-linux-arm64.xz?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=SU5ZZ3Q6D6AFIQSCOO65%2F20211122%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20211122T153428Z&X-Amz-Expires=600&X-Amz-SignedHeaders=host&X-Amz-Signature=937898e9a6c24308f6a0a55a496defb94a6cd325e2b85498219e3072ad4c5599 [following]
--2021-11-22 23:34:28-- https://storage.gitea.io/gitea-artifacts/gitea/1.15.6/gitea-1.15.6-linux-arm64.xz?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=SU5ZZ3Q6D6AFIQSCOO65%2F20211122%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20211122T153428Z&X-Amz-Expires=600&X-Amz-SignedHeaders=host&X-Amz-Signature=937898e9a6c24308f6a0a55a496defb94a6cd325e2b85498219e3072ad4c5599
Resolving storage.gitea.io (storage.gitea.io)... 2604:1380:2000:c600::5, 147.75.84.81
Connecting to storage.gitea.io (storage.gitea.io)|2604:1380:2000:c600::5|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 44287796 (42M) [application/x-xz]
Saving to: ‘gitea-1.15.6-linux-arm64.xz’

gitea-1.15.6-linux-arm64.xz 100%[==========================================================>] 42.24M 946KB/s in 53s

2021-11-22 23:35:22 (815 KB/s) - ‘gitea-1.15.6-linux-arm64.xz’ saved [44287796/44287796]

git@ubuntu:~/temp$ ls -l
total 43252
-rw-rw-r-- 1 git git 44287796 10月 28 17:08 gitea-1.15.6-linux-arm64.xz
git@ubuntu:~/temp$ xz -d gitea-1.15.6-linux-arm64.xz
git@ubuntu:~/temp$ ls -l
total 97900
-rw-rw-r-- 1 git git 100246088 10月 28 17:08 gitea-1.15.6-linux-arm64
git@ubuntu:~/temp$ mv gitea-1.15.6-linux-arm64 /home/git/gitea/gitea
git@ubuntu:~/temp$ chmod +x /home/git/gitea/gitea
git@ubuntu:~/temp$

添加配置

修改配置文件/home/git/gitea/custom/conf/app.ini使数据库配置和文件路径配置与实际情况相符:

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
ini复制代码APP_NAME = Gitea: Git with a cup of tea
RUN_USER = git ; 以git用户启动
RUN_MODE = prod ; 生产环境模式

[oauth2]
JWT_SECRET = BMZHkyeWxyQe********* ; jwt认证token

[security]
INTERNAL_TOKEN = eyJhbGciOiJIUzI1NiIsInR5c********
INSTALL_LOCK = true
SECRET_KEY = 7x9LiJyJwrteuPmIh5iZAXlEA********

[database]
DB_TYPE = mysql ; 数据库类型,可选postgresql、sqlite和mysql
HOST = 192.168.3.14:3306 ; 数据库服务地址
NAME = gitea ; 数据库名
USER = gitea ; 数据库账号
PASSWD = ***** ; 数据库密码
SSL_MODE = disable ; 禁用ssl
CHARSET = utf8mb4 ; 编码格式使用utf8mb4,与utf8相比支持表情符号
PATH = /home/git/gitea/data/gitea.db ; 使用sqlite数据库时的数据文件路径

[repository]
ROOT = /home/git/gitea/gitea-repositories ; 版本仓库位置

[server]
SSH_DOMAIN = 192.168.3.14 ; git服务的ssh模式地址
DOMAIN = 192.168.3.14 ; git服务的HTTP模式地址
HTTP_PORT = 3000 ; gitea服务监听端口
ROOT_URL = http://192.168.3.14:3000/
DISABLE_SSH = false
SSH_PORT = 22
LFS_START_SERVER = true
LFS_CONTENT_PATH = /home/git/gitea/data/lfs
LFS_JWT_SECRET = 0zK7KHBPfffQu8i5********
OFFLINE_MODE = true
LOCAL_ROOT_URL = http://localhost:3000/

[mailer]
ENABLED = true
HOST = smtp.qq.com:465 ; 邮件smtp服务的地址和端口
FROM = nightstream@foxmail.com ; smtp发送者
USER = nightstream@foxmail.com ; smtp服务账号
PASSWD = kni******************** ; smtp服务密码

[service]
REGISTER_EMAIL_CONFIRM = false
ENABLE_NOTIFY_MAIL = false
DISABLE_REGISTRATION = false
ALLOW_ONLY_EXTERNAL_REGISTRATION = false
ENABLE_CAPTCHA = false
REQUIRE_SIGNIN_VIEW = true
DEFAULT_KEEP_EMAIL_PRIVATE = false
DEFAULT_ALLOW_CREATE_ORGANIZATION = true
DEFAULT_ENABLE_TIMETRACKING = true
NO_REPLY_ADDRESS = noreply.localhost

[picture]
DISABLE_GRAVATAR = true
ENABLE_FEDERATED_AVATAR = false

[openid]
ENABLE_OPENID_SIGNIN = true
ENABLE_OPENID_SIGNUP = true

[session]
PROVIDER = file

[log]
MODE = file
LEVEL = info ; 日志级别
ROOT_PATH = /home/git/gitea/log ; 日志文件路径

数据库utf8mb4编码说明

执行/home/git/gitea/gitea web --config /home/git/gitea/custom/conf/app.ini测试gitea进程是否可以正常启动,查看/home/git/gitea/log/gitea.log日志文件确认是否存在报错,如数据库连接失败、文件系统权限异常等。

1
2
3
4
5
6
7
8
9
shell复制代码git@ubuntu:~/gitea$ /home/git/gitea/gitea web --config /home/git/gitea/custom/conf/app.ini
2021/11/22 23:43:42 cmd/web.go:102:runWeb() [I] Starting Gitea on PID: 18955
2021/11/22 23:43:42 cmd/web.go:146:runWeb() [I] Global init
2021/11/22 23:43:42 routers/init.go:74:GlobalInit() [I] Git Version: 2.25.1, Wire Protocol Version 2 Enabled
2021/11/22 23:43:42 routers/init.go:77:GlobalInit() [I] AppPath: /home/git/gitea/gitea
2021/11/22 23:43:42 routers/init.go:78:GlobalInit() [I] AppWorkPath: /home/git/gitea
2021/11/22 23:43:42 routers/init.go:79:GlobalInit() [I] Custom path: /home/git/gitea/custom
2021/11/22 23:43:42 routers/init.go:80:GlobalInit() [I] Log path: /home/git/gitea/log
2021/11/22 23:43:42 routers/init.go:81:GlobalInit() [I] Run Mode: Prod
1
2
3
4
shell复制代码git@ubuntu:~/temp$ cat /home/git/gitea/log/gitea.log
2021/11/22 23:43:44 cmd/web.go:196:listen() [I] Listen: http://0.0.0.0:3000
2021/11/22 23:43:44 cmd/web.go:199:listen() [I] LFS server enabled
2021/11/22 23:43:44 ...s/graceful/server.go:62:NewServer() [I] Starting new Web server: tcp:0.0.0.0:3000 on PID: 18955

此时可以访问gitea页面查看效果,您可以使用自己的账号登录,同时日志将有刷新:

image.png

系统服务

为了避免每次启动树莓派都需要手动启动gitea进程,我们可以参照官方文档将gitea二进制文件注册成系统服务,由于我的数据库是使用docker部署的,所以service文件与官方示例相比略有不同:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ini复制代码[Unit]
Description=Gitea (Git with a cup of tea)
After=syslog.target ; 在syslog服务启动后启动
After=network.target ; 在network服务启动后启动
After=docker.target ; 在docker服务启动后启动,因为数据库使用docker启动

[Service]
RestartSec=2s ; 重启间隔时间
Type=simple
User=git ; 使用git账号启动服务进程
Group=git ; 使用git组
WorkingDirectory=/home/git/gitea/ ; 设置工作路径
ExecStart=/home/git/gitea/gitea web --config /home/git/gitea/custom/conf/app.ini # 进程启动命令
Restart=always ; 失败自动重启
Environment=USER=git ; 设置环境变量
HOME=/home/git ; 设置home路径

[Install]
WantedBy=multi-user.target ; 系统开机自启

将以上内容保存到/etc/systemd/system/gitea.service文件(可能需要root权限),然后设置开机自启并启动gitea服务。

1
2
shell复制代码systemctl enable gitea  # 设置服务开机自启
systemctl start gitea # 手动立即启动

执行systemctl status gitea查看服务状态,打开浏览器查看页面情况。

image.png

image.png

数据完美恢复~

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%