- 删除 .trae/ 目录(Trae IDE 旧配置) - 删除 temp-agent-os-v2.md - 新增:AI时代的Token战争——能源算力与我们每个人的选择 - 新增:自建Git服务——在NAS上部署Gitea - 新增:Docker安装与入门指南 - 更新:Git团队协作指南 - 更新:recent-files-obsidian 插件数据
4.5 KiB
在宿舍 NAS 上搭建 Gitea:一个自己的 GitHub
校园网封了 22 端口?SMB 写文件权限炸了?sshpass 吃特殊字符?两天踩的坑都在这了。
起因
手上项目越来越多,GitHub 国内访问不稳定,Gitee 又有仓库数量限制。刚好手边有台绿联 DXP-2800 NAS(N100 处理器,8GB 内存,跑 Debian 12),不如自己搭个 Git 服务——代码完全在自己硬盘上,不用联网也能 push,想建多少个私有仓库都行。
选型
对比了几个方案:
| 方案 | 优点 | 缺点 |
|---|---|---|
| GitLab | 功能最全,内置 CI/CD | 吃内存,N100 扛不动 |
| Gogs | Go 语言,轻量 | 社区不如 Gitea 活跃 |
| Gitea | Go 语言,GitHub 风格,安装简单 | 够用就行 |
GitLab 最低要求 4GB 内存,加上 NAS 上已经跑了 14 个 Docker 容器(Halo 博客、qBittorrent、PostgreSQL、一堆 Cloudflare Tunnel……),资源不够。Gitea 用 SQLite 单用户跑,内存占用不到 256MB,选它。
部署
docker-compose 文件很简单:
services:
gitea:
image: gitea/gitea:latest
restart: unless-stopped
volumes:
- /volume1/docker/gitea/data:/data
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000" # Web UI
- "2222:22" # SSH(避开 NAS 主机的 22 端口)
environment:
- TZ=Asia/Shanghai
- GITEA__database__DB_TYPE=sqlite3
- GITEA__server__DOMAIN=192.168.5.8
- GITEA__server__SSH_DOMAIN=192.168.5.8
- GITEA__server__SSH_PORT=2222
- GITEA__server__ROOT_URL=http://192.168.5.8:3000/
- GITEA__server__APP_NAME=LHY Git
mem_limit: 512m
cpus: 1
docker compose up -d,一分钟起好。访问 http://192.168.5.8:3000,注册第一个账号即为管理员。
踩坑:SSH 排错
Gitea 部署完了,但到推送的时候卡住了。问题出在 SSH 认证链路。
第一关:GitHub 连不上
ssh -T git@github.com 一直 Permission denied,密钥指纹是对的,GitHub 后台也确认加好了。排查了半天发现——校园网封了 22 端口。
改走 443 秒通:
ssh -T -p 443 git@ssh.github.com
# Hi LHY0125! You've successfully authenticated...
解决:在 ~/.ssh/config 里把 GitHub 永久改成 443:
Host github.com
HostName ssh.github.com
Port 443
User git
IdentityFile ~/.ssh/id_ed25519
第二关:NAS 密钥认证失败
ssh LHY@192.168.5.8 每次都要输密码,即使公钥已经加到了 authorized_keys。
排查过程:
- SSH config 问题 — 配了不存在的
id_rsa私钥,改了。 authorized_keys换行丢失 — 通过 SMB(F: 盘)追加公钥时,旧文件末尾没有换行,导致新旧两行粘在一起。用cat -A检查后修复。- 权限问题 — 这是坑最大的。SMB 写文件不会正确保留 Unix 权限,sshd 要求
~/.ssh必须是 700、authorized_keys必须是 600、家目录不能 group-writable。修复命令:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 750 ~
第三关:sshpass 吃特殊字符
密码里有个 @,sshpass -p 参数怎么传都报 Permission denied。试了引号、转义、文件读取都不行。后来发现不是工具问题,是密码本身在 NAS 上已经不是这个了——手动输入能登,说明只是自动化传输特殊字符有问题。解决:不用密码,用密钥。
推送
两个仓库 novel-hub 和 rl-atari 推上去。Novel 秒推,rl-atari 有 2.2G(含 PDF 文件),SSH 推这个体量的仓库慢得离谱,换成 HTTP 一次过:
git remote set-url origin http://192.168.5.8:3000/LHY/rl-atari.git
git push -u origin main
推完切回 SSH,日常小 update 没压力。
效果
现在 http://192.168.5.8:3000 就是我的代码中心:
- Web 界面和 GitHub/Gitee 一模一样:Issues、Pull Request、Wiki、Actions
- 局域网内 push/pull 走 NAS 千兆,几秒搞定
- 不需要互联网,代码完全在自己硬盘上
- 想建多少个私有仓库都行,不受任何限制
后续
下一步打算:
- 用 Cloudflare Tunnel 把 Gitea 暴露到公网,不在宿舍也能 push
- 给 Gitea 配 GitHub Actions Runner,实现本地 CI/CD
- 把学校课程设计的代码库全部迁移过来
总结:自托管 Git 服务的门槛比想象中低很多。Docker 部署十分钟,SSH 排错花了大半天。核心教训——校园网封 22 端口、SMB 写文件要注意权限、密钥比密码靠谱。