diff --git a/CyberusgateApp/package-lock.json b/CyberusgateApp/package-lock.json index a2ad3f2..a6d4166 100644 --- a/CyberusgateApp/package-lock.json +++ b/CyberusgateApp/package-lock.json @@ -84,6 +84,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", @@ -1486,6 +1487,7 @@ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", "license": "MIT", + "peer": true, "engines": { "node": ">=6.9.0" } @@ -1566,29 +1568,6 @@ "node": ">=0.8.0" } }, - "node_modules/@emnapi/core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", - "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@emnapi/wasi-threads": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", @@ -3083,6 +3062,7 @@ "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-7.3.4.tgz", "integrity": "sha512-zyAqFLeZuaakerMMnhYqBeGAzJ+WFQUTgezP3FxSlXNwFq5XxnjP28vi2XHGqm4zg4pGWls9Ay4JKshIHUOpwA==", "license": "MIT", + "peer": true, "dependencies": { "@react-navigation/core": "^7.21.2", "escape-string-regexp": "^4.0.0", @@ -3282,6 +3262,7 @@ "integrity": "sha512-Qec1E3mhALmaspIrhWt9jkQMNdw6bReVu64mjvhbhq2NFPftLPVr+l1SZgmw/66WwBNpDh7ao5AT6gF5v41PFA==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -3352,6 +3333,7 @@ "integrity": "sha512-sPhE4iHuJDSvoAiec+Ro8JyXw8f0ql13HFR82P99nCm9GwTEKG0KYLvDe6REk8BCXuit6vJAv/Yxg5ABaNS2rA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.62.1", "@typescript-eslint/types": "8.62.1", @@ -3714,9 +3696,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3731,9 +3710,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3748,9 +3724,6 @@ "loong64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3765,9 +3738,6 @@ "loong64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3782,9 +3752,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3799,9 +3766,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3816,9 +3780,6 @@ "riscv64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3833,9 +3794,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3850,9 +3808,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3867,9 +3822,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -4013,6 +3965,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -4673,6 +4626,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.10.38", "caniuse-lite": "^1.0.30001799", @@ -5668,6 +5622,7 @@ "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -5864,6 +5819,7 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -6078,6 +6034,7 @@ "resolved": "https://registry.npmjs.org/expo/-/expo-54.0.35.tgz", "integrity": "sha512-E+tXpQwjGm5fK/uwa55p0Xx/kuo5dXDKfVJ95IargTNa5KiFt26lSTXXa9KnHbI4EDLwFD38/xTKZvzPTlGTdg==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.20.0", "@expo/cli": "54.0.25", @@ -6130,6 +6087,7 @@ "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.13.tgz", "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==", "license": "MIT", + "peer": true, "dependencies": { "@expo/config": "~12.0.13", "@expo/env": "~2.0.8" @@ -6144,6 +6102,7 @@ "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-14.0.12.tgz", "integrity": "sha512-QQzunE2Mxk45AsCWm3tK7OpVljbtVnKD58q4/qliev+cbye1IOduUnRIdD+P7DyButw17G9MTX795kgaQiz5hQ==", "license": "MIT", + "peer": true, "dependencies": { "fontfaceobserver": "^2.1.0" }, @@ -6184,6 +6143,7 @@ "resolved": "https://registry.npmjs.org/expo-linking/-/expo-linking-8.0.12.tgz", "integrity": "sha512-FpXeIpFgZuxihwT9lBo86YD3y6LphBuAhN680MMxm/Y7fmsc57vimn2d3vFu68VI0+Z9w457t494mu2wvlgWTQ==", "license": "MIT", + "peer": true, "dependencies": { "expo-constants": "~18.0.13", "invariant": "^2.2.4" @@ -8762,9 +8722,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -8785,9 +8742,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -8808,9 +8762,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -8831,9 +8782,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -10392,6 +10340,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -10411,6 +10360,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.26.0" }, @@ -10447,6 +10397,7 @@ "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.81.5.tgz", "integrity": "sha512-1w+/oSjEXZjMqsIvmkCRsOc8UBYv163bTWKTI8+1mxztvQPhCRYGTvZ/PL1w16xXHneIj/SLGfxWg2GWN2uexw==", "license": "MIT", + "peer": true, "dependencies": { "@jest/create-cache-key-function": "^29.7.0", "@react-native/assets-registry": "0.81.5", @@ -10504,6 +10455,7 @@ "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-2.28.0.tgz", "integrity": "sha512-0msfJ1vRxXKVgTgvL+1ZOoYw3/0z1R+Ked0+udoJhyplC2jbVKIJ8Z1bzWdpQRCV3QcQ87Op0zJVE5DhKK2A0A==", "license": "MIT", + "peer": true, "dependencies": { "@egjs/hammerjs": "^2.0.17", "hoist-non-react-statics": "^3.3.0", @@ -10529,6 +10481,7 @@ "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-4.1.7.tgz", "integrity": "sha512-Q4H6xA3Tn7QL0/E/KjI86I1KK4tcf+ErRE04LH34Etka2oVQhW6oXQ+Q8ZcDCVxiWp5vgbBH6XcH8BOo4w/Rhg==", "license": "MIT", + "peer": true, "dependencies": { "react-native-is-edge-to-edge": "^1.2.1", "semver": "^7.7.2" @@ -10556,6 +10509,7 @@ "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-5.6.2.tgz", "integrity": "sha512-4XGqMNj5qjUTYywJqpdWZ9IG8jgkS3h06sfVjfw5yZQZfWnRFXczi0GnYyFyCc2EBps/qFmoCH8fez//WumdVg==", "license": "MIT", + "peer": true, "peerDependencies": { "react": "*", "react-native": "*" @@ -10566,6 +10520,7 @@ "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-4.16.0.tgz", "integrity": "sha512-yIAyh7F/9uWkOzCi1/2FqvNvK6Wb9Y1+Kzn16SuGfN9YFJDTbwlzGRvePCNTOX0recpLQF3kc2FmvMUhyTCH1Q==", "license": "MIT", + "peer": true, "dependencies": { "react-freeze": "^1.0.0", "react-native-is-edge-to-edge": "^1.2.1", @@ -10581,6 +10536,7 @@ "resolved": "https://registry.npmjs.org/react-native-web/-/react-native-web-0.21.2.tgz", "integrity": "sha512-SO2t9/17zM4iEnFvlu2DA9jqNbzNhoUP+AItkoCOyFmDMOhUnBBznBDCYN92fGdfAkfQlWzPoez6+zLxFNsZEg==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.18.6", "@react-native/normalize-colors": "^0.74.1", @@ -10613,6 +10569,7 @@ "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-13.15.0.tgz", "integrity": "sha512-Vzjgy8mmxa/JO6l5KZrsTC7YemSdq+qB01diA0FqjUTaWGAGwuykpJ73MDj3+mzBSlaDxAEugHzTtkUQkQEQeQ==", "license": "MIT", + "peer": true, "dependencies": { "escape-string-regexp": "^4.0.0", "invariant": "2.2.4" @@ -10627,6 +10584,7 @@ "resolved": "https://registry.npmjs.org/react-native-worklets/-/react-native-worklets-0.5.1.tgz", "integrity": "sha512-lJG6Uk9YuojjEX/tQrCbcbmpdLCSFxDK1rJlkDhgqkVi1KZzG7cdcBFQRqyNOOzR9Y0CXNuldmtWTGOyM0k0+w==", "license": "MIT", + "peer": true, "dependencies": { "@babel/plugin-transform-arrow-functions": "^7.0.0-0", "@babel/plugin-transform-class-properties": "^7.0.0-0", @@ -10737,6 +10695,7 @@ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -12041,6 +12000,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -12247,6 +12207,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" diff --git a/old/Dockerfile.nginx b/Dockerfile.presentation old mode 100644 new mode 100755 similarity index 100% rename from old/Dockerfile.nginx rename to Dockerfile.presentation diff --git a/docker-compose.yml b/docker-compose.yml index 07a481e..326a1bf 100755 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,6 +9,16 @@ services: - "8888:80" networks: - cyberusgate-network + + frontend_presentation: + build: + context: . + dockerfile: Dockerfile.presentation + container_name: cyberusgate_presentation + ports: + - "7854:80" + networks: + - cyberusgate-network networks: cyberusgate-network: diff --git a/old/Dockerfile b/old/Dockerfile deleted file mode 100644 index 92bc5bc..0000000 --- a/old/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM python:3.9-slim -WORKDIR /app -COPY app/requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt -COPY app/ . -EXPOSE 8000 -CMD ["python", "-m", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"] \ No newline at end of file diff --git a/old/app/apple-touch-icon.png b/old/app/apple-touch-icon.png deleted file mode 100644 index f319dce..0000000 Binary files a/old/app/apple-touch-icon.png and /dev/null differ diff --git a/old/app/favicon-16x16.png b/old/app/favicon-16x16.png deleted file mode 100644 index 5e7b212..0000000 Binary files a/old/app/favicon-16x16.png and /dev/null differ diff --git a/old/app/favicon-32x32.png b/old/app/favicon-32x32.png deleted file mode 100644 index 2d77783..0000000 Binary files a/old/app/favicon-32x32.png and /dev/null differ diff --git a/old/app/index.html b/old/app/index.html deleted file mode 100644 index 6775709..0000000 --- a/old/app/index.html +++ /dev/null @@ -1,265 +0,0 @@ - - - - - - Cyberusgate - Démonstration - - - - - - - - -
- - - - -
-
-

