Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 63 additions & 0 deletions packages/pushkin-cli/src/commands/setupdb/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -336,10 +336,73 @@ export async function migrateTransactionsDB(coreDBs, verbose) {
});
}

/**
* Ensures a clean state by detecting and removing existing database containers
* This prevents issues with stale containers that may have different credentials
* @param {boolean} verbose Output extra debugging info
* @returns {Promise<void>}
*/
async function ensureCleanState(verbose) {
if (verbose) console.log("--verbose flag set inside ensureCleanState()");

try {
// Check if database containers are running or stopped
const { stdout } = await exec(
`docker ps -a --format "{{.Names}}" | grep -E "pushkin[-_](test_db|test_transaction_db)[-_]"`
);

if (stdout.trim()) {
// Found existing containers - clean them up
console.log('⚠️ Found existing database containers. Cleaning up...');

const dockerPath = path.join(process.cwd(), "pushkin");
const dockerConfig = "docker-compose.dev.yml";

try {
// Stop containers if running
await compose.stop({
cwd: dockerPath,
config: dockerConfig,
});
} catch (err) {
// Containers might already be stopped, which is fine
if (verbose) console.log("Containers already stopped or error stopping:", err.message);
}

try {
// Remove containers
await compose.rm({
cwd: dockerPath,
config: dockerConfig,
commandOptions: ["-f", "-v"], // -f: force, -v: remove volumes
});
} catch (err) {
if (verbose) console.warn("Warning removing containers:", err.message);
}

console.log('✓ Cleanup complete. Starting fresh databases...');
} else {
if (verbose) console.log("No existing database containers found. Proceeding with fresh setup.");
}
} catch (e) {
// If grep finds nothing, it returns exit code 1, which throws an error
// This is expected when no containers exist, so we can safely ignore it
if (e.code === 1 && e.stderr === '') {
if (verbose) console.log("No existing database containers found (grep returned no matches).");
} else {
// Actual error - log it but don't fail the entire setup
if (verbose) console.warn("Warning: Could not check for existing containers:", e.message);
}
}
}

export async function setupdb(coreDBs, mainExpDir, verbose) {
if (verbose) console.log("--verbose flag set inside setupdb()");
// load up all migrations for same dbs to be run at same time (knex requires this)

// Ensure clean state before starting databases
await ensureCleanState(verbose);

let dbPromise;
if (verbose) console.log("Spooling up databases.");
try {
Expand Down
Loading