import { execSync, type ExecSyncOptions } from "child_process"; import path from "path"; import s3UploadFile from "../utils/s3-upload"; const BACKUP_NAME = `.backup`; const BACKUP_DIR = `/root/backups`; const BACKUP_FILE_NAME = "backup.tar.xz"; const BACKUP_DIR_BACKUP = path.join(BACKUP_DIR, BACKUP_NAME); 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 R2_FOLDER = `archives/servers`; const R2_FILE_NAME = `${process.env.CODERANK_HOST_DOMAIN}.tar.xz`; const SERVER_DATA_DIR = `/root/.coderank`; const BACKUP_DATA_DIR = path.join(BACKUP_DIR_BACKUP, ".coderank"); const execOpts: ExecSyncOptions = { stdio: ["ignore", "ignore", "ignore"], }; execSync( `rm -rf ${path.join(BACKUP_DIR, BACKUP_FILE_NAME)} && rm -rf ${BACKUP_DIR_BACKUP}`, 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); let syncServerDataCmd = `rsync -avz --delete --exclude="**.coderank/server" --exclude=".git" ${SERVER_DATA_DIR}/ ${BACKUP_DATA_DIR}/`; execSync(syncServerDataCmd, execOpts); execSync(`tar -cJvf ${BACKUP_FILE_TAR} ${BACKUP_NAME}`, { ...execOpts, cwd: BACKUP_DIR, }); await s3UploadFile({ fileName: R2_FILE_NAME, filePath: BACKUP_FILE_TAR, folder: R2_FOLDER, }); process.exit();