Cyberusgate

-

Console d'administration centralisée

-
- - -
-
-

Utilisateurs Actifs

- -
-
- - - - - - - - - - - - -
NomRôleStatutAction
-
-
- - -
-

Journal d'Événements en Temps Réel

-
- -
-
-
- - - - -
-
-

Simulateur de Porte

- - -
-
-

CYBERUSGATE

-
- -
-
- -
- - -
- -
- -
-
-
-
- - - - - - - diff --git a/old/app/main.py b/old/app/main.py deleted file mode 100644 index e8a1327..0000000 --- a/old/app/main.py +++ /dev/null @@ -1,131 +0,0 @@ -# main.py : Backend pour le POC Cyberusgate avec FastAPI -import asyncio -import datetime -import uuid -from typing import Dict, List - -from fastapi import FastAPI, WebSocket, WebSocketDisconnect -from fastapi.middleware.cors import CORSMiddleware - -# --- Initialisation de l'application FastAPI --- -app = FastAPI( - title="Cyberusgate POC API", - description="API pour la démonstration de la solution de badge digital." -) - -# --- Configuration CORS --- -# Permet au frontend (ouvert depuis un fichier local) de communiquer avec le backend. -app.add_middleware( - CORSMiddleware, - allow_origins=["*"], # Attention : En production, restreindre à l'URL du frontend. - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], -) - -# --- "Base de données" en mémoire --- -# Utilisation d'un dictionnaire pour simuler une base de données d'utilisateurs. -# La clé est l'ID de l'utilisateur, la valeur contient ses informations. -users_db: Dict[str, Dict] = { - "user-001": {"id": "user-001", "name": "Alice Martin", "role": "Collaborateur", "has_access": True}, - "user-002": {"id": "user-002", "name": "Bob Dubois", "role": "Prestataire", "has_access": True}, -} - -# --- Gestion des connexions WebSocket pour les logs en temps réel --- -class ConnectionManager: - def __init__(self): - self.active_connections: List[WebSocket] = [] - - async def connect(self, websocket: WebSocket): - await websocket.accept() - self.active_connections.append(websocket) - - def disconnect(self, websocket: WebSocket): - self.active_connections.remove(websocket) - - async def broadcast(self, message: str): - """ Diffuse un message à tous les clients connectés. """ - for connection in self.active_connections: - await connection.send_text(message) - -manager = ConnectionManager() - -async def log_and_broadcast(message: str): - """ Formate un message de log avec un timestamp et le diffuse. """ - timestamp = datetime.datetime.now().strftime("%H:%M:%S") - log_message = f"[{timestamp}] {message}" - print(log_message) # Affiche aussi dans la console du serveur - await manager.broadcast(log_message) - -# --- Endpoints de l'API --- - -@app.get("/users", summary="Lister tous les utilisateurs") -async def get_users(): - """ Récupère la liste de tous les utilisateurs enregistrés. """ - return list(users_db.values()) - -@app.post("/access/simulate", summary="Simuler un scan de badge") -async def simulate_access(data: Dict): - """ - Vérifie si un utilisateur a l'accès autorisé et log le résultat. - """ - user_id = data.get("user_id") - if not user_id or user_id not in users_db: - await log_and_broadcast(f"ERREUR: Tentative d'accès avec un ID inconnu '{user_id}'.") - return {"status": "refused", "reason": "Utilisateur inconnu"} - - user = users_db[user_id] - if user["has_access"]: - await log_and_broadcast(f"ACCÈS AUTORISÉ: {user['name']} ({user['role']}) à la porte principale.") - return {"status": "authorized", "user_name": user['name']} - else: - await log_and_broadcast(f"ACCÈS REFUSÉ: {user['name']} ({user['role']}) - Droits révoqués.") - return {"status": "refused", "user_name": user['name'], "reason": "Accès révoqué"} - -@app.post("/users/revoke/{user_id}", summary="Révoquer l'accès d'un utilisateur") -async def revoke_access(user_id: str): - """ Désactive les droits d'accès pour un utilisateur donné. """ - if user_id in users_db: - users_db[user_id]["has_access"] = False - user_name = users_db[user_id]['name'] - await log_and_broadcast(f"ACTION ADMIN: Accès révoqué pour {user_name}.") - return {"status": "success", "user_id": user_id, "has_access": False} - return {"status": "error", "message": "Utilisateur non trouvé"} - -@app.post("/users/create_ephemeral", summary="Créer un pass éphémère") -async def create_ephemeral_pass(): - """ Crée un nouvel utilisateur 'Prestataire' avec un accès temporaire. """ - new_id = f"guest-{uuid.uuid4().hex[:4]}" - new_user = { - "id": new_id, - "name": f"Visiteur {new_id}", - "role": "Pass Éphémère", - "has_access": True, - } - users_db[new_id] = new_user - await log_and_broadcast(f"ACTION ADMIN: Pass éphémère créé pour {new_user['name']}.") - return new_user - -# --- Endpoint WebSocket pour les logs --- - -@app.websocket("/ws/logs") -async def websocket_endpoint(websocket: WebSocket): - """ - Point de connexion pour les clients qui veulent recevoir les logs en temps réel. - """ - await manager.connect(websocket) - await log_and_broadcast("INFO: Un client de la console d'admin s'est connecté.") - try: - while True: - # On maintient la connexion ouverte pour envoyer des messages - # Le serveur n'attend pas de message du client ici. - await asyncio.sleep(1) - except WebSocketDisconnect: - manager.disconnect(websocket) - await log_and_broadcast("INFO: Un client de la console d'admin s'est déconnecté.") - -# --- Point d'entrée pour lancer le serveur (avec uvicorn) --- -if __name__ == "__main__": - import uvicorn - print("Lancement du serveur de l'API Cyberusgate sur http://0.0.0.0:8000") - uvicorn.run(app, host="0.0.0.0", port=8000) diff --git a/old/app/requirements.txt b/old/app/requirements.txt deleted file mode 100644 index 55f7559..0000000 --- a/old/app/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -fastapi==0.111.0 -uvicorn[standard]==0.29.0 -python-multipart==0.0.9 \ No newline at end of file diff --git a/old/app/site.webmanifest b/old/app/site.webmanifest deleted file mode 100644 index 45dc8a2..0000000 --- a/old/app/site.webmanifest +++ /dev/null @@ -1 +0,0 @@ -{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/old/docker-compose.yml b/old/docker-compose.yml deleted file mode 100644 index a7a3910..0000000 --- a/old/docker-compose.yml +++ /dev/null @@ -1,26 +0,0 @@ -services: - backend: - build: - context: . - dockerfile: Dockerfile - container_name: cyberusgate_backend - ports: - - "8000:8000" - environment: - - PYTHONUNBUFFERED=1 - networks: - - cyberusgate-network - - frontend: - build: - context: . - dockerfile: Dockerfile.nginx - container_name: cyberusgate_frontend - ports: - - "8888:80" - networks: - - cyberusgate-network - -networks: - cyberusgate-network: - driver: bridge \ No newline at end of file diff --git a/presentation/index.html b/presentation/index.html new file mode 100644 index 0000000..ae87c0c --- /dev/null +++ b/presentation/index.html @@ -0,0 +1,1164 @@ + + + + + + Soutenance Cyberusgate + + + + + + + + + + + + + + +
+ +
+
+
+ Logo Cyberusgate + Cyberusgate +
+ +
+ 1 / 20 +
+ + +
+
+
+ + +
+ +
+
+ +
+ + + + +
+
+
+
+ Logo Cyberusgate +
+

