Files
Obsidian/博客/AI与大模型/自建Git服务-在NAS上部署Gitea.md
Serendipity 2dd12d0b67 chore: 清理 .trae 旧文件,新增多篇博客文章
- 删除 .trae/ 目录(Trae IDE 旧配置)
- 删除 temp-agent-os-v2.md
- 新增:AI时代的Token战争——能源算力与我们每个人的选择
- 新增:自建Git服务——在NAS上部署Gitea
- 新增:Docker安装与入门指南
- 更新:Git团队协作指南
- 更新:recent-files-obsidian 插件数据
2026-07-23 22:02:35 +08:00

125 lines
4.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 在宿舍 NAS 上搭建 Gitea:一个自己的 GitHub
> 校园网封了 22 端口?SMB 写文件权限炸了?sshpass 吃特殊字符?两天踩的坑都在这了。
## 起因
手上项目越来越多,GitHub 国内访问不稳定,Gitee 又有仓库数量限制。刚好手边有台绿联 DXP-2800 NASN100 处理器,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 文件很简单:
```yaml
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 秒通:
```bash
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`
排查过程:
1. **SSH config 问题** — 配了不存在的 `id_rsa` 私钥,改了。
2. **`authorized_keys` 换行丢失** — 通过 SMB(F: 盘)追加公钥时,旧文件末尾没有换行,导致新旧两行粘在一起。用 `cat -A` 检查后修复。
3. **权限问题** — 这是坑最大的。SMB 写文件不会正确保留 Unix 权限,sshd 要求 `~/.ssh` 必须是 700、`authorized_keys` 必须是 600、家目录不能 group-writable。修复命令:
```bash
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 一次过:
```bash
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 写文件要注意权限、密钥比密码靠谱。