Skip to content
Merged
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
54 changes: 53 additions & 1 deletion packages/pushkin-cli/src/commands/setupdb/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -336,18 +336,70 @@ 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 {
// Remove containers and named volumes so new containers start with fresh credentials
await compose.down({
cwd: dockerPath,
config: dockerConfig,
commandOptions: ["--volumes"], // removes named volumes (e.g. test_transaction_db_volume)
Comment on lines +363 to +366

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The -v flag on compose.rm only removes anonymous volumes, so I switched from compose.stop/compose.rm to compose.down in order to also remove named volumes: pushkin_test_db_volume, pushkin_test_transaction_db_volume. I ran into the same "password authentication failed" error with the original fix on this branch, which was because my test volumes survived the slate-cleaning process. The new container mounted the the old volume, which contained the PostgreSQL data directory with the old password.
The original fix did work for me before, but that was probably because either those named volumes hadn't been created yet or I'd cleared them.
Volume auth error before this change:
Image
After:
Image

});
} 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
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 {
dbPromise = compose.upMany(["test_db", "test_transaction_db"], {
cwd: path.join(process.cwd(), "pushkin"),
config: "docker-compose.dev.yml",
});
} catch {
} catch (e) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This bug wasn't introduced here, just cleaning it up anyway!

console.error("something went wrong starting database containers.");
throw e;
}
Expand Down
Loading