Skip to content

Architecture

Zyphro3D edited this page Jun 25, 2026 · 1 revision

Architecture

Le panel utilise une architecture Docker split : le panel Flask et le serveur ACE EVO tournent dans des containers séparés. Cela permet de rebuilder le panel en ~30 secondes sans interrompre le jeu.


Vue d'ensemble

docker compose
├── ace-panel        → Flask (port 4300)       — rebuild rapide sans toucher au jeu
├── ace-server       → Wine + ACE EVO exe      — géré par le panel (ports 9700, 8081)
├── ace-server-*     → Serveurs additionnels   — créés depuis le panel (superadmin)
└── dockerproxy      → Proxy Docker socket     — isolation sécurité

Containers

ace-panel

  • Image : Dockerfile.panel — Python 3.11 + Flask + dépendances
  • Port exposé : 4300 (HTTP) ou 443 (HTTPS si SSL configuré)
  • Restart : unless-stopped
  • Rôle : interface web, API, bot TCP, watchdog, scheduler

ace-server

  • Image : Dockerfile.aceserver — Debian + Wine + AssettoCorsaEVOServer.exe
  • Ports exposés : 9700 TCP/UDP (joueurs), 8081 TCP (API Kunos)
  • Restart : no — le cycle de vie est géré par le panel (watchdog)
  • Rôle : serveur de jeu ACE EVO

ace-server-<nom> (serveurs additionnels)

  • Image : même que ace-server
  • Ports : configurables à la création (9701+, 8082+)
  • Créés dynamiquement depuis l'interface superadmin

dockerproxy

  • Image : Tecnativa docker-socket-proxy
  • Rôle : expose uniquement les endpoints Docker nécessaires au panel (start/stop/logs des containers), sans exposer le socket Docker complet

Volumes persistants

Volume / Bind Chemin hôte Chemin container Contenu
./aceserver /opt/pannel-ac-evo-server/aceserver /aceserver Binaires ACE EVO, configs JSON, résultats
./media /opt/pannel-ac-evo-server/media /panel/media Images circuits, voitures, bannières
panel_data Volume Docker nommé /panel/data Base de données SQLite
wine_prefix Volume Docker nommé /root/.wine Prefix Wine du serveur principal

⚠️ Ne jamais supprimer panel_data (base de données) ni wine_prefix (prefix Wine initialisé en ~5 min) lors d'une mise à jour.


Réseau Docker

Les containers communiquent via le réseau Docker interne. En mode docker_split :

  • ace-panel peut atteindre ace-server via son nom de container comme hostname
  • Le bot TCP se connecte à ace-server:9700 (port interne) — pas au port host-mappé
  • Pour les serveurs additionnels : ace-server-<nom>:9700

Base de données

SQLite via SQLAlchemy. Fichier stocké dans le volume panel_data.

Tables principales :

Table Contenu
admin_account Comptes administrateurs
driver Comptes pilotes
event Événements planifiés
event_registration Inscriptions pilotes aux événements
session_result Résultats de sessions importés
server Serveurs ACE EVO configurés
car_meta Banque de véhicules (94 voitures)
track_meta Banque de circuits (36 circuits)

Les migrations de schéma s'appliquent automatiquement au démarrage — aucune action manuelle requise.


Stack technique

Composant Technologie
Backend Python 3.11, Flask, SQLAlchemy, Flask-Babel, Flask-Login
Frontend Jinja2, CSS vanilla, JavaScript vanilla
Serveur HTTP Waitress (HTTP) ou Gunicorn (HTTPS)
Base de données SQLite
Internationalisation Flask-Babel (FR/EN/DE/ES/IT)
Déploiement Docker + Docker Compose
Serveur de jeu Wine + AssettoCorsaEVOServer.exe

Structure du code

app/
├── __init__.py          ← create_app(), migrations DB, sync CarMeta/TrackMeta, boot TCP bots
├── models.py            ← modèles SQLAlchemy
├── utils.py             ← décorateurs auth, helpers partagés
├── config.py            ← lecture variables d'environnement
├── routes/
│   ├── admin.py         ← gestion serveur, véhicules, circuits, comptes
│   ├── auth.py          ← login, register, reset password
│   ├── live.py          ← timing en direct, API timing
│   ├── public.py        ← accueil, résultats, espace pilote
│   ├── events_admin.py  ← événements, inscriptions
│   ├── api.py           ← API serveur (start/stop, configs, stats)
│   ├── leaderboard.py   ← classement global
│   └── container_mgmt.py ← mise à jour SteamCMD, restart panel
├── services/
│   ├── ace_tcp_client.py    ← bot TCP, leaderboard live, détection tours invalides
│   ├── discord_notifier.py  ← webhooks Discord
│   └── process_manager.py   ← lifecycle serveur, watchdog, logs
├── templates/           ← templates Jinja2
└── static/
    ├── css/main.css     ← styles globaux
    └── js/              ← scripts JavaScript

Clone this wiki locally