mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2025-11-20 03:32:09 +10:00
- Added missing `type="button"` attributes to various toolbar buttons in the rich-input component for better accessibility. - Updated Gengar template to ensure the summary section is only displayed when populated. - Changed boolean values in Docker Compose files from unquoted to quoted strings for consistency and to prevent potential parsing issues.
180 lines
5.5 KiB
YAML
180 lines
5.5 KiB
YAML
version: "3.8"
|
|
|
|
# In this Docker Compose example, we use Docker Swarm to deploy Reactive Resume on multiple servers, with Traefik as the load balancer.
|
|
# Ensure that the overlay network is created before deploying this stack. You can do so by running the following command:
|
|
# docker network create --driver=overlay --attachable reactive_resume_network
|
|
|
|
services:
|
|
# Database (Postgres)
|
|
postgres:
|
|
image: postgres:16-alpine
|
|
networks:
|
|
- reactive_resume_network
|
|
volumes:
|
|
- postgres_data:/var/lib/postgresql/data
|
|
environment:
|
|
POSTGRES_DB: postgres
|
|
POSTGRES_USER: postgres
|
|
POSTGRES_PASSWORD: postgres
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "pg_isready -U postgres -d postgres"]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 5
|
|
deploy:
|
|
replicas: 1
|
|
restart_policy:
|
|
condition: on-failure
|
|
|
|
# Storage (for image uploads)
|
|
minio:
|
|
image: minio/minio:latest
|
|
command: server /data
|
|
networks:
|
|
- reactive_resume_network
|
|
volumes:
|
|
- minio_data:/data
|
|
environment:
|
|
MINIO_ROOT_USER: minioadmin
|
|
MINIO_ROOT_PASSWORD: minioadmin
|
|
deploy:
|
|
replicas: 1
|
|
restart_policy:
|
|
condition: on-failure
|
|
labels:
|
|
- traefik.enable=true
|
|
- traefik.http.routers.storage.rule=Host(`storage.example.com`)
|
|
- traefik.http.routers.storage.entrypoints=websecure
|
|
- traefik.http.routers.storage.tls.certresolver=letsencrypt
|
|
- traefik.http.services.storage.loadbalancer.server.port=9000
|
|
|
|
# Chrome Browser (for printing and previews)
|
|
chrome:
|
|
image: ghcr.io/browserless/chromium:v2.18.0 # Upgrading to newer versions causes issues
|
|
networks:
|
|
- reactive_resume_network
|
|
environment:
|
|
TIMEOUT: 10000
|
|
CONCURRENT: 10
|
|
TOKEN: chrome_token
|
|
EXIT_ON_HEALTH_FAILURE: "true"
|
|
PRE_REQUEST_HEALTH_CHECK: "true"
|
|
deploy:
|
|
replicas: 2
|
|
restart_policy:
|
|
condition: on-failure
|
|
labels:
|
|
- traefik.enable=true
|
|
- traefik.http.routers.printer.rule=Host(`printer.example.com`)
|
|
- traefik.http.routers.printer.entrypoints=websecure
|
|
- traefik.http.routers.printer.tls.certresolver=letsencrypt
|
|
- traefik.http.services.printer.loadbalancer.server.port=3000
|
|
|
|
app:
|
|
image: amruthpillai/reactive-resume:latest
|
|
networks:
|
|
- reactive_resume_network
|
|
environment:
|
|
# -- Environment Variables --
|
|
PORT: 3000
|
|
NODE_ENV: production
|
|
|
|
# -- URLs --
|
|
PUBLIC_URL: https://example.com
|
|
STORAGE_URL: https://storage.example.com
|
|
|
|
# -- Printer (Chrome) --
|
|
CHROME_TOKEN: chrome_token
|
|
CHROME_URL: wss://printer.example.com
|
|
|
|
# -- Database (Postgres) --
|
|
DATABASE_URL: postgresql://postgres:postgres@postgres:5432/postgres
|
|
|
|
# -- Auth --
|
|
ACCESS_TOKEN_SECRET: access_token_secret
|
|
REFRESH_TOKEN_SECRET: refresh_token_secret
|
|
|
|
# -- Emails --
|
|
MAIL_FROM: noreply@example.com
|
|
# SMTP_URL: smtp://user:pass@smtp:587 # Optional
|
|
|
|
# -- Storage (Minio) --
|
|
STORAGE_ENDPOINT: minio
|
|
STORAGE_PORT: 9000
|
|
STORAGE_REGION: us-east-1 # Optional
|
|
STORAGE_BUCKET: default
|
|
STORAGE_ACCESS_KEY: minioadmin
|
|
STORAGE_SECRET_KEY: minioadmin
|
|
STORAGE_USE_SSL: "false"
|
|
STORAGE_SKIP_BUCKET_CHECK: "false"
|
|
|
|
# -- Crowdin (Optional) --
|
|
# CROWDIN_PROJECT_ID:
|
|
# CROWDIN_PERSONAL_TOKEN:
|
|
|
|
# -- Feature Flags (Optional) --
|
|
# DISABLE_SIGNUPS: "false"
|
|
# DISABLE_EMAIL_AUTH: "false"
|
|
|
|
# -- GitHub (Optional) --
|
|
# GITHUB_CLIENT_ID: github_client_id
|
|
# GITHUB_CLIENT_SECRET: github_client_secret
|
|
# GITHUB_CALLBACK_URL: https://example.com/api/auth/github/callback
|
|
|
|
# -- Google (Optional) --
|
|
# GOOGLE_CLIENT_ID: google_client_id
|
|
# GOOGLE_CLIENT_SECRET: google_client_secret
|
|
# GOOGLE_CALLBACK_URL: https://example.com/api/auth/google/callback
|
|
deploy:
|
|
replicas: 2
|
|
restart_policy:
|
|
condition: on-failure
|
|
labels:
|
|
- traefik.enable=true
|
|
- traefik.http.routers.app.rule=Host(`example.com`)
|
|
- traefik.http.routers.app.entrypoints=websecure
|
|
- traefik.http.routers.app.tls.certresolver=letsencrypt
|
|
- traefik.http.services.app.loadbalancer.server.port=3000
|
|
|
|
traefik:
|
|
image: traefik
|
|
command:
|
|
- --api=true
|
|
- --providers.docker=true
|
|
- --providers.docker.swarmMode=true
|
|
- --providers.docker.exposedbydefault=false
|
|
- --providers.docker.network=reactive_resume_network
|
|
- --entrypoints.web.address=:80
|
|
- --entrypoints.websecure.address=:443
|
|
- --certificatesresolvers.letsencrypt.acme.tlschallenge=true
|
|
- --certificatesresolvers.letsencrypt.acme.email=noreply@example.com
|
|
- --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json
|
|
|
|
# Let's Encrypt Staging Server (for testing)
|
|
# - --certificatesResolvers.letsencrypt.acme.caServer=https://acme-staging-v02.api.letsencrypt.org/directory
|
|
|
|
# Redirect all HTTP requests to HTTPS
|
|
- --entrypoints.web.http.redirections.entrypoint.to=websecure
|
|
- --entrypoints.web.http.redirections.entrypoint.scheme=https
|
|
ports:
|
|
- "80:80"
|
|
- "443:443"
|
|
- "8080:8080"
|
|
networks:
|
|
- reactive_resume_network
|
|
volumes:
|
|
- letsencrypt_data:/letsencrypt
|
|
- /var/run/docker.sock:/var/run/docker.sock
|
|
deploy:
|
|
placement:
|
|
constraints: [node.role == manager]
|
|
|
|
volumes:
|
|
minio_data:
|
|
postgres_data:
|
|
letsencrypt_data:
|
|
|
|
networks:
|
|
reactive_resume_network:
|
|
external: true
|