commit 1e3c6fcf4c2aa5ba1311368fab260b79f9c414f0 Author: Benjamin Toby Date: Mon Jan 26 14:08:09 2026 +0100 first commit diff --git a/rsync-ignore.txt b/rsync-ignore.txt new file mode 100644 index 0000000..c2a3cdc --- /dev/null +++ b/rsync-ignore.txt @@ -0,0 +1,4 @@ +**-root/_data/code-server +**-root/_data/downloads +**-root/_data/.* +node_modules \ No newline at end of file diff --git a/scripts/backup.ts b/scripts/backup.ts new file mode 100644 index 0000000..4109b81 --- /dev/null +++ b/scripts/backup.ts @@ -0,0 +1,53 @@ +import datasquirel from "@moduletrace/datasquirel"; +import { execSync, ExecSyncOptions } from "child_process"; +import path from "path"; + +const BACKUP_DIR = `/root/backups`; +const BACKUP_FILE_NAME = "backup.tar.xz"; +const BACKUP_DIR_BACKUP = path.join(BACKUP_DIR, `.backup`); +const DOCKER_VOLUMES_DIR = "/var/lib/docker/volumes"; +const DOCKER_VOLUMES_BACKUP_DIR = path.join( + BACKUP_DIR_BACKUP, + `docker`, + `volumes`, +); +const BACKUP_FILE_TAR = path.join(BACKUP_DIR, BACKUP_FILE_NAME); +const RSYNC_IGNORE_FILE = `/root/.coderank/server/rsync-ignore.txt`; +const DSQL_FOLDER = `/projects/coderank/archives/servers/${process.env.CODERANK_HOST_DOMAIN}`; +const DSQL_FILE_NAME = `${process.env.CODERANK_HOST_DOMAIN}.tar.xz`; + +const execOpts: ExecSyncOptions = { + stdio: ["inherit", "inherit", "ignore"], +}; + +execSync(`rm -rf ${path.join(BACKUP_DIR, BACKUP_FILE_NAME)}`, execOpts); +execSync(`mkdir -p ${DOCKER_VOLUMES_BACKUP_DIR}`, execOpts); + +let syncDockerVolsCmd = `rsync -avz --delete --exclude-from="${RSYNC_IGNORE_FILE}"`; +syncDockerVolsCmd += ` ${DOCKER_VOLUMES_DIR}/ ${DOCKER_VOLUMES_BACKUP_DIR}/`; + +execSync(syncDockerVolsCmd, execOpts); + +execSync(`tar -czvf ${BACKUP_FILE_TAR} ${BACKUP_DIR_BACKUP}`, execOpts); + +const file = Bun.file(BACKUP_FILE_TAR); +const buffer = await file.arrayBuffer(); +const base64 = Buffer.from(buffer).toString("base64"); + +await datasquirel.api.media.add({ + media: [ + { + fileName: DSQL_FILE_NAME, + fileType: "tar.xz", + fileBase64: base64, + }, + ], + type: "file", + folder: DSQL_FOLDER, + update: true, +}); + +datasquirel.utils.debugLog({ + log: `Media Uploaded Successfully!`, + addTime: true, +}); diff --git a/scripts/restore.ts b/scripts/restore.ts new file mode 100644 index 0000000..8c16d09 --- /dev/null +++ b/scripts/restore.ts @@ -0,0 +1,31 @@ +import datasquirel from "@moduletrace/datasquirel"; +import { execSync, ExecSyncOptions } from "child_process"; +import path from "path"; + +const BACKUP_DIR = `/root/backups`; +const BACKUP_FILE_NAME = "backup.tar.xz"; +const BACKUP_DIR_BACKUP = path.join(BACKUP_DIR, `.backup`); +const DOCKER_VOLUMES_DIR = "/var/lib/docker/volumes"; +const DOCKER_VOLUMES_BACKUP_DIR = path.join( + BACKUP_DIR_BACKUP, + `docker`, + `volumes`, +); +const BACKUP_FILE_TAR = path.join(BACKUP_DIR, BACKUP_FILE_NAME); +const RSYNC_IGNORE_FILE = `/root/.coderank/server/rsync-ignore.txt`; +const DSQL_FOLDER = `/projects/coderank/archives/servers/${process.env.CODERANK_HOST_DOMAIN}`; +const DSQL_FILE_NAME = `${process.env.CODERANK_HOST_DOMAIN}.tar.xz`; + +const execOpts: ExecSyncOptions = { + stdio: ["inherit", "inherit", "ignore"], +}; + +const dsqlFile = await datasquirel.api.media.get({ + folder: DSQL_FOLDER, + mediaName: DSQL_FILE_NAME, +}); + +datasquirel.utils.debugLog({ + log: dsqlFile, + addTime: true, +});