welcome: please sign in
location: MirrorMaintenance

镜像维护手册

镜像站的技术架构请看 MirrorsArch

代码仓库概览

镜像站的所有代码都用 Git 维护(Git 新手请看 GitQuickstart),都采用 ssh 协议同步,此外还有一个只读的 Web 前端 。现有以下 Git repo:

箭头前面是 bare repo 在 solar 上的路径。它们均借助 post-receive hook,在修改者 push 的时候自动将新版本检出(checkout)到箭头后面所指的目录里面去。此外对于脚本 repo scripts.git,post-receive 还会 sudo 成为相应用户(mirror)更新 crontab (执行 crontab etc/crontab)。详见代码

写权限

solar 上的 repo 们借助 Posix ACL(AclHowto),对整个 mirror 组的用户开放写权限,并且允许 mirror 组成员 sudo 成为 mirror

镜像同步脚本维护

注意:solar 的总协调人是 xiaq,重大的改动一定要事先跟 xiaq 商量。最好可以事先在列表中和大家讨论。

使用 nginx 提供镜像的 HTTP 访问:http://mirrors.tuna.tsinghua.edu.cn有一个例外:apache 仓库使用 apache 提供访问。

我们还提供 RSYNC 访问,使用如下命令列出可访问的镜像列表:

rsync rsync://mirrors.tuna.tsinghua.edu.cn

一些信息:

同步脚本代码库的目录结构:

.:
bin    可执行文件目录
etc    配置文件目录
log    日志文件目录

./bin:
run    (调试用)手工同步某镜像
sync    主要镜像同步脚本
sync.*  特殊镜像的专用同步脚本
mkstatus     生成某一镜像的同步状态文件
sumstatus    汇总所有的镜像同步状态

./etc:
CTAN.conf               CTAN 镜像配置脚本
debian-multimedia.conf  debian-multimedia 镜像配置脚本
gnu.conf                gnu 镜像配置脚本
sample.conf             配置脚本范例 + 原型
crontab                 镜像同步的 cron 任务

./log:
<distro>/ftpsync.log.N  同步脚本的日志
<distro>/rsync.error.N  rsync 的错误输出
<distro>/rsync.log.N    rsync 的标准输出

http 访问方式(只读):

git clone http://mirror.tuna.tsinghua.edu.cn/~git/mirror/scripts.git

ssh 访问方式(读写):

git clone <your_tuna_id>@solar.tuna.tsinghua.edu.cn:/home/git/mirror/scripts.git

添加新镜像的配置流程

  1. 在本机用上面的 clone 命令之一取得仓库;
  2. 复制 ./etc/sample.conf,重命名,比如叫做 foobar.conf(脚本依照名字来确定同步的文件夹和日志名,所以尽量符合规范吧);修改 foobar.conf,首先是 $IPV6, $RSYNC_HOST, $MAILTO 变量等;如果是linux源,需要对照 mirror 的树形结构修改 $ARCH_EXCLUDE 变量,排除不需要的架构,然后依照示例编写一段 $EXCLUDE 的脚本。
  3. 执行 git add foobar.conf 添加版本控制;执行 git commit 本地入库。按照惯例,注释分两段,第一行为短小的简介,之后的随便你发挥。检查无误后,执行 git push 远程入库。

  4. SSH 到 solar 上,运行 /home/ftp/bin/run foobar 第一次同步镜像,其实就是 sudo 成 mirror,sync foobar,bg,切换回,详见 run 脚本代码。期间使用 tail -f log/foobar/* 检查同步过程是否正常。

  5. 一切正常的话,编辑 etc/crontab 文件,按照你想要的时间间隔添加新镜像的 cron 任务。之后 git commit 提交, git push 推送到 solar 上的代码库。

镜像站网站维护

镜像站门户首页等文件(php, css, js, ...) 由 Git 进行版本控制。

如果之前没有 clone 过门户的代码仓库,需要先 clone 一个:(已经 clone 过旧版仓库的可以跳过此步骤)

git clone <your_tuna_id>@solar.tuna.tsinghua.edu.cn:/home/git/mirror/web.git

然后切换到本地仓库的顶层工作目录中(cd web/),在本地把两个 bare repo 都加为远程仓库:

git remote add staging <your_tuna_id>@solar.tuna.tsinghua.edu.cn:/home/git/mirror/stg.web.git
git remote add livewww <your_tuna_id>@solar.tuna.tsinghua.edu.cn:/home/git/mirror/web.git

OK 之后,记得将两个远程仓库的内容更新到本机:

git remote update

这样之后,其实 origin 就不需要了,可以删除:

git remote rm origin

先不要着急 push,我们需要调整一下 push 的行为。 请修改本地仓库里的 .git/config 文件,在文件中两个远程仓库对应配置中指定 push 方式,添加 push = 开头的两行,结果应和下面的类似:

[remote "staging"]
        url = <your_tuna_id>@solar.tuna.tsinghua.edu.cn:/home/git/mirror/stg.web.git
        fetch = +refs/heads/*:refs/remotes/staging/*
        push = refs/heads/master:refs/heads/master
[remote "livewww"]
        url = <your_tuna_id>@solar.tuna.tsinghua.edu.cn:/home/git/mirror/web.git
        fetch = +refs/heads/*:refs/remotes/livewww/*
        push = refs/remotes/staging/master:refs/heads/master

好的,配置工作已经大功告成。之后一般的工作流程是:

先在本地做修改,执行 git commit 本地入库。

然后将本地提交内容推送到网站的 staging 区域:

git push staging

可以通过浏览器访问 http://mirrors.tuna.tsinghua.edu.cn/stg/ 查看修改后的结果是否正常/满意。

如果感觉可以,再使用下面命令将 staging 中的提交推送到实际的网站路径上:

git push livewww

NOTE: 如果发现推送不成功,记得先 git remote updategit fetch

参考文献:http://www.ellipsix.net/blog/post.209.html


CategoryManual

MirrorMaintenance (2013-01-19 22:54:15由alick编辑)