春风得意马蹄疾 记录技术,分享生活
随笔: 35 分类: 15 评论: 2 阅读: 7,313

自建 Git 远端备份:通过 IPv6 从外网访问私有仓库

📅 发表于 2026-06-23 11:33:53 👁 阅读 174 次 💬 评论 0

为什么自建 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 一样流畅。

📂 分类:服务器维护
评论 (0)
技术分享者 · 记录成长的每一步
✨ 特效 ON