missing scripts
This commit is contained in:
1 parent
80c000c601
commit
66e723052d
30 files changed
+3108
No files matched your search
Executable
+101
@@ -0,0 +1,101 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# PostgreSQL: Emergency script to backup the database
|
||||
# Creates a timestamped dump of the database
|
||||
#
|
||||
# Usage:
|
||||
# docker exec -it dockhand /app/scripts/emergency/postgres/backup-db.sh [output_dir]
|
||||
#
|
||||
# Example:
|
||||
# docker exec -it dockhand /app/scripts/emergency/postgres/backup-db.sh /app/data/backups
|
||||
#
|
||||
# Default output: /app/data
|
||||
#
|
||||
# Requires: DATABASE_URL environment variable
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
echo "========================================"
|
||||
echo " Dockhand - Backup Database (PostgreSQL)"
|
||||
echo "========================================"
|
||||
echo ""
|
||||
|
||||
# Check DATABASE_URL
|
||||
if [ -z "$DATABASE_URL" ]; then
|
||||
echo "Error: DATABASE_URL environment variable not set"
|
||||
echo ""
|
||||
echo "Example: DATABASE_URL=postgres://user:pass@host:5432/dockhand"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
OUTPUT_DIR="${1:-/app/data}"
|
||||
|
||||
# Parse DATABASE_URL
|
||||
# Format: postgres://user:password@host:port/database
|
||||
DB_URL="$DATABASE_URL"
|
||||
DB_URL="${DB_URL#postgres://}"
|
||||
DB_URL="${DB_URL#postgresql://}"
|
||||
|
||||
# Extract credentials
|
||||
DB_USER="${DB_URL%%:*}"
|
||||
DB_URL="${DB_URL#*:}"
|
||||
DB_PASS="${DB_URL%%@*}"
|
||||
DB_URL="${DB_URL#*@}"
|
||||
DB_HOST="${DB_URL%%:*}"
|
||||
DB_URL="${DB_URL#*:}"
|
||||
DB_PORT="${DB_URL%%/*}"
|
||||
DB_NAME="${DB_URL#*/}"
|
||||
DB_NAME="${DB_NAME%%\?*}"
|
||||
|
||||
# Generate backup filename with timestamp
|
||||
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
||||
BACKUP_FILE="$OUTPUT_DIR/dockhand_backup_$TIMESTAMP.sql"
|
||||
|
||||
echo "This script will create a backup of the database."
|
||||
echo ""
|
||||
echo "Host: $DB_HOST:$DB_PORT"
|
||||
echo "Database: $DB_NAME"
|
||||
echo "Backup: $BACKUP_FILE"
|
||||
echo ""
|
||||
printf "Continue? [y/N]: "
|
||||
read CONFIRM
|
||||
|
||||
case "$CONFIRM" in
|
||||
[yY]|[yY][eE][sS])
|
||||
;;
|
||||
*)
|
||||
echo "Aborted."
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
|
||||
echo ""
|
||||
|
||||
# Create output directory if needed
|
||||
mkdir -p "$OUTPUT_DIR"
|
||||
|
||||
echo "Creating database backup..."
|
||||
|
||||
# Use pg_dump to create backup
|
||||
export PGPASSWORD="$DB_PASS"
|
||||
if command -v pg_dump >/dev/null 2>&1; then
|
||||
pg_dump -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -F p -f "$BACKUP_FILE"
|
||||
else
|
||||
echo "Error: pg_dump not found"
|
||||
echo "Install PostgreSQL client tools to use this script"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ $? -eq 0 ] && [ -f "$BACKUP_FILE" ]; then
|
||||
SIZE=$(ls -lh "$BACKUP_FILE" | awk '{print $5}')
|
||||
echo ""
|
||||
echo "Backup created successfully!"
|
||||
echo "Size: $SIZE"
|
||||
echo ""
|
||||
echo "To copy from Docker container to host:"
|
||||
echo " docker cp dockhand:$BACKUP_FILE ./dockhand_backup_$TIMESTAMP.sql"
|
||||
else
|
||||
echo "Error: Failed to create backup"
|
||||
exit 1
|
||||
fi
|
||||
Executable
+75
@@ -0,0 +1,75 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# PostgreSQL: Emergency script to clear all user sessions
|
||||
# Use this to force all users to re-login
|
||||
#
|
||||
# Usage:
|
||||
# docker exec -it dockhand /app/scripts/emergency/postgres/clear-sessions.sh
|
||||
#
|
||||
# Requires: DATABASE_URL environment variable
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
echo "========================================"
|
||||
echo " Dockhand - Clear All Sessions (PostgreSQL)"
|
||||
echo "========================================"
|
||||
echo ""
|
||||
echo "This script will clear all user sessions,"
|
||||
echo "forcing all users to log in again."
|
||||
echo ""
|
||||
|
||||
# Check DATABASE_URL
|
||||
if [ -z "$DATABASE_URL" ]; then
|
||||
echo "Error: DATABASE_URL environment variable not set"
|
||||
echo ""
|
||||
echo "Example: DATABASE_URL=postgres://user:pass@host:5432/dockhand"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Parse DATABASE_URL
|
||||
DB_URL="$DATABASE_URL"
|
||||
DB_URL="${DB_URL#postgres://}"
|
||||
DB_URL="${DB_URL#postgresql://}"
|
||||
|
||||
DB_USER="${DB_URL%%:*}"
|
||||
DB_URL="${DB_URL#*:}"
|
||||
DB_PASS="${DB_URL%%@*}"
|
||||
DB_URL="${DB_URL#*@}"
|
||||
DB_HOST="${DB_URL%%:*}"
|
||||
DB_URL="${DB_URL#*:}"
|
||||
DB_PORT="${DB_URL%%/*}"
|
||||
DB_NAME="${DB_URL#*/}"
|
||||
DB_NAME="${DB_NAME%%\?*}"
|
||||
|
||||
export PGPASSWORD="$DB_PASS"
|
||||
|
||||
COUNT=$(psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -t -c "SELECT COUNT(*) FROM sessions;" 2>/dev/null | tr -d ' ')
|
||||
|
||||
echo "Database: $DB_HOST:$DB_PORT/$DB_NAME"
|
||||
echo "Active sessions: $COUNT"
|
||||
echo ""
|
||||
printf "Continue? [y/N]: "
|
||||
read CONFIRM
|
||||
|
||||
case "$CONFIRM" in
|
||||
[yY]|[yY][eE][sS])
|
||||
;;
|
||||
*)
|
||||
echo "Aborted."
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
|
||||
echo ""
|
||||
echo "Clearing all user sessions..."
|
||||
psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -c "DELETE FROM sessions;"
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
echo ""
|
||||
echo "Cleared $COUNT session(s) successfully."
|
||||
echo "All users will need to log in again."
|
||||
else
|
||||
echo "Error: Failed to clear sessions"
|
||||
exit 1
|
||||
fi
|
||||
Executable
+117
@@ -0,0 +1,117 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# PostgreSQL: Emergency script to create an admin user
|
||||
# Use this if you're locked out of Dockhand and need to create a new admin
|
||||
#
|
||||
# Usage:
|
||||
# docker exec -it dockhand /app/scripts/emergency/postgres/create-admin.sh
|
||||
#
|
||||
# Default credentials: admin / admin123
|
||||
# CHANGE THE PASSWORD IMMEDIATELY after logging in!
|
||||
#
|
||||
# Requires: DATABASE_URL environment variable
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
echo "========================================"
|
||||
echo " Dockhand - Create Admin User (PostgreSQL)"
|
||||
echo "========================================"
|
||||
echo ""
|
||||
echo "This script will create an admin user with:"
|
||||
echo " Username: admin"
|
||||
echo " Password: admin123"
|
||||
echo ""
|
||||
echo "If user 'admin' already exists, password will"
|
||||
echo "be reset and admin privileges restored."
|
||||
echo ""
|
||||
|
||||
# Check DATABASE_URL
|
||||
if [ -z "$DATABASE_URL" ]; then
|
||||
echo "Error: DATABASE_URL environment variable not set"
|
||||
echo ""
|
||||
echo "Example: DATABASE_URL=postgres://user:pass@host:5432/dockhand"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Parse DATABASE_URL
|
||||
DB_URL="$DATABASE_URL"
|
||||
DB_URL="${DB_URL#postgres://}"
|
||||
DB_URL="${DB_URL#postgresql://}"
|
||||
|
||||
DB_USER="${DB_URL%%:*}"
|
||||
DB_URL="${DB_URL#*:}"
|
||||
DB_PASS="${DB_URL%%@*}"
|
||||
DB_URL="${DB_URL#*@}"
|
||||
DB_HOST="${DB_URL%%:*}"
|
||||
DB_URL="${DB_URL#*:}"
|
||||
DB_PORT="${DB_URL%%/*}"
|
||||
DB_NAME="${DB_URL#*/}"
|
||||
DB_NAME="${DB_NAME%%\?*}"
|
||||
|
||||
export PGPASSWORD="$DB_PASS"
|
||||
|
||||
echo "Database: $DB_HOST:$DB_PORT/$DB_NAME"
|
||||
echo ""
|
||||
printf "Continue? [y/N]: "
|
||||
read CONFIRM
|
||||
|
||||
case "$CONFIRM" in
|
||||
[yY]|[yY][eE][sS])
|
||||
;;
|
||||
*)
|
||||
echo "Aborted."
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
|
||||
# Username and password
|
||||
USERNAME="admin"
|
||||
# Password: admin123
|
||||
# This is an argon2id hash of "admin123" - generated with default argon2 settings
|
||||
PASSWORD_HASH='$argon2id$v=19$m=65536,t=3,p=4$Jq4am2SfyYKmc0PAHe+yzg$cq/27vK/Qg2eZb/jMDy0ExLDhOG+58cKAximxpG5Dss'
|
||||
|
||||
echo ""
|
||||
echo "Creating admin user..."
|
||||
|
||||
# Check if admin user already exists
|
||||
EXISTING=$(psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -t -c "SELECT COUNT(*) FROM users WHERE username='$USERNAME';" 2>/dev/null | tr -d ' ')
|
||||
|
||||
if [ "$EXISTING" -gt "0" ]; then
|
||||
echo "User '$USERNAME' already exists."
|
||||
echo "Resetting password and ensuring active status..."
|
||||
psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -c "UPDATE users SET password_hash='$PASSWORD_HASH', is_active=true WHERE username='$USERNAME';"
|
||||
USER_ID=$(psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -t -c "SELECT id FROM users WHERE username='$USERNAME';" 2>/dev/null | tr -d ' ')
|
||||
else
|
||||
echo "Creating new admin user..."
|
||||
psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -c "INSERT INTO users (username, password_hash, is_active, auth_provider, created_at, updated_at) VALUES ('$USERNAME', '$PASSWORD_HASH', true, 'local', NOW(), NOW());"
|
||||
USER_ID=$(psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -t -c "SELECT id FROM users WHERE username='$USERNAME';" 2>/dev/null | tr -d ' ')
|
||||
echo "Admin user created successfully."
|
||||
fi
|
||||
|
||||
# Get the Admin role ID (it's a system role)
|
||||
ADMIN_ROLE_ID=$(psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -t -c "SELECT id FROM roles WHERE name='Admin';" 2>/dev/null | tr -d ' ')
|
||||
|
||||
if [ -z "$ADMIN_ROLE_ID" ]; then
|
||||
echo "Warning: Admin role not found in database."
|
||||
echo "The user was created but may not have admin privileges."
|
||||
echo "Please check Settings > Auth > Roles after logging in."
|
||||
else
|
||||
# Check if user already has Admin role
|
||||
HAS_ROLE=$(psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -t -c "SELECT COUNT(*) FROM user_roles WHERE user_id=$USER_ID AND role_id=$ADMIN_ROLE_ID;" 2>/dev/null | tr -d ' ')
|
||||
|
||||
if [ "$HAS_ROLE" -eq "0" ]; then
|
||||
echo "Assigning Admin role..."
|
||||
psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -c "INSERT INTO user_roles (user_id, role_id, created_at) VALUES ($USER_ID, $ADMIN_ROLE_ID, NOW());"
|
||||
echo "Admin role assigned."
|
||||
else
|
||||
echo "User already has Admin role."
|
||||
fi
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "Credentials:"
|
||||
echo " Username: admin"
|
||||
echo " Password: admin123"
|
||||
echo ""
|
||||
echo "WARNING: Change the password immediately after logging in!"
|
||||
Executable
+74
@@ -0,0 +1,74 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# PostgreSQL: Emergency script to disable authentication
|
||||
# Use this if you're locked out of Dockhand
|
||||
#
|
||||
# Usage:
|
||||
# docker exec -it dockhand /app/scripts/emergency/postgres/disable-auth.sh
|
||||
#
|
||||
# Requires: DATABASE_URL environment variable
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
echo "========================================"
|
||||
echo " Dockhand - Disable Authentication (PostgreSQL)"
|
||||
echo "========================================"
|
||||
echo ""
|
||||
echo "This script will disable authentication,"
|
||||
echo "allowing access to Dockhand without login."
|
||||
echo ""
|
||||
|
||||
# Check DATABASE_URL
|
||||
if [ -z "$DATABASE_URL" ]; then
|
||||
echo "Error: DATABASE_URL environment variable not set"
|
||||
echo ""
|
||||
echo "Example: DATABASE_URL=postgres://user:pass@host:5432/dockhand"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Parse DATABASE_URL
|
||||
DB_URL="$DATABASE_URL"
|
||||
DB_URL="${DB_URL#postgres://}"
|
||||
DB_URL="${DB_URL#postgresql://}"
|
||||
|
||||
DB_USER="${DB_URL%%:*}"
|
||||
DB_URL="${DB_URL#*:}"
|
||||
DB_PASS="${DB_URL%%@*}"
|
||||
DB_URL="${DB_URL#*@}"
|
||||
DB_HOST="${DB_URL%%:*}"
|
||||
DB_URL="${DB_URL#*:}"
|
||||
DB_PORT="${DB_URL%%/*}"
|
||||
DB_NAME="${DB_URL#*/}"
|
||||
DB_NAME="${DB_NAME%%\?*}"
|
||||
|
||||
export PGPASSWORD="$DB_PASS"
|
||||
|
||||
echo "Database: $DB_HOST:$DB_PORT/$DB_NAME"
|
||||
echo ""
|
||||
printf "Continue? [y/N]: "
|
||||
read CONFIRM
|
||||
|
||||
case "$CONFIRM" in
|
||||
[yY]|[yY][eE][sS])
|
||||
;;
|
||||
*)
|
||||
echo "Aborted."
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
|
||||
echo ""
|
||||
echo "Disabling authentication..."
|
||||
psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -c "UPDATE auth_settings SET auth_enabled = false WHERE id = 1;"
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
echo ""
|
||||
echo "Authentication disabled successfully."
|
||||
echo "You can now access Dockhand without logging in."
|
||||
echo ""
|
||||
echo "Remember to re-enable authentication in Settings after regaining access."
|
||||
else
|
||||
echo "Error: Failed to disable authentication"
|
||||
exit 1
|
||||
fi
|
||||
Executable
+94
@@ -0,0 +1,94 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# PostgreSQL: Emergency script to list all users
|
||||
# Shows username, admin status, active status, and last login
|
||||
#
|
||||
# Usage:
|
||||
# docker exec -it dockhand /app/scripts/emergency/postgres/list-users.sh
|
||||
#
|
||||
# Requires: DATABASE_URL environment variable
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
echo "========================================"
|
||||
echo " Dockhand - List Users (PostgreSQL)"
|
||||
echo "========================================"
|
||||
echo ""
|
||||
|
||||
# Check DATABASE_URL
|
||||
if [ -z "$DATABASE_URL" ]; then
|
||||
echo "Error: DATABASE_URL environment variable not set"
|
||||
echo ""
|
||||
echo "Example: DATABASE_URL=postgres://user:pass@host:5432/dockhand"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Parse DATABASE_URL
|
||||
DB_URL="$DATABASE_URL"
|
||||
DB_URL="${DB_URL#postgres://}"
|
||||
DB_URL="${DB_URL#postgresql://}"
|
||||
|
||||
DB_USER="${DB_URL%%:*}"
|
||||
DB_URL="${DB_URL#*:}"
|
||||
DB_PASS="${DB_URL%%@*}"
|
||||
DB_URL="${DB_URL#*@}"
|
||||
DB_HOST="${DB_URL%%:*}"
|
||||
DB_URL="${DB_URL#*:}"
|
||||
DB_PORT="${DB_URL%%/*}"
|
||||
DB_NAME="${DB_URL#*/}"
|
||||
DB_NAME="${DB_NAME%%\?*}"
|
||||
|
||||
export PGPASSWORD="$DB_PASS"
|
||||
|
||||
# Get user count
|
||||
USER_COUNT=$(psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -t -c "SELECT COUNT(*) FROM users;" 2>/dev/null | tr -d ' ')
|
||||
|
||||
if [ "$USER_COUNT" -eq "0" ]; then
|
||||
echo "No users found."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Get Admin role ID for checking admin status
|
||||
ADMIN_ROLE_ID=$(psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -t -c "SELECT id FROM roles WHERE name='Admin';" 2>/dev/null | tr -d ' ')
|
||||
|
||||
# Print header
|
||||
printf "%-4s %-20s %-8s %-8s %-6s %s\n" "ID" "Username" "Admin" "Active" "MFA" "Last Login"
|
||||
printf "%-4s %-20s %-8s %-8s %-6s %s\n" "----" "--------------------" "--------" "--------" "------" "-------------------"
|
||||
|
||||
# List users (check admin status via user_roles table)
|
||||
psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -t -A -F '|' -c "SELECT id, username, is_active, mfa_enabled, COALESCE(last_login::text, 'Never') FROM users ORDER BY id;" 2>/dev/null | while IFS='|' read id username is_active mfa_enabled last_login; do
|
||||
# Check if user has Admin role
|
||||
if [ -n "$ADMIN_ROLE_ID" ]; then
|
||||
HAS_ADMIN=$(psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -t -c "SELECT COUNT(*) FROM user_roles WHERE user_id=$id AND role_id=$ADMIN_ROLE_ID;" 2>/dev/null | tr -d ' ')
|
||||
if [ "$HAS_ADMIN" -gt "0" ]; then
|
||||
admin_str="Yes"
|
||||
else
|
||||
admin_str="No"
|
||||
fi
|
||||
else
|
||||
admin_str="N/A"
|
||||
fi
|
||||
|
||||
# Convert boolean values (PostgreSQL returns t/f)
|
||||
if [ "$is_active" = "t" ]; then
|
||||
active_str="Yes"
|
||||
else
|
||||
active_str="No"
|
||||
fi
|
||||
|
||||
if [ "$mfa_enabled" = "t" ]; then
|
||||
mfa_str="Yes"
|
||||
else
|
||||
mfa_str="No"
|
||||
fi
|
||||
|
||||
printf "%-4s %-20s %-8s %-8s %-6s %s\n" "$id" "$username" "$admin_str" "$active_str" "$mfa_str" "$last_login"
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "Total: $USER_COUNT user(s)"
|
||||
|
||||
# Show session count
|
||||
SESSION_COUNT=$(psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -t -c "SELECT COUNT(*) FROM sessions;" 2>/dev/null | tr -d ' ')
|
||||
echo "Active sessions: $SESSION_COUNT"
|
||||
Executable
+118
@@ -0,0 +1,118 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# PostgreSQL: Emergency script to factory reset the database
|
||||
# WARNING: This will DELETE ALL DATA including users, settings, and activity logs!
|
||||
#
|
||||
# Usage:
|
||||
# docker exec -it dockhand /app/scripts/emergency/postgres/reset-db.sh
|
||||
#
|
||||
# Requires: DATABASE_URL environment variable
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
echo "========================================"
|
||||
echo " Dockhand - Factory Reset Database (PostgreSQL)"
|
||||
echo "========================================"
|
||||
echo ""
|
||||
echo "WARNING: This will DELETE ALL DATA!"
|
||||
echo ""
|
||||
echo "This includes:"
|
||||
echo " - All users and their settings"
|
||||
echo " - All sessions"
|
||||
echo " - Authentication settings"
|
||||
echo " - Activity logs"
|
||||
echo " - Environment configurations"
|
||||
echo " - OIDC/SSO settings"
|
||||
echo ""
|
||||
echo "The database tables will be truncated."
|
||||
echo ""
|
||||
|
||||
# Check DATABASE_URL
|
||||
if [ -z "$DATABASE_URL" ]; then
|
||||
echo "Error: DATABASE_URL environment variable not set"
|
||||
echo ""
|
||||
echo "Example: DATABASE_URL=postgres://user:pass@host:5432/dockhand"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Parse DATABASE_URL
|
||||
DB_URL="$DATABASE_URL"
|
||||
DB_URL="${DB_URL#postgres://}"
|
||||
DB_URL="${DB_URL#postgresql://}"
|
||||
|
||||
DB_USER="${DB_URL%%:*}"
|
||||
DB_URL="${DB_URL#*:}"
|
||||
DB_PASS="${DB_URL%%@*}"
|
||||
DB_URL="${DB_URL#*@}"
|
||||
DB_HOST="${DB_URL%%:*}"
|
||||
DB_URL="${DB_URL#*:}"
|
||||
DB_PORT="${DB_URL%%/*}"
|
||||
DB_NAME="${DB_URL#*/}"
|
||||
DB_NAME="${DB_NAME%%\?*}"
|
||||
|
||||
export PGPASSWORD="$DB_PASS"
|
||||
|
||||
echo "Database: $DB_HOST:$DB_PORT/$DB_NAME"
|
||||
echo ""
|
||||
printf "Continue? [y/N]: "
|
||||
read CONFIRM
|
||||
|
||||
case "$CONFIRM" in
|
||||
[yY]|[yY][eE][sS])
|
||||
;;
|
||||
*)
|
||||
echo "Aborted."
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
|
||||
echo ""
|
||||
echo "Creating backup before reset..."
|
||||
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
||||
BACKUP_FILE="/app/data/dockhand_backup_pre_reset_$TIMESTAMP.sql"
|
||||
if command -v pg_dump >/dev/null 2>&1; then
|
||||
pg_dump -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -F p -f "$BACKUP_FILE" 2>/dev/null || true
|
||||
if [ -f "$BACKUP_FILE" ]; then
|
||||
echo "Backup saved to: $BACKUP_FILE"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "Truncating all tables..."
|
||||
|
||||
# Truncate all tables in the correct order (respecting foreign keys)
|
||||
psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" <<EOF
|
||||
TRUNCATE TABLE
|
||||
sessions,
|
||||
user_roles,
|
||||
dashboard_preferences,
|
||||
audit_logs,
|
||||
container_events,
|
||||
vulnerability_scans,
|
||||
stack_sources,
|
||||
git_stacks,
|
||||
git_repositories,
|
||||
git_credentials,
|
||||
host_metrics,
|
||||
stack_events,
|
||||
environment_notifications,
|
||||
auto_update_settings,
|
||||
users,
|
||||
roles,
|
||||
oidc_config,
|
||||
ldap_config,
|
||||
auth_settings,
|
||||
notification_settings,
|
||||
config_sets,
|
||||
registries,
|
||||
environments,
|
||||
settings
|
||||
CASCADE;
|
||||
EOF
|
||||
|
||||
echo ""
|
||||
echo "Database reset successfully."
|
||||
echo ""
|
||||
echo "Restart Dockhand to recreate default data:"
|
||||
echo " docker restart dockhand"
|
||||
Executable
+139
@@ -0,0 +1,139 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# PostgreSQL: Emergency script to reset a user's password
|
||||
# Use this if a user is locked out and needs a password reset
|
||||
#
|
||||
# Usage:
|
||||
# docker exec -it dockhand /app/scripts/emergency/postgres/reset-password.sh <username> <new_password>
|
||||
#
|
||||
# Example:
|
||||
# docker exec -it dockhand /app/scripts/emergency/postgres/reset-password.sh admin MyNewPassword123
|
||||
#
|
||||
# Requires: DATABASE_URL environment variable
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
echo "========================================"
|
||||
echo " Dockhand - Reset User Password (PostgreSQL)"
|
||||
echo "========================================"
|
||||
echo ""
|
||||
|
||||
# Check arguments
|
||||
if [ -z "$1" ] || [ -z "$2" ]; then
|
||||
echo "Usage: $0 <username> <new_password>"
|
||||
echo ""
|
||||
echo "Example:"
|
||||
echo " $0 admin MyNewPassword123"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
USERNAME="$1"
|
||||
NEW_PASSWORD="$2"
|
||||
|
||||
# Validate password length
|
||||
if [ ${#NEW_PASSWORD} -lt 8 ]; then
|
||||
echo "Error: Password must be at least 8 characters"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check DATABASE_URL
|
||||
if [ -z "$DATABASE_URL" ]; then
|
||||
echo "Error: DATABASE_URL environment variable not set"
|
||||
echo ""
|
||||
echo "Example: DATABASE_URL=postgres://user:pass@host:5432/dockhand"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Parse DATABASE_URL
|
||||
DB_URL="$DATABASE_URL"
|
||||
DB_URL="${DB_URL#postgres://}"
|
||||
DB_URL="${DB_URL#postgresql://}"
|
||||
|
||||
DB_USER="${DB_URL%%:*}"
|
||||
DB_URL="${DB_URL#*:}"
|
||||
DB_PASS="${DB_URL%%@*}"
|
||||
DB_URL="${DB_URL#*@}"
|
||||
DB_HOST="${DB_URL%%:*}"
|
||||
DB_URL="${DB_URL#*:}"
|
||||
DB_PORT="${DB_URL%%/*}"
|
||||
DB_NAME="${DB_URL#*/}"
|
||||
DB_NAME="${DB_NAME%%\?*}"
|
||||
|
||||
export PGPASSWORD="$DB_PASS"
|
||||
|
||||
# Check if user exists
|
||||
EXISTING=$(psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -t -c "SELECT COUNT(*) FROM users WHERE username='$USERNAME';" 2>/dev/null | tr -d ' ')
|
||||
|
||||
if [ "$EXISTING" -eq "0" ]; then
|
||||
echo "Error: User '$USERNAME' not found"
|
||||
echo ""
|
||||
echo "Available users:"
|
||||
psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -t -c "SELECT username FROM users;" 2>/dev/null | while read user; do
|
||||
user=$(echo "$user" | tr -d ' ')
|
||||
if [ -n "$user" ]; then
|
||||
echo " - $user"
|
||||
fi
|
||||
done
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "This script will reset the password for user '$USERNAME'."
|
||||
echo ""
|
||||
echo "Database: $DB_HOST:$DB_PORT/$DB_NAME"
|
||||
echo "Username: $USERNAME"
|
||||
echo ""
|
||||
printf "Continue? [y/N]: "
|
||||
read CONFIRM
|
||||
|
||||
case "$CONFIRM" in
|
||||
[yY]|[yY][eE][sS])
|
||||
;;
|
||||
*)
|
||||
echo "Aborted."
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
|
||||
# Generate password hash using node (argon2 is available in the app)
|
||||
echo ""
|
||||
echo "Generating password hash..."
|
||||
|
||||
# Check if node and argon2 are available
|
||||
if command -v node >/dev/null 2>&1; then
|
||||
# Try to use argon2 from node_modules
|
||||
PASSWORD_HASH=$(node -e "
|
||||
try {
|
||||
const argon2 = require('argon2');
|
||||
argon2.hash('$NEW_PASSWORD').then(h => console.log(h)).catch(e => process.exit(1));
|
||||
} catch(e) {
|
||||
process.exit(1);
|
||||
}
|
||||
" 2>/dev/null)
|
||||
|
||||
if [ -z "$PASSWORD_HASH" ]; then
|
||||
echo "Error: Could not generate password hash (argon2 not available)"
|
||||
echo "This script requires Node.js with argon2 module"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "Error: Node.js is required to generate password hash"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Resetting password for user '$USERNAME'..."
|
||||
psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -c "UPDATE users SET password_hash='$PASSWORD_HASH', updated_at=NOW() WHERE username='$USERNAME';"
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
echo ""
|
||||
echo "Password reset successfully for user '$USERNAME'"
|
||||
echo ""
|
||||
# Invalidate sessions
|
||||
USER_ID=$(psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -t -c "SELECT id FROM users WHERE username='$USERNAME';" 2>/dev/null | tr -d ' ')
|
||||
psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -c "DELETE FROM sessions WHERE user_id=$USER_ID;" 2>/dev/null || true
|
||||
echo "All existing sessions have been invalidated."
|
||||
echo "The user can now log in with the new password."
|
||||
else
|
||||
echo "Error: Failed to reset password"
|
||||
exit 1
|
||||
fi
|
||||
Executable
+117
@@ -0,0 +1,117 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# PostgreSQL: Emergency script to restore the database from a backup
|
||||
# WARNING: This will overwrite the current database!
|
||||
#
|
||||
# Usage:
|
||||
# docker exec -it dockhand /app/scripts/emergency/postgres/restore-db.sh <backup_file>
|
||||
#
|
||||
# Example:
|
||||
# docker exec -it dockhand /app/scripts/emergency/postgres/restore-db.sh /app/data/dockhand_backup_20240115_120000.sql
|
||||
#
|
||||
# To copy backup into container first:
|
||||
# docker cp ./dockhand_backup.sql dockhand:/app/data/
|
||||
#
|
||||
# Requires: DATABASE_URL environment variable
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
echo "========================================"
|
||||
echo " Dockhand - Restore Database (PostgreSQL)"
|
||||
echo "========================================"
|
||||
echo ""
|
||||
|
||||
# Check argument
|
||||
if [ -z "$1" ]; then
|
||||
echo "Usage: $0 <backup_file>"
|
||||
echo ""
|
||||
echo "Example:"
|
||||
echo " $0 /app/data/dockhand_backup_20240115_120000.sql"
|
||||
echo ""
|
||||
echo "To copy backup into container first:"
|
||||
echo " docker cp ./dockhand_backup.sql dockhand:/app/data/"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
BACKUP_FILE="$1"
|
||||
|
||||
# Check DATABASE_URL
|
||||
if [ -z "$DATABASE_URL" ]; then
|
||||
echo "Error: DATABASE_URL environment variable not set"
|
||||
echo ""
|
||||
echo "Example: DATABASE_URL=postgres://user:pass@host:5432/dockhand"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Parse DATABASE_URL
|
||||
DB_URL="$DATABASE_URL"
|
||||
DB_URL="${DB_URL#postgres://}"
|
||||
DB_URL="${DB_URL#postgresql://}"
|
||||
|
||||
DB_USER="${DB_URL%%:*}"
|
||||
DB_URL="${DB_URL#*:}"
|
||||
DB_PASS="${DB_URL%%@*}"
|
||||
DB_URL="${DB_URL#*@}"
|
||||
DB_HOST="${DB_URL%%:*}"
|
||||
DB_URL="${DB_URL#*:}"
|
||||
DB_PORT="${DB_URL%%/*}"
|
||||
DB_NAME="${DB_URL#*/}"
|
||||
DB_NAME="${DB_NAME%%\?*}"
|
||||
|
||||
export PGPASSWORD="$DB_PASS"
|
||||
|
||||
# Check if backup file exists
|
||||
if [ ! -f "$BACKUP_FILE" ]; then
|
||||
echo "Error: Backup file not found: $BACKUP_FILE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Get backup file size
|
||||
BACKUP_SIZE=$(ls -lh "$BACKUP_FILE" | awk '{print $5}')
|
||||
|
||||
echo "WARNING: This will overwrite the current database!"
|
||||
echo ""
|
||||
echo "Database: $DB_HOST:$DB_PORT/$DB_NAME"
|
||||
echo "Backup to restore: $BACKUP_FILE ($BACKUP_SIZE)"
|
||||
echo ""
|
||||
printf "Continue? [y/N]: "
|
||||
read CONFIRM
|
||||
|
||||
case "$CONFIRM" in
|
||||
[yY]|[yY][eE][sS])
|
||||
;;
|
||||
*)
|
||||
echo "Aborted."
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
|
||||
# Create backup of current database before restoring
|
||||
echo ""
|
||||
echo "Creating backup of current database..."
|
||||
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
||||
PRE_RESTORE_BACKUP="/app/data/dockhand_pre_restore_$TIMESTAMP.sql"
|
||||
if command -v pg_dump >/dev/null 2>&1; then
|
||||
pg_dump -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -F p -f "$PRE_RESTORE_BACKUP" 2>/dev/null || true
|
||||
if [ -f "$PRE_RESTORE_BACKUP" ]; then
|
||||
echo "Current database backed up to: $PRE_RESTORE_BACKUP"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "Restoring database..."
|
||||
|
||||
# Drop and recreate all tables by running the backup
|
||||
psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -f "$BACKUP_FILE"
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
echo ""
|
||||
echo "Database restored successfully!"
|
||||
echo ""
|
||||
echo "Restart Dockhand to apply changes:"
|
||||
echo " docker restart dockhand"
|
||||
else
|
||||
echo "Error: Failed to restore database"
|
||||
exit 1
|
||||
fi
|
||||
Reference in new issue
Block a user