CYBERUSGATE

+

Sécurité Cybernétique et Contrôle d'Accès

+
+

Vers un nouveau standard d'entreprise

+
+
+
+ + +
+

1. Gouvernance du Projet

+ +
+ +
+
Chess King Icon
+

Nicolas

+

Dir. Général & Stratégie

+

Gouvernance, Vision, Scalabilité

+
+ + +
+
+
+
+
+
+
+
+
+
+ + +
+ +
+
Microchip Icon
+

Anthony

+

Dir. Technique

+

Innovation Tech & UX
Technologie invisible

+
+ +
+
Scale Icon
+

Guillaume

+

Dir. Conformité

+

Éthique, RGPD
Protection des données

+
+ +
+
Chart Line Icon
+

Erkin

+

Dir. Commercial

+

Acquisition, Marketing
Modernisation B2B

+
+ +
+
Coins Icon
+

Antoine

+

Dir. Financier

+

Infrastructure & Finance
Pérennité du modèle

+
+
+
+
+ + +
+

2. Le Constat de Départ

+

Le badge physique PVC est dépassé, coûteux et risqué.

+
+
+
+

Une contrainte opérationnelle

+

Badge oublié, perdu, prêté, abîmé ou conservé après une mission. Chaque friction perturbe l'accueil et génère de l'attente.

