Install pgAdmin 9.18 in its own virtualenv and run it under gunicorn on port 5050 next to PostgreSQL and the bridge. On first start the entrypoint creates the pgAdmin login (PGADMIN_DEFAULT_EMAIL, default admin@example.com; PGADMIN_DEFAULT_PASSWORD, default POSTGRES_PASSWORD) and registers the bundled PostgreSQL server. pgAdmin is optional (PEO4C_PGADMIN=false) and a failure in it does not stop the container. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
64 lines
2.2 KiB
Bash
Executable File
64 lines
2.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Runs PostgreSQL (through the stock postgres entrypoint), the peo4c bridge and
|
|
# pgAdmin side by side. The container stops when PostgreSQL or the bridge exits;
|
|
# pgAdmin is optional and its failure does not take the others down.
|
|
set -euo pipefail
|
|
|
|
if [ "${1:-}" != "postgres" ]; then
|
|
exec docker-entrypoint.sh "$@"
|
|
fi
|
|
|
|
export PEO4C_PG_DATABASE="${PEO4C_PG_DATABASE:-${POSTGRES_DB:-${POSTGRES_USER:-postgres}}}"
|
|
|
|
start_pgadmin() {
|
|
local app=/opt/pgadmin/app
|
|
local email="${PGADMIN_DEFAULT_EMAIL:-admin@example.com}"
|
|
|
|
if [ ! -f /var/lib/pgadmin/pgadmin4.db ]; then
|
|
# First start: create the login user and register the bundled PostgreSQL.
|
|
cat > /var/lib/pgadmin/servers.json <<EOF
|
|
{"Servers": {"1": {"Name": "peo4c", "Group": "Servers", "Host": "127.0.0.1", "Port": 5432,
|
|
"MaintenanceDB": "${PEO4C_PG_DATABASE}", "Username": "${POSTGRES_USER:-postgres}", "SSLMode": "prefer"}}}
|
|
EOF
|
|
chown postgres:postgres /var/lib/pgadmin/servers.json
|
|
PGADMIN_SETUP_EMAIL="$email" \
|
|
PGADMIN_SETUP_PASSWORD="${PGADMIN_DEFAULT_PASSWORD:-${POSTGRES_PASSWORD:-}}" \
|
|
gosu postgres /opt/pgadmin/bin/python "$app/setup.py" setup-db \
|
|
&& gosu postgres /opt/pgadmin/bin/python "$app/setup.py" load-servers \
|
|
/var/lib/pgadmin/servers.json --user "$email" \
|
|
|| { rm -f /var/lib/pgadmin/pgadmin4.db; return 1; }
|
|
fi
|
|
|
|
gosu postgres /opt/pgadmin/bin/gunicorn --bind "0.0.0.0:${PEO4C_PGADMIN_PORT}" \
|
|
--workers 1 --threads 25 --timeout 0 --chdir "$app" --log-level warning pgAdmin4:app &
|
|
pgadmin_pid=$!
|
|
echo "peo4c: pgAdmin on http://localhost:${PEO4C_PGADMIN_PORT}/ (login: $email)"
|
|
}
|
|
|
|
docker-entrypoint.sh "$@" &
|
|
pg_pid=$!
|
|
|
|
cd /opt/peo4c/bridge
|
|
gosu postgres python3 -m peo4c &
|
|
bridge_pid=$!
|
|
|
|
pgadmin_pid=
|
|
if [ "${PEO4C_PGADMIN}" = "true" ]; then
|
|
start_pgadmin || echo "peo4c: WARNING: pgAdmin setup failed, continuing without it" >&2
|
|
fi
|
|
|
|
shutdown() {
|
|
for pid in "$bridge_pid" $pgadmin_pid "$pg_pid"; do
|
|
kill -TERM "$pid" 2>/dev/null || true
|
|
done
|
|
}
|
|
trap shutdown TERM INT
|
|
|
|
# Wait until PostgreSQL or the bridge exits, then stop everything.
|
|
set +e
|
|
wait -n "$pg_pid" "$bridge_pid"
|
|
status=$?
|
|
shutdown
|
|
wait 2>/dev/null
|
|
exit "$status"
|