剪藏#剪藏#谢同学的NAS笔记

群晖 NAS 部署 Gitea:Docker 自建 Git 仓库全流程

2026 年 7 月 6 日1 分钟
分享Twitter / XTelegram微博
群晖 NAS 部署 Gitea:Docker 自建 Git 仓库全流程 封面

想在NAS上搭一个自己的Git服务,代码落在本地盘、用域名访问?

这篇用Docker Compose在群晖上部署Gitea,HTTPS按Cloudflare 托管域名 + Nginx 通配符证书来配(示例子域 gitea.5itech.ccwu.cc),从起容器、反代、初始化到本地 push/pull 一次走完。

测试环境:DSM 7.x,已安装Container Manager

一、适用场景

如果你已经在 homelab 里跑了 Nginx、Cloudflare Tunnel,Gitea可以按同一套方式接入:把脚本、家庭项目、基础设施配置放在 NAS 上,局域网或 Tailscale 里随时 clone;仓库文件落在 /volume1/docker/gitea/,跟NAS备份一起走。

公开项目照常推 GitHub 就行,需要完全留在本地盘上的仓库,交给 NAS 上的 Gitea 管。

二、部署

2.1 准备目录

SSH 登录 NAS,或用 File Station 建文件夹:

JAVASCRIPT
sudo mkdir -p /volume1/docker/gitea/data
sudo chown -R 1000:1000 /volume1/docker/gitea/data

这里用 gitea/gitea:1.22-rootless,容器内进程用户是 git(UID 1000),不是群晖的 docker 用户(1026)。data 目录必须 1000:1000 可写,不然日志会报 Permission denied/var/lib/gitea/git is not writable

2.2 docker-compose.yml

路径:/volume1/docker/gitea/docker-compose.yml

JAVASCRIPT
services:
  gitea:
    image:gitea/gitea:1.22-rootless
    container_name:gitea
    restart:unless-stopped
    environment:
      -TZ=Asia/Shanghai
      -GITEA__database__DB_TYPE=sqlite3
      -GITEA__server__DOMAIN=gitea.5itech.ccwu.cc
      -GITEA__server__SSH_DOMAIN=gitea.5itech.ccwu.cc
      -GITEA__server__ROOT_URL=https://gitea.5itech.ccwu.cc/
      #- GITEA__server__ROOT_URL=https://gitea.5itech.ccwu.cc:8443/
      -GITEA__server__SSH_PORT=2222
      -GITEA__server__DISABLE_SSH=false
      -GITEA__service__DISABLE_REGISTRATION=true
    ports:
      -"3000:3000"
      -"2222:2222"
    volumes:
      -/volume1/docker/gitea/data:/var/lib/gitea
    networks:
      -proxy-net

networks:
proxy-net:
    external:true

