Installation, déploiement, sécurisation et maintenance
Mise à jour : 18 juin 2025
- Comprendre le fonctionnement du serveur Python
- Créer une machine virtuelle sous Debian
- Tester le serveur localement avec des clients
- Mettre en place les premiers outils réseau (UFW)
- Hyperviseur : VirtualBox (ou autre)
- Nom :
Classcord - Type : Linux / Debian (64-bit)
- RAM : 2 Go
- Disque dur : 20 Go (VDI, alloué dynamiquement)
- Réseau :
- Adaptateur 1 : NAT
- Adaptateur 2 : Réseau privé hôte
- Langue : Français
- Localisation : France
- Clavier : Français
- Partition : Guidée – utiliser tout le disque
- Environnement de bureau : Aucun
- Activer serveur SSH
sudo apt update && sudo apt upgrade -y
sudo apt install -y git curl python3 python3-pip ufwgit clone https://github.com/AstrowareConception/classcord-server.git
cd classcord-serverpython3 server_classcord.py- Port utilisé :
12345 - Connexion client via JSON
- Logs affichés dans la console
ss -tulpn | grep 12345
sudo ufw allow 12345/tcp- Déployer le serveur Classcord sur un réseau local ou pédagogique
- Automatiser son lancement avec
systemd - Créer une version conteneurisée avec Docker
- Documenter les chemins et commandes pour l’accès
sudo ufw allow 12345/tcp
ss -tulpn | grep 12345
hostname -I # Vérifie l’adresse IP de la machinesudo useradd -m classcord
sudo passwd classcord
su - classcordCela permet d’isoler l’exécution du serveur.
Créer un fichier classcord.service :
# /etc/systemd/system/classcord.service
[Unit]
Description=Classcord Discord-like Service
After=network.target
StartLimitIntervalSec=0
[Service]
Type=simple
User=nedjb
Group=nedjb
WorkingDirectory=/home/nedjb/Documents/classcord-server
ExecStart=/usr/bin/python3 /home/nedjb/Documents/classcord-server/server_classcord.py
Restart=always
RestartSec=1
StandardOutput=append:/var/log/classcord/classcord.log
StandardError=append:/var/log/classcord/classcord.log
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reexec
sudo systemctl enable --now classcord.serviceÀ placer à la racine du dossier classcord-docker :
# Utilise une image Python légère
FROM python:3.11-slim
# Définir le dossier de travail
WORKDIR /app
# Copier le code source et la base de données minimale
COPY server_classcord.py .
COPY config/database/ ./config/database/
COPY logs/ ./logs/
# Crée les dossiers nécessaires (au cas où)
RUN mkdir -p exports config/database logs
# Installer les dépendances (si besoin ajouter tabulate ou autres dans requirements.txt)
# Ici aucune dépendance externe obligatoire pour le serveur simple
# Expose le port utilisé par le serveur
EXPOSE 12345
# Démarrer le serveur
CMD ["python", "server_classcord.py"]version: '3.9'
services:
classcord:
build: .
container_name: classcord-server
ports:
- "12345:12345"
volumes:
- ./logs:/app/logs
- ./config/database:/app/config/database
- ./exports:/app/exports
restart: unless-stopped
Ce fichier permet de déployer le conteneur avec une seule commande :
docker compose up --buildclasscord.service(dans/etc/systemd/system)Dockerfiledocker-compose.yml
- Logger tous les événements
- Protéger avec fail2ban
- Sauvegarder automatiquement
users.pkl - Automatiser avec cron
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
file_handler = logging.FileHandler('/var/log/classcord/classcord.log')
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)Créer le dossier :
sudo mkdir -p /var/log/classcord
sudo chown -R classcord:classcord /var/log/classcordFichier /etc/logrotate.d/classcord :
/var/log/classcord/classcord.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 640 classcord classcord
postrotate
systemctl restart classcord.service
endscript
}
Fichier /etc/fail2ban/filter.d/classcord.conf :
[Definition]
failregex = \[LOGIN\] Failed login attempt from <HOST>
ignoreregex =
Fichier /etc/fail2ban/jail.local :
[classcord]
enabled = true
port = 12345
filter = classcord
logpath = /var/log/classcord/classcord.log
maxretry = 3
findtime = 300
bantime = 3600
crontab -eAjouter :
0 * * * * cp /home/classcord/classcord-server/users.pkl /home/classcord/backups/users-$(date +\%F-\%H\%M).pklsudo tail -f /var/log/classcord/classcord.log
sudo fail2ban-client status classcord
sudo systemctl status classcord.service
sudo journalctl -u classcord.service -f- Gérer les canaux de discussion côté serveur
- Stocker de façon persistante les utilisateurs et messages
- Mettre en place un menu administrateur
- Créer un script d’export CSV
- Gérer la déconnexion des clients et l’arrêt du serveur
Structure créée dans le code :
CHANNELS = {'#général': [], '#dev': [], '#admin': []}Adaptation du serveur pour :
- Attribuer un canal à chaque client connecté
- Diffuser uniquement aux clients présents dans le même canal
Extrait :
def broadcast(message, channel=None, exclude=None):
targets = CHANNELS[channel] if channel else sum(CHANNELS.values(), [])
for client in targets:
if client != exclude:
...Commandes :
mkdir -p config/databaseInitialisation automatique dans le script :
DB_PATH = 'config/database/classcord.db'Création des tables :
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL,
password TEXT NOT NULL
);
CREATE TABLE messages (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER,
channel TEXT,
content TEXT,
timestamp TEXT,
FOREIGN KEY(user_id) REFERENCES users(id)
);Les mots de passe sont hachés en SHA256 :
def hash_password(pwd):
return hashlib.sha256(pwd.encode()).hexdigest()Ajout dans le serveur :
def admin_console():
while True:
print("1. Voir les clients connectés")
print("2. Voir l'état des canaux")
print("3. Voir les utilisateurs et messages")
...Accessible en parallèle via un thread :
threading.Thread(target=admin_console, daemon=True).start()Fonction :
- Affiche les utilisateurs et les messages récents
- Utilise
sqlite3ettabulate
Installation de la dépendance :
python3 -m venv .venv
source .venv/bin/activate
pip install tabulateUtilisation :
python3 admin_view.pyFichiers générés automatiquement :
scripts/exports/messages_export_YYYY-MM-DD.csvscripts/exports/users_export_YYYY-MM-DD.csv
Structure créée :
mkdir -p scripts/exportsCode :
with open(f"scripts/exports/messages_export_{date.today()}.csv", "w") as f:
writer = csv.writer(f)
...Lorsqu’un administrateur arrête le serveur :
for sock in list(CLIENTS.keys()):
try:
send_json(sock, {"type": "shutdown", "message": "Serveur arrêté."})
except:
passLes clients reçoivent un message de fin et ferment leur socket.
- Serveur avec gestion de canaux
- Authentification sécurisée par hash
- Menu administrateur intégré
- Base de données SQLite fonctionnelle
- Script
admin_view.pyutilisable - Export CSV automatisé
- Intégrer le serveur dans le système (systemd)
- Automatiser le démarrage et le redémarrage en cas d’échec
- Vérifier la stabilité multi-clients
- Documenter tout le projet de manière claire
- Exporter les données (utilisateurs, messages)
- S’assurer de la sécurité et du suivi du serveur
Création du fichier :
sudo nano /etc/systemd/system/classcord.serviceContenu :
[Unit]
Description=Classcord Discord-like Service
After=network.target
StartLimitIntervalSec=0
[Service]
Type=simple
User=nedjb
Group=nedjb
WorkingDirectory=/home/nedjb/Documents/classcord-server
ExecStart=/usr/bin/python3 /home/nedjb/Documents/classcord-server/server_classcord.py
Restart=always
RestartSec=1
StandardOutput=append:/var/log/classcord/classcord.log
StandardError=append:/var/log/classcord/classcord.log
[Install]
WantedBy=multi-user.targetCommandes :
sudo systemctl daemon-reexec
sudo systemctl enable --now classcord.serviceVérification :
sudo systemctl status classcord.service
sudo journalctl -u classcord.service -f- Lancement simultané de plusieurs
test_client.py - Chaque client peut :
- s’enregistrer
- se connecter
- envoyer/recevoir des messages en temps réel
- changer de canal
Exemple de réception :
{ "type": "message", "from": "lia", "channel": "#général", "content": "salut leo", "timestamp": "..." }Dans l’interface console (admin) :
3. Voir les utilisateurs et messages
➡️ Génère :
scripts/exports/messages_export_2025-06-20.csvscripts/exports/users_export_2025-06-20.csv
| Fichier | Contenu |
|---|---|
logs/classcord.log |
Activité standard du serveur |
logs/audit.log |
Actions administratives (alerte, changement canal, arrêt serveur...) |
logs/debug.log |
Infos détaillées, erreurs de threads, exceptions techniques |
logs/server_stdout.log |
Sortie standard du serveur (si lancé via start_server.sh) |
Commandes utiles :
tail -f logs/classcord.log
tail -f logs/audit.log- Suppression de
users.pklsi encore présent
rm users.pkl- Vérification des permissions sur la base SQLite :
chmod 600 config/database/classcord.db- Vérification des ports :
ss -tulpn | grep 12345- Activation pare-feu :
sudo ufw allow 12345/tcp
sudo ufw enable- Serveur stable et multi-clients
- Données utilisateurs/messages persistantes
- Export CSV automatisé
- Interface console opérationnelle
- Démarrage automatique avec systemd
- Journalisation complète et filtrable
classcord-server/
├── server_classcord.py
├── test_client.py
├── admin_view.py
├── start_server.sh
├── config/
│ ├── database/
│ ├── fail2ban/
│ ├── logrotate/
│ └── systemd/
├── logs/
│ ├── audit.log
│ ├── debug.log
│ ├── classcord.log
│ └── server_stdout.log
├── scripts/
│ └── exports/
│ ├── messages_YYYY-MM-DD.csv
│ └── users_YYYY-MM-DD.csv
- Projet prêt à déployer et documenté
- Fonctionnalités avancées : multi-clients, sécurité, logging, base de données