Docker实践——gogs及https与备份
步骤/目录:
1.准备工作
2.编写compose模板
3.运行并验证
4.gogs使用https
5.gogs备份
本文首发于个人博客https://lisper517.top/index.php/archives/24/
,转载请注明出处。
本文的目的是使用docker、docker-compose在云服务器上运行gogs。
本文实验日期为2022年7月28日。本文使用的云服务器为阿里云轻量应用服务器,系统镜像 Docker 19.03 。
之前的文章中曾介绍过gogs,详见 树莓派+云服务器,gogs+frp搭建私有git 。简单来说,使用gogs可以搭建一个私有的轻量级的git服务器,一般gogs用于个人或小微企业。
在docker官方仓库网页可以搜索到官方gogs镜像即 gogs/gogs ,其下载量为50M+,3天前更新。下面就使用该镜像+mysql镜像搭建gogs服务。
1.准备工作
和frp的部署一样,笔者准备了一台云服务器,如果只打算在局域网用gogs也可以在本地机器上运行。
在服务器上准备目录,拉取镜像:
mkdir -p /docker/gogs/data/gogs
mkdir /docker/gogs/data/mysql
mkdir -p /docker/gogs/conf/mysql
docker pull gogs/gogs
docker pull mysql:8.0.29
这里需要简单说明一下docker-gogs的使用。容器内的22端口用于git命令相关操作,3000用于网页访问;容器内的/data目录包含了仓库、gogs的个性化设置。
2.编写compose模板
编写compose模板:
vim /docker/gogs/docker-compose.yml
写入以下内容:
version: "3.9"
services:
gogs:
image: gogs/gogs
ports:
- "50023:22"
- "9444:3000"
volumes:
- /docker/gogs/data/gogs:/data
depends_on:
- mysql
logging:
driver: syslog
restart: always
mysql:
image: mysql:8.0.29
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: gogs
MYSQL_USER: gogs
MYSQL_PASSWORD: 234567
command:
- mysqld
- --character-set-server=utf8
- --default-authentication-plugin=mysql_native_password
volumes:
- /docker/gogs/data/mysql:/var/lib/mysql
- /docker/gogs/conf/mysql:/etc/mysql/conf.d
logging:
driver: syslog
restart: always
根据 docker-mysql 的介绍,通过 MYSQL_USER
、 MYSQL_PASSWORD
创建的用户,对通过 MYSQL_DATABASE
创建的数据库享有所有权限。
3.运行并验证
cd /docker/gogs
docker-compose config
docker-compose up
记得在云服务器的设置里打开9444、50023端口。这时可以访问 云服务器ip:9444 ,出现gogs初始页面。这里谈一点gogs的初始设置:
数据库选mysql,数据库主机填mysql:3306,用户密码就是gogs@234567。基本设置里的域名,笔者使用云服务器就填服务器ip,应用URL则不影响实际、只是展示用。SMPT设置和typecho的CommentNotifier插件差不多,见 Docker树莓派实践——Typecho及其备份 。如果是私人或小微企业,可以在 禁止用户自主注册 、 启用登录访问限制 里打勾。具体配置细节还是参考 gogs/gogs镜像原址 。
另外,若要后台运行docker-frpc,可使用docker-compose up -d
命令。
4.gogs使用https
gogs可以使用https,这里笔者使用的是自己域名的证书,也可以用自签证书。
mkdir /docker/gogs/ssl_certificate
cp /docker/gogs/data/gogs/gogs/conf/app.ini /docker/gogs/data/gogs/gogs/conf/app.ini_backup
vim /docker/gogs/data/gogs/gogs/conf/app.ini
将自己的证书放到/docker/gogs/ssl_certificate中后,对gogs的配置文件app.ini进行以下修改:
[server]
......
......
#新增4行
PROTOCOL = https
ROOT_URL = https://lisper517.top:3000
CERT_FILE = /ssl_certificate/www.lisper517.top.pem
KEY_FILE = /ssl_certificate/www.lisper517.top.key
修改gogs配置文件主要参考了 这篇文章 ,其中还介绍了使用nginx反向代理。
然后修改compose模板,新增一个挂载:
- /docker/gogs/ssl_certificate:/ssl_certificate
最后删除容器、重新生成:
docker stop gogs_mysql_1
docker stop gogs_gogs_1
docker container rm gogs_mysql_1
docker container rm gogs_gogs_1
docker network rm gogs_default
docker volume ls
docker volume prune #gogs用了一个匿名卷也删掉
cd /docker/gogs
docker-compose config
docker-compose up
最后在浏览器访问 https://lisper517.top:9444 即可看到使用了https的gogs页面。
5.gogs备份
为了定时备份,同 Docker树莓派实践——Typecho及其备份 中最后一部分一样,在服务器上进行如下操作:
mkdir -p /backup/gogs
crontab -e
加上一行:
15 0 * * * /usr/bin/zip -r /backup/gogs/backup.zip /docker/gogs
zip命令写绝对路径是怕cron运行时的env里PATH不包括/usr/bin,实际上应该尽量都写绝对路径。用whereis zip
可查找zip的路径。
这样每天0点15分就会备份整个docker-gogs。
最后,可以在树莓派上也设置每天1点15分拷贝服务器上的/backup/gogs/backup.zip备份文件,具体操作如下:
mkdir -p /backup/gogs
mkdir /backup/key #存放密钥
crontab -e
加上如下内容:
15 1 * * * /usr/bin/scp -i /backup/key/alicloud-backup root@lisper517.top:/backup/gogs/backup.zip /backup/gogs
关于打开树莓派的crontab日志功能、设置正确的树莓派系统时间见 Docker树莓派实践——Typecho及其备份 。另外,在gogs后台可以看到有备份仓库的功能,笔者这里为了方便镜像更新后数据迁移,就直接备份文件夹了。