MirrorZ
Your next MirrorS is not MirrorS, nor MirrorSes, it's MirrorZ.
A final site for Mirror sites.
Demo
Intro
Mirror sites are heterogeneous. It is hard for a single mirror to provide all mirrors, so differences occur.
For end users, this is not a good experience as they need to search for available mirrors.
To make things easy, MirrorZ is intended to include all mirrorS, so a unified interface is needed.
Data Format v1.7
A mirrorz.json in the following format describes all the data of one mirror site in MirrorZ.
{
"version": 1.7,
"site": {
"url": "https://example.org",
"logo": "https://example.org/img/logo.svg",
"logo_darkmode": "https://example.org/img/logo-white.svg",
"abbr": "EXAMPLE",
"name": "样例镜像站",
"homepage": "https://blog.example.org",
"issue": "https://github.com/example/issues",
"request": "https://github.com/example/mirror-request",
"email": "[email protected]",
"group": "QQ: 10086 and/or Telegram @something",
"disk": "may be any string showing usage of disk, e.g. usage",
"note": "may be any string; like speed limit or connection limit",
"big": "/speedtest/1000mb.bin",
"disable": false
},
"info": [
{
"distro": "Debian",
"category": "os",
"urls": [
{
"name": "10.7.0 (amd64, CD installer with xfce)",
"url": "/debian-cd/current/amd64/iso-cd/debian-10.7.0-amd64-xfce-CD-1.iso"
}
]
}
],
"mirrors": [
{
"cname": "AOSP",
"desc": "Android 操作系统源代码",
"url": "/AOSP",
"status": "S",
"help": "/help/AOSP/",
"upstream": "https://android.googlesource.com/mirror/manifest",
"size": "596G",
"disable": false
},
{
"cname": "AUR",
"desc": "Arch Linux 用户软件库",
"url": "https://aur.tuna.tsinghua.edu.cn",
"status": "S1612195849X1612196849N",
"help": "/help/AUR/",
"upstream": "https://aur.archlinux.org/"
}
]
}
Notes
versionis optional for version 1.x
siteprovides the global info about one mirror site
site.url and site.abbr are mandatory
- site.logo should not be of format ico. Also, at least 64x64 resolution is required
- site.logo_darkmode is used when browser uses dark mode. Note that it should be set only after site.logo is set
- site.url should not end with slash /
- site.big should be a valid url to a big file, allowing clients to do speedtest when requesting mannerly.
- site.disable is a boolean value, indicating whether the site is available for service. Its default value is false. If true, this site will be marked as disabled in mirrorz webpage, and mirrorz-302 will not redirect to the site
infois used for category view
info is mandatory
- info may be left empty as []
- the name of info.distro should be agreed and have a mapping, maintained in cname.json
mirrorsis used for list view
mirrors.cname should be agreed and have a mapping, maintained in cname.json
- mirrors.desc may differ for each mirror site since there are excludes for some mirror site
- mirrors.desc may be empty
- if mirrors.url begins with a slash /, it should be appended to site.url to form a full url
- mirrors.url should not end with slash /
- mirrors.status is a concat of strings of pattern A-Z?. Only one main status is allowed; the number of auxiliary status is not limited.
- S1600000000: successful. (optional) last successful ended unix timestamp
- D1600000000: pending. (optional) pending to sync unix timestamp
- Y1600000000: syncing. (optional) start to sync unix timestamp
- F1600000000: failed. (optional) last attempt to sync unix timestamp
- P1600000000: paused. (optional) the unix timestamp sync stopped
- C: reverse proxy with cache
- R: reverse proxy without cache
- U: unknown
- X1600000000: (auxiliary) next scheduled sync unix timestamp
- N1600000000: (auxiliary) new mirror. (optional) unix timestamp the repo added
- O1600000000: (auxiliary) old successful timestamp, used only when it is syncing, pending or failed
- mirrors.help may be empty, or the same rule as mirrors.url
- mirrors.upstream, mirrors.size, mirrors.disable may be empty
Developing and Contributing
Repo organization
This repo depends on other repos in this organization to provide full functionality; However, they are not submodules as we need to bump submodules whenever there is an update, which is painful. We just use the latest version of each repo when building.
For full preparation of all the repos, you should refer to the Prepare steps in Github Actions.
Note that yarn mirrorz_env prepares for yarn dev_env and yarn debug_build, which builds the site for env like cngi_env and cernet_env prepares for other sites that mirrorz maintain.
Frontend
HTML/CSS
One may use
yarn --frozen-lockfile
yarn start
to start a local server. It is often convenient for debugging frontend features like html/css since auto-reload is provided by parcel.
Parser, local new static files
To debug one parser from src/config/parser with new site json in src/config/json-site, use
yarn --frozen-lockfile
yarn full_start
to start a local server. Python3 is required in this case. Note there is no auto-reload feature.
Static files
To use static files and 404 redirection (emulate Github pages), one may use
yarn --frozen-lockfile
yarn full_start
to start a local server. Python3 is required in this case. Note there is no auto-reload feature.
Deployment
One may use
yarn build
to build the site. postbuild is run via yarn postbuild (or automatically after full_start) to copy static assets.
If one want all parts, one can use the following command to accomplish all the steps above
yarn full_build
Misc
Currently *.json is ignored in .gitignore (not ignored in /static). If one wants to commit a json file, they should use git add -f.
Contributing
Other contributing guidelines are maintained in