# 在宿舍 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 写文件要注意权限、密钥比密码靠谱。