2dd12d0b67
- 删除 .trae/ 目录(Trae IDE 旧配置) - 删除 temp-agent-os-v2.md - 新增:AI时代的Token战争——能源算力与我们每个人的选择 - 新增:自建Git服务——在NAS上部署Gitea - 新增:Docker安装与入门指南 - 更新:Git团队协作指南 - 更新:recent-files-obsidian 插件数据
125 lines
4.5 KiB
Markdown
125 lines
4.5 KiB
Markdown
# 在宿舍 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 文件很简单:
|
||
|
||
```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 写文件要注意权限、密钥比密码靠谱。
|