Cane's Blog

Cane

【Docker】Compose 安装 gogs 并设置 nginx 反向代理

174
2022-11-01

前言

Gogs Github Page Introduce

步骤

Gogs

gogs.yaml

version: "3.5"
services:
  gogs:
    image: gogs/gogs
    container_name: gogs
    restart: always
    environment:
      - TZ=Asia/Shanghai
    networks:
      - nginx
      - mysql
    ports:
      - "10022:22"
      - "10880:3000"
    volumes:
      - /home/gogs:/data
networks:
  nginx:
    external: true
  mysql:
    external: true

这里我打算用 mysql 作为数据库,网络部分要通过 nginx 实现反向代理(用了 nginx 的话 ports 其实是可以不写的,但是为了能通过 docker ps -a 一眼查看各个容器是干啥的,容器内部哪个端口提供服务,我一般选择把容器的服务端口映射到宿主机,但是宿主机的端口不对外开发)

gogs 的目录结构

/home/gogs
|-- git
|   |-- gogs-repositories
|-- ssh
|   |-- # ssh public/private keys for Gogs
|-- gogs
    |-- conf
    |-- data
    |-- log

但是不要尝试手动去构建这个目录,只构建到 /home/gogs,手动构建整个目录树安装 gogs 的时候会导致权限错误

Nginx

nginx.yaml

version: "3.5"
services:
  nginx:
    image: nginx
    container_name: nginx
    ports:
      - "443:443"
      - "80:80"
      - "22:22"
    restart: always
    volumes:
      - /home/nginx/ssl:/etc/nginx/ssl
      - /home/nginx/conf:/etc/nginx/conf.d
      - /home/nginx/nginx_header.conf:/etc/nginx/nginx.conf
    environment:
      - TZ=Asia/Shanghai
    networks:
      - nginx
networks:
  nginx:
    name: nginx

nginx_header.conf

stream {

    server{
        listen 22;
        proxy_pass gogs:22;
    }

}

nginx.conf

# gogs
server {
    listen 80;
    server_name git.xxxx.com;
    rewrite ^(.*) https://git.xxxx.com$1 permanent;
}

server {
    listen 443 ssl;
    server_name  git.xxxx.com;

    ssl_certificate /etc/nginx/ssl/xxxx.xxx.com.pem;
    ssl_certificate_key /etc/nginx/ssl/xxxx.xxxx.com.key;
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://gogs:3000;
        proxy_set_header HOST $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

这里需要注意的是

  1. 22 端口的转发,在 nginx 的配置中,是在「stream」中,跟「http」是平级的

  2. 我的 nginx 是运行在 docker 中的,gogs 的 默认 ssh 端口是 22,nginx 也是要监听 22 端口的,然后将 22 端口的流量转发到 gogs 容器内的 22 端口,如果宿主机的 ssh 端口也是 22 端口, nginx 是运行不起来的。有两种解决方案

    1. 修改 ssh 的 默认端口

      # 配置文件路径
      /etc/ssh/sshd_config
      
      # 找到 22 端口的部分,如果被注释了,就解开注释,在下面新建一行
      Port 22
      Port 22870
      
      # 重启服务
      systemctl restart sshd
      
      # 使用 22870 端口登录,(不要忘记将 22870 从主机安全组里面放出来)注释掉 22 的部分
      Port 22870
      
      # 然后再次重启服务
      systemctl restart sshd
    2. 修改 gogs 的默认 ssh 端口,这个修改要去 gogs 的配置文件中修改,在安装面板界面 修改是没用的,具体步骤见:app.ini

补充

  1. Permission denied, please try agiain.

    如果通过 ssh 拉/推/克隆 一直提示这个错误,说明你的 22 端口没有成功映射,要么是 nginx 代理规则没写对,要么是 22 端口没开放。

    2022-11-01 15-43-05.png