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,初次访问需要进行若干配置。

注意事项:
-
这里需要将SSH服务端口改为其他端口号,因为此处的SSH端口是用于“通过SSH克隆仓库“,若不更改会导致虽然上传了SSH密钥,在克隆时仍被要求输入密码,且会一直密码错误。这里我将其改为之前配置里该端口所映射的物理机端口222。
-
在“服务器和第三方设置”中开启“禁止用户自助注册”,防止后续仓库在公网上被随意注册。
-
填写并设置管理员账号。
按下立即安装,稍等几秒钟便安装成功,下图是未登陆用户所看到的界面。

安装完成后更改下配置文件中的一些设置。
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 down,docker 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 ok和is 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服务了。

浙公网安备 33010602011771号