步骤/目录： 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使用httpsgogs可以使用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/gogszip命令写绝对路径是怕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后台可以看到有备份仓库的功能，笔者这里为了方便镜像更新后数据迁移，就直接备份文件夹了。
步骤/目录： 1.搭建局域网内的gogs （1）安装gogs的依赖项 （2）为gogs设置mariadb （3）为gogs新建系统用户并安装gogs （4）gogs初次登录设置 a. 数据库设置 b. localhost改为树莓派的局域网ip c. 设置管理员 d. 后续设置 （5）gogs最新版的问题 2.使用frp将gogs映射到外网 （1）购买阿里云服务器，安装frp并配置frps服务器端 （2）树莓派下载frp并配置frpc客户端 （3）其他 （4）设置frpc开机自启并开启服务 3.验证本文首发于个人博客https://lisper517.top/index.php/archives/8/，转载请注明出处。本篇文章的目的是搭建一个能从外网访问的，自己的git服务。本文实验日期为2022年2月5日。使用的是树莓派4B（内存8G版），系统为Pi OS 32位桌面版（2022年1月28日更新，镜像名 2022-01-28-raspios-bullseye-armhf.img ）；云服务器为阿里云，系统镜像为Ubuntu 20.04。1.搭建局域网内的gogs这里选用gogs，轻量级、适合树莓派。gitlab太大；gitea据说对树莓派也不错。（1）安装gogs的依赖项包括MySQL服务器和Git（顺便安装unzip）。简单介绍一下：Pi OS现在好像只有mariadb版的mysql，没有原版mysql了。即apt install能找到的只有mariadb-server而没有mysql-server。不过maria-mysql和mysql用起来可以说差别不大，都是一家兄弟。通过PuTTY登录树莓派，输入以下命令：apt install mariadb-server git unzip发现git和unzip已经默认安装且都是最新版，但mariadb出现问题。考虑到实验时间（2022年2月5日）距离4B系统发布时间（2022年1月28日）很近，估计是清华的源没来得及更新。添加上默认源后apt update一下，然后mariadb-server安装成功。（2）为gogs设置mariadb首先对mariadb进行基础设置：mysql_secure_installation首先需要输入root密码，但第一次进还没设置root密码，根据提示直接按回车。剩下的全选y，注意途中要设置root密码。感兴趣的可以仔细读一下。然后可以进入mysql，为gogs创建一个用户及database了：mysql -uroot -p输入密码，进入mysql命令行后，进行以下四步操作（创建gogs数据库，创建gogs用户，刷新权限，退出mysql命令行）：CREATE DATABASE gogs; GRANT ALL PRIVILEGES ON gogs.* TO 'gogsuser'@'localhost' IDENTIFIED BY '你的密码'; #只开放了gogsuser对gogs库的权限 FLUSH PRIVILEGES; QUIT另外，mariadb-server默认使用3306端口。我安装过ufw，使用ufw allow 3306打开该端口。如果不希望mariadb对外网开放，也可以不开放此端口（若使用了frp映射了树莓派的3306端口，则本地打不打开3306的意义不大，除非需要局域网访问）。（3）为gogs新建系统用户并安装gogs退出mysql命令行后，新建无法登录的用户git：adduser --disabled-login git这里还可以添加全名、电话等，此处全部留空。gogs默认需要用3000端口，我已预先安装过ufw，开放一下3000端口：ufw allow 3000（因为需要从本地查看gogs网页）。进入git用户的根目录，下载gogs（用cat /proc/cpuinfo命令发现树莓派CPU为ARM v7）：cd /home/git wget https://dl.gogs.io/0.12.3/gogs_0.12.3_linux_armv7.zip #建议不要下载最新版，可以选次新版 unzip gogs_0.12.3_linux_armv7.zip确保git用户对/home/git目录的权限：chown -R git:git /home/git设置gogs开机自启动，并重启gogs服务：cp /home/git/gogs/scripts/systemd/gogs.service /etc/systemd/system/gogs.service systemctl enable gogs.service systemctl restart gogs.service最后检查一下gogs服务是不是active：systemctl status gogs.service不要忘了删除.zip文件：rm /home/git/gogs_0.12.3_linux_armv7.zip（4）gogs初次登录设置gogs网页默认在3000端口，如果见不到网页可以看看是不是该端口没有开放。接下来在浏览器输入 树莓派本地ip:3000 ，出现gogs初次设置界面。主要分下面三个部分：a. 数据库设置数据库类型为MySQL，数据库用户和数据库用户密码就是刚才设置的gogsuser和密码。注意到下面的提示：如果您使用 MySQL，请使用 INNODB 引擎以及 utf8_general_ci 字符集。登录mariadb，输入show engines;检查，InnoDB为DEFAULT；输入show character set;，发现utf8和utf8mb4（utf8对应utf8_general_ci），输入show variables like "%char%";，发现其中character_set_database和character_set_server对应的都是utf8mb4。退出mariadb，不知道配置文件在哪里，使用find / -name "*.cnf"找到/etc/mysql/mariadb.conf.d/50-server.cnf，找到其中两行：character-set-server = utf8mb4 collation-server = utf8mb4_general_ci改为character-set-server = utf8 collation-server = utf8_general_ci保存退出，重新进入mariadb，输入show variables like "%char%";，发现其中character_set_database和character_set_server对应的都是utf8。b. localhost改为树莓派的局域网ip在 应用基本设置 中将2个localhost改为树莓派的局域网ip。如果gogs想部署在云服务器而非树莓派上，可以改成云服务器的ip，如果还买了域名也可以换成域名。c. 设置管理员在 可选设置-管理员账号设置 中设置一个管理员账号。d. 后续设置设置完后即可创建一个仓库试试。之后写了什么代码要在树莓派跑，就可以笔记本上传，树莓派使用git下载（邮箱中的@用%40代替）：git clone http://邮箱或用户名:密码@仓库url如使用gogs_root下载该用户名下名为test的仓库：git clone http://gogs_root:对应密码@树莓派本地ip:3000/gogs_root/test另外，刚才完成的都是基础的设置。如果需要完整设置，可以调整文件/home/git/gogs/custom/conf/app.ini（该文件需要初次设置后才出现）。由于本文创建的是私有git，所以进行以下设置（另外一些设置用于以后可能开放）：DISABLE_REGISTRATION = true #只能由管理员创建账号 REQUIRE_SIGNIN_VIEW = true #必须登录才能查看页面 REGISTER_EMAIL_CONFIRM = true #注册时邮箱确认 [mailer] ENABLED = true #开启邮件服务 [log] ROOT_PATH = /var/logs/gogs_logs #习惯写到此文件夹下创建一下gogs_logs：mkdir /var/logs #之前没创建过这个文件夹 mv /home/git/gogs/log /var/logs/gogs_logs（5）gogs最新版的问题一开始我下载的是0.12.4版armv7压缩包，systemctl start gogs.service后systemctl status gogs.service发现状态为failed，检查gogs.service看到ExecStart=/home/git/gogs/gogs web，于是试着手动启动gogs网页/home/git/gogs/gogs web，报错bash:gogs: No such file or directory，出现这个报错一般是gogs版本不对（生产环境可以看看原来是不是跑在docker下的）。试了0.12.4的其他版本还是不行，最后换成0.12.3版armv7包可以手动开启。感觉每次gogs最新版本都有点问题。下面给出操作过程：（从1.-（3）新建git用户后开始）cd /home/git wget https://dl.gogs.io/0.12.4/gogs_0.12.4_linux_armv7.zip unzip gogs_0.12.4_linux_armv7.zip cd gogs #解压后文件夹名为gogs chown -R git:git /home/git systemctl enable /home/git/gogs/scripts/systemd/gogs.service systemctl restart gogs.service systemctl status gogs.service #发现状态为failed nano /home/git/gogs/scripts/systemd/gogs.service #看到ExecStart=/home/git/gogs/gogs web ./gogs web #试试手动启动，结果报错bash:gogs: No such file or directory # 停止服务，删除文件 systemctl stop gogs.service systemctl disable gogs.service cd .. rm -r gogs rm gogs_0.12.4_linux_armv7.zip2.使用frp将gogs映射到外网之前 frp+云服务器搭建能从外网访问的redis 一文中使用同一阿里云服务器，已经配置过frps了。下面粘贴一下：（1）购买阿里云服务器，安装frp并配置frps服务器端首先介绍一下frp。frp分为frps（server）和frpc（client），其中frps运行在有公网ip的云服务器上，frpc运行在内网中的机器上。frp主要用于把内网机器的端口映射到云服务器端口，比如把内网机器的22端口（一般用于ssh）映射到云服务器的6000端口，那么访问云服务器的6000端口即可接入内网机器的ssh服务。如果有其他方法搞到公网ip，也可以跳过这一步。随便选择一个便宜的服务器，购买后安装镜像，这里选择的系统镜像是Ubuntu 20.04。在左侧 服务器运维-远程连接 中设置一下root账户密码，然后下载putty，通过putty连接：连接类型为SSH，端口为默认的22，主机地址填云服务器的ip地址。输入root和root密码后即登录到云服务器。目前frp最新版本为0.38.0（2021年10月25更新）。这里安装frp到/bin目录下（wget github速度慢可以换成gitee上的仓库）：cd /bin wget https://github.com/fatedier/frp/releases/download/v0.38.0/frp_0.38.0_linux_amd64.tar.gz tar -zxvf frp_0.38.0_linux_amd64.tar.gz mv frp_0.38.0_linux_amd64 frp cd frp nano frps.ini然后配置一下frps.ini：[common] bind_port = 7000 #frpc上也要有相同的token值 token = 你的密码 #配置log log_file = /var/logs/frps.log log_level = info log_max_days = 3 #frps统计板 dashboard_port = 7500 dashboard_user = wuhuqifei dashboard_pwd = wuhuqifei kcp_bind_port = 7000解读一下配置选项：bind_port是frp使用的端口；token是密码令牌；log是日志相关；dashboard是统计板，设置好以后，网页访问 服务器ip:7500 即可看到frps的统计情况，user和pwd分别设置统计板的用户名密码（不用太复杂，简单易记即可）。如果后面运行frps时显示没有frps.log文件，可以自己新建一个并chmod改一下权限（或者直接删掉log相关设置）。最后的kcp_bind_port是多消耗15%左右流量、降低tcp延迟的，不要也可以不加。详细配置可以参考frps_full.ini。配置完成后，需要打开云服务器相应端口。在 安全-防火墙 中新增规则，打开7000和7500端口（云服务器在此处打开，非云服务器则使用ufw、iptables等。云服务器用ufw会出问题）。附带一些github上常见问题：流量是否经过服务器中转？ 目前除了 xtcp 外，其他类型的内网穿透模式的流量都需要经过 frps 所在服务器中转。 网络传输速度慢是什么原因？ 由于流量需要经过服务器转发，所以传输速度的快慢取决于服务器的下行带宽和客户端的上行带宽，通常家用宽带的上行带宽较低，限制了出口的速度。 另外一种情况是服务器部署在国外的 VPS 上，丢包率较高，也会影响到传输速度。这种情况下可以考虑开启 kcp 传输模式。 开启加密和压缩会消耗一定的 cpu 资源，且影响到传输速度，具体影响情况取决于机器性能。 客户端连接失败，提示 authorization failed 出现这种情况说明鉴权失败，检查 frps 和 frpc 的配置文件中的 token 是否一致。 客户端连接失败，提示 authorization timeout 出现这种情况是因为 frps 所在服务器和 frpc 所在服务器的系统时间相差较大。如果不希望在身份校验时加入系统时间，可以将 frps 配置文件中的 authentication_timeout 设置为 0 来解决这个问题。 frpc 能否在系统启动阶段无网络时一直等待而不是直接退出？ 在 frpc 的配置文件中将 login_fail_exit 设置为 false，则 frpc 启动后会不断尝试连接 frps，直到连接成功，而不是直接退出。最后使用./frps -c ./frps.ini即可启动frps。启动后不能关闭putty，这时可以访问 服务器ip:7500 查看是否成功开启。设置frps开机自动开启参考 不同系统下的开机自动运行 。（2）树莓派下载frp并配置frpc客户端安装方法同上（版本是arm非64版，树莓派4B的CPU是64位但使用的Pi OS为32位。下载链接）。安装完成之后修改一下frpc.ini文件（frp文件夹放在/bin下为例）：[common] server_addr = 云服务器ip地址 server_port = 7000 token = 你的密码 login_fail_exit = false #下面的log部分也可以不加 log_file = /var/logs/frpc.log log_level = info log_max_days = 3 [pi4B-gogs-web-1] type = tcp local_ip = localhost local_port = 3000 remote_port = 8181 [pi4B-gogs-ssh-1] type = tcp local_ip = localhost local_port = 22 remote_port = 50022（3）其他检查一下端口开放情况：服务器需要开放8181和50022端口（不要用ufw，要在 安全-防火墙 中添加规则）；树莓派需要开放3000和22端口（本例用ufw添加规则；如果不需要局域网访问也可以不加）。另外，记得删除一下安装包。（4）设置frpc开机自启并开启服务frp在systemd文件夹中放了.service文件。拷贝到/etc/systemd/system下即可：cd /bin/frp/systemd cp frpc.service /etc/systemd/system/frpc.service然后打开/etc/systemd/system/frpc.service，把其中的User=nobody删掉，ExecStart和ExecReload改一下即可（放在其他路径就改成其他的）:ExecStart=/bin/frp/frpc -c /bin/frp/frpc.ini ExecReload=/bin/frp/frpc reload -c /bin/frp/frpc.ini最后enable+start：systemctl enable frpc.service systemctl start frpc.service3.验证systemctl status frpc.service查看一下frpc状态为active。浏览器访问 服务器ip:8181 ，出现gogs网页。查看dashboard（服务器ip:7500），pi4B-gogs-web-1和pi4B-gogs-ssh-1已上线。git clone试验成功。