
ããã¯ãã·ã¹ãã 管çè
ã®äž»ãªåœä»€ãå®è¡ããããšããèªäœã®èªè»¢è»ã«é¢ãã話ã§ãããã¹ãŠãæ©èœããŸããããäœãããŸããã§ããã ïŒ
ããã€ãã®ç޹ä»
éèŠ -ããã®æ
å ±ã¯ããæä»£é
ãã§ãäžè¬çãªèª¬æã¯å€æŽãããŠããŸããããæ§æã®äžéšã倿ŽãããŠãããããããã«githubã確èªããããšããå§ãããŸãã
ç§ãã¡ã¯æ°å¹ŽéïŒæ£ç¢ºã«ã¯2幎ïŒäŒç€Ÿã«åšç±ããŠãããLinuxãŸãã¯ã³ã³ããã«å
šé¢çã«ç§»è¡ããŠããŸãã å瀟ã§éçºäžã®ããã°ã©ã èªäœãLinuxã§åäœãããããç¹å¥ãªåé¡ã¯ãªãããã¹ã¯äºåã«æ±ºå®ãããŠããŸãã
ååãšããŠãADãFileServerãããã³ãã¹ãçšã®ä»ã®ãµãŒããŒã®ã¿ããããŸããã
æåã«æ»ã£ãŠãã³ã³ããã衚瀺ããããšãã«ãããããä¿åããæ¹æ³ã«ã€ããŠã®è³ªåãçºçããããã€ãã®ã¹ã¯ãªããããããŸããããæã§å€ãã®ããšãããªããã°ãªãããã³ã³ããã®æ°ãå¢ããŠè¿·æã«ãªããŸããã ãã®ãããã³ã³ãããŒïŒãµãŒããŒïŒWindowsããã³LinuxïŒããã®ããŒã¿ïŒãä¿åã§ããããã«ããã°ã©ã ãäœæããŸããã ããã¯ãnode.jsã§äœæããæåã®ããã°ã©ã ã§ãããããã«å¿ããŠé©åã§ããããæ©èœããŸããã æ°ãæåŸããšã©ãŒãèŠã€ããŸããããä¿®æ£ã§ããŸããã§ãããnode.jsã«ã€ããŠå°ãåŠãã ã®ã§ãasync / awaitã§ãã¹ãŠãæžãçŽãããšã«ããŸããããã®ãããæžããã2çªç®ã®ããŒãžã§ã³ãç»å ŽããŸããã
å®è£
äžã§æžããããã«ãnodebackupã¯ããŒã¿ã®ã¿ãä¿åã§ããŸãã å
éšã§ã¯ã éè€ãæ©èœããŸã ã Nodebackupã¯ãããŒã¿ãè€è£œããã ãã§æºåã§ããããã«ããŒã¿ãæºåããŸãã
ä»çµã¿
äžã®åçã¯ãã¹ãŠãããŸã説æããŠããŸãïŒç§ã¯èªåã§ãã£ãããšãé¡ã£ãŠããŸãïŒïŒïŒããèšèã§ç¹°ãè¿ããŸãã
4ã€ã®ã³ã³ããŒãã³ãïŒã¹ã¿ãŒã¿ãŒãexecãã¯ã©ã€ã¢ã³ãããµãŒããŒïŒãããããããã¯ãã¹ãŠåããµãŒããŒäžã«ãã£ãŠãç°ãªããµãŒããŒäžã«ãã£ãŠããããå€ãã®ã¯ã©ã€ã¢ã³ãããã£ãŠãããŸããŸããã
Starterã¯å®éã«ã¯nodebackupã§ãããnode.jsãããã°ã©ãã«ã§ãã€ã³ã¹ããŒã«ã§ããŸãã ã³ã³ããå
ã§åäœããŸãïŒåŸã§èª¬æããŸãïŒ
Exec-ã¹ã¿ãŒã¿ãŒã¯ãã®ãµãŒããŒã«æ¥ç¶ãããã§ã«ãããããã¹ãŠã®ã³ãã³ããå®è¡ããŸãã ããšãã°ãã€ã³ã¿ãŒããããããããã¯ãŒã¯ã«ä¿åããå¿
èŠãããå Žåã«åããŠããã®éšåãDMZã«é
眮ããŠãããã¯ã¢ãããµãŒããŒã«å転ãããŸãã
ã¯ã©ã€ã¢ã³ã -ããã¯å®éã«ã¯ä¿åãåé€ããããµãŒããŒã§ãããLinuxãWindowsããŸãã¯ããã«ãŒãã¹ãã«ããããšãã§ããŸãã
ãµãŒããŒã¯ãããŒã¿ãä¿åããããµãŒããŒã§ãã
Starterã«ã¯ããã®ãããªãµãŒããŒããããã®ã¯ã©ã€ã¢ã³ãã®ããã«ä¿åããã¯ã©ã€ã¢ã³ãã®æ§æããããã©ãåŠçããããæ¢ã«èšè¿°ããŠãããšèšãæ§æããããŸãã ã¯ã©ã€ã¢ã³ããããã«ãŒãã¹ãã®å Žåãã©ãã«ã¯åã³ã³ããããèªã¿åããããã®ã³ã³ããã§äœããããã瀺ãããŸãã
æ§æ

ãããã£ãŠãnodebackupãã€ã³ã¹ããŒã«ãããŠãããµãŒããŒïŒããã¯ã¹ã¿ãŒã¿ãŒã§ãïŒã®ããã«ãnode.js> v6.5ãã€ã³ã¹ããŒã«ããã ãã§ãããšãã°3ã€ã®ãµãŒããŒïŒwindows fileserverïŒwinserverïŒãlinuxïŒfreepbxïŒãdocker hostïŒdockerhost1ïŒãªã©ïŒãã€ã³ã¹ããŒã«ããã ãã§ãããã¯backup2ã«ä¿åãããŸãã
backup2 -Exec / Serverã®åœ¹å²ãæããããã®äžã§æ©èœããã«ã¯ãcifsãduplicyãsshfsãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã smbãsshfsãããŠã³ãããŠfreepbxãµãŒããŒããããŒã¿ãããŠã³ãããã«ã¯Cifsãå¿
èŠã§ããããä¿åããã«ã¯éè€ãå¿
èŠã§ãã
ãŸããLinuxãŸãã¯ãã¹ãDockerã®å Žåãã¯ã©ã€ã¢ã³ãã¯sshããŒãã°ã€ã³ãå¿
èŠã§ãã
å®éãããã¯ãµãŒããŒäžã®ã»ããã¢ããå
šäœã§ããæ¬¡ã«ãnodebackupã®æ§æãäœæããŠã圌ãäœããã¹ãããç¥ãå¿
èŠããããŸãã
ãã®ãããconfig.yamlãã¡ã€ã«ãäœæããŸãããã®ãã¡ã€ã«ã¯nodebackupãã©ã«ããŒã«ããå¿
èŠããããŸãã
nodebackupã®æåã®éšå
starter: sshkey: id_rsa log: path: log
id_rsaã¯sshããŒã§ãããã®å Žåãåããã©ã«ããŒã«ãããŸãã
次ã®éšåã¯ããã¯ã¢ãããµãŒããŒçšã§ãïŒãã®å Žåãbackup2ïŒ
backupserver: backup2: passphrase: PASSPHRASE-FOR-DUPLICITY HOST: backup2.example.com USER: admin2 PORT: '22' prerun: '["echo prerun1", "echo prerun2", "echo prerun3"]' #postrun: '["echo postrun1","echo postrun2","echo postrun3"]' backuppath: /backup duplicityarchiv: /backup/duplicityarchiv backuppartsize: 2048 tmpdir: /backup/backuptemp backupfor: '["winserver", "freepbx", "dockerhost1"]'
ãã¹ãã¬ãŒãº-ä¿åãããã¹ã¯ãŒãããµãŒããŒã«ä¿åãããŠãããã¹ãŠã®ã¯ã©ã€ã¢ã³ãã«äœ¿çšãããŸã
prerunãpostrun-ããã¯ã¢ããã®ååŸã«ããããå®è¡ãããã³ãã³ã
backuppath-ããã¯ã¢ãããä¿åãããå Žæã
duplicityarchiv-ãªãã·ã§ã³ãéè€ã¯ããèªäœã®ããŒã¿ãä¿åããŸããå€ãã®ãªãã·ã§ã³ããããŸãããªãã·ã§ã³ãèšå®ããªãå Žåããã¹ãŠã¯/home/user/.config/duplicityã«ä¿åãããŸãã
backuppartsize-ããã¯ã¢ããã¯2048 MBã®æçã«åå²ãããŸããããã§ã¯ãç¬èªã®äœããæžã蟌ãããšãã§ããŸãã
backupfor-ããã«ã¯ã©ã€ã¢ã³ãã®ååãæžã蟌ãŸããŸãããããã®æ§æã«ã€ããŠã¯ä»¥äžã§èª¬æããŸãã
顧客ã®äžéšãšãªããæåã®winserver
clientserver: backup2: HOST: backup2.example.com USER: admin2 PORT: '22' sftpServer: sudo: true path: /usr/lib/sftp-server winserver: HOST: "windows.example.com" SMB: SET: "true" PATH: "d$" PASS: "userpass" DOMAIN: "example.com" USER: "backupservice" PORT: 22 backup: /cygdrive/d include: '["usershare", "publicshare", "GeschÀftsleitung"]' exclude: '["publicshare/Softwarepool", "**"]' confprefixes: '["asynchronous-upload", "allow-source-mismatch"]'
ãã®ããã°ã©ã ã¯äž»ã«Linuxåãã«äœæãããŠãããããããã§ãšã©ãŒãçºçããŸããèšå®ããåé€ã§ããªãã¢ãŒãã£ãã¡ã¯ããããã€ããããŸãããããã¯PORTãããã¯ã¢ããã§ãã
SMB-ããã¯å®éã«ã¯sambaã®èšå®ã§ããããã¡ã€ã³ã«ãªãå Žåã«ãµãŒããŒã§ã©ã®ããã«åäœããããããããŸãã
includeãexclude-ãã¹ã¯SMB / PATHããååŸãããincludeãããã«æ·»ä»ãããexcludeã¯ããã«å¿ããŠåé€ãããŸã
confprefixes-ããã§ãéè€ãããªãã·ã§ã³ã远å ã§ããŸããããã¯ãã¹ãŠããã¥ã¡ã³ãã«ãããŸãã
Linuxã§ãµãŒããŒã远å ããŸãããã®å Žåããã©ã«ããŒã®ã¿ãä¿åããå¿
èŠããããŸãã
freepbx: HOST: "freepbx.example.com" USER: root PORT: '22' nextfullbackup: 1M noffullbackup: 2 backup: /var/spool/asterisk/backup/taeglich prerun: '["mv /var/spool/asterisk/backup/taeglich/*.tgz /var/spool/asterisk/backup/taeglich/backup.tgz"]' postrun: '["rm -Rf /var/spool/asterisk/backup/taeglich/backup.tgz"]' confprefixes: '["asynchronous-upload"]'
nextfullbackup-æ°ããå®å
šããã¯ã¢ãããäœæãããåã«å¢åããã¯ã¢ãããå®è¡ã§ããéã瀺ããŸãã
noffullbackup-ããã¯ã¢ããã®æ°ïŒfullbackupsã®æ°ïŒ
prerunãpostrun-ããã¯ã¢ããã®ååŸã«å®è¡ãããã³ãã³ã
仿ãéèŠãªéšåã¯ã³ã³ããã®ããã¯ã¢ããã§ã
ãŸããconfig.yamlããã®æ§æ
dockerhost1: HOST: dockerHostN010912m.example.local USER: docker PORT: 22 docker: 'true' sftpServer: sudo: true path: /usr/lib/sftp-server
docker-trueã¯ããããdockerãã¹ãã§ããããšã瀺ããŸã
sftpServer-rootãæããªãããsudoïŒãã¹ã¯ãŒããªãïŒã®ãŠãŒã¶ãŒãããå Žåããã®èå¥ãå¿
èŠãªã®ã§ãubuntuã®ããã«ãªããŸã
ããã°ã©ã ã¯ããããdockerãã¹ãã§ããããšã確èªããåŸãdocker.sockïŒ/var/run/docker.sockïŒããã³ã³ãããŒã«é¢ããæ
å ±ãèªã¿åããé©åãªã©ãã«ãèŠã€ããå Žåã¯åLabelsã調ã¹ãããã¯ã¢ãããè¡ãããŸãã
ããã¯ãã©ãã«ãç»é²ãããŠããdocker-compose.yamlã®äžéšã§ãããã¯ã©ã€ã¢ã³ãã«é¢ããäžéšã®æ§æã®ããã«èŠããŸã
labels: prerun: '["echoc prerun1", "echo prerun2"]' postrun: '["echo postrun1","echo postrun2"]' nextfullbackup: "1M" noffullbackup: "2" backup: "/a/data/backup-new-test" strategy: "off" confprefixes: '["allow-source-mismatch"]' name: "backup-new-test" processes: '["httpd"]' failovercustom: "echo 'failover ####################'" passphrase: "+++++containerPASS#######"
prerunãpostrun-ã³ã³ããã§ã¯ãªããDockerãã¹ãã§å®è¡ãããŸãã
æŠç¥-ãã®ãªãã·ã§ã³ã¯ãããã¯ã¢ããã®ããã«ã³ã³ããããªãã«ããå¿
èŠããããã©ããã瀺ããŸãã éèŠïŒããã«ãããåããªã³ã¯ã³ã³ããããªãã«ãªããŸãã
name-ãªãã·ã§ã³ãããã¯ã¢ãããµãŒããŒäžã®ãã©ã«ããŒã®ååã«ãªããŸããããã«äœããªãå Žåã¯ãã³ã³ãããŒåããã®ãŸãŸäœ¿çšãããŸãã
ããã»ã¹-ããã¯ç£èŠãããã¯ããã®ãã®ã§ãããå¶ç¶ããã«å°éããŸããã
failovercustom-ãªãã·ã§ã³ã§ãããã¯ã¢ããäžã«ãšã©ãŒãçºçããå Žåããã®ã³ãã³ããå®è¡ããããã®ãªãã·ã§ã³ãååšããªãå Žåã¯ãåã«ãdocker start CONTAINER + LINKSã
ãã¹ãã¬ãŒãº-åã³ã³ããã«åå¥ã«ç»é²ããããšããããã«ãŒãã¹ãå
šäœã«ã°ããŒãã«ã«ç»é²ããããšãã§ããŸãã åªå
床ã¯ã³ã³ãããæ¬¡ã«dockerãã¹ãã§ãã
config.yaml starter: sshkey: id_rsa log: path: log backupserver: backup2: passphrase: PASSPHRASE-FOR-DUPLICITY HOST: backup2.example.com USER: admin2 PORT: '22' prerun: '["echo prerun1", "echo prerun2", "echo prerun3"]' #postrun: '["echo postrun1","echo postrun2","echo postrun3"]' backuppath: /backup duplicityarchiv: /backup/duplicityarchiv backuppartsize: 2048 tmpdir: /backup/backuptemp backupfor: '["winserver", "freepbx", "dockerhost1"]' clientserver: backup2: HOST: backup2.example.com USER: admin2 PORT: '22' sftpServer: sudo: true path: /usr/lib/sftp-server server2: HOST: "windows.example.com" SMB: SET: "true" PATH: "d$" PASS: "userpass" DOMAIN: "example.com" USER: "backupservice" PORT: 22 backup: /cygdrive/d include: '["usershare", "publicshare", "GeschÀftsleitung"]' exclude: '["publicshare/Softwarepool", "**"]' confprefixes: '["asynchronous-upload", "allow-source-mismatch"]' freepbx: HOST: "freepbx.example.com" USER: root PORT: '22' nextfullbackup: 1M noffullbackup: 2 backup: /var/spool/asterisk/backup/taeglich prerun: '["mv /var/spool/asterisk/backup/taeglich/*.tgz /var/spool/asterisk/backup/taeglich/backup.tgz"]' postrun: '["rm -Rf /var/spool/asterisk/backup/taeglich/backup.tgz"]' confprefixes: '["asynchronous-upload"]' dockerhost1: HOST: dockerHostN010912m.example.local USER: docker PORT: 22 docker: 'true' sftpServer: sudo: true path: /usr/lib/sftp-server
ååãšããŠãèšå®ãæ£ããèšå®ãããšãããŸããŸãªããšãã§ããŸã
ã³ã³ããã®å¥ã®äŸã 倧ããªããŒã¿ããŒã¹ãæã€ã³ã³ããã1ã€ãããããŒã¿ããŒã¹ãã³ããŒããããŸã§åŸ
æ©ããããªãã®ã§ãã³ã³ããããªãã«ããã¹ãããã·ã§ãããäœæããã³ã³ããããªã³ã«ããã¹ãããã·ã§ãããããã£ããããã¯ã¢ããããåŸã§æ¶å»ããŸããã³ã³ããã®æ§æã¯æ¬¡ã®ãšããã§ãã
labels: nextfullbackup: "1M" noffullbackup: "2" backup: "/cephrbd/mariadb-intern-prod/snapshot" prerun: '["sudo docker stop adito4internproddb_mariadb-dev_1 adito4internproddb_mariadb_1","sudo btrfs subvolume snapshot -r /cephrbd/mariadb-intern-prod /cephrbd/mariadb-intern-prod/snapshot","sudo docker start adito4internproddb_mariadb-dev_1 adito4internproddb_mariadb_1"]' postrun: '["sudo btrfs subvolume delete /cephrbd/mariadb-intern-prod/snapshot"]' strategy: "on"
ãŸãããã¡ããããµãŒããŒãããã©ã«ããŒãä¿åããå¿
èŠããããåããµãŒããŒãdockerãã¹ãã§ããå ŽåããããŸãããããæ©èœããŸãã
1ã€ã®config.yamlã«ã¯ã倿°ã®ããã¯ã¢ãããµãŒããŒãšå€æ°ã®ã¯ã©ã€ã¢ã³ããå«ããããšãã§ããŸãã ããšãã°ãHetznerããããã€ãã®ãµãŒããŒãããããããããã¹ãŠconfig.yamlã«ç»é²ãããŠããŸã
éå§ãã
config.yamlãã§ããã®ã§ãããã¯ã¢ãããäœæã§ããŸãã
ããŒã ãªã¹ã
/nodebackup
äŸ1
ããã¯ã¢ãããäœæããŸãã
node BackupExecV3.js -b -e backup2 -s backup2 -d/f
ããã°ã©ã ã¯config.yamlãèŠãŠãä¿åãããµãŒããŒã決å®ããŸãã ãã®åŸãããã¯ã¢ãããè¡ãããŸãã
äŸ2
åã
ã®ãµãŒããŒãŸãã¯ã³ã³ããã®ããã¯ã¢ãããäœæããŸã
node BackupExecV3.js -b -e backup -s bacup2 -t CONTAINERNAME -d/f
ããå°ãç°¡çŽ åãã
nodebackupãæåã§ã€ã³ã¹ããŒã«ããªãããã«ãDockerã®ã€ã¡ãŒãžãäœæããŸããïŒ ãã¡ã ïŒ
ãã®ã³ã³ããã¯ãconfig.yamlãcrontab.tmpãsshããŒã®3ã€ã®ãã¡ã€ã«ããã£ãŒãããå¿
èŠããããŸã
docker-compose.yaml
nodebackup: image: adito/nodebackup hostname: nodebackup environment: - SSMTP_SENDER_ADDRESS=no-reply@example.com - SSMTP_MAIL_SERVER=mail.example.com - SSMTP_HOST=nodebackup.example.com volumes: - ./config/config.yml:/nodebackup/config.yml:ro - ./config/id_rsa:/nodebackup/id_rsa:ro - ./config/crontab.tmp:/crontab.tmp:ro - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro - /a/data/nodebackup/log:/a/data/log restart: always
crontab.tmp
MAILTO=admin@example.com NODE_PATH=/usr/lib/nodejs:/usr/lib/node_modules:/usr/share/javascript
ãããã«
ä»ã®ã¿ããªããããã©ããã£ãŠãããããããªãã®ã§ãå°ãã°ãŒã°ã«ã§æ€çŽ¢ããŸãããããã®ãããã¯ã§è¯ãããšãèŠã€ããããŸããã§ãããå€åããã¯ããŸãæ£ç¢ºã§ã¯ãªããããããŸãããããšãŠãç°¡åã«ãªããŸããã
githubã®readmeã«ã¯ã埩å
ãšæ€èšŒã®ããã«ä»ã®äŸãæžãããŠããŸããããã¹ãŠãããã«ããããã«æããã®ã§ãããã§ã¯èª¬æããŸããã§ãããäž»ãªããšã¯ãæ£ããæ§æconfig.yamlãäœæããããšã§ãã
ãããæžããçç±ã¯2ã€ãããŸãã
- ç§ãã¡ã¯ãã£ãããškubernetesã«åãæ¿ããããšãèããŠããŸãããç§ã®æèŠã§ã¯ãããã¯ééã£ã決å®ã«ãªãã§ãããã 誰ããã³ã¡ã³ãã§æ£ãã解決çãæããŠããããããããŸããã
- ç§ã¯ããªãé·ãéããããã¹ãŠè¡ã£ãŠæžããŸããããä»ã®äººã«ã䜿ã£ãŠã»ããã§ãã
åç
§è³æ
- Nodebackup
- Nodebackupã³ã³ãããŒ
- éè€