This repo provides simple sync job control.
Default database name: mirrors
Columns:
index: index, primary keyid: name of the mirror, also unique indentifierstate: state of the mirror, in{'error','sync','done'}lastSyncTime: timestamp (in milliseconds) of last syncnextSyncTime: timestamp (in milliseconds) of next syncdiskUsage: disk usage in string formlogPath: where the lastest logfile is
to create table:
CREATE TABLE `status`(
`index` INT UNSIGNED AUTO_INCREMENT ,
`id` VARCHAR(50) NOT NULL,
`state` VARCHAR(20) NOT NULL,
`lastSyncTime` BIGINT UNSIGNED DEFAULT 0,
`nextSyncTime` BIGINT UNSIGNED DEFAULT 0,
`diskUsage` VARCHAR(30) DEFAULT '',
`logPath` VARCHAR(100) DEFAULT '',
`laststate` VARCHAR(20) NOT NULL,
PRIMARY KEY (`index`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;-
GET /statusreturns current status in JSON
an example of response:
[ { "id": "manjaro", "state": "done", "lastSyncTime":1615911140966, "nextSyncTime":1615997400000, "diskUsage":"100.43G" } ]
CAUTION: Following APIs should be accessed by admin only.
-
GET /stop/$idstop the job with id=
$idreturns a JSON
// success {"status":"ok"} // failure {"status":"failed","reason":"?"} -
GET /start/$idstart the job with id=
$idreturns a JSON
// success {"status":"ok"} // failure {"status":"failed","reason":"?"} -
GET /log/$idreturn the job's latest log
Configuration file is ./config.json by default. You can assign custom configuration path by adding -c <path> in command-line.
Here is an example of full configuration
{
"mirrors": [
{
"id": "manjaro",
"schedule": "10 0 * * *",
"provider": "rsync",
"params": {
"url": "rsync://mirror.yandex.ru/mirrors/manjaro/"
},
"metadata": {
"name": "Manjaro",
"url": "/manjaro/"
},
"file-custom": [
"alias /abc/def/;"
]
},
{
"id": "opensuse",
"schedule": "0 */8 * * *",
"provider": "rsync",
"params": {
"url": "rsync://fr2.rpmfind.net/linux/opensuse/",
"exclude": "{history,ports,source}",
"dest": "/data-tmp/opensuse"
}
},
{
"id": "custom",
"schedule": "10 0 * * *",
"provider": "shell",
"params": {
"cmd": "node ./update_custom.js"
}
}
],
"concurrency": 2,
"log_dir": "/data/log/sync/",
"repo_dir": "/data/repos/",
"rsync": {
"command": "rsync -avHh --delete --delete-after --delay-updates --safe-links --stats --no-o --no-g"
},
"mysql": {
"host": "127.0.0.1",
"user": "sync",
"password": "123456",
"database": "sync"
},
"port":3000
}Attention: metadata in a mirror is used to render mirror list.
here is an example:
"metadata": {
"url": "/ubuntu/",
"name": "Ubuntu",
"help": "Ubuntu",
"describe": "A Ubuntu mirror"
}
The describe will show when your mouse hover on the link.
The help should satisfy the requirement in website/src/components/help/Ubuntu.vue currently
Be aware:
mirrorsstores the list of sync jobs, in whichscheduleis a cron-style string indicating frequency (more info). We implemented two providers,rsyncandshell, you can use them as the way shown above.mysqlstores the database connection params. See mysql for more info.concurrencylimits the max concurrency of run_queue.
Typical way:
- clone the repo
- modify the configuration
node index.js
You can assign configuration file by node index.js -c <path> or node index.js --conf <path>.
We also provides systemd service.
Remember to modify WorkingDirectory & ExecStart in backend.service to correct path before use
# cp backend.service /etc/systemd/system
# systemctl start backend.service
- manual kill
- manual start sync job
- status + disk usage (of *** job)
- hot reload config (get/update)
- restart(kill all running job & restart)
- rsync provider
- add dynamic proxy function => tip: use nginx_http_dyups_module in nginx and dynamicly change upstream
- may need a slave sync controller run on the second machine to avoid sync the same mirror at a same time