From 15ffabebf303d228011714e9a658cebfb8921c7b Mon Sep 17 00:00:00 2001 From: counterweight Date: Fri, 14 Feb 2025 20:03:28 +0100 Subject: [PATCH] ok this seems to work --- .env.dist | 1 + Dockerfile | 24 +++++++++++++++++------ caddy/Caddyfile | 2 +- docker-compose.yml | 45 +++++++------------------------------------- docker-entrypoint.sh | 26 +++++++++++++++++++++++++ src/database.js | 2 +- 6 files changed, 54 insertions(+), 46 deletions(-) create mode 100644 docker-entrypoint.sh diff --git a/.env.dist b/.env.dist index bfa4559..63c6c73 100644 --- a/.env.dist +++ b/.env.dist @@ -1,3 +1,4 @@ +POSTGRES_HOST=localhost POSTGRES_USER=app_user POSTGRES_PASSWORD=app_password POSTGRES_DB=app_db \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 538fcec..0e71e00 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,25 @@ -FROM node:20 +FROM debian:latest +# Install dependencies +RUN apt-get update && apt-get install -y \ + curl gnupg2 ca-certificates lsb-release apt-transport-https \ + postgresql caddy nodejs npm && \ + rm -rf /var/lib/apt/lists/* + +# Set up working directory for Express app WORKDIR /app - COPY package*.json ./ - RUN npm install - COPY . . -EXPOSE 3000 +COPY caddy/Caddyfile /etc/caddy/Caddyfile -CMD ["npm", "start"] +# Copy entrypoint script +COPY docker-entrypoint.sh /docker-entrypoint.sh +RUN chmod +x /docker-entrypoint.sh + +# Expose required ports +EXPOSE 80 3000 5432 + +# Use the entrypoint script to start everything +ENTRYPOINT ["/docker-entrypoint.sh"] \ No newline at end of file diff --git a/caddy/Caddyfile b/caddy/Caddyfile index da44ac9..0761206 100644 --- a/caddy/Caddyfile +++ b/caddy/Caddyfile @@ -1,3 +1,3 @@ :80 { - reverse_proxy express:3000 + reverse_proxy localhost:3000 } diff --git a/docker-compose.yml b/docker-compose.yml index 3e1f540..13326f3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,45 +1,14 @@ version: '3' services: - express: + app: build: . - user: "${UID:-1000}:${GID:-1000}" - ports: - - "3000:3000" - volumes: - - ./container-data:/app/data - networks: - - app_network - depends_on: - postgres: - condition: service_healthy - - caddy: - image: caddy:2 ports: - "80:80" - volumes: - - ./caddy:/etc/caddy - networks: - - app_network - depends_on: - - express - - postgres: - image: postgres - environment: - POSTGRES_USER: ${POSTGRES_USER} - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} - POSTGRES_DB: ${POSTGRES_DB} - ports: + - "3000:3000" - "5432:5432" - networks: - - app_network - healthcheck: - test: [ "CMD", "pg_isready", "-U", "${POSTGRES_USER}", "-d", "${POSTGRES_DB}" ] - interval: 1s - retries: 10 - -networks: - app_network: - driver: bridge + environment: + - POSTGRES_HOST=${POSTGRES_HOST} + - POSTGRES_USER=${POSTGRES_USER} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + - POSTGRES_DB=${POSTGRES_DB} diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh new file mode 100644 index 0000000..1766c21 --- /dev/null +++ b/docker-entrypoint.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +# Start PostgreSQL service +service postgresql start + +# Wait for PostgreSQL to be ready +until su - postgres -c "pg_isready"; do + echo "Waiting for PostgreSQL to be ready..." + sleep 1 +done + +# Create the database and user if they don't exist +su - postgres -c "psql -tc \"SELECT 1 FROM pg_roles WHERE rolname = '$POSTGRES_USER';\"" | grep -q 1 || \ +su - postgres -c "psql -c \"CREATE USER $POSTGRES_USER WITH ENCRYPTED PASSWORD '$POSTGRES_PASSWORD';\"" + +su - postgres -c "psql -tc \"SELECT 1 FROM pg_database WHERE datname = '$POSTGRES_DB';\"" | grep -q 1 || \ +su - postgres -c "psql -c \"CREATE DATABASE $POSTGRES_DB OWNER $POSTGRES_USER;\"" + +# Start Caddy +caddy run --config /etc/caddy/Caddyfile & + +# Start Express app +npm start + +# Keep container running +wait diff --git a/src/database.js b/src/database.js index ba8a8dd..b90f77f 100644 --- a/src/database.js +++ b/src/database.js @@ -5,7 +5,7 @@ dotenv.config(); const sequelize = new Sequelize({ dialect: 'postgres', - host: 'postgres', + host: process.env.POSTGRES_HOST, port: 5432, database: process.env.POSTGRES_DB, username: process.env.POSTGRES_USER,