Skip to content

Sample Setup

CodeWithCJ edited this page Feb 21, 2026 · 13 revisions

My Compose file

version: "3.9"

services:
  sparkyfitness-db:
    image: postgres:15-alpine
    container_name: postgres15-alpine
    ports:
      - "5434:5432"
    
    restart: always
    environment:
      POSTGRES_DB: ${SPARKY_FITNESS_DB_NAME}
      POSTGRES_USER: ${SPARKY_FITNESS_DB_USER}
      POSTGRES_PASSWORD: ${SPARKY_FITNESS_DB_PASSWORD}
    volumes:
      - /mnt/eHDD/SparkyApps/sparkyfitness/postgresql:/var/lib/postgresql/data
    networks:
      - sparkyfitness-network # Use the new named network

  sparkyfitness-server:
    image: codewithcj/sparkyfitness_server:${SPARKY_VERSION} # Use pre-built image
    container_name: sparkyfitness-server
    environment:
      BETTER_AUTH_TRUST_HOST: "true"
      SPARKY_FITNESS_LOG_LEVEL: ${SPARKY_FITNESS_LOG_LEVEL}
      SPARKY_FITNESS_DB_USER: ${SPARKY_FITNESS_DB_USER}
      SPARKY_FITNESS_DB_HOST: sparkyfitness-db # Use the service name 'sparkyfitness-db' for inter-container communication
      SPARKY_FITNESS_DB_NAME: ${SPARKY_FITNESS_DB_NAME}
      SPARKY_FITNESS_DB_PASSWORD: ${SPARKY_FITNESS_DB_PASSWORD}
      SPARKY_FITNESS_APP_DB_USER: ${SPARKY_FITNESS_APP_DB_USER}
      SPARKY_FITNESS_APP_DB_PASSWORD: ${SPARKY_FITNESS_APP_DB_PASSWORD}
      SPARKY_FITNESS_DB_PORT: 5432
      SPARKY_FITNESS_API_ENCRYPTION_KEY: ${SPARKY_FITNESS_API_ENCRYPTION_KEY}
      SPARKY_FITNESS_SERVER_PORT: 3010
      BETTER_AUTH_SECRET : ${BETTER_AUTH_SECRET}
      SPARKY_FITNESS_FRONTEND_URL: ${SPARKY_FITNESS_FRONTEND_URL}
      BETTER_AUTH_URL: ${SPARKY_FITNESS_FRONTEND_URL}
      SPARKY_FITNESS_ADMIN_EMAIL: ${SPARKY_FITNESS_ADMIN_EMAIL}
      NODE_ENV: ${NODE_ENV} # Ensure NODE_ENV is passed to the backend service
      GARMIN_MICROSERVICE_URL: http://sparkyfitness-garmin:8000
      SPARKY_FITNESS_EMAIL_HOST: ${SPARKY_FITNESS_EMAIL_HOST}
      SPARKY_FITNESS_EMAIL_PORT: ${SPARKY_FITNESS_EMAIL_PORT}
      SPARKY_FITNESS_EMAIL_SECURE: ${SPARKY_FITNESS_EMAIL_SECURE}
      SPARKY_FITNESS_EMAIL_USER: ${SPARKY_FITNESS_EMAIL_USER}
      SPARKY_FITNESS_EMAIL_PASS: ${SPARKY_FITNESS_EMAIL_PASS}
      SPARKY_FITNESS_EMAIL_FROM: ${SPARKY_FITNESS_EMAIL_FROM}
    networks:
      - sparkyfitness-network # Use the new named network
    restart: always
    #extra_hosts:
    #  - "auth.domain.com:10.0.0.10"   # internal IP of Authentik OR host IP
    volumes:
      - /mnt/eHDD/SparkyApps/sparkyfitness/backups:/app/SparkyFitnessServer/backup # Mount volume for backups
      - /mnt/eHDD/SparkyApps/sparkyfitness/uploads:/app/SparkyFitnessServer/uploads # Mount volume for backups
    depends_on:
      - sparkyfitness-db # Backend depends on the database being available


  sparkyfitness-frontend:
    image: codewithcj/sparkyfitness:${SPARKY_VERSION} # Use pre-built image
    container_name: sparkyfitness-frontend
    #volumes:
    #  - /mnt/eHDD/SparkyApps/sparkyfitness/nginx/nginx.conf:/etc/nginx/templates/default.conf.template
    environment:   
      SPARKY_FITNESS_SERVER_HOST: sparkyfitness-server
      SPARKY_FITNESS_SERVER_PORT: 3010
      SPARKY_FITNESS_FRONTEND_URL: ${SPARKY_FITNESS_FRONTEND_URL}
    ports:
      - "3004:80" # Map host port 8080 to container port 80 (Nginx)
    networks:
      - sparkyfitness-network # Use the new named network
    restart: always
    depends_on:
      - sparkyfitness-server # Frontend depends on the server

  sparkyfitness-garmin:
    image: codewithcj/sparkyfitness_garmin:${SPARKY_VERSION}
    container_name: sparkyfitness-garmin
    environment:
      GARMIN_MICROSERVICE_URL: http://sparkyfitness-garmin:8000
    networks:
      - sparkyfitness-network
    restart: unless-stopped
    #volumes:
    #  - /mnt/eHDD/SparkyApps/sparkyfitness/SparkyFitnessGarmin:/app
    depends_on:
      - sparkyfitness-db
      - sparkyfitness-server
networks:
  sparkyfitness-network:
    driver: bridge

My Env Variable Setup

SPARKY_FITNESS_DB_NAME=sparkyfitness_db
SPARKY_FITNESS_DB_USER=sparky
SPARKY_FITNESS_DB_PASSWORD=password
SPARKY_FITNESS_FRONTEND_URL=https://fit.domain.com
SPARKY_FITNESS_LOG_LEVEL=ERROR
NODE_ENV=production
TZ=Etc/UTC
SPARKY_FITNESS_API_ENCRYPTION_KEY=******
BETTER_AUTH_SECRET=******=
SPARKY_FITNESS_ADMIN_EMAIL=myemail@gmail.com
SPARKY_FITNESS_EMAIL_HOST=smtp.gmail.com
SPARKY_FITNESS_EMAIL_PORT=587
SPARKY_FITNESS_EMAIL_SECURE=false
SPARKY_FITNESS_EMAIL_USER=myemail@gmail.com
SPARKY_FITNESS_EMAIL_PASS=******
SPARKY_FITNESS_EMAIL_FROM=myemail@gmail.com
SPARKY_VERSION=latest
SPARKY_FITNESS_APP_DB_USER=sparky_asd
SPARKY_FITNESS_APP_DB_PASSWORD=password
SPARKY_FITNESS_DB_PORT=5434

NGINX Proxy Manager

Here 192.168.1.111 is the IP address of my server. 3004 is front end port.

image

image

image

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
add_header X-Content-Type-Options "nosniff";
proxy_set_header X-Forwarded-Ssl on;
image

Clone this wiki locally