ROOT_URL 必须与浏览器地址完全一致(含 https://、末尾 /
DISABLE_REGISTRATION=true 关闭公开注册,仅管理员建号
SSH_PORT=2222 与宿主机映射一致,clone 地址里会显示此端口

没有 proxy-net 时:

JAVASCRIPT
sudo docker network create proxy-net   # 需要与 Nginx 同网时再建

2.3 启动

JAVASCRIPT
cd /volume1/docker/gitea
sudo docker compose up -d

局域网可先测:http://192.168.1.12:3000

2.4 首次安装向导

  1. 浏览器打开 Gitea(建议先配好HTTPS反代后再做)

  2. 数据库:SQLite3(compose 已指定,页面会默认选中)

  3. 常规设置

站点名称 随意,如 Homelab Git
仓库根目录 保持默认
Git 使用 LFS 按需勾选(大文件场景)
服务器域名 gitea.5itech.ccwu.cc
SSH 端口 2222
Gitea 基本 URL https://gitea.5itech.ccwu.cc/
日志路径 默认

  1. 管理员账号:设 管理员用户名 / 密码 / 邮箱

  2. 安装 Gitea → 进入登录页

2.5 Cloudflare + HTTPS

域名已在 Cloudflare,Gitea 用子域 gitea.5itech.ccwu.cc。Web 走 HTTPS 反代;Git SSH(2222)不能走 Cloudflare 橙云代理,需直连 NAS 或 Tailscale。

Cloudflare 侧

自用(Tailscale / 内网) 已有 *.5itech.ccwu.cc 通配符 LE 证即可,不必在 CF 加 A 记录
对外(标准 443) Zero Trust → Tunnel → Public Hostname:Subdomain gitea,Domain 5itech.ccwu.cc,Service http://gitea:3000(与 Nginx 同网时也可指 http://nginx-main:80

Tunnel 的 DNS 由 Cloudflare 自动 CNAME,无需手建 A 记录。

Nginx 反代(复用通配符证书)

若已有 5itech.ccwu.cc.pem / .key(与 img、blog 共用通配符证),在 conf.d/ 增加 gitea.conf(写法与 halo.conf 一致,容器内 listen 443,宿主机 8443:443 映射后,浏览器用 :8443 访问):

JAVASCRIPT
# conf.d/gitea.conf
server {
    listen 443 ssl http2;
    server_name gitea.5itech.ccwu.cc;

    ssl_certificate     /etc/nginx/certs/5itech.ccwu.cc.pem;
    ssl_certificate_key /etc/nginx/certs/5itech.ccwu.cc.key;

    client_max_body_size 0;   # LFS / 大文件 push

    location / {
        proxy_pass http://gitea:3000;
        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;
    }
}

复制到 NAS 后执行:

JAVASCRIPT
sudo docker exec nginx-main nginx -t && docker exec nginx-main nginx -s reload

验证(应返回 200/302,且 body 含 Gitea,不是 NoSuchKey):

JAVASCRIPT
curl -Ik --resolve gitea.5itech.ccwu.cc:8443:127.0.0.1 https://gitea.5itech.ccwu.cc:8443/

Gitea 容器与 Nginx 同在 proxy-net。自用 Tailscale 时在 Mac hosts 加一行(IP 换成你的 Tailscale 地址):

JAVASCRIPT
100.94.166.70  gitea.5itech.ccwu.cc

浏览器访问:https://gitea.5itech.ccwu.cc:8443

ROOT_URL** 选哪个?**(只能填一个,Gitea 靠它生成链接)

Cloudflare Tunnel(标准 443,对外) https://gitea.5itech.ccwu.cc/
仅 Tailscale + :8443(自用) https://gitea.5itech.ccwu.cc:8443/

imgblog 一样:对外走 Tunnel 用无端口;自用 :8443 时链接可能需手动带端口,或 Split DNS 统一走 443。

不用 Nginx 时:DSM 反代

控制面板 → 登录门户 → 高级 → 反向代理

HTTPS,gitea.5itech.ccwu.cc,443 HTTP,localhost3000

证书用 DSM 申请 Let's Encrypt,或上传通配符证。

Notion image

改完 ROOT_URL 后重启:

JAVASCRIPT
sudo docker compose restart gitea

三、日常使用

3.1 新建仓库

  1. 登录 → 右上角 +新建仓库

  2. 仓库名如 demo,可见性 私有

  3. 可选勾选 使用自述文件初始化仓库

3.2 HTTPS 克隆 / 推送

JAVASCRIPT
git clone https://gitea.5itech.ccwu.cc/你的用户名/demo.git
cd demo
echo "# hello" >> README.md
git add .
git commit -"init"
git push origin main

首次 push 会提示输入 Gitea 用户名 + 密码(或访问令牌)。

生成访问令牌(推荐,代替密码):

设置 → 应用 → 生成新令牌 → 勾选 write:repository → 复制令牌;push 时密码处粘贴令牌。

3.3 SSH 克隆 / 推送

  1. 本地生成密钥(若无):ssh-keygen -t ed25519 -C "your@email.com"

  2. Gitea → 设置 → SSH / GPG 密钥 → 粘贴 ~/.ssh/id_ed25519.pub

  3. 克隆:

JAVASCRIPT
git clone ssh://git@gitea.5itech.ccwu.cc:2222/你的用户名/demo.git

端口 2222 必须写进 URL。Cloudflare 只代理 HTTP/HTTPS,SSH 需 NAS 端口转发、Tailscale 直连,或只用 HTTPS clone。

3.4 常用 app.ini 片段

安装完成后配置在:/volume1/docker/gitea/data/gitea/conf/app.ini

JAVASCRIPT
[server]
ROOT_URL = https://gitea.5itech.ccwu.cc/
DOMAIN = gitea.5itech.ccwu.cc
SSH_DOMAIN = gitea.5itech.ccwu.cc
SSH_PORT = 2222
LFS_START_SERVER = true

[service]
DISABLE_REGISTRATION = true
SHOW_REGISTRATION_BUTTON = false

[mailer]
ENABLED = false
; 若要邮件通知再开启 SMTP

[repository]
DEFAULT_BRANCH = main

改完执行 docker compose restart gitea

四、配置模板(复制后改域名)

JAVASCRIPT
# === 域名(Cloudflare 托管 5itech.ccwu.cc)===
Gitea 子域:        gitea.5itech.ccwu.cc
ROOT_URL:          https://gitea.5itech.ccwu.cc/
证书:              复用 *.5itech.ccwu.cc 通配符 LE(5itech.ccwu.cc.pem)
自用访问:          https://gitea.5itech.ccwu.cc:8443(Tailscale + hosts)
对外访问:          Cloudflare Tunnel → gitea:3000(标准 443

完整 docker-compose(含 PostgreSQL,可选)

多人使用时可将 SQLite 换成 Postgres:

JAVASCRIPT
services:
  db:
    image:postgres:16-alpine
    container_name:gitea-db
    restart:unless-stopped
    environment:
      POSTGRES_USER:gitea
      POSTGRES_PASSWORD:请改成强密码
      POSTGRES_DB:gitea
    volumes:
      -/volume1/docker/gitea/postgres:/var/lib/postgresql/data
    networks:
      -gitea-net

gitea:
    image:gitea/gitea:1.22-rootless
    container_name:gitea
    restart:unless-stopped
    depends_on:
      -db
    environment:
      -TZ=Asia/Shanghai
      -GITEA__database__DB_TYPE=postgres
      -GITEA__database__HOST=db:5432
      -GITEA__database__NAME=gitea
      -GITEA__database__USER=gitea
      -GITEA__database__PASSWD=请改成强密码
      -GITEA__server__ROOT_URL=https://gitea.5itech.ccwu.cc/
      #- GITEA__server__ROOT_URL=https://gitea.5itech.ccwu.cc:8443/
      -GITEA__server__DOMAIN=gitea.5itech.ccwu.cc
      -GITEA__server__SSH_PORT=2222
      -GITEA__service__DISABLE_REGISTRATION=true
    ports:
      -"3000:3000"
      -"2222:2222"
    volumes:
      -/volume1/docker/gitea/data:/var/lib/gitea
    networks:
      -gitea-net
      -proxy-net

networks:
gitea-net:
proxy-net:
    external:true

五、总结

操作顺序:建目录 → docker compose up → HTTPS 反代 → 安装向导 → push 验证

多人高频push可换PostgreSQL。

往期推荐:

一张通配符证书搞定 Halo + 图床:Let's Encrypt、Nginx Snippets 与 Tunnel 通用配置

群晖NAS用Docker Compose搭建Halo,打造专属私有建站平台

不用花钱!用 DNSHE 免费域名 + Cloudflare 搭建私有内网穿透

Notion image

Notion image

“分享”、“点赞”,给我充点儿电吧~

原文地址: https://mp.weixin.qq.com/s?__biz=Mzk2NDMzMzY2MA==&mid=2247484513&idx=1&sn=0b6ae483338b38b6ad6842539221afcc&chksm=c53f3350191e5e3d676498c5d7aa44ad5f7d5d96e8ded7b42e6c8b163e9a76bfb8101892fd8f&mpshare=1&scene=1&srcid=0706VNWR8DiWKDT08GK2bUCw&sharer_shareinfo=8170267b5c27df5cc8151eeb3eb2afb5&sharer_shareinfo_first=8170267b5c27df5cc8151eeb3eb2afb5#rd

相关文章