+
+
+
+

Une charge administrative

+

Création, encodage, impression, remise, modification et révocation mobilisent inutilement les RH, les moyens généraux et la sécurité (env. 30min/badge).

+
+
+
+

Une faille potentielle

+

Un badge non désactivé rapidement (délai de 48h à 72h courant) devient une porte d'entrée physique vers des espaces sensibles.

+
+
+
+ + +
+

3. Quantification du Problème

+
+
+
+
+
+

Coût complet annuel estimé

+

18,50

+

par badge et par collaborateur

+

+ 12% de perte/vol par an

+
+
+
+
+
+
3,50 €
+
+

Matériel & Composants

+

Support PVC, Puce RFID/NFC, Antenne.

+
+
+
+
2,00 €
+
+

Personnalisation & Production

+

Impression, rubans YMCKO, laminage.

+
+
+
+
13,00 €
+
+

Administratif & Temps Humain

+

Saisie SIRH, encodage, gestion à l'accueil, support.

+
+
+
+
+
+ + + + +
+

4. La Solution Cyberusgate

+

Orchestrer une identité professionnelle dynamique, pas juste ouvrir une porte.

+
+
+
+

Application Mobile

+

Badge virtuel sur smartphone (iOS/Android). Usage simple, verrouillage natif par biométrie (FaceID/TouchID), zéro plastique.

