-
Notifications
You must be signed in to change notification settings - Fork 0
Architecture
Zyphro3D edited this page Jun 25, 2026
·
1 revision
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.
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é
-
Image :
Dockerfile.panel— Python 3.11 + Flask + dépendances -
Port exposé :
4300(HTTP) ou443(HTTPS si SSL configuré) -
Restart :
unless-stopped - Rôle : interface web, API, bot TCP, watchdog, scheduler
-
Image :
Dockerfile.aceserver— Debian + Wine + AssettoCorsaEVOServer.exe -
Ports exposés :
9700TCP/UDP (joueurs),8081TCP (API Kunos) -
Restart :
no— le cycle de vie est géré par le panel (watchdog) - Rôle : serveur de jeu ACE EVO
-
Image : même que
ace-server - Ports : configurables à la création (9701+, 8082+)
- Créés dynamiquement depuis l'interface superadmin
- 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
| 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 supprimerpanel_data(base de données) niwine_prefix(prefix Wine initialisé en ~5 min) lors d'une mise à jour.
Les containers communiquent via le réseau Docker interne. En mode docker_split :
-
ace-panelpeut atteindreace-servervia 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
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.
| 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 |
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