3fb15d6282
- Make .env the single source of truth for runtime config. Remove all
`env:` blocks from SREBOT/ecosystem.config.js and TSSBOT/ecosystem.config.js
so values can't silently shadow .env. Both ecosystem files load .env via
`require('dotenv').config()` and PM2 inherits the resolved environment.
- Rename SREBOT_STORAGE_VOL_PATH → STORAGE_VOL_PATH across all readers
(BOT/utils.py, BOT/receiver_bridge.py, BOT/render_recap.py, server.js,
web/server.js, dateindex.js, scripts/*, srebot.service, tests/, README,
and both .env files). STORAGE is shared between SREBOT and TSSBOT, so the
variable shouldn't carry one bot's prefix.
- Rename per-process PORT env vars to disambiguated names so .env can be
the source of truth without collisions:
PORT (api) → SREBOT_API_PORT (server.js)
PORT (web) → SREBOT_WEB_PORT (web/server.js)
WEBHOOK_PORT → SREBOT_WEBHOOK_PORT (github_webhook_updater.py)
SREBOT_EXTERNAL_HOST/PORT/UPSTREAM_URL were already uniquely named;
they just move from ecosystem env to .env.
- TSSBOT/.env: drop GITHUB_WEBHOOK_SECRET (only srebot-webhook consumes it)
and the stale SREBOT_DEPLOY_PATH. SREBOT/.env: also drop the obsolete
SREBOT_DEPLOY_PATH (ecosystem now hardcodes __dirname).
- ecosystem.config.js no longer references SREBOT_DEPLOY_PATH; deploy path
is always __dirname of the ecosystem file.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
72 lines
2.4 KiB
JavaScript
72 lines
2.4 KiB
JavaScript
require('dotenv').config();
|
|
const sqlite3 = require('sqlite3').verbose();
|
|
const path = require('path');
|
|
const STORAGE_ROOT = (process.env.STORAGE_VOL_PATH || '').trim();
|
|
if (!STORAGE_ROOT) {
|
|
throw new Error('STORAGE_VOL_PATH must be set');
|
|
}
|
|
const DB_PATH = path.join(STORAGE_ROOT, 'sq_battles.db');
|
|
|
|
console.log(`Opening database at: ${DB_PATH}`);
|
|
|
|
const db = new sqlite3.Database(DB_PATH, sqlite3.OPEN_READWRITE, (err) => {
|
|
if (err) {
|
|
console.error('Failed to open database:', err.message);
|
|
process.exit(1);
|
|
}
|
|
console.log('Connected to database successfully');
|
|
|
|
const checkIndexQuery = `
|
|
SELECT name FROM sqlite_master
|
|
WHERE type='index' AND name='idx_endtime_unix'
|
|
`;
|
|
|
|
db.get(checkIndexQuery, [], (err, row) => {
|
|
if (err) {
|
|
console.error('Error checking for existing index:', err.message);
|
|
db.close();
|
|
process.exit(1);
|
|
}
|
|
|
|
if (row) {
|
|
console.log('Index idx_endtime_unix already exists');
|
|
db.close();
|
|
console.log('Nothing to do - exiting');
|
|
process.exit(0);
|
|
}
|
|
|
|
console.log('Creating index idx_endtime_unix on player_games_hist(endtime_unix)...');
|
|
const createIndexQuery = `CREATE INDEX idx_endtime_unix ON player_games_hist(endtime_unix)`;
|
|
|
|
db.run(createIndexQuery, [], (err) => {
|
|
if (err) {
|
|
console.error('Failed to create index:', err.message);
|
|
db.close();
|
|
process.exit(1);
|
|
}
|
|
|
|
console.log('Index created successfully!');
|
|
|
|
db.get(checkIndexQuery, [], (err, row) => {
|
|
if (err) {
|
|
console.error('Error verifying index:', err.message);
|
|
} else if (row) {
|
|
console.log('Index verified successfully');
|
|
} else {
|
|
console.warn('Warning: Index not found after creation');
|
|
}
|
|
|
|
db.close((err) => {
|
|
if (err) {
|
|
console.error('Error closing database:', err.message);
|
|
process.exit(1);
|
|
}
|
|
console.log('Database connection closed');
|
|
console.log('\nIndex creation complete!');
|
|
process.exit(0);
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|