Underground 2 Revived
Play Need for Speed: Underground 2 (2004) in Chrome and Firefox with WebGPU graphics, Web Audio, up to 120 fps widescreen, controller support, free roam and Online races with friends. Fan project, not
翻譯準備中
Interface web Flask pour gérer un serveur dédié Assetto Corsa EVO : démarrage/arrêt, multi-config, Race Weekend, auto-restart sur crash, notifications Discord.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Organisées par niveau d'accès — chaque rôle hérite des fonctionnalités des rôles en dessous : Public ⊂ Pilote ⊂ Admin ⊂ Superadmin.
| Fonctionnalité | Public | Pilote | Admin | Superadmin |
|---|---|---|---|---|
| Accueil, résultats, classements, timing en direct | ✓ | ✓ | ✓ | ✓ |
| Fair-play, ELO, championnats, carte des accrochages, exports CSV des classements | ✓ | ✓ | ✓ | ✓ |
| Inscription pilote, mot de passe oublié | ✓ | ✓ | ✓ | ✓ |
| Tableau de bord, inscription/désinscription aux événements | — | ✓ | ✓ | ✓ |
| Historique personnel des tours, liaison Steam | — | ✓ | ✓ | ✓ |
| Consulter / télécharger un mod véhicule | — | ✓ | ✓ | ✓ |
| Démarrer / arrêter / redémarrer le serveur, logs, métriques | — | — |
| ✓ |
| ✓ |
| Éditeur de config (circuit, météo, sessions, voitures), roulement | — | — | ✓ | ✓ |
| Créer / publier un événement, gérer les inscriptions | — | — | ✓ | ✓ |
| Approuver / rejeter un compte pilote | — | — | ✓ | ✓ |
| Uploader / supprimer un mod, poser ses tags (catégorie, PI) | — | — | ✓ | ✓ |
| Uploader une image véhicule / circuit | — | — | ✓ | ✓ |
| Modération in-game : chat, kick, mute, pénalités, lest | — | — | ✓ | ✓ |
| Gérer les championnats, l'accès au serveur (bannissements, lest), voir la santé du serveur | — | — | ✓ | ✓ |
| Journal d'audit, sauvegarde / restauration, réglages d'accès et de sécurité | — | — | — | ✓ |
Variables .env, mise à jour SteamCMD du serveur de jeu | — | — | — | ✓ |
| Créer / supprimer un serveur additionnel (multi-serveurs) | — | — | — | ✓ |
| Créer / supprimer un compte admin, changer un rôle | — | — | — | ✓ |
🌍 Public — aucun compte requis
🏎️ Pilote — compte connecté
🛠️ Admin
.kspkg), tags manuels (catégorie, PI), image de couverture auto-détectée ou personnalisée, détection et signalement des conflits d'identifiant entre modsentry_list.json) et des comptes pilotes (approbation/rejet)\ban, enregistré dans la page Accès et signalé sur Discord)👑 Superadmin
.env éditables depuis l'interface, sans accès SSH🔒 Sécurité
TRUSTED_PROXIES) : limite de débit et anti-brute-force par visiteur, pas par proxypip-audit), restauration de sauvegarde protégée contre les archives piégées🔔 Notifications Discord
🎨 Interface
📖 Pas à pas avec captures / step-by-step guide with screenshots (English): Getting started
Une seule commande installe le panel et son serveur de jeu (Docker, Wine compris) ; la même commande le met à jour. Rien à cloner, rien à configurer à la main : clés et mots de passe sont générés, et le panel installe lui-même SteamCMD puis vous propose de télécharger le serveur ACE EVO dès la première connexion — il suffit de saisir votre compte Steam.
Prérequis : un compte Steam qui possède Assetto Corsa EVO (le compte anonyme de Steam n'a pas accès au serveur).
curl -fsSL https://raw.githubusercontent.com/Zyphro3D/pannel-ac-evo-server/master/install.sh | sudo bash
Docker est proposé à l'installation s'il manque. Le panel s'installe dans /opt/pannel-ac-evo-server (option --dir).
Dans Terminal (administrateur) (clic droit sur Démarrer) :
irm https://raw.githubusercontent.com/Zyphro3D/pannel-ac-evo-server/master/install.ps1 | iex
Docker Desktop est installé (winget) s'il manque : redémarrez alors Windows, ouvrez Docker Desktop une fois, et relancez la commande. Le script ouvre aussi les ports du panel et du jeu dans le pare-feu Windows (réseau privé). Le panel s'installe dans %USERPROFILE%\ace-evo-panel.
Docker Desktop doit rester lancé pour que le panel et le serveur tournent : activez Settings → General → Start Docker Desktop when you sign in to your computer.
http://IP:4300) et les identifiants générés (aussi dans le fichier .env) : changez les mots de passe dans le panel.Premier lancement : environ 10 minutes (construction des images).
Configurez une redirection de ports sur votre box/routeur vers l'IP locale de votre serveur.
| Port | Protocole | Usage |
|---|---|---|
9700 | UDP + TCP | Connexions des joueurs (serveur de jeu ACE EVO) |
8081 | TCP | API HTTP ACE EVO — enregistrement Kunos (liste publique des serveurs) |
4300 | TCP | Interface web du panel — HTTP direct |
443 | TCP | Interface web du panel — HTTPS (Let's Encrypt ou reverse proxy) |
Multi-serveur : chaque serveur supplémentaire utilise ses propres ports (ex. serveur 2 : 9701 TCP/UDP + 8082 HTTP). Ouvrez les ports correspondants.
Mode 1 — HTTP direct (défaut, aucune config supplémentaire)
http://IP:4300
Mode 2 — HTTPS intégré via Let's Encrypt
sudo apt install certbot
sudo certbot certonly --standalone -d votre-domaine.fr
Dans .env :
PANEL_PORT=443
SSL_CERTFILE=/etc/letsencrypt/live/votre-domaine.fr/fullchain.pem
SSL_KEYFILE=/etc/letsencrypt/live/votre-domaine.fr/privkey.pem
SESSION_COOKIE_SECURE=true
Dans docker-compose.yml, décommentez la ligne :
- /etc/letsencrypt:/etc/letsencrypt:ro
Après chaque renouvellement du certificat :
docker compose up -d panel
Mode 3 — Reverse proxy (Nginx, Caddy…)
Laissez le panel sur HTTP port 4300 et gérez le SSL côté reverse proxy. Assurez-vous que SESSION_COOKIE_SECURE=true est défini dans .env.
docker compose
├── ace-panel → Flask (port 4300) — rebuild rapide sans toucher au jeu
├── ace-server → Wine + ACE EVO exe (ports 9700, 8081) — géré par le panel
├── ace-server-* → Serveurs additionnels (multi-serveur, ports configurables)
└── dockerproxy → Proxy Docker socket (isolation sécurité)
Volumes persistants :
./aceserver → /aceserver (configs, résultats, binaires)
./media → /panel/media (images circuits, véhicules, bannières)
panel_data (base de données SQLite)
wine_prefix (prefix Wine du serveur principal, runtime Visual C++ compris)
steamcmd (SteamCMD, installé automatiquement par le panel)
steam_session (fichiers de travail de SteamCMD)
Structure du dossier aceserver/ :
aceserver/
├── AssettoCorsaEVOServer.exe ← téléchargé par le panel (SteamCMD), non versionné
├── cars.json ← liste des voitures disponibles
├── events_practice.json ← modèles de sessions practice
├── events_race_weekend.json ← modèles de sessions race weekend
├── configs/ ← fichiers de config JSON — créés par le panel, non versionnés
│ ├── default.json ← créé automatiquement au premier démarrage
│ ├── *.json ← configs créées depuis l'interface
│ └── default.json.example ← template fourni dans le repo
└── results/ ← résultats de session — non versionnés
└── result*.json
Référence complète des variables .env (voir aussi .env.example) :
| Variable | Description | Défaut |
|---|---|---|
SECRET_KEY | Clé secrète Flask — obligatoire en production | — |
ADMIN_USERNAME / ADMIN_PASSWORD | Compte admin | admin / — |
SUPERADMIN_USERNAME / SUPERADMIN_PASSWORD | Compte superadmin | superadmin / — |
PANEL_URL | URL publique (liens dans les emails) | http://localhost:4300 |
PANEL_TIMEZONE | Fuseau horaire | Europe/Paris |
DEFAULT_LOCALE | Langue par défaut (fr / en / es / de / it) | fr |
SESSION_COOKIE_SECURE | true derrière HTTPS, false en HTTP direct | true |
PANEL_PORT | Port d'écoute du panel | 4300 |
PANEL_GITHUB_URL | URL GitHub du projet (affichée dans le footer) | dépôt officiel |
RESULTS_INGEST_SECRET | Secret HMAC du webhook résultats (/api/results/ingest). Facultatif : le serveur de jeu s'authentifie déjà par le jeton sig de l'URL que le panel lui donne, ou par le réseau interne (Docker / localhost) ; toute requête passée par un reverse proxy est refusée | — |
TRUSTED_PROXIES | Reverse proxys autorisés à indiquer l'IP réelle du visiteur (adresses ou réseaux CIDR, séparés par des virgules). Derrière Caddy/nginx/Cloudflare, indiquer l'adresse du proxy vue par le panel : sans cela, limite de débit et anti-brute-force du login sont partagés par tous les visiteurs. Panel exposé directement : laisser vide | — |
BACKUP_AUTO / BACKUP_KEEP | Sauvegarde automatique quotidienne du panel (base, réglages, configurations, images) et nombre de sauvegardes automatiques conservées | true / 7 |
AUDIT_RETENTION_DAYS | Durée de conservation du journal d'audit, en jours | 365 |
RATING_ENFORCE / RATING_MIN_TO_JOIN / RATING_MIN_RACES | Refus des pilotes définitifs dont l'ELO est sous le seuil (liste noire du serveur de jeu, nécessite le contrôle d'accès) ; réglé depuis la page Accès | false / 0 / 5 |
LIVE_COLLISIONS | Affiche les derniers contacts sur le timing : lance le serveur de jeu avec -log_debug gameplay (une douzaine de lignes de log par session) ; pris en compte au prochain démarrage du serveur de jeu | false |
ACCESS_CONTROL_ENABLED / ACCESS_APPROVED_ONLY | Contrôle d'accès au serveur de jeu (liste blanche des pilotes approuvés, bannissements, lest et restricteur) ; réglé depuis la page Accès | false / false |
SERVER_ENTRY_LIST_PATH | Chemin d'un fichier d'engagés défini à la main : il reste prioritaire sur le contrôle d'accès | — |
LAP_HISTORY_RETENTION_MONTHS | Nombre de mois de conservation détaillée de l'historique des tours pilote, au-delà archivé en résumé mensuel | 6 |
| Variable | Description | Défaut |
|---|---|---|
ACESERVER_HTTP_PORT | Port HTTP de l'API ACE EVO (Kunos registration) | 8081 |
ACESERVER_TCP_HOST | Hôte TCP ACE EVO | 127.0.0.1 |
ACESERVER_TCP_PORT | Port TCP ACE EVO | 9700 |
SERVER_NAME | Nom affiché dans la liste des serveurs ACE EVO | ACE EVO Server |
SERVER_MAX_PLAYERS | Nombre maximum de joueurs | 8 |
Le bot TCP se connecte au serveur ACE EVO pour envoyer des messages de bienvenue, détecter les meilleurs tours et alimenter le timing en direct.
| Variable | Description | Défaut |
|---|---|---|
ACE_BOT_STEAM_ID | Steam ID du compte bot — laisser vide pour désactiver | — |
ACE_BOT_CAR_MODEL | Modèle de voiture utilisé par le bot pour la connexion | preset_190_evo_ii |
ACE_BOT_IS_ADMIN | true pour envoyer automatiquement \admin <password> à la connexion | false |
ACE_BOT_MSG_WELCOME | Message de bienvenue (variables : {name}, {discord_url}, {site_url}) | — |
ACE_BOT_MSG_DISCORD | Message Discord envoyé si DISCORD_INVITE_URL est défini | — |
ACE_BOT_MSG_SITE | Message site envoyé si PANEL_URL est défini | — |
Multi-serveur : un bot indépendant est démarré automatiquement pour chaque serveur activé. Chaque bot se connecte au container ACE EVO correspondant sur son port interne.
| Variable | Description |
|---|---|
SSL_CERTFILE | Chemin vers le certificat (ex: /etc/letsencrypt/live/domain/fullchain.pem) |
SSL_KEYFILE | Chemin vers la clé privée (ex: /etc/letsencrypt/live/domain/privkey.pem) |
Si les deux variables sont renseignées, le panel démarre en HTTPS via gunicorn. Sinon, il utilise waitress en HTTP.
| Variable | Description |
|---|---|
DISCORD_WEBHOOK_URL | Webhook principal (démarrage / arrêt / crash) |
DISCORD_PILOTS_WEBHOOK_URL | Webhook pilotes — fallback sur le principal si vide |
DISCORD_RACE_WEBHOOK_URL | Webhook course — fallback sur le principal si vide |
DISCORD_INVITE_URL | Lien d'invitation affiché sur la page d'accueil |
DISCORD_NOTIFY_SESSION_SUMMARY | Récapitulatif de fin de session sur le webhook course (podium, meilleur tour, incidents, sanctions) |
| Variable | Description | Défaut |
|---|---|---|
MAIL_SERVER | Serveur SMTP — vide pour désactiver | — |
MAIL_PORT | Port SMTP | 587 |
MAIL_USE_TLS | STARTTLS | true |
MAIL_USERNAME / MAIL_PASSWORD | Identifiants SMTP | — |
MAIL_FROM | Adresse expéditeur | — |
MAIL_ADMIN | Adresse(s) admin pour les notifications (virgule) | — |
Depuis le panel : Paramètres → Panel → Mise à jour du panel, bouton « Mettre à jour » (superadmin). Chaque version est signée ; la machine vérifie signature et empreinte, reconstruit, redémarre et revient à la version précédente si le panel ne répond plus. Cette fonction s'active en lançant une fois la commande d'installation ci-dessous (elle installe l'agent de mise à jour : service systemd sous Linux, tâche planifiée à l'ouverture de session sous Windows).
À la main : relancez la commande d'installation (Linux : curl … install.sh | sudo bash, Windows : irm … install.ps1 | iex) : elle télécharge la dernière version, vérifie son empreinte SHA-256, remplace le code et reconstruit les containers.
Le .env, la base de données, les configurations et les fichiers du jeu ne sont jamais modifiés par une mise à jour. Les migrations de schéma s'appliquent automatiquement au démarrage.
Installation faite avec
git clone:git pullpuisdocker compose up -d --buildfonctionne toujours ; le script d'installation peut aussi être lancé dans le même dossier (--dir), vos réglages sont conservés.
Rebuild complet et multi-serveur :
docker-compose.override.ymlest auto-généré par le panel et référence tous vos serveurs additionnels. Undocker compose up -d --buildreconstruit tous les containers (principal + additionnels) sans intervention manuelle.
Personnalisations Docker locales : ne modifiez pas
docker-compose.ymldirectement — vos changements seraient écrasés à chaque mise à jour. Utilisezdocker-compose.override.ymlà la place (Docker Compose le fusionne automatiquement). Notez que le panel régénère ce fichier pour la sectionservicesdes serveurs additionnels ; ajoutez vos surcharges dans une section séparée.
Configs serveur : les fichiers
aceserver/configs/*.jsonsont créés et gérés par le panel, ils ne sont pas versionnés. Une mise à jour ne les modifiera jamais.
Ceci met à jour le panel, pas le serveur de jeu. Pour mettre à jour ACE EVO Server lui-même (nouveau build Steam), utilisez le bouton de mise à jour dans l'interface (superadmin) — il lance SteamCMD avec suivi de progression, sans passer par la ligne de commande.
Voir CHANGELOG.md pour l'historique complet des versions.
Le panel est développé sur le temps libre, distribué gratuitement, et maintenu activement. Si vous l'utilisez pour vos courses ou votre club, le soutien sur Patreon aide à financer les prochaines fonctionnalités.
Soutenir Zyphro sur Patreon
Elastic License 2.0 — vous pouvez utiliser, copier, modifier et redistribuer le panel, y compris pour un club ou une communauté qui encaisse des inscriptions. Il est interdit de le proposer à des tiers comme service hébergé ou géré (revendre l’accès au panel) et de retirer les mentions de licence. © 2026 Florian Praturlon. Les versions publiées jusqu’à la v2.3.0 restent sous CC BY-NC 4.0 pour celles et ceux qui les ont reçues.
Crédits Wine : approche Docker inspirée de VandaLpr/acevo-docker-server.