Prechádzať zdrojové kódy

update docker-compose.yml and add traefik

Virgil Ollivier 3 mesiacov pred
rodič
commit
e597bb3c4a
1 zmenil súbory, kde vykonal 116 pridanie a 32 odobranie
  1. 116 32
      docker-compose.yml

+ 116 - 32
docker-compose.yml

@@ -1,4 +1,64 @@
 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
   framed-server:
     build:
@@ -6,8 +66,8 @@ services:
       dockerfile: Dockerfile
     container_name: framed-tracker-server
     restart: unless-stopped
-    ports:
-      - "3000:3000"
+    # ports:
+    #  - "3000:3000"
     volumes:
       - ./server:/app
       - ./data:/app/data
@@ -16,6 +76,15 @@ services:
       - NODE_ENV=production
       - PORT=3000
       - 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)
   framed-client-dev:
@@ -23,42 +92,57 @@ services:
     container_name: framed-tracker-client-dev
     restart: unless-stopped
     working_dir: /app
-    ports:
-      - "3001:3001"
+    # ports:
+    #   - "3001:3001"
     volumes:
       - ./client:/app
+    networks:
+      - proxy
     environment:
       - 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"
     depends_on:
       - 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