|
@@ -1,4 +1,64 @@
|
|
services:
|
|
services:
|
|
|
|
+ proxy:
|
|
|
|
+ image: traefik:v3
|
|
|
|
+ container_name: proxy
|
|
|
|
+ restart: unless-stopped
|
|
|
|
+ command:
|
|
|
|
+ - '--api'
|
|
|
|
+ - '--global.sendAnonymousUsage=false'
|
|
|
|
+ - '--global.checkNewVersion=false'
|
|
|
|
+ - '--log=true'
|
|
|
|
+ - '--log.level=DEBUG'
|
|
|
|
+ - '--log.format=common'
|
|
|
|
+ # providers
|
|
|
|
+ - "--providers.docker=true"
|
|
|
|
+ - "--providers.docker.network=proxy"
|
|
|
|
+ - "--providers.docker.exposedByDefault=false"
|
|
|
|
+ - "--providers.file.directory=/etc/traefik/"
|
|
|
|
+ - "--providers.file.watch=true"
|
|
|
|
+ - "--entrypoints.web.address=:80"
|
|
|
|
+ - "--entrypoints.web.http.redirections.entrypoint.to=websecure"
|
|
|
|
+ - "--entryPoints.web.http.redirections.entrypoint.scheme=https"
|
|
|
|
+ - "--entrypoints.websecure.address=:443"
|
|
|
|
+ # letsencrypt
|
|
|
|
+ - "--certificatesresolvers.leresolver.acme.dnschallenge=true"
|
|
|
|
+ - "--certificatesresolvers.leresolver.acme.dnschallenge.provider=ovh"
|
|
|
|
+ - "--certificatesresolvers.leresolver.acme.dnschallenge.resolvers=8.8.8.8:53"
|
|
|
|
+ - "--certificatesresolvers.leresolver.acme.email=contact@linuxforward.com"
|
|
|
|
+ - "--certificatesresolvers.leresolver.acme.storage=/letsencrypt/acme.json"
|
|
|
|
+ ports:
|
|
|
|
+ - "80:80"
|
|
|
|
+ - "443:443"
|
|
|
|
+ volumes:
|
|
|
|
+ - "./traefik/config:/etc/traefik"
|
|
|
|
+ - "./traefik/letsencrypt:/letsencrypt"
|
|
|
|
+ - "/var/run/docker.sock:/var/run/docker.sock:ro"
|
|
|
|
+ environment:
|
|
|
|
+ - "OVH_ENDPOINT=ovh-eu"
|
|
|
|
+ - "OVH_APPLICATION_KEY=dcee610a0a9df3c7"
|
|
|
|
+ - "OVH_APPLICATION_SECRET=11892f9feb86d85544827b83194e679d"
|
|
|
|
+ - "OVH_CONSUMER_KEY=5b059d39a3e6ace6f343b411e7208e28"
|
|
|
|
+ networks:
|
|
|
|
+ - proxy
|
|
|
|
+ labels:
|
|
|
|
+ - "traefik.enable=true"
|
|
|
|
+ # API & Dashboard
|
|
|
|
+ - "traefik.http.routers.dashboard.rule=(Host(`dashboard-ft.linuxforward.com`)) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))"
|
|
|
|
+ - "traefik.http.routers.dashboard.service=api@internal"
|
|
|
|
+ - "traefik.http.routers.dashboard.entrypoints=websecure"
|
|
|
|
+ - "traefik.http.routers.dashboard.tls=true"
|
|
|
|
+ - "traefik.http.routers.dashboard.tls.certresolver=leresolver"
|
|
|
|
+ - "traefik.http.routers.dashboard.middlewares=auth"
|
|
|
|
+ - "traefik.http.middlewares.auth.basicauth.users=dashboard-ft:***REMOVED***" # Q2nZkXhrqu54cQR5
|
|
|
|
+
|
|
|
|
+ ## middleware redirect
|
|
|
|
+ #- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
|
|
|
|
+
|
|
|
|
+ ## global redirect to https
|
|
|
|
+ #- "traefik.http.routers.redirs.rule=hostregexp(`{host:.+}`)"
|
|
|
|
+ #- "traefik.http.routers.redirs.entrypoints=web"
|
|
|
|
+ #- "traefik.http.routers.redirs.middlewares=redirect-to-https"
|
|
|
|
+
|
|
# Service pour le backend
|
|
# Service pour le backend
|
|
framed-server:
|
|
framed-server:
|
|
build:
|
|
build:
|
|
@@ -6,8 +66,8 @@ services:
|
|
dockerfile: Dockerfile
|
|
dockerfile: Dockerfile
|
|
container_name: framed-tracker-server
|
|
container_name: framed-tracker-server
|
|
restart: unless-stopped
|
|
restart: unless-stopped
|
|
- ports:
|
|
|
|
- - "3000:3000"
|
|
|
|
|
|
+ # ports:
|
|
|
|
+ # - "3000:3000"
|
|
volumes:
|
|
volumes:
|
|
- ./server:/app
|
|
- ./server:/app
|
|
- ./data:/app/data
|
|
- ./data:/app/data
|
|
@@ -16,6 +76,15 @@ services:
|
|
- NODE_ENV=production
|
|
- NODE_ENV=production
|
|
- PORT=3000
|
|
- PORT=3000
|
|
- DB_PATH=/app/data/framed.db
|
|
- DB_PATH=/app/data/framed.db
|
|
|
|
+ networks:
|
|
|
|
+ - proxy
|
|
|
|
+ labels:
|
|
|
|
+ - "traefik.enable=true"
|
|
|
|
+ - "traefik.http.routers.framed-tracker-api.rule=(Host(`framed-tracker.linuxforward.com`) && PathPrefix(`/api`))"
|
|
|
|
+ - "traefik.http.routers.framed-tracker-api.entrypoints=websecure"
|
|
|
|
+ - "traefik.http.routers.framed-tracker-api.tls=true"
|
|
|
|
+ - "traefik.http.routers.framed-tracker-api.tls.certresolver=leresolver"
|
|
|
|
+ - "traefik.http.services.framed-tracker-api.loadbalancer.server.port=3000"
|
|
|
|
|
|
# Service pour le frontend (en développement)
|
|
# Service pour le frontend (en développement)
|
|
framed-client-dev:
|
|
framed-client-dev:
|
|
@@ -23,42 +92,57 @@ services:
|
|
container_name: framed-tracker-client-dev
|
|
container_name: framed-tracker-client-dev
|
|
restart: unless-stopped
|
|
restart: unless-stopped
|
|
working_dir: /app
|
|
working_dir: /app
|
|
- ports:
|
|
|
|
- - "3001:3001"
|
|
|
|
|
|
+ # ports:
|
|
|
|
+ # - "3001:3001"
|
|
volumes:
|
|
volumes:
|
|
- ./client:/app
|
|
- ./client:/app
|
|
|
|
+ networks:
|
|
|
|
+ - proxy
|
|
environment:
|
|
environment:
|
|
- PORT=3001
|
|
- PORT=3001
|
|
- - REACT_APP_API_URL=http://localhost:3000/api
|
|
|
|
|
|
+ - REACT_APP_API_URL=http://framed-server/api
|
|
command: sh -c "npm install && npm start"
|
|
command: sh -c "npm install && npm start"
|
|
depends_on:
|
|
depends_on:
|
|
- framed-server
|
|
- framed-server
|
|
|
|
+ labels:
|
|
|
|
+ - "traefik.enable=true"
|
|
|
|
+ - "traefik.http.routers.framed-tracker.rule=Host(`framed-tracker.linuxforward.com`)"
|
|
|
|
+ - "traefik.http.routers.framed-tracker.entrypoints=websecure"
|
|
|
|
+ - "traefik.http.routers.framed-tracker.tls=true"
|
|
|
|
+ - "traefik.http.routers.framed-tracker.tls.certresolver=leresolver"
|
|
|
|
+ - "traefik.http.services.framed-tracker.loadbalancer.server.port=3001"
|
|
|
|
|
|
- # Service pour construire le frontend (production)
|
|
|
|
- framed-client-build:
|
|
|
|
- image: node:18-alpine
|
|
|
|
- container_name: framed-tracker-client-build
|
|
|
|
- working_dir: /app
|
|
|
|
- volumes:
|
|
|
|
- - ./client:/app
|
|
|
|
- - ./server/public:/output
|
|
|
|
- environment:
|
|
|
|
- - REACT_APP_API_URL=/api
|
|
|
|
- command: sh -c "npm install && npm run build && cp -r build/* /output/"
|
|
|
|
- profiles:
|
|
|
|
- - build
|
|
|
|
|
|
+ # # Service pour construire le frontend (production)
|
|
|
|
+ # framed-client-build:
|
|
|
|
+ # image: node:18-alpine
|
|
|
|
+ # container_name: framed-tracker-client-build
|
|
|
|
+ # working_dir: /app
|
|
|
|
+ # networks:
|
|
|
|
+ # - proxy
|
|
|
|
+ # volumes:
|
|
|
|
+ # - ./client:/app
|
|
|
|
+ # - ./server/public:/output
|
|
|
|
+ # environment:
|
|
|
|
+ # - REACT_APP_API_URL=/api
|
|
|
|
+ # command: sh -c "npm install && npm run build && cp -r build/* /output/"
|
|
|
|
+ # profiles:
|
|
|
|
+ # - build
|
|
|
|
|
|
- # Service nginx pour servir l'application en production
|
|
|
|
- framed-nginx:
|
|
|
|
- image: nginx:alpine
|
|
|
|
- container_name: framed-tracker-nginx
|
|
|
|
- restart: unless-stopped
|
|
|
|
- ports:
|
|
|
|
- - "80:80"
|
|
|
|
- volumes:
|
|
|
|
- - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
|
|
|
|
- - ./server/public:/usr/share/nginx/html
|
|
|
|
- depends_on:
|
|
|
|
- - framed-server
|
|
|
|
- profiles:
|
|
|
|
- - prod
|
|
|
|
|
|
+ # # Service nginx pour servir l'application en production
|
|
|
|
+ # framed-nginx:
|
|
|
|
+ # image: nginx:alpine
|
|
|
|
+ # container_name: framed-tracker-nginx
|
|
|
|
+ # restart: unless-stopped
|
|
|
|
+ # ports:
|
|
|
|
+ # - "80:80"
|
|
|
|
+ # volumes:
|
|
|
|
+ # - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
|
|
|
|
+ # - ./server/public:/usr/share/nginx/html
|
|
|
|
+ # depends_on:
|
|
|
|
+ # - framed-server
|
|
|
|
+ # profiles:
|
|
|
|
+ # - prod
|
|
|
|
+
|
|
|
|
+networks:
|
|
|
|
+ proxy:
|
|
|
|
+ name: proxy
|