---
url: /article/7dobd88o/index.md
---
## 前言

之前在 R2S 上安装了 SVN 作为代码仓库，虽然它装起来简单，但是它管理起来不太方便。还是觉得装个 Git 仓库合适，刚好[Gogs](https://gogs.io/)就很不错，安装也简单。不过再继续用 ip 访问显得不优雅，索性也用 Caddy 反代服务。

## 1. 安装 Gogs

Gogs 的安装很简单，一开始下载二进制包，解压后在 OpenWrt 上运行不起来，于是选择通过 [Docker 安装](https://hub.docker.com/r/gogs/gogs)：

```bash :no-line-numbers
docker volume create --name gogs-data
docker run --name=gogs -p 9522:22 -p 9530:3000 -v gogs-data:/data -e RUN_CROND=true -e BACKUP_INTERVAL=1d -e BACKUP_RETENTION=7d gogs/gogs
```

至此，Gogs 就安装好了，这里启用了定时(RUN\_CROND)系统备份，备份频率(BACKUP\_INTERVAL)为每 1 天，保留备份数(BACKUP\_RETENTION)为 7 天，即 7 天前的备份会自动删除，备份文件存放(BACKUP\_ARG\_CONFIG)在`~/gogs/backup`目录下，我们稍后来配置它。

## 2. 修改 uhttpd 端口

OpenWrt 使用 uhttpd 运行 http 服务，默认端口为 80，但 Caddy 的端口也是 80，所以这里先将 uhttpd 端口改为 8080，稍后再用 Caddy 反代过来。

```bash :no-line-numbers
// 其他代码已省略...

config uhttpd 'main'
        list listen_http '0.0.0.0:8080' # [!code focus]
        list listen_http '[::]:8080' # [!code focus]
        #list listen_https '0.0.0.0:443'
        #list listen_https '[::]:443'

// 其他代码已省略...
```

重启 uhttpd 服务`service uhttpd restart`，如果没效果就直接重启 OpenWrt 系统，之后通过`http://192.168.0.1:8080`能访问通就没错了。

## 3. 安装 Caddy

Caddy 支持通过 Dcoker 安装，不过 OpenWrt 支持运行 Caddy 的二进制包。通过 Caddy 的[下载服务器](https://caddyserver.com/download)选择`Linux arm64`版本，因为我的 R2S CPU 架构是 aarch64，所以选择这个版本。

```bash :no-line-numbers
# 先创建目录(因为压缩包内没有目录，解压出来就平铺当前目录了)
mkdir caddy
tar -zxf caddy_2.10.0_linux_arm64.tar.gz -C caddy
# 复制过去就行了，默认有执行权限
cp caddy/caddy /usr/bin/
```

编写配置模板`Caddyfile`(名称随意)：

```text :no-line-numbers
mc.lan {
        tls internal
        reverse_proxy 127.0.0.1:8080
}
gogs.mc.lan {
        tls internal
        reverse_proxy 127.0.0.1:9530
}
```

这里将`mc.lan`域名反代到了`127.0.0.1:8080`(OpenWrt)，`gogs.mc.lan`反代到了`127.0.0.1:9530`(Gogs)。然后执行:

```bash :no-line-numbers
# 格式化配置文件
./usr/bin/caddy fmt --overwrite ~/Caddyfile
# 转换为 json 文件
./usr/bin/caddy adapt --config ~/Caddyfile > /etc/config/caddy
```

编写启动配置`/etc/init.d/caddy`：

```bash :no-line-numbers
#!/bin/sh /etc/rc.common

START=99
USE_PROCD=1
LOGFILE="/var/log/caddy.log"

start_service() {
    procd_open_instance
    procd_set_param command /usr/bin/caddy run --config /etc/config/caddy
    procd_set_param stdout "$LOGFILE"
    procd_set_param stderr "$LOGFILE"
    procd_set_param respawn
    procd_close_instance
}
```

运行开机启动`service caddy enable`，启动服务`service caddy start`，会自动在`/.local/share/caddy/certificates/local`目录下生成站点证书。至此，Caddy 就安装好了。

## 4. 配置 Gogs

访问`https://gogs.mc.lan`，此时浏览器会提示不安全忽略即可。接着浏览器会自动重定向到 Gogs 的配置页面，参考[Gogs安装](https://hub.docker.com/r/gogs/gogs)的`Settgins`一节做如下配置(只说需要改动的项，其他保持默认)：

|配置项|值|
|:--:|:--:|
|数据库|SQLite3|
|域名|gogs.mc.lan|
|SSH端口|9522|
|应用URL|https://gogs.mc.lan|

然后安装即可，第一个注册的用户自动成为管理员。\
所有的配置可以在 Docker Vomule 下查看，由于我将`/opt/docker`挂载为了 Docker 根目录，因此 Gogs 的配置文件在`/opt/docker/volumes/gogs-data/_data/gogs/conf/app.ini`。可配置项参考[app.ini](https://github.com/gogs/gogs/blob/main/conf/app.ini)。

## 5. 导出根证书

Caddy 自动生成的根证书在`/.local/share/caddy/pki/authorities/local/`目录下，也可以通过命令`find / -type f -name "root.crt"`来查找。接着将`root.crt`复制出来导入到其他设备中信任即可，可参考[远程开发实践 - Caddy](/article/7uov7swb/#_3-4-3-caddy-%E6%8E%A8%E8%8D%90)一节。之后再访问域名就没有不安全的提示了。

## 6. 配置 SSH 密钥

访问`https://gogs.mc.lan/user/settings/ssh`，在`SSH密钥`一栏中增加下面生成的公钥：

```bash :no-line-numbers
# 生成密钥并保存在一个特定的位置，如：~/.ssh/Gogs/mayee/id_ed25519
ssh-keygen -t ed25519 -C "devos"
# 将公钥配置在 gogs 中
cat ~/.ssh/Gogs/mayee/id_ed25519.pub
```

之后在`~/.ssh/config`中增加如下内容：

```bash :no-line-numbers title="config"
# Gogs
Host gogs.mc.lan
    User git
    IdentityFile ~/.ssh/Gogs/mayee/id_ed25519
    Port 9522
```

检查配置`ssh -T git@gogs.mc.lan`看到 ==Hi there, You've successfully authenticated, but Gogs does not provide shell access.== 即表示配置成功。
