From c04af08b62d28a7fbee02bb9d9352260bc8e781f Mon Sep 17 00:00:00 2001 From: "Rodrigo Rodriguez (Pragmatismo)" Date: Fri, 30 May 2025 22:18:46 -0300 Subject: [PATCH] feat(gb-infra): Add script for PostgreSQL setup in LXD container --- gb-infra/src/scripts/tables.sh | 177 +++++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 gb-infra/src/scripts/tables.sh diff --git a/gb-infra/src/scripts/tables.sh b/gb-infra/src/scripts/tables.sh new file mode 100644 index 0000000..45bb03d --- /dev/null +++ b/gb-infra/src/scripts/tables.sh @@ -0,0 +1,177 @@ +#!/bin/bash + +# Configuration +PARAM_TENANT="" +PARAM_PORT="4444" +PARAM_PASSWORD="" + +# Host paths +HOST_BASE="/opt/gbo/tenants/$PARAM_TENANT/tables" +HOST_DATA="$HOST_BASE/data" +HOST_CONF="$HOST_BASE/conf" +HOST_LOGS="$HOST_BASE/logs" + +# Create fresh directories with proper permissions +echo "Creating host directories..." +mkdir -p "$HOST_DATA" "$HOST_CONF" "$HOST_LOGS" + +# Launch container first to get the postgres UID +echo "Launching container..." +lxc launch images:debian/12 "$PARAM_TENANT"-tables -c security.privileged=true + +# Wait for container to be ready +echo "Waiting for container to start..." +until lxc exec "$PARAM_TENANT"-tables -- test -f /bin/bash; do + echo "Container not ready, waiting..." + sleep 5 +done +sleep 10 + +# Install PostgreSQL 14 +echo "Installing PostgreSQL 14..." +lxc exec "$PARAM_TENANT"-tables -- bash -c " +set -e +export DEBIAN_FRONTEND=noninteractive + +# Update package list and install prerequisites +apt-get update +apt-get install -y wget gnupg2 sudo lsb-release + +# Add PostgreSQL repository with proper variable expansion +CODENAME=\$(lsb_release -cs) +echo \"deb http://apt.postgresql.org/pub/repos/apt \${CODENAME}-pgdg main\" > /etc/apt/sources.list.d/pgdg.list + +# Add repository key +wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor > /etc/apt/trusted.gpg.d/postgresql.gpg + +# Update package list with new repository +apt-get update + +# Install PostgreSQL 14 specifically +apt-get install -y postgresql-14 postgresql-client-14 + +# Verify installation +if ! id postgres &>/dev/null; then + echo 'ERROR: PostgreSQL installation failed - postgres user not created' + exit 1 +fi + +# Stop PostgreSQL service +systemctl stop postgresql@14-main 2>/dev/null || systemctl stop postgresql 2>/dev/null || true +" + +# Get the postgres UID/GID from inside the container +echo "Getting postgres user information..." +POSTGRES_UID=$(lxc exec "$PARAM_TENANT"-tables -- id -u postgres) +POSTGRES_GID=$(lxc exec "$PARAM_TENANT"-tables -- id -g postgres) + +echo "Container postgres UID: $POSTGRES_UID, GID: $POSTGRES_GID" + +# Set correct ownership on host directories +# LXD maps container UID 999 to host UID 100999, container UID 70 to host UID 100070, etc. +HOST_POSTGRES_UID=$((100000 + POSTGRES_UID)) +HOST_POSTGRES_GID=$((100000 + POSTGRES_GID)) + +echo "Setting host directory ownership to UID: $HOST_POSTGRES_UID, GID: $HOST_POSTGRES_GID" +chown -R "$HOST_POSTGRES_UID:$HOST_POSTGRES_GID" "$HOST_BASE" +chmod -R 750 "$HOST_BASE" + +# Now mount directories after setting permissions +echo "Mounting directories..." +lxc config device add "$PARAM_TENANT"-tables pgdata disk source="$HOST_DATA" path=/var/lib/postgresql/14/main +lxc config device add "$PARAM_TENANT"-tables pgconf disk source="$HOST_CONF" path=/etc/postgresql/14/main +lxc config device add "$PARAM_TENANT"-tables pglogs disk source="$HOST_LOGS" path=/var/log/postgresql + +# Initialize and configure PostgreSQL +echo "Configuring PostgreSQL..." +lxc exec "$PARAM_TENANT"-tables -- bash -c " +set -e + +# Ensure directories exist and have correct permissions inside container +mkdir -p /var/lib/postgresql/14/main +mkdir -p /etc/postgresql/14/main +mkdir -p /var/log/postgresql +chown -R postgres:postgres /var/lib/postgresql/14/main +chown -R postgres:postgres /etc/postgresql/14/main +chown -R postgres:postgres /var/log/postgresql +chmod 700 /var/lib/postgresql/14/main + +# Initialize database in the mounted directory +sudo -u postgres /usr/lib/postgresql/14/bin/initdb -D /var/lib/postgresql/14/main + +# Create PostgreSQL configuration +cat > /etc/postgresql/14/main/postgresql.conf < /etc/postgresql/14/main/pg_hba.conf </dev/null || true +lxc config device add "$PARAM_TENANT"-tables postgres-proxy proxy \ + listen=tcp:0.0.0.0:"$PARAM_PORT" \ + connect=tcp:127.0.0.1:"$PARAM_PORT" + +# Create database user and database +echo "Creating database user and database..." +lxc exec "$PARAM_TENANT"-tables -- bash -c " +set -e +cd /var/lib/postgresql + +# Wait for PostgreSQL to be fully ready on the correct port +until sudo -u postgres psql -p $PARAM_PORT -c '\q' 2>/dev/null; do + echo 'Waiting for PostgreSQL to be ready on port $PARAM_PORT ...' + sleep 3 +done + +# Create user and database (suppress directory warnings) +sudo -u postgres psql -p $PARAM_PORT -c \"CREATE USER $PARAM_TENANT WITH PASSWORD '$PARAM_PASSWORD';\" 2>/dev/null +sudo -u postgres psql -p $PARAM_PORT -c \"CREATE DATABASE ${PARAM_TENANT}_db OWNER $PARAM_TENANT;\" 2>/dev/null +sudo -u postgres psql -p $PARAM_PORT -c \"GRANT ALL PRIVILEGES ON DATABASE ${PARAM_TENANT}_db TO $PARAM_TENANT;\" 2>/dev/null + +echo 'PostgreSQL setup completed successfully!' +" + +echo "Container setup complete!" +echo "Connection details:" +echo " Host: localhost" +echo " Port: $PARAM_PORT" +echo " Database: ${PARAM_TENANT}_db" +echo " Username: $PARAM_TENANT" +echo " Password: $PARAM_PASSWORD" + +# Test connection on the correct port +echo "Testing connection..." +lxc exec "$PARAM_TENANT"-tables -- bash -c "cd /var/lib/postgresql && sudo -u postgres psql -p $PARAM_PORT -c '\l'" 2>/dev/null | grep "${PARAM_TENANT}_db" && echo "✓ Database created successfully" || echo "✗ Database creation failed" \ No newline at end of file