Gitea安装(使用Docker与Postgresql)并将其穿透至公网访问

准备工作

完成docker-compose安装,镜像仓库设置与具体安装步骤可查看Docker与Docker Compose(插件方式)搭建,本文通过官方文档安装(略有修改)。

Docker Compose编写

请注意:Gitea不支持以root身份运行,为确保权限正常,本文所有操作均在普通用户下进行。

前往~文件夹下创建 gitea-docker 目录。

cd ~ && mkdir gitea-docker && cd gitea-docker
sudo vi docker-compose.yml

将以下内容粘贴到 docker-compose.yml 文件中,对于稳定的发行版,可以使用 :1 或指定某个发行版,例如 1.23.5

# 自动创建名为gitea的网络,且该网络在该容器之外不存在。
networks:
  gitea:
    external: false

# 创建两个命名卷而不是主机卷,
# 这样无需担心命名卷的权限,Docker将自动处理该问题。
volumes:
  gitea:
    driver: local
  postgres:
    driver: local

# 使用gitea 1.23.5版本,且该卷由指定UID/GID的用户/组拥有,
# 1000为系统第一个创建的普通用户与用户组。
services:
  gitea:
    image: gitea/gitea:1.23.5
    container_name: gitea
    environment:
      - TZ=Asia/Shanghai
      - USER_UID=1000
      - USER_GID=1000
      - GITEA__database__DB_TYPE=postgres
      - GITEA__database__HOST=db:5432
      - GITEA__database__NAME=giteadb
      - GITEA__database__USER=gitea
      - GITEA__database__PASSWD=gitea
    restart: always
    networks:
      - gitea
    volumes:
      - gitea:/data
    ports:
      - 3000:3000
      - 222:22
    depends_on:
      - db

  # 集成Postgresql数据库
  db:
    image: postgres:14
    restart: always
    environment:
      - POSTGRES_USER=gitea
      - POSTGRES_PASSWORD=gitea
      - POSTGRES_DB=giteadb
    networks:
      - gitea
    volumes:
      - postgres:/var/lib/postgresql/data

安装

检查docker-compose.yml文件内容是否编写正确。

docker compose config -q

若无输出,则代表无语法错误,可以在后台启动 Gitea了。

sudo docker compose up -d

等待Docker下载并启动完成后,便可以查看Gitea是否正确启动。

sudo docker compose ps

现在可以通过浏览器输入“宿主机IP:3000”访问Gitea了。如果发现配置错误(如密码等忘记更改),可以使用以下命令停止容器清理命名卷和内部网络。

sudo docker compose down -v

配置

通过“宿主机IP:3000”访问Gitea,初次访问需要进行若干配置。

Gitea初始界面

注意事项:

  • 这里需要将SSH服务端口改为其他端口号,因为此处的SSH端口是用于“通过SSH克隆仓库“,若不更改会导致虽然上传了SSH密钥,在克隆时仍被要求输入密码,且会一直密码错误。这里我将其改为之前配置里该端口所映射的物理机端口222。

  • 在“服务器和第三方设置”中开启“禁止用户自助注册”,防止后续仓库在公网上被随意注册。

  • 填写并设置管理员账号。

按下立即安装,稍等几秒钟便安装成功,下图是未登陆用户所看到的界面。

未登陆用户的Gitea界面

安装完成后更改下配置文件中的一些设置。

sudo vi /var/lib/docker/volumes/gitea-docker_gitea/_data/gitea/conf/app.ini
...

[service]
DISABLE_REGISTRATION = true

- REQUIRE_SIGNIN_VIEW = false
+ REQUIRE_SIGNIN_VIEW = true

REGISTER_EMAIL_CONFIRM = false
ENABLE_NOTIFY_MAIL = false
ALLOW_ONLY_EXTERNAL_REGISTRATION = false

- ENABLE_CAPTCHA = false
+ ENABLE_CAPTCHA = true

DEFAULT_KEEP_EMAIL_PRIVATE = false
DEFAULT_ALLOW_CREATE_ORGANIZATION = true
DEFAULT_ENABLE_TIMETRACKING = true
NO_REPLY_ADDRESS = noreply.localhost

...

这里更改了禁止非注册用户访问仓库页面启用注册时的验证码,重启Docker。

sudo docker restart gitea

HTTPS访问配置

本节使用Nginx作为Gitea的反向代理服务进行配置,使用Docker Compose安装Nginx。

cd ~ && mkdir nginx-docker && cd nginx-docker
sudo vi docker-compose.yml

将以下内容写入Docker Compose配置文件,注意在链接到前一小节Gitea所创建内部网络前,请先确认其所创建的网络标识,使用sudo docker network ls查看。

# 告诉docker启动后加入已有网络gitea
networks:
  gitea-docker_gitea:  # 注意之前创建的gitea网络时的网络标识
    external: true

# 创建名为nginx的命名卷
volumes:
  nginx:
    driver: local