+
+
+
+

Console d'Administration

+

Gestion centralisée Cloud. Création de pass éphémères pour les prestataires en 3 clics, gestion des zones et horaires.

+
+
+
+

Écosystème & APIs

+

Connexion directe avec les SIRH (Lucca, Workday), gestion des temps, et systèmes du Smart Building.

+
+
+
+ + +
+

5. Le défi de l'interopérabilité

+

La réalité : les fabricants (HID, STid, Genetec) utilisent des SDK fermés. Notre app doit s'adapter à l'existant sans tout remplacer.

+ +
+
+
+

+ Stratégie "SDK Wrapper" +

+

+ Notre application intègre les SDK officiels de chaque fabricant partenaire. Cyberusgate devient un "launcher" intelligent qui détecte le site et appelle le SDK spécifique. +

+
    +
  • Rétrocompatibilité immédiate
  • +
  • Aucun matériel à changer pour le client
  • +
+
+ +
+
+

+ Standards Ouverts +

+

+ Pour les nouvelles installations, nous poussons vers des standards de lecture sécurisée modernes, indépendants du matériel propriétaire. +

+
    +
  • OSDP : Plus moderne et sécurisé que Wiegand.
  • +
  • FIDO2 : Authentification par clés cryptographiques.
  • +
+
+
+
+ + +
+

6. Architecture Logicielle Découplée

+ +
+ +
+
+ +
+
+

Couche d'Abstraction (HAL)

+

Une API interne qui normalise les requêtes. Peu importe le lecteur, l'application traite une commande universelle : RequestAccess(SiteID, UserToken).

+
+
+ +
+
+ +
+
+

Gestionnaire de Jetons (Token Vault)

+

Le cœur sécurisé. Utilisation des TEE (Trusted Execution Environment) : Android StrongBox ou Apple Secure Enclave pour isoler les clés cryptographiques.

+
+
+ +
+
+ +
+
+

Communication Bidirectionnelle

+

Gestion des certificats de révocation en temps réel via une connexion backend ultra-sécurisée (HTTPS/TLS 1.3 obligatoire).

