群晖 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 建文件夹:
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
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:trueROOT_URL 必须与浏览器地址完全一致(含 https://、末尾 /)
DISABLE_REGISTRATION=true 关闭公开注册,仅管理员建号
SSH_PORT=2222 与宿主机映射一致,clone 地址里会显示此端口
没有 proxy-net 时:
sudo docker network create proxy-net # 需要与 Nginx 同网时再建2.3 启动
cd /volume1/docker/gitea
sudo docker compose up -d局域网可先测:http://192.168.1.12:3000
2.4 首次安装向导
-
浏览器打开 Gitea(建议先配好HTTPS反代后再做)
-
数据库:SQLite3(compose 已指定,页面会默认选中)
-
常规设置:
站点名称 随意,如 Homelab Git
仓库根目录 保持默认
Git 使用 LFS 按需勾选(大文件场景)
服务器域名 gitea.5itech.ccwu.cc
SSH 端口 2222
Gitea 基本 URL https://gitea.5itech.ccwu.cc/
日志路径 默认
-
管理员账号:设 管理员用户名 / 密码 / 邮箱
-
安装 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 访问):
# 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 后执行:
sudo docker exec nginx-main nginx -t && docker exec nginx-main nginx -s reload验证(应返回 200/302,且 body 含 Gitea,不是 NoSuchKey):
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 地址):
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/
与 img、blog 一样:对外走 Tunnel 用无端口;自用 :8443 时链接可能需手动带端口,或 Split DNS 统一走 443。
不用 Nginx 时:DSM 反代
控制面板 → 登录门户 → 高级 → 反向代理:
HTTPS,gitea.5itech.ccwu.cc,443 HTTP,localhost,3000
证书用 DSM 申请 Let's Encrypt,或上传通配符证。

改完 ROOT_URL 后重启:
sudo docker compose restart gitea三、日常使用
3.1 新建仓库
-
登录 → 右上角 + → 新建仓库
-
仓库名如
demo,可见性 私有 -
可选勾选 使用自述文件初始化仓库
3.2 HTTPS 克隆 / 推送
git clone https://gitea.5itech.ccwu.cc/你的用户名/demo.git
cd demo
echo "# hello" >> README.md
git add .
git commit -m "init"
git push origin main首次 push 会提示输入 Gitea 用户名 + 密码(或访问令牌)。
生成访问令牌(推荐,代替密码):
设置 → 应用 → 生成新令牌 → 勾选 write:repository → 复制令牌;push 时密码处粘贴令牌。
3.3 SSH 克隆 / 推送
-
本地生成密钥(若无):
ssh-keygen -t ed25519 -C "your@email.com" -
Gitea → 设置 → SSH / GPG 密钥 → 粘贴
~/.ssh/id_ed25519.pub -
克隆:
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
[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。
四、配置模板(复制后改域名)
# === 域名(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:
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 搭建私有内网穿透


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