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://.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();