+
+
+
+
+ + +
+

7. Contraintes Technologiques Majeures

+ +
+ +
+
+

BLE vs NFC

+

+ Le Bluetooth (BLE) permet le "Hands-free" (ouverture sans sortir le téléphone) et une meilleure portée. +

+
+ Défi : Gérer les états Bluetooth (Scan, GATT) pour une latence < 200ms. +
+
+ + +
+
+

Permissions OS

+

+ iOS et Android restreignent l'accès NFC/BLE en arrière-plan pour éviter de vider la batterie. +

+
+ Défi : Optimiser le cycle de vie pour un éveil en millisecondes. +
+
+ + +
+
+

Certification Cyber

+

+ Centraliser l'accès fait de nous une cible. La sécurité logicielle doit être irréprochable. +

+
+ Défi : Pentests continus et visée d'une certification type CSPN (ANSSI). +
+
+
+
+ + +
+

8. Roadmap Produit & Déploiement

+ +
+ +
+ + +
+
26
+
+

R&D + Bêta

+

Prototype, RGPD, pentests

+
+
+ +
+
27
+
+

Lancement IDF

+

15 clients pilotes (coworking, tech)

+
+
+ +
+
28
+
+

Expansion France

+

45 clients, PME multi-sites

+
+
+ +
+
29
+
+

Maturité

+

110 clients, Offre Enterprise SIRH

+
+
+
+

Méthode : bêta-test pilotes → retours utilisateurs → amélioration continue.

+
+ + + + +
+

9. Structure Juridique & Nature de l'Activité

+

Un cadre légal agile et un positionnement d'éditeur logiciel pur.

+ +
+ +
+
+

Forme : S.A.S

+

Société par Actions Simplifiée

+
    +
  • Pacte d'associés : Flexibilité pour la gouvernance à 5.
  • +
  • Statut social : Dirigeants assimilés-salariés.
  • +
+
+ + +
+
+

Nature : Éditeur SaaS

+

Software as a Service (B2B)

+
    +
  • Zéro Stock : Pas de fabrication de matériel physique.
  • +
  • Scalabilité : Déploiement logiciel massif avec coût marginal faible.
  • +
+
+ + +
+
+

Secteur & ADN

+

Cybersécurité & PropTech

+
    +
  • PropTech : Smart Building et Flex-Office.
  • +
  • RSE : Dématérialisation responsable (Zéro plastique PVC).
  • +
+
+
+
+ + +
+

10. Environnement PESTEL

+
+
+

Opportunités

+
    +
  • Économique : Optimisation des coûts, flex-office, modèle SaaS récurrent.
  • +
  • Sociologique : Génération Mobile-Only, attentes collaborateur fortes pour des outils fluides.
  • +
  • Environnemental : Dématérialisation responsable, suppression du plastique PVC.
  • +
+
+
+

Vigilances

+
    +
  • Technologique : Complexité de l'interopérabilité, gestion de la batterie (BLE).
  • +
  • Légal : Respect strict du RGPD, durée de conservation des logs, finalité des données.
  • +
  • Humain : Crainte de surveillance, nécessité de pédagogie (CSE, droit à la déconnexion).
  • +
+
+
+
+ + +
+

11. Privacy by Design & RGPD

+

La solution doit protéger l'entreprise sans empiéter sur les droits et libertés des salariés.

+
+
+ +
+

Finalité strictement limitée

+

Gérer les accès. Aucune géolocalisation en arrière-plan, aucun flicage des déplacements internes hors bornes de contrôle.

+
+
+
+ +
+

Minimisation des données

+

Collecte uniquement des données nécessaires à l'authentification. La biométrie (empreinte/visage) reste locale au téléphone.

+
+
+
+ +
+

Durée de conservation

+

Purge automatique des logs d'accès selon les standards de la CNIL (ex: 3 mois) et information transparente des CSE.

+
+
+
+
+ + +
+

12. Anticipation des Scénarios Dégradés