services:
  nginx:
    image: nginx:1.27.4
    container_name: nginx
    environment:
      - TZ=Asia/Shanghai
    restart: always
    networks:
      - gitea-docker_gitea
    volumes:
      - nginx:/etc/nginx
    ports:
      - 80:80
      - 443:443

同样,检查编写无误后便可以拉起容器。

docker compose config -q
sudo docker compose up -d

接下来去申请自己域名相对应的SSL证书,本人域名在Cloudflare购买,因此示例为在Cloudflare申请证书。

证书申请

申请的文件分为两部分,私钥和证书,私钥只会显示一次因此需要妥善保管。我们已经将容器内部的/etc/nginx目录映射到了命名卷中,因此只要进入宿主机的命名卷目录便可同步修改容器内的内容(该目录需要root权限才可进入,若想cd进入需先切换为root用户:su -),在命名卷目录下创建cert目录并保存私钥和证书。

sudo mkdir /var/lib/docker/volumes/nginx-docker_nginx/_data/cert

接着创建相对应的文件并将刚刚保存的密钥复制进去。

sudo vi /var/lib/docker/volumes/nginx-docker_nginx/_data/cert/git.xxx.com.pem  # 证书
sudo vi /var/lib/docker/volumes/nginx-docker_nginx/_data/cert/git.xxx.com.key  # 私钥

因为Nginx配置文件(nginx.conf)中已经写好了include,为保证结构清晰,所以在conf.d中创建此次反向代理配置,同时因为此配置文件作用于容器内部,所以在填写证书路径时使用容器内部的路径。

如果不需要再通过内网IP+端口的形式访问该页面,而是通过Nginx将指定端口代理至Docker内部网络端口,则可以将Docker容器中内部端口到宿主机物理端口的映射删除掉。具体为删除掉docker-compose.yml中的ports部分,然后docker compose downdocker compose up -d重建容器。注意:在此操作前,请留意自己的SSH配置,本文中并未更改“通过SSH克隆”部分,其默认为IP+端口形式。

sudo vi /var/lib/docker/volumes/nginx-docker_nginx/_data/conf.d/gitea.conf
server {
        listen 443 ssl;
        server_name git.xxx.com;

        ssl_certificate /etc/nginx/cert/git.torymin.com.pem;
        ssl_certificate_key /etc/nginx/cert/git.torymin.com.key;

        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:!aNULL:!MD5;
        
        location / {
                client_max_body_size 512M;
                proxy_pass http://gitea:3000;
                proxy_set_header Connection $http_connection;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
        }
}

# HTTP 重定向到 HTTPS
server {
        listen 80;
        server_name git.xxx.com;
    
        return 301 https://$host:23080$request_uri;
}

配置完成后拉起该容器。

sudo docker compose up -d

进入容器内部测试下配置是否写正确。

sudo docker exec -it nginx bash
nginx -t

如果输出syntax is okis successful则配置正确,重新加载nginx即可。

nginx -s reload
exit

其次,修改Gitea的app.ini配置,使其以知道自己的访问地址。

sudo vi /var/lib/docker/volumes/gitea-docker_gitea/_data/gitea/conf/app.ini
...

[server]
APP_DATA_PATH = /data/gitea
DOMAIN = 192.168.6.198
SSH_DOMAIN = 192.168.6.198
HTTP_PORT = 3000

- ROOT_URL = http://192.168.6.198:3000/
+ ROOT_URL = https://git.xxx.com

DISABLE_SSH = false
SSH_PORT = 222
SSH_LISTEN_PORT = 22

...

配置完成后重启Gitea

sudo docker restart gitea

内网穿透

此过程需要准备穿透软件和一个域名,我自己使用的是SakuraFrp。在官网注册账号后,使用以下脚本安装客户端,脚本会自动检测到之前安装的Docker并以此种方式安装。

sudo bash -c ". <(curl -sSL https://doc.natfrp.com/launcher.sh)"

提示输入访问密钥,访问密钥在主页获取。

访问密钥位置

输入管理密码后便成功启动,输入Ctrl+C退出日志界面。在隧道列表创建一个名为Gitea且端口为443的隧道。

创建隧道

在远程管理页面连接上宿主机。

连接宿主机

在隧道页面将刚才创建的隧道拖入上方则可启动隧道。若下方没有显示隧道,点击右上角刷新按钮刷新隧道列表。

隧道列表

查看日志界面,显示创建成功后记录下应当解析的CNAME地址,前往域名服务商网站解析该地址,此处因为申请的Cloudflare源服务器证书,其仅对Cloudflare与源服务器之间的通信有效,因此需要打开Cloudflare代理来保证不会提示访问的网站不安全。

解析域名

至此便可以通过私有域名访问Gitea服务了。

posted @ 2025-03-20 16:55  絵守辛玥  阅读(701)  评论(0)    收藏  举报