From 3c25b3f2da19e660523447f876e5cf6d34786318 Mon Sep 17 00:00:00 2001 From: buttercat1791 Date: Wed, 4 Mar 2026 00:43:40 -0600 Subject: [PATCH] Configure for local dev with Docker Compose --- .gitignore | 3 + compose.yaml | 91 ++++++++++++++++++++++++++ Dockerfile => docker/server.Dockerfile | 8 +-- docker/setup.Dockerfile | 12 ++++ docker/usersetup.sh | 35 ++++++++++ rel/overlays/bin/server | 3 - 6 files changed, 145 insertions(+), 7 deletions(-) create mode 100644 compose.yaml rename Dockerfile => docker/server.Dockerfile (95%) create mode 100644 docker/setup.Dockerfile create mode 100644 docker/usersetup.sh diff --git a/.gitignore b/.gitignore index 779e95a..717a662 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,6 @@ gc_index_relay-*.tar # Secrets -- copy from .env.example and fill in values .env + +# Local Postgres data +/pgdata/ diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 0000000..556f562 --- /dev/null +++ b/compose.yaml @@ -0,0 +1,91 @@ +services: + postgres: + image: docker.io/apache/age:release_PG17_1.6.0 + container_name: postgress_01 + restart: unless-stopped + user: 1000:1000 # Should match host user + ports: + - "5432:5432" + volumes: + - ./pgdata:/var/lib/postgresql/data # Ensure host user owns the ./pgdata directory + environment: + POSTGRES_DB: ${POSTGRES_DB} + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + command: > + postgres + deploy: + resources: + limits: + cpus: "1.00" + memory: 1G + reservations: + cpus: "0.50" + memory: 512M + security_opt: + - no-new-privileges:true + cap_drop: + - ALL + cap_add: + - CHOWN + - FOWNER + - SETUID + - SETGID + read_only: false + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"] + interval: 10s + timeout: 5s + retries: 5 + + setup: + build: + context: . + dockerfile: ./docker/setup.Dockerfile + command: ["/usr/local/bin/usersetup.sh"] + restart: no + depends_on: + postgres: + condition: service_healthy + environment: + POSTGRES_HOST: ${POSTGRES_HOST} + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB} + POSTGRES_RUNTIME_USER: ${POSTGRES_RUNTIME_USER} + POSTGRES_RUNTIME_PASSWORD: ${POSTGRES_RUNTIME_PASSWORD} + + migrator: + build: + context: . + dockerfile: ./docker/server.Dockerfile + command: ["/app/bin/migrate"] + restart: no + depends_on: + postgres: + condition: service_healthy + setup: + condition: service_completed_successfully + environment: + DATABASE_URL: "ecto://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}/${POSTGRES_DB}" + SECRET_KEY_BASE: ${SECRET_KEY_BASE} + + isidore: + build: + context: . + dockerfile: ./docker/server.Dockerfile + command: ["/app/bin/server"] + restart: unless-stopped + depends_on: + postgres: + condition: service_healthy + migrator: + condition: service_completed_successfully + ports: + - "4000:4000" + environment: + DATABASE_URL: "ecto://${POSTGRES_RUNTIME_USER}:${POSTGRES_RUNTIME_PASSWORD}@${POSTGRES_HOST}/${POSTGRES_DB}" + SECRET_KEY_BASE: ${SECRET_KEY_BASE} + +volumes: + pgdata: diff --git a/Dockerfile b/docker/server.Dockerfile similarity index 95% rename from Dockerfile rename to docker/server.Dockerfile index 25bcfc7..24d2d31 100644 --- a/Dockerfile +++ b/docker/server.Dockerfile @@ -7,7 +7,7 @@ ARG DEBIAN_VERSION=trixie-20260202-slim ARG BUILDER_IMAGE="hexpm/elixir:${ELIXIR_VERSION}-erlang-${OTP_VERSION}-debian-${DEBIAN_VERSION}" ARG RUNNER_IMAGE="debian:${DEBIAN_VERSION}" -FROM ${BUILDER_IMAGE} as builder +FROM ${BUILDER_IMAGE} AS builder # Set the locale ENV LANG=en_US.UTF-8 @@ -68,9 +68,9 @@ RUN apt-get update && \ # Set the runtime locale RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \ locale-gen -ENV LANG en_US.UTF-8 -ENV LANGUAGE en_US:en -ENV LC_ALL en_US.UTF-8 +ENV LANG=en_US.UTF-8 +ENV LANGUAGE=en_US:en +ENV LC_ALL=en_US.UTF-8 # Transfer ownership of the app directory to the runtime user WORKDIR "/app" diff --git a/docker/setup.Dockerfile b/docker/setup.Dockerfile new file mode 100644 index 0000000..1f9698a --- /dev/null +++ b/docker/setup.Dockerfile @@ -0,0 +1,12 @@ +ARG DEBIAN_VERSION=trixie-20260202-slim + +FROM debian:${DEBIAN_VERSION} + +RUN apt-get update \ + && apt-get install -y --no-install-recommends postgresql-client \ + && rm -rf /var/lib/apt/lists/* + +COPY ./docker/usersetup.sh /usr/local/bin/usersetup.sh +RUN chmod +x /usr/local/bin/usersetup.sh + +ENTRYPOINT ["/usr/local/bin/usersetup.sh"] diff --git a/docker/usersetup.sh b/docker/usersetup.sh new file mode 100644 index 0000000..c5348b1 --- /dev/null +++ b/docker/usersetup.sh @@ -0,0 +1,35 @@ +#!/bin/sh +set -eu + +export PGPASSWORD="${POSTGRES_PASSWORD}" + +echo "Waiting for PostgreSQL at ${POSTGRES_HOST}..." +until psql -h "${POSTGRES_HOST}" -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" -c '\q' 2>/dev/null; do + echo " not ready, retrying in 2s..." + sleep 2 +done +echo "PostgreSQL is ready." + +USER_EXISTS=$(psql -h "${POSTGRES_HOST}" -U "${POSTGRES_USER}" -tAc \ + "SELECT 1 FROM pg_roles WHERE rolname = '${POSTGRES_RUNTIME_USER}'") + +if [ "${USER_EXISTS}" != "1" ]; then + echo "Creating user '${POSTGRES_RUNTIME_USER}'..." + psql -h "${POSTGRES_HOST}" -U "${POSTGRES_USER}" \ + -c "CREATE USER \"${POSTGRES_RUNTIME_USER}\" WITH PASSWORD '${POSTGRES_RUNTIME_PASSWORD}'" +else + echo "User '${POSTGRES_RUNTIME_USER}' already exists, ensuring password is current..." + psql -h "${POSTGRES_HOST}" -U "${POSTGRES_USER}" \ + -c "ALTER USER \"${POSTGRES_RUNTIME_USER}\" WITH PASSWORD '${POSTGRES_RUNTIME_PASSWORD}'" +fi + +echo "Granting privileges on '${POSTGRES_DB}'..." +psql -h "${POSTGRES_HOST}" -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" \ + -c "GRANT CONNECT ON DATABASE \"${POSTGRES_DB}\" TO \"${POSTGRES_RUNTIME_USER}\";" \ + -c "GRANT USAGE ON SCHEMA public TO \"${POSTGRES_RUNTIME_USER}\";" \ + -c "GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO \"${POSTGRES_RUNTIME_USER}\";" \ + -c "GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO \"${POSTGRES_RUNTIME_USER}\";" \ + -c "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO \"${POSTGRES_RUNTIME_USER}\";" \ + -c "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT USAGE, SELECT ON SEQUENCES TO \"${POSTGRES_RUNTIME_USER}\";" + +echo "Done. User '${POSTGRES_RUNTIME_USER}' has read/write access to '${POSTGRES_DB}'." diff --git a/rel/overlays/bin/server b/rel/overlays/bin/server index 2021760..2c48725 100755 --- a/rel/overlays/bin/server +++ b/rel/overlays/bin/server @@ -3,8 +3,5 @@ set -eu cd -P -- "$(dirname -- "$0")" -# Run migrations before starting the server -./gc_index_relay eval "GcIndexRelay.Release.migrate" - # Start the server PHX_SERVER=true exec ./gc_index_relay start