56 lines
1.9 KiB
JavaScript
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(); |