自建 Git 远端备份:通过 IPv6 从外网访问私有仓库
为什么自建 Git 远端?
GitHub、Gitee 固然好用,但代码完全托管在别人服务器上。如果你有自己的服务器和公网 IPv6,完全可以搭建一个私有 Git 远端备份库,零成本、数据完全自主可控。
本文记录在华为 RH2288-V3 服务器上搭建 Git 远端服务,并通过 IPv6 从外网访问的完整过程。
服务器配置
1. 创建专用用户
为 Git 创建一个独立用户,专用于代码远端备份,与博客、DDNS 等服务隔离:
# SSH 登录服务器(root)
ssh root@你的服务器IP
# 创建 git 组和用户
useradd -m -g git -s /bin/bash git_xiaoajun
echo 'git_xiaoajun:你的密码' | chpasswd
# 创建仓库目录
mkdir -p /home/git_xiaoajun/repos
chown -R git_xiaoajun:git /home/git_xiaoajun/repos
# 初始化 SSH 目录
mkdir -p /home/git_xiaoajun/.ssh
chmod 700 /home/git_xiaoajun/.ssh
chown -R git_xiaoajun:git /home/git_xiaoajun/.ssh
2. 创建远端仓库(bare)
# 切换到 git 用户
su - git_xiaoajun
# 创建一个空仓库
git init --bare ~/repos/my-project.git
--bare 表示裸仓库,没有工作目录,只存 Git 数据,专门用于远端备份。
从外网访问(IPv6)
由于服务器有公网 IPv6 并通过 DDNS 绑定了域名 xiaoajun.cn,可以直接用域名访问:
# 添加远端
git remote add backup git_xiaoajun@xiaoajun.cn:/home/git_xiaoajun/repos/my-project.git
# 推送所有分支
git push backup --all
# 推送标签
git push backup --tags
注意:访问端也必须有 IPv6 网络(现在几乎所有宽带和手机热点都支持了)。
免密登录(SSH Key)
每次都输密码很麻烦,配置 SSH 密钥免密登录:
# 在本地电脑生成密钥(如果没有的话)
ssh-keygen -t ed25519 -C "git-backup"
# 把公钥上传到服务器
# 方法1: 用 ssh-copy-id(推荐)
ssh-copy-id git_xiaoajun@xiaoajun.cn
# 方法2: 手动复制
cat ~/.ssh/id_ed25519.pub | ssh git_xiaoajun@xiaoajun.cn \
"cat >> ~/.ssh/authorized_keys"
配置完成后,push/pull 无需密码。
完整工作流
本地项目 远端备份(服务器)
┌──────────┐ git push ┌──────────────────┐
│ 开发代码 │ ─────────────→ │ /home/git_xiaoajun│
│ 日常提交 │ │ /repos/project.git │
└──────────┘ └──────────────────┘
↑ IPv6 公网
│ xiaoajun.cn
│
git clone
git_xiaoajun@xiaoajun.cn:/home/git_xiaoajun/repos/project.git
日常使用命令
新项目关联远端
cd my-project
git init
git add .
git commit -m "初始化"
git remote add origin git_xiaoajun@xiaoajun.cn:/home/git_xiaoajun/repos/my-project.git
git push -u origin main
已有项目添加备份远端
git remote add backup git_xiaoajun@xiaoajun.cn:/home/git_xiaoajun/repos/my-project.git
git push backup --all
从远端克隆
git clone git_xiaoajun@xiaoajun.cn:/home/git_xiaoajun/repos/my-project.git
查看所有远端
git remote -v
# origin https://github.com/user/repo.git (fetch)
# backup git_xiaoajun@xiaoajun.cn:/home/git_xiaoajun/repos/my-project.git (push)
安全加固(可选)
如果想让 git_xiaoajun 用户只能做 Git 操作,不能登录 Shell:
# 限制 git_xiaoajun 使用 git-shell(只能执行 Git 命令)
usermod -s /usr/bin/git-shell git_xiaoajun
注意:部分系统 git-shell 路径可能是 /usr/lib/git-core/git-shell,用 which git-shell 确认。
服务器信息速查
| 服务器 | hw-RH2288-V3 (华为) |
| 外网访问 | xiaoajun.cn (通过 DDNS 自动更新) |
| Git 用户 | git_xiaoajun |
| 仓库路径 | /home/git_xiaoajun/repos/ |
| 认证方式 | 密码 / SSH Key |
| 协议 | IPv6 + SSH |
优势总结
- 零成本:自有服务器,不花一分钱
- 数据自主:代码在自家硬盘上,不怕平台跑路
- 速度快:IPv6 直连,不走中转
- DDNS 保障:即使 IPv6 前缀变化,域名自动更新,远端地址永远可达
- 隔离安全:独立用户 git_xiaoajun,不影响博客和其他服务
补充:批量备份本地仓库
写一个脚本一键推送所有本地仓库:
#!/bin/bash
# 备份所有本地仓库到服务器
REPOS=(
"~/projects/project-a"
"~/projects/project-b"
"~/projects/ddns-scripts"
)
SERVER="git_xiaoajun@xiaoajun.cn"
for repo in "${REPOS[@]}"; do
echo "=== 备份: $repo ==="
cd "$repo"
remote_name=$(basename "$repo")
# 创建远端仓库(首次)
ssh $SERVER "git init --bare ~/repos/${remote_name}.git" 2>/dev/null
# 添加远端并推送
git remote add backup $SERVER:/home/git_xiaoajun/repos/${remote_name}.git 2>/dev/null
git push backup --all --force
echo ""
done
echo "全部备份完成!"
多仓库管理
实际开发中通常有多个项目,每个项目一个 bare 仓库,统一放在 ~/repos/ 下:
/home/git_xiaoajun/repos/
├── blog-theme.git ← 博客主题
├── ddns-scripts.git ← DDNS 脚本
├── stm32-project.git ← 单片机项目
├── cadence-pcb.git ← PCB 设计
└── my-tools.git ← 工具脚本
仓库管理脚本
在服务器上装一个管理工具,一行命令搞定所有操作:
# SSH 登录服务器
ssh root@xiaoajun.cn
# 创建管理脚本
cat > /usr/local/bin/git-xj << 'SCRIPT'
#!/bin/bash
REPO_BASE="/home/git_xiaoajun/repos"
case "$1" in
create)
# 创建远端仓库: git-xj create 项目名
[ -z "$2" ] && { echo "用法: git-xj create <项目名>"; exit 1; }
sudo -u git_xiaoajun git init --bare "$REPO_BASE/$2.git" && \
echo "✅ 仓库已创建: $2.git" && \
echo " 远端地址: git_xiaoajun@xiaoajun.cn:$REPO_BASE/$2.git"
;;
list)
# 列出所有仓库: git-xj list
echo "=== 远端仓库列表 ==="
for r in "$REPO_BASE"/*.git; do
[ -d "$r" ] || continue
name=$(basename "$r" .git)
size=$(du -sh "$r" | cut -f1)
echo " $name ($size)"
done
;;
delete)
# 删除仓库: git-xj delete 项目名
[ -z "$2" ] && { echo "用法: git-xj delete <项目名>"; exit 1; }
read -p "确认删除 $2.git?(y/N) " confirm
[ "$confirm" = "y" ] && rm -rf "$REPO_BASE/$2.git" && echo "✅ 已删除: $2.git"
;;
*)
echo "用法:"
echo " git-xj create <项目名> 创建新仓库"
echo " git-xj list 列出所有仓库"
echo " git-xj delete <项目名> 删除仓库"
;;
esac
SCRIPT
chmod +x /usr/local/bin/git-xj
使用示例
# 创建仓库
git-xj create my-blog-theme
# ✅ 仓库已创建: my-blog-theme.git
# 远端地址: git_xiaoajun@xiaoajun.cn:/home/git_xiaoajun/repos/my-blog-theme.git
# 查看所有仓库
git-xj list
# === 远端仓库列表 ===
# blog-theme (2.3M)
# ddns-scripts (156K)
# stm32-project (8.1M)
# 删除仓库
git-xj delete my-blog-theme
本地多项目一键推送
# 在本地电脑上,一键推送所有项目
#!/bin/bash
SERVER="git_xiaoajun@xiaoajun.cn"
REPOS=(
"D:/Projects/blog-theme"
"D:/Projects/ddns-scripts"
"D:/Projects/stm32"
)
for repo in "${REPOS[@]}"; do
name=$(basename "$repo")
echo ">>> $name"
cd "$repo" || continue
# 首次需要先建远端: ssh $SERVER "sudo git-xj create $name"
git remote add backup $SERVER:/home/git_xiaoajun/repos/${name}.git 2>/dev/null
git push backup --all
done
echo "✅ 全部推送完成"
总结
有了公网 IPv6 + DDNS + 自建 Git,你就拥有了一个完全自主可控的代码远端备份方案。任何有 IPv6 网络的地方——家里、公司、手机热点——都能随时 push/pull。配合 SSH Key 免密登录,使用体验和 GitHub 一样流畅。