+ + + + + + + + + + + + + + + + + + + + + +
Risque IdentifiéRéponse Cyberusgate
Téléphone déchargé ou oubliéDélivrance d'un badge temporaire de secours à l'accueil via la console admin (procédure d'urgence).
Panne réseau ou Cloud indisponibleFonctionnement en mode hors-ligne (Offline) via le cache sécurisé des terminaux (SLA 99.99%).
Rejet social / Crainte de flicageAccompagnement pédagogique des RH et validation du cadre Privacy by Design avec les syndicats.
+
+ + + + +
+

13. Segmentation & Cibles B2B

+
+ +
+
+
+
+

Coworking & Tiers-lieux

+

Cycle de vente court (1-4 sem.). Bons clients pilotes pour générer de la traction.

+
+
+ Priorité 1 +
+ +
+
+
+
+

PME & ETI Multi-sites

+

Besoin fort de flexibilité, volume d'utilisateurs (MRR), cycles maîtrisés (2-4 mois).

+
+
+ Cœur de cible +
+ +
+
+
+
+

Grands Comptes & Industrie

+

Exigences cyber extrêmes (SIRH), cycles longs (6-12 mois). Objectif de scale.

+
+
+ Maturité +
+
+
+ + +
+

14. Analyse Concurrentielle (Gap Analysis)

+
+ +
+
+

Géants Historiques

+

HID, Salto, Castel

+
    +
  • Systèmes fermés/propriétaires
  • +
  • Lourd investissement matériel
  • +
+
+
+

Startups "Cloud-Native"

+

Kisi, Welcomr

+
    +
  • Dépendance totale au Cloud
  • +
  • Coût élevé par utilisateur
  • +
+
+
+ + +
+
+ Logo +

Le Positionnement Cyberusgate

+

L'équilibre parfait entre la rigueur d'entreprise et l'agilité logicielle SaaS.

+ +
+
+
+

Interopérabilité

Conserve le parc matériel existant

+
+
+
+

Conforme RGPD

Hébergement souverain & Privacy

+
+
+
+

Atout RSE

Zéro plastique, bilan carbone allégé

+
+
+
+

Modèle SaaS

Tarification lisible (Opex vs Capex)

+
+
+
+
+
+ + +
+

15. Stratégie Marketing & Acquisition

+
+
+

Mix Marketing B2B

+
    +
  • Produit : Plateforme SaaS, interopérabilité, conformité RGPD.
  • +
  • Prix : Modèle Opex, tarification lisible et scalable (2 à 8€/util).
  • +
  • Place : Vente directe IDF + Réseau de partenaires intégrateurs.
  • +
  • Promotion : Account-Based Marketing (ABM), Simulateur de ROI, Présence salons (FIC).
  • +
+
+
+

Messages Clés (Inbound)

+
+ Fini les badges perdus + Droits en temps réel + Compatible existant + Zéro plastique (RSE) +
+
+
+
+ + +
+

16. Stratégie "Land and Expand"

+ +
+ +
+
Année 1
+
+

Amorçage

+

Pilotes IDF

+
    +
  • 15 clients pilotes
  • +
  • 750 utilisateurs
  • +
  • ~ 45 000 € CA
  • +
+
+ + +
+
Année 2
+
+

Accélération

+

Expansion PME

+
    +
  • 45 clients
  • +
  • 3 500 utilisateurs
  • +
  • ~ 180 000 € CA
  • +
+
+ + +
+
Année 3
+
+

Maturité (Scale)

+

Grands Comptes

+
    +
  • 110 clients signés
  • +
  • 12 000 utilisateurs
  • +
  • ~ 650 000 € CA
  • +
  • Intégration SIRH
  • +
+
+
+
+ + + + +
+

17. Modèle Économique (SaaS)

+

Un modèle prévisible (Opex), offrant un ROI immédiat face aux 18,50€ de coût caché du badge PVC.

+ +
+
+

Pack Agilité

+

2 €/util/mois

+

Coworking & TPE
Ouverture simple BLE/NFC
Support email

+
+
+
CŒUR DE GAMME
+

Pack Sécurité+

+

5 €/util/mois

+

PME Multi-sites
Niveaux d'accès avancés
Pass prestataires éphémères

+
+
+

Pack Enterprise

+

~8 €/util/mois

+

Grands Comptes
Intégration SIRH complète
Alertes intrusion & SLA

+
+
+

Frais d'installation initiaux de 150€ à 500€ / porte (Audit & Configuration).

+
+ + +
+

18. Structure Financière Initiale

+

Financement maîtrisé de l'amorçage et transparence des investissements critiques.

+ +
+ +
+

Gouvernance & Capital

+
+ Capital Social Total + 20 000 +
+ +
+
+ Nicolas Morais +
4 000 €20% des parts
+
+
+ Anthony Mvakanga +
4 000 €20% des parts
+
+
+ Guillaume Sanchez +
4 000 €20% des parts
+
+
+ Antoine Decabooter Holleman +
4 000 €20% des parts
+
+
+ Erkin Michel Ozturk +
4 000 €20% des parts
+
+
+

Un pacte d'associés équilibré en SAS prouvant la cohésion de l'équipe fondatrice.

+
+ + +
+
+

Investissement (CAPEX) & Charges

+ +
+

Investissement Initial Ciblé (Cash Burn)

+

~ 89 300

+
+ +
+
+ +
+ R&D & Infrastructure "Zéro Stock" +

Développement de l'App, Token Vault et APIs. Zéro matériel physique stocké, d'où un coût maîtrisé.

+
+
+
+ +
+ Audits Cyber & Conformité +

Budget alloué aux pentests externes (ANSSI) pour rassurer les DSI dès le lancement.

+
+
+
+ +
+ Charges RH (OPEX) +

Recrutement progressif : alternant IT (A1), Ingénieur Cyber + Business Dev (A2).

+
+
+
+
+
+
+ + +
+

19. Stratégie RH & Rémunération

+

Un engagement total des fondateurs pour sécuriser la phase d'amorçage et préserver la trésorerie.

+ +
+ +
+
+
+ +
+

Année 1 : Zéro Rémunération

+

0 € pour les 5 associés fondateurs

+

+ Afin de préserver le capital et de maximiser l'investissement dans le développement de la plateforme (R&D), aucun salaire ni dividende ne sera versé lors du premier exercice. +

+
+ + +
+ +
+
+
+
+

Premier recrutement (Année 1)

+

1 Alternant IT / SysOps

+

+ Renfort technique sur l'infrastructure Cloud. L'alternance permet de maîtriser nos coûts fixes (OPEX) grâce aux aides de l'État, tout en formant notre futur talent. +

+
+
+ + +
+

Trajectoire Années 2 & 3

+
    +
  • Déblocage salaires : Indexé sur le seuil de rentabilité (> 37k€).
  • +
  • Embauche A2 : 1 Ingénieur Cybersécurité (Audits).
  • +
  • Embauche A2/A3 : 1 Business Developer B2B.
  • +
+
+
+
+
+ + +
+

20. Bilan Prévisionnel & Trajectoire 3 Ans

+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Indicateurs clés (en €)Année 1Année 2Année 3
Chiffre d'Affaires (CA)~ 45 000~ 180 000~ 650 000
Créances clients (30j)2 20018 00064 998
Dettes fournisseurs (Serveurs)1 6802 0902 090
Dettes fiscales et sociales018 00064 998
Besoin en Fonds de Roul. (BFR)520- 2 090- 2 090
+
+ +

BFR Négatif : Les dettes fournisseurs stagnent malgré la hausse du CA grâce à la scalabilité du Cloud. L'entreprise génère sa propre trésorerie dès l'Année 2.

+
+
+ + +
+
+
+

Seuil de Rentabilité

+

37 018

+
+ +
+ +
+

Trajectoire OPEX

+
+
A1
+
+
Amorçage & Preuve
+

15 pilotes IDF. Coûts concentrés sur la R&D. BFR maîtrisé.

+
+
+
+
A2
+
+
Accélération
+

Embauches clés. Le modèle d'abonnement génère du cash.

+
+
+
+
A3
+
+
Maturité (Scale)
+

CA ~650k€. Les coûts fixes (OPEX) sont lissés par le volume (12 000 util).

+
+
+
+
+
+
+ + +
+
+
+ +
+ Logo Cyberusgate + +

+ Cyberusgate ne remplace pas seulement une serrure. +

+ +

+ Notre solution crée un véritable hub d'identité professionnelle : responsable, sécurisé, interopérable et prêt pour les entreprises de demain. +

+ +
+
+

Le Besoin

+

Validé économiquement par la fin des 18,50€ de coûts cachés liés au plastique.

+
+
+

La Tech & Légal

+

Une architecture Zero Trust, compatible avec l'existant, et "Privacy by Design".

+
+
+

Le Business

+

Un modèle SaaS hyper-scalable, un BFR négatif dès l'Année 2 et un capital solidaire.

+
+
+ +
+ Merci de votre attention. +
+
+
+
+ +
+ + + + + + + \ No newline at end of file