Files
Sheep-Service/cron/tasks/backup.js

56 lines
1.9 KiB
JavaScript

const fs = require("fs");
const path = require("path");
const TelegramBot = require("node-telegram-bot-api");
const { S3Client, PutObjectCommand } = require("@aws-sdk/client-s3");
const TOKEN = process.env.TELEGRAM_TOKEN;
const CHAT_ID = process.env.CHAT_ID;
const DB_PATH = process.env.DATABASE_PATH || "../";
const FILE = path.join(DB_PATH, "database.sqlite");
const bot = new TelegramBot(TOKEN, { polling: false });
// Настройки S3 / R2
const s3Client = new S3Client({
region: "auto",
endpoint: process.env.S3_ENDPOINT, // Напр: https://<id>.r2.cloudflarestorage.com
credentials: {
accessKeyId: process.env.S3_ACCESS_KEY_ID,
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
},
});
class Backup {
async database() {
try {
if (!fs.existsSync(FILE)) {
console.log("❌ Файл бази даних не знайдено:", FILE);
return;
}
const fileName = `backup_${new Date().toISOString().replace(/[:.]/g, "-")}.sqlite`;
// 1. Отправка в Telegram
await bot.sendDocument(CHAT_ID, fs.createReadStream(FILE), {
caption: `📦 Резервна копія бази даних`,
});
console.log("✅ Telegram: успішно надіслано");
// 2. Отправка в S3 (R2)
const fileBuffer = fs.readFileSync(FILE);
const uploadParams = {
Bucket: process.env.S3_BUCKET_NAME,
Key: `sheep-service.com/database/${fileName}`, // Путь внутри бакета
Body: fileBuffer,
ContentType: "application/x-sqlite3",
};
await s3Client.send(new PutObjectCommand(uploadParams));
console.log("✅ S3: успішно завантажено в хмару");
} catch (err) {
console.error("❌ Помилка при надсиланні файлу:", err.message);
}
}
}
module.exports = new Backup();