6 changed files with 145 additions and 7 deletions
@ -0,0 +1,91 @@
@@ -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: |
||||
@ -0,0 +1,12 @@
@@ -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"] |
||||
@ -0,0 +1,35 @@
@@ -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}'." |
||||
Loading…
Reference in new issue