Files
dbgate/packages/api/src/utility/cloudUpgrade.js
2025-04-23 11:18:20 +00:00

75 lines
2.3 KiB
JavaScript

const axios = require('axios');
const fs = require('fs');
const fsp = require('fs/promises');
const semver = require('semver');
const currentVersion = require('../currentVersion');
const { getLogger, extractErrorLogData } = require('dbgate-tools');
const { storageReadConfig } = require('../controllers/storageDb');
const logger = getLogger('cloudUpgrade');
async function checkCloudUpgrade() {
try {
if (process.env.STORAGE_DATABASE) {
const settings = await storageReadConfig('settings');
if (settings['cloud.useAutoUpgrade'] != 1) {
// auto-upgrade not allowed
return;
}
}
const resp = await axios.default.get('https://api.github.com/repos/dbgate/dbgate/releases/latest');
const json = resp.data;
const version = json.name.substring(1);
let cloudDownloadedVersion = null;
try {
cloudDownloadedVersion = await fsp.readFile(process.env.CLOUD_UPGRADE_FILE + '.version', 'utf-8');
} catch (err) {
cloudDownloadedVersion = null;
}
if (
semver.gt(version, currentVersion.version) &&
(!cloudDownloadedVersion || semver.gt(version, cloudDownloadedVersion))
) {
logger.info(`New version available: ${version}`);
const zipUrl = json.assets.find(x => x.name == 'cloud-build.zip').browser_download_url;
const writer = fs.createWriteStream(process.env.CLOUD_UPGRADE_FILE);
const response = await axios.default({
url: zipUrl,
method: 'GET',
responseType: 'stream',
});
response.data.pipe(writer);
await new Promise((resolve, reject) => {
writer.on('finish', resolve);
writer.on('error', reject);
});
await fsp.writeFile(process.env.CLOUD_UPGRADE_FILE + '.version', version);
logger.info(`Downloaded new version from ${zipUrl}`);
} else {
logger.info(
`Checked version ${version} is not newer than ${
cloudDownloadedVersion ?? currentVersion.version
}, upgrade skippped`
);
}
} catch (err) {
logger.error(extractErrorLogData(err), 'Error checking cloud upgrade');
}
}
function startCloudUpgradeTimer() {
// at first in 5 seconds
setTimeout(checkCloudUpgrade, 5000);
// hourly
setInterval(checkCloudUpgrade, 60 * 60 * 1000);
}
module.exports = startCloudUpgradeTimer;