version: '3.8'

services:
  server:
    container_name: server
    image: server:1.0.0
    build:
      context: ./backend
      dockerfile: Dockerfile
    command: npm run start:debug
    ports:
      - 127.0.0.1:${SERVER_PORT}:${SERVER_PORT}
    networks:
      - backend-network
    volumes:
      # changes in host's ./backend directory will be propagated to the container
      - ./backend:/usr/src/app
      # this will let us add packages during development without rebuilding the image
      # - we then need to install added packages (run 'npm i') inside the container in the folder '/usr/src'
      - ./backend/package.json:/usr/src/package.json
      - ./backend/package-lock.json:/usr/src/package-lock.json
      # this prevents our host files from overriding container's node_modules
      # – some packages may be platform specific so we always want to run 'npm i' in the container when new package is added
      - exclude-server:/usr/src/app/node_modules/
    environment:
      - PORT=${SERVER_PORT}
      - DATABASE_URL=${DATABASE_URL}
    restart: always
    depends_on:
      - postgres

  postgres:
    container_name: postgres
    image: postgres:14.3-alpine
    ports:
      - 127.0.0.1:${DB_PORT}:${DB_PORT}
    networks:
      - backend-network
    volumes:
      - ./backend/database-storage:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: ${DB_USER}
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_DB: ${DB_NAME}
      PGPORT: ${DB_PORT}
    restart: always

  adminer:
    container_name: adminer
    image: adminer:4.8.1
    ports:
      - 127.0.0.1:${ADMINER_PORT}:${ADMINER_PORT}
    networks:
      - backend-network
    environment:
      ADMINER_DESIGN: nette
    restart: always
    depends_on:
      - postgres

  nginx:
    container_name: nginx
    image: nginx:1.21.6-alpine
    ports:
      - 127.0.0.1:${NGINX_PORT}:${NGINX_PORT}
    networks:
      - backend-network
      - frontend-network
    volumes:
      - ./nginx/templates:/etc/nginx/templates
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    environment:
      - NGINX_PORT=${NGINX_PORT}
      - SERVER_PORT=${SERVER_PORT}
    restart: always
    depends_on:
      - server
      - postgres

  client:
    container_name: client
    image: client:1.0.0
    build:
      context: ./frontend
      dockerfile: Dockerfile
    ports:
      - 127.0.0.1:${CLIENT_PORT}:${CLIENT_PORT}
    networks:
     - frontend-network
    volumes:
      # changes in host's ./frontend directory will be propagated to the container
      - ./frontend:/usr/src/app
      # this prevents our host files from overriding container's node_modules
      - exclude-client:/usr/src/app/node_modules/
    environment:
      - PORT=${CLIENT_PORT}
      # all the traffic goes through Nginx server
      - VITE_SERVER_PORT=${NGINX_PORT}
    restart: always

networks:
  backend-network:
    driver: bridge
  frontend-network:

volumes:
  database-storage:
  exclude-server:
  exclude-client:
