Skip to content

Build a Git Using Gogs On RaspberryPi with Docker Employ Frp with Caddy Proxy and CDN in Cloudflare

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

提供2中的docker脚本,和3中的docker-compose.yaml文件

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]. Docker安装Gogs

[2]. Caddy配置

[3]. Local Service Tunneling with FRP and Caddy

[4]. fatedier/frp