镜像站部署与维护指南

镜像站好像开了有半年了,第一次同步还是去年十一月,把文档补一下…

实现就是一个非常非常简陋的文件服务器,Linux 课大作业能写的一定也能搭…

准备

三楼机房电脑一台,安装 Ubuntu 20.04。1T 机械硬盘,格式化成 Ext4,挂载到 /mnt/socoding

挂载的各种最佳实践 ArchWiki 有。

/etc/fstab

UUID=c9749c1c-a066-4512-9d77-81dbee17d5cf /mnt/socoding ext4 defaults,noatime,commit=60 0 1

Fancyindex

文件服务器就少不了 NGINX,/mnt/socoding/files 作为站点根目录。

$ sudo apt install nginx-extras

觉得单纯列出文件太单调了,把 Fancyindex 安排上,主题是 这个,如果是我二次开发完成的那就是 这个。很不巧的是,由于笔者我编程习惯不好,静态资源引用时路径写死是 fancyindex 了,又懒得改,如果你是下一任维护者可以把这件事情做一下。这里 clone 下来必须命名为 fancyindex

$ git clone https://github.com/SCNU-SoCoding/mirror-site.git fancyindex

然后把依赖装一下,其实就是把 material-design-litevue 给安装到主题目录里面。

$ npm install

首页文件丢进 Fancyindex 仓库里面一起维护了,把首页文件链接到根目录。

$ ln -s fancyindex/index.html index.html

NGINX

在内网访问下面网址都要进入镜像站 :

外网:

mirrors-internal.socoding.cn 的 SSL 证书可以在腾讯云申请,这里 有证书安装教程。

注意 10.191.65.243:9000 是用不了小绿锁的;mirrors.socoding.cn 上个 Frp 内网穿透即可。

这里是最后的配置文件(学院服务器):

/etc/nginx/sites-enabled/files
/home/scnuoj/frp_0.34.3_linux_amd64/frpc.ini

现在 systemctl restart nginx 一下看看首页看起来正不正常,随便建点目录直接浏览器地址栏进去看看正不正常(首页直接展示 index.html 的)。

同步实现

从最简单的全量同步开始,ArchWiki 看到一半就能找到救星:

You can use rsync directly or this script as a starting point.

直接开抄,发现有几个参数需要我们来填写,顺便就建立了下面几个目录。

  • /mnt/socoding/mirror-sync - 放同步脚本用的。
  • /mnt/socoding/mirror-pending - 同步时下载中的文件就临时存这里。
  • /mnt/socoding/mirror-log - 存日志用的。

考虑到一件事情就是全量同步 Arch Linux 和 Manjaro 等仓库的时候也就文件开头的几个参数不一样,其它都是一样的。

那就执行 Shell 脚本时,再向脚本传递参数好了,完成的文件是这样子的(这里上游就直接全部钦定广度优先搜索大学了):

/mnt/socoding/mirror-sync/bfsu-rsync.sh

像 Debian 和 Ubuntu 这些如果全量同步就要爆空间的咋办,只能部分同步了。稍作搜索发现 debmirror 神器,参数也容易读懂,可以直接自己写。

同样的,没法复用的部分就执行 Shell 脚本时,再向脚本传递参数好了,完成的文件是这样子的(这里上游就直接全部钦定金枪鱼了):

/mnt/socoding/mirror-sync/tuna-debmirror.sh

备注:debian 仅同步稳定版本 amd64 架构大概只需要 100G 空间。

定时同步

本来是直接 Systemd Timer 的,但是用 GitHub Actions 同步的话失败了可以给我发邮件,图个省事。

GitHub 上使用自托管 Runner 是免费的,私有仓库也免费。考虑到公开仓库的话,别人一个 PR 发过来如果就是新增 workflow 的还是执行危险命令的还是指定在自托管 Runner 运行的话那就真的完蛋了,无论你合不合并只要你发它就会运行,所以务必设置成私有仓库。

下面是截至 4 月 18 日的配置文件:

.github/workflows/debmirror.yml
.github/workflows/rsync.yml

有访问权限的软协同学可以到 这里 看。

权限控制

学院服务器裸机我也配置为 GitHub Runner 了,考虑到学院服务器还跑着 SCNUOJ,想着把权限分一下,不然误操作人就没了。就专门拉一个 Docker 镜像来管辖镜像站同步,容器实例本身作为一个 Runner。之前装了 Docker CE 这里就直接开整了(Podman 好像进 Ubuntu 20.10 官方源了),注意要把镜像站目录映射过去。

# docker pull ubuntu
# docker run --name mirror -it -v /mnt/socoding:/mnt/socoding ubuntu /bin/bash

各种初始化略过,一些可能需要到的包如下,另外可能需要一个普通用户。

# apt install curl rsync debmirror python3 sudo screen

在容器里面配置 GitHub Runner,文档在 这里,配置的时候会另外要求你装一些依赖,运行它提供的脚本即可。最后在 workflow 里面指定这个 Runner 运行同步任务。

站点首页

按理来说把 index.html 删掉也没大问题,但是部分同步(甚至手动同步)的仓库比较多,加上可以整一些说明性内容上去,避免坑到用户。目前的设计大概是,一个发行版的东西放一栏,每一栏先是展示发行版名称和描述,然后展示同步信息(收录架构和版本、上游、同步状态),最后是软件仓库目录和使用文档等相关链接。

由于每栏的东西都差不多,开了一个 JSON 维护,然后用 Vue 做数据绑定。

/mnt/socoding/files/fancyindex/data/supported_os.json

关于同步状态的显示,目前的实现就是直接将同步状态写入这个文件,在同步的时候顺便完成。同步状态成功与否就取决于 rsyncdebmirror 命令的返回值是否为 0,不过我还是主要看有没有收到邮件…

/mnt/socoding/mirror-sync/util/update-status.py

1赞
粤 ICP 备 2020080455 号