Skip to content

Build Git Server Using Gogs with Docker and Employ Frp with Caddy Reverse Proxy

Goals

  • 在树莓派上运行Gogs,并且使用Docker部署
  • 由于树莓派在内网,需要使用Frp进行内网穿透
  • 使用Caddy+CDN代理,加速对Gogs的访问速度

Requirements

  • Raspberry 3B+
  • Domain
  • Cloudflare Account
  • VPS with Public IPv4 Address

1. Install Docker on RaspberryPi 3B+

(1). 使用docker官方的一键安装脚本:

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

(2). 将当前用户加入docker组:

sudo groupadd docker
sudo usermod -aG docker $USER

(3). 为docker设置镜像加速:sudo vim /etc/docker/daemon.json

{
    "registry-mirrors": [
        "https://1nj0zren.mirror.aliyuncs.com",
        "https://docker.mirrors.ustc.edu.cn",
        "http://f1361db2.m.daocloud.io",
        "https://registry.docker-cn.com"
    ]
}
sudo systemctl daemon-reload sudo systemctl restart docker

2. Install Gogs with Docker

(1). 下载镜像文件

docker pull gogs/gogs-rpi

(2). 运行镜像

docker run  \
--name=gogs-rpi -d \
--restart=always \
-p 10022:22 -p 13000:3000 \
-v /data/gogs:/data gogs/gogs-rpi
- 10022:22->将本机10022端口映射到docker内的22 - 13000:3000->将本机13000端口映射到docker内的3000 - /data/gogs是本机存放数据的位置

3. Install Gogs with docker-compose Orchestration using MySQL(可选)

(1). Install docker-compose

sudo apt-get install docker-compose

(2). 编排docker-compose.yaml 内容

version: "3"
services:
    db:
        image: mysql:5.7
        container_name: MySQL5.7
        restart: always
        ports:
            - "13306:3306"
        volumes:
            - ${pwd_DB}/gogs_DB:/var/lib/mysql
        environment:
            MYSQL_ROOT_PASSWORD: AdminMySQL
            MYSQL_DATABASE: gogs
            MYSQL_USER: gogs
            MYSQL_PASSWORD: passwordgogs
            TZ: Asia/Shanghai
    docker-gogs:
        depends_on:
            - db
        image: gogs/gogs
        container_name: docker-gogs
        restart: always
        ports:
            - "10022:22"
            - "13000:3000"
        volumes:
            - ${pwd_gogs}/data:/data

(3). 运行docker容器

进入docker-compose.yaml所在路径,运行:

docker-compose up -d

当使用MySQL作为数据存储时,在gogs的设置页面,需要将数据库地址设置为db:3306

4. Configuration of Domain

(1). 先将域名的nameservers改到cloudflare,参考Change nameservers to cloudflare

(2). 在Cloudflare中将域名解析到VPS的IP地址,并且将PrivateDNS关闭,橙色云->灰色

(3). 在gogs配置完成后,将PrivateDNS打开

5. Configuration of FRP

Server Config

[common]
bind_port = [your port1]
token =  [your token]
vhost_http_port = [your port2]
bing_udp_port = [your port3]
vhost_https_port = [your port4]

Client Config

[common]
server_addr = [your ip]
server_port = [your port]
token = [your token]

[Gogs]
type = tcp
local_ip = 127.0.0.1
local_port = 13000
remote_port = 8888
  • 此处需要注意13000端口为gogs容器在树莓派上映射的端口,要与之前docker上运行的端口对应

6. Configuration of Caddy On VPS

(1). 安装Caddy,参考用RaspberryPi搭建Aria2+Caddy2下载站

(2). 配置Caddyfile:sudo vim /etc/caddy/Caddyfile

gogs.yourdomain: {
        tls address@mail.com
        proxy / 127.0.0.1:8888 
        proxy /captcha 127.0.0.1:8888
}
- proxy / 127.0.0.1:8888 表示将访问gogs.yourdomain:443的流量转发到本机的8888端口 - address@mail.com表示用户邮箱

(3). 重启Caddy:sudo systemctl restart caddy

7. Configuration of Gogs

(1). 在浏览器中访问树莓派的 IPv4:13000 进行设置

(2). 在Domain中输入 yourdomain

(3). EXTERNAL_URL 设置为https://gogs.yourdomain:443/

(4). 完成安装后跳回第3.3,将Cloudflare的PrivateDNS打开。

局限性

  • 通过该方式安装的gogs只能够通过https或者http协议进行git操作
  • 通过将SSH端口进行FRP穿透可以实现SSH方式的操作,但是PrivateDNS无法支持SSH,所以需要关闭PrivateDNS。

REF

[1]. https://blog.ximcloud.cn/1199/%E6%A0%91%E8%8E%93%E6%B4%BE4b-ubuntu19-10-%E5%AE%89%E8%A3%85docker-gogs.html

[2]. https://li-aaron.github.io/2019/07/nas-frp-caddy-cloudfare/

[3]. https://asdasd.page/2019/04/14/Local-Service-Tunneling-with-FRP-and-Caddy/

[4]. https://github.com/fatedier/frp

[5]. Install-FRP

[6]. gogs-配置详解

[7]. Reverse-Proxy-with-Caddy-on-RHEL