From 5c4c47688db22bb4561e75f531e6b7df02825901 Mon Sep 17 00:00:00 2001 From: typical bob Date: Sat, 19 Apr 2025 20:35:49 +0600 Subject: [PATCH 1/2] feat: add docker support --- .env.example | 27 ++++++++++++++++++------ Dockerfile | 17 +++++++++++++++ docker-compose.yml | 52 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+), 6 deletions(-) create mode 100644 Dockerfile create mode 100644 docker-compose.yml diff --git a/.env.example b/.env.example index 072e702..57eae77 100644 --- a/.env.example +++ b/.env.example @@ -1,10 +1,25 @@ -DATABASE_URL="postgresql://user:password@localhost:5432/db?schema=public" +# Database credentials +PG_USER=p-stream_user +# Use a strong password +PG_PASSWORD=password +PG_DB=p-stream_backend +DATABASE_URL="postgresql://${PG_USER}:${PG_PASSWORD}@localhost:5432/${PG_DB}?schema=public" +DATABASE_URL_DOCKER="postgresql://${PG_USER}:${PG_PASSWORD}@postgres:5432/${PG_DB}?schema=public" + +# App metadata META_NAME='' META_DESCRIPTION='' + +# Security (generate with `openssl rand -base64 24` or use https://bitwarden.com/password-generator/) +CRYPTO_SECRET='' + +# API Keys +# From https://www.themoviedb.org/settings/api +TMDB_API_KEY='' +# From https://trakt.tv/oauth/applications +TRAKT_CLIENT_ID='' +TRAKT_SECRET_ID='' + +# Optional: Captcha CAPTCHA=false CAPTCHA_CLIENT_KEY='' -# USE A RANDOM PASSWORD GENERATOR LIKE THIS: https://bitwarden.com/password-generator/ NEVER SHARE -CRYPTO_SECRET='' -TMDB_API_KEY='' -TRAKT_CLIENT_ID='' -TRAKT_SECRET_ID='' \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..7d42f7c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,17 @@ +FROM node:23-alpine + +WORKDIR /app + +COPY package*.json ./ + +RUN npm ci + +COPY . . + +RUN npx prisma generate + +RUN npm run build + +EXPOSE 3000 + +CMD ["sh", "-c", "npx prisma migrate deploy && node .output/server/index.mjs"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..74822af --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,52 @@ +services: + postgres: + image: postgres:15-alpine + restart: unless-stopped + healthcheck: + test: [ "CMD-SHELL", "pg_isready -U $$PG_USER -d $$PG_DB" ] + interval: 5s + retries: 10 + timeout: 2s + environment: + - POSTGRES_USER=${PG_USER} + - POSTGRES_PASSWORD=${PG_PASSWORD} + - POSTGRES_DB=${PG_DB} + volumes: + - postgres-data:/var/lib/postgresql/data + env_file: + - .env + ports: + - '5432:5432' + networks: + - p-stream-network + + p-stream: + build: . + restart: unless-stopped + environment: + DATABASE_URL: ${DATABASE_URL_DOCKER:?database URL required} + META_NAME: ${META_NAME} + META_DESCRIPTION: ${META_DESCRIPTION} + CRYPTO_SECRET: ${CRYPTO_SECRET:?crypto secret required} + TMDB_API_KEY: ${TMDB_API_KEY:?TMDB API key password required} + TRAKT_CLIENT_ID: ${TRAKT_CLIENT_ID:?TMDB client ID password required} + TRAKT_SECRET_ID: ${TRAKT_SECRET_ID:?TMDB secret ID password required} + CAPTCHA: ${CAPTCHA} + CAPTCHA_CLIENT_KEY: ${CAPTCHA_CLIENT_KEY} + NODE_ENV: ${NODE_ENV:-production} + env_file: + - .env + ports: + - '3000:3000' + depends_on: + postgres: + condition: service_healthy + networks: + - p-stream-network + +networks: + p-stream-network: + driver: bridge + +volumes: + postgres-data: From 1f725998524543cd31cda65eb0888084b11ab877 Mon Sep 17 00:00:00 2001 From: typical bob Date: Sat, 19 Apr 2025 20:53:45 +0600 Subject: [PATCH 2/2] fix(docker-compose.yml): correct error messages --- docker-compose.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 74822af..454e82a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -28,9 +28,9 @@ services: META_NAME: ${META_NAME} META_DESCRIPTION: ${META_DESCRIPTION} CRYPTO_SECRET: ${CRYPTO_SECRET:?crypto secret required} - TMDB_API_KEY: ${TMDB_API_KEY:?TMDB API key password required} - TRAKT_CLIENT_ID: ${TRAKT_CLIENT_ID:?TMDB client ID password required} - TRAKT_SECRET_ID: ${TRAKT_SECRET_ID:?TMDB secret ID password required} + TMDB_API_KEY: ${TMDB_API_KEY:?TMDB API key required} + TRAKT_CLIENT_ID: ${TRAKT_CLIENT_ID:?Trakt client ID required} + TRAKT_SECRET_ID: ${TRAKT_SECRET_ID:?Trakt secret ID required} CAPTCHA: ${CAPTCHA} CAPTCHA_CLIENT_KEY: ${CAPTCHA_CLIENT_KEY} NODE_ENV: ${NODE_ENV:-production}