fix: respect NODE_DB_PATH environment variable in Docker (fixes #40)
- Fixed docker-entrypoint.sh to use NODE_DB_PATH instead of hardcoded paths - Added log_message() helper to prevent stdio mode output corruption - Fixed directory creation race condition with proper ownership - Added path validation to ensure NODE_DB_PATH ends with .db - Updated rebuild.ts to respect NODE_DB_PATH environment variable - Added comprehensive documentation for custom database paths - Bumped version to 2.7.16 The bug was caused by hardcoded /app/data/nodes.db paths in the Docker entrypoint script that ignored the NODE_DB_PATH environment variable. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -1,39 +1,75 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
# Helper function for safe logging (prevents stdio mode corruption)
|
||||
log_message() {
|
||||
[ "$MCP_MODE" != "stdio" ] && echo "$@"
|
||||
}
|
||||
|
||||
# Environment variable validation
|
||||
if [ "$MCP_MODE" = "http" ] && [ -z "$AUTH_TOKEN" ] && [ -z "$AUTH_TOKEN_FILE" ]; then
|
||||
echo "ERROR: AUTH_TOKEN or AUTH_TOKEN_FILE is required for HTTP mode"
|
||||
log_message "ERROR: AUTH_TOKEN or AUTH_TOKEN_FILE is required for HTTP mode" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Validate AUTH_TOKEN_FILE if provided
|
||||
if [ -n "$AUTH_TOKEN_FILE" ] && [ ! -f "$AUTH_TOKEN_FILE" ]; then
|
||||
echo "ERROR: AUTH_TOKEN_FILE specified but file not found: $AUTH_TOKEN_FILE"
|
||||
log_message "ERROR: AUTH_TOKEN_FILE specified but file not found: $AUTH_TOKEN_FILE" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Database path configuration - respect NODE_DB_PATH if set
|
||||
if [ -n "$NODE_DB_PATH" ]; then
|
||||
# Basic validation - must end with .db
|
||||
case "$NODE_DB_PATH" in
|
||||
*.db) ;;
|
||||
*) log_message "ERROR: NODE_DB_PATH must end with .db" >&2; exit 1 ;;
|
||||
esac
|
||||
|
||||
# Use the path as-is (Docker paths should be absolute anyway)
|
||||
DB_PATH="$NODE_DB_PATH"
|
||||
else
|
||||
DB_PATH="/app/data/nodes.db"
|
||||
fi
|
||||
|
||||
DB_DIR=$(dirname "$DB_PATH")
|
||||
|
||||
# Ensure database directory exists with correct ownership
|
||||
if [ ! -d "$DB_DIR" ]; then
|
||||
log_message "Creating database directory: $DB_DIR"
|
||||
if [ "$(id -u)" = "0" ]; then
|
||||
# Create as root but immediately fix ownership
|
||||
mkdir -p "$DB_DIR" && chown nodejs:nodejs "$DB_DIR"
|
||||
else
|
||||
mkdir -p "$DB_DIR"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Database initialization with file locking to prevent race conditions
|
||||
if [ ! -f "/app/data/nodes.db" ]; then
|
||||
echo "Database not found. Initializing..."
|
||||
if [ ! -f "$DB_PATH" ]; then
|
||||
log_message "Database not found at $DB_PATH. Initializing..."
|
||||
# Use a lock file to prevent multiple containers from initializing simultaneously
|
||||
(
|
||||
flock -x 200
|
||||
# Double-check inside the lock
|
||||
if [ ! -f "/app/data/nodes.db" ]; then
|
||||
echo "Initializing database..."
|
||||
cd /app && node dist/scripts/rebuild.js || {
|
||||
echo "ERROR: Database initialization failed"
|
||||
if [ ! -f "$DB_PATH" ]; then
|
||||
log_message "Initializing database at $DB_PATH..."
|
||||
cd /app && NODE_DB_PATH="$DB_PATH" node dist/scripts/rebuild.js || {
|
||||
log_message "ERROR: Database initialization failed" >&2
|
||||
exit 1
|
||||
}
|
||||
fi
|
||||
) 200>/app/data/.db.lock
|
||||
) 200>"$DB_DIR/.db.lock"
|
||||
fi
|
||||
|
||||
# Fix permissions if running as root (for development)
|
||||
if [ "$(id -u)" = "0" ]; then
|
||||
echo "Running as root, fixing permissions..."
|
||||
chown -R nodejs:nodejs /app/data
|
||||
log_message "Running as root, fixing permissions..."
|
||||
chown -R nodejs:nodejs "$DB_DIR"
|
||||
# Also ensure /app/data exists for backward compatibility
|
||||
if [ -d "/app/data" ]; then
|
||||
chown -R nodejs:nodejs /app/data
|
||||
fi
|
||||
# Switch to nodejs user (using Alpine's native su)
|
||||
exec su nodejs -c "$*"
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user