diff --git a/client/Dockerfile b/client/Dockerfile index f1021e6..9e8ec7a 100644 --- a/client/Dockerfile +++ b/client/Dockerfile @@ -1,6 +1,6 @@ # client -FROM node:18 AS build +FROM node:20 AS build WORKDIR /usr/src/app/client diff --git a/docker-compose-local.yaml b/docker-compose-local.yaml new file mode 100644 index 0000000..0d8d61a --- /dev/null +++ b/docker-compose-local.yaml @@ -0,0 +1,109 @@ +version: '3' + +services: + + frontend: + build: + context: ./client + dockerfile: Dockerfile + container_name: frontend + ports: + - "5173:5173" + restart: always + + backend: + build: + context: ./server + dockerfile: Dockerfile + container_name: backend + ports: + - "3000:3000" + environment: + PORT: 3000 + MONGO_URI: "mongodb://mongo:27017/evaluetonsavoir" + MONGO_DATABASE: evaluetonsavoir + EMAIL_SERVICE: gmail + SENDER_EMAIL: infoevaluetonsavoir@gmail.com + EMAIL_PSW: 'vvml wmfr dkzb vjzb' + JWT_SECRET: haQdgd2jp09qb897GeBZyJetC8ECSpbFJe + SESSION_Secret: 'lookMomImQuizzing' + SITE_URL: http://localhost + FRONTEND_PORT: 5173 + USE_PORTS: false + AUTHENTICATED_ROOMS: false + volumes: + - ./server/auth_config.json:/usr/src/app/serveur/config/auth_config.json + depends_on: + - mongo + - keycloak + restart: always + + # Ce conteneur sert de routeur pour assurer le bon fonctionnement de l'application + nginx: + image: fuhrmanator/evaluetonsavoir-routeur:latest + container_name: nginx + ports: + - "80:80" + depends_on: + - backend + - frontend + restart: always + + # Ce conteneur est la base de données principale pour l'application + mongo: + image: mongo + container_name: mongo + ports: + - "27017:27017" + tty: true + volumes: + - mongodb_data:/data/db + restart: always + + # Ce conteneur cherche des mises à jour à 5h du matin + watchtower: + image: containrrr/watchtower + container_name: watchtower + volumes: + - /var/run/docker.sock:/var/run/docker.sock + environment: + - TZ=America/Montreal + - WATCHTOWER_CLEANUP=true + - WATCHTOWER_DEBUG=true + - WATCHTOWER_INCLUDE_RESTARTING=true + - WATCHTOWER_SCHEDULE=0 0 5 * * * # At 5 am everyday + restart: always + + watchtower-once: + image: containrrr/watchtower + container_name: watchtower-once + volumes: + - /var/run/docker.sock:/var/run/docker.sock + command: --run-once + environment: + - TZ=America/Montreal + - WATCHTOWER_CLEANUP=true + - WATCHTOWER_DEBUG=true + - WATCHTOWER_INCLUDE_RESTARTING=true + restart: "no" + + keycloak: + container_name: keycloak + image: quay.io/keycloak/keycloak:latest + environment: + KEYCLOAK_ADMIN: admin + KEYCLOAK_ADMIN_PASSWORD: admin123 + KC_HEALTH_ENABLED: 'true' + KC_FEATURES: preview + ports: + - "8080:8080" + volumes: + - ./oauth-tester/config.json:/opt/keycloak/data/import/realm-config.json + command: + - start-dev + - --import-realm + - --hostname-strict=false + +volumes: + mongodb_data: + external: false diff --git a/docker-compose.yaml b/docker-compose.yaml index 0d8d61a..b0c1410 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -3,18 +3,19 @@ version: '3' services: frontend: - build: - context: ./client - dockerfile: Dockerfile + image: fuhrmanator/evaluetonsavoir-frontend:latest container_name: frontend + environment: + # Define empty VITE_BACKEND_URL because it's production + - VITE_BACKEND_URL= + # Define empty VITE_BACKEND_SOCKET_URL so it will default to window.location.host + - VITE_BACKEND_SOCKET_URL= ports: - "5173:5173" restart: always backend: - build: - context: ./server - dockerfile: Dockerfile + image: fuhrmanator/evaluetonsavoir-backend:latest container_name: backend ports: - "3000:3000" @@ -28,11 +29,13 @@ services: JWT_SECRET: haQdgd2jp09qb897GeBZyJetC8ECSpbFJe SESSION_Secret: 'lookMomImQuizzing' SITE_URL: http://localhost + OIDC_URL: https://evalsa.etsmtl.ca FRONTEND_PORT: 5173 USE_PORTS: false AUTHENTICATED_ROOMS: false volumes: - - ./server/auth_config.json:/usr/src/app/serveur/config/auth_config.json + - /opt/EvalueTonSavoir/auth_config.json:/usr/src/app/serveur/auth_config.json + - /opt/EvalueTonSavoir/oauth-tester/config.json:/usr/src/app/serveur/oauth-tester/config.json depends_on: - mongo - keycloak diff --git a/server/auth/modules/passport-providers/oidc.js b/server/auth/modules/passport-providers/oidc.js index 9ccebf1..4b6e990 100644 --- a/server/auth/modules/passport-providers/oidc.js +++ b/server/auth/modules/passport-providers/oidc.js @@ -4,6 +4,7 @@ var users = require('../../../models/users'); var { hasNestedValue } = require('../../../utils'); const { MISSING_OIDC_PARAMETER } = require('../../../constants/errorCodes.js'); const AppError = require('../../../middleware/AppError.js'); +const expressListEndpoints = require('express-list-endpoints'); class PassportOpenIDConnect { constructor(passportjs, auth_name) { @@ -23,11 +24,16 @@ class PassportOpenIDConnect { async register(app, passport, endpoint, name, provider) { - const config = await this.getConfigFromConfigURL(name, provider) - const cb_url = `${process.env['BACKEND_URL']}${endpoint}/${name}/callback` - const self = this - const scope = 'openid profile email ' + `${provider.OIDC_ADD_SCOPE}` + const config = await this.getConfigFromConfigURL(name, provider); + const cb_url = `${process.env['OIDC_URL']}${endpoint}/${name}/callback`; + const self = this; + const scope = 'openid profile email ' + `${provider.OIDC_ADD_SCOPE}`; + console.log(config); + console.log(''); + console.log(cb_url); + console.log(''); + console.log(scope); passport.use(name, new OpenIDConnectStrategy({ issuer: config.issuer, authorizationURL: config.authorization_endpoint, @@ -49,7 +55,6 @@ class PassportOpenIDConnect { roles: [] }; - if (hasNestedValue(profile, provider.OIDC_ROLE_TEACHER_VALUE)) received_user.roles.push('teacher') if (hasNestedValue(profile, provider.OIDC_ROLE_STUDENT_VALUE)) received_user.roles.push('student') @@ -99,7 +104,8 @@ class PassportOpenIDConnect { } } ); - console.info(`Ajout de la connexion : ${name}(OIDC)`) + console.info(`Ajout de la connexion : ${name}(OIDC)`); + console.log(expressListEndpoints(app)); } } diff --git a/server/package-lock.json b/server/package-lock.json index 1de4aeb..e0fdb07 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -14,6 +14,7 @@ "cors": "^2.8.5", "dotenv": "^16.4.4", "express": "^4.18.2", + "express-list-endpoints": "^7.1.1", "express-session": "^1.18.0", "jsonwebtoken": "^9.0.2", "mongodb": "^6.3.0", @@ -3247,6 +3248,15 @@ "url": "https://opencollective.com/express" } }, + "node_modules/express-list-endpoints": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/express-list-endpoints/-/express-list-endpoints-7.1.1.tgz", + "integrity": "sha512-SA6YHH1r6DrioJ4fFJNqiwu1FweGFqJZO9KBApMzwPosoSGPOX2AW0wiMepOXjojjEXDuP9whIvckomheErbJA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/express-session": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.18.1.tgz", diff --git a/server/package.json b/server/package.json index 4eb536d..cd0348b 100644 --- a/server/package.json +++ b/server/package.json @@ -18,6 +18,7 @@ "cors": "^2.8.5", "dotenv": "^16.4.4", "express": "^4.18.2", + "express-list-endpoints": "^7.1.1", "express-session": "^1.18.0", "jsonwebtoken": "^9.0.2", "mongodb": "^6.3.0",