Partie 1 : D'un site statique à un serveur Python
Partie 1 : D'un site statique à un serveur Python
Octobre 2025
Le point de départ : 4 pages HTML statiques
Tout a commencé très simplement. J'avais :
- 4 pages HTML : index.html, presentation.html, services.html, galerie.html
- 1 fichier CSS : style.css
- 1 fichier JavaScript : script.js pour le menu et la lightbox
- Des images dans un dossier images/
Le site home-fonta.fr était un site de test basique avec une galerie photos, une présentation et des services. Il était hébergé... nulle part en fait. Juste des fichiers statiques sur ma raspberry-pi.
Structure initiale
home-fonta/
├── index.html
├── presentation.html
├── services.html
├── galerie.html
├── menu.html
├── style.css
├── script.js
└── images/
├── aigle.jpg
├── Bust.jpg
├── fleur.jpg
└── ...
Le problème des chemins absolus
Premier problème rencontré : mes fichiers HTML utilisaient des chemins absolus !
<!-- Dans index.html -->
<link rel="stylesheet" href="/style.css">
<script src="/script.js"></script>
<!-- Dans le JavaScript -->
fetch("/menu.html")
Ça fonctionnait en local avec file://, mais impossible à déployer sur un serveur dans un sous-dossier /home-fonta/.
Étape 1 : Migration vers un serveur Python simple
Ma première question : "J'ai 4 pages HTML, un CSS et un JavaScript, est-ce que je peux les adapter sur un serveur web Python ?"
J'hésitais entre Flask et http.server. Ne connaissant pas Flask, j'ai choisi la simplicité : http.server.
Le premier serveur Python
#!/usr/bin/env python3
"""
Serveur Web Python pour Home-Fonta.fr
Utilise le module http.server intégré à Python
"""
import http.server
import socketserver
import sys
import os
DEFAULT_PORT = 8000
DIRECTORY = "."
class CustomHTTPRequestHandler(http.server.SimpleHTTPRequestHandler):
"""Handler personnalisé avec logs"""
def __init__(self, *args, **kwargs):
super().__init__(*args, directory=DIRECTORY, **kwargs)
def main():
port = int(sys.argv[1]) if len(sys.argv) > 1 else DEFAULT_PORT
with socketserver.TCPServer(("", port), CustomHTTPRequestHandler) as httpd:
print(f" Serveur démarré sur http://localhost:{port}")
print(f" Servant le dossier : {os.path.abspath(DIRECTORY)}")
httpd.serve_forever()
if __name__ == "__main__":
main()
Correction des chemins
J'ai créé un script Python pour corriger automatiquement tous les chemins :
# fix_paths.py
def fix_html_paths(file_path):
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
# Remplacer les chemins absolus par des chemins relatifs
replacements = [
('href="/style.css"', 'href="./style.css"'),
('src="/script.js"', 'src="./script.js"'),
('href="/images/', 'href="./images/'),
('fetch("/menu.html")', 'fetch("./menu.html")')
]
for old, new in replacements:
content = content.replace(old, new)
# Sauvegarder avec backup
shutil.copy2(file_path, f"{file_path}.backup")
with open(file_path, 'w', encoding='utf-8') as f:
f.write(content)
Configuration avec systemd
Pour que le serveur Python démarre automatiquement :
# /etc/systemd/system/home-fonta.service
[Unit]
Description=Home-Fonta.fr Python Server
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/html/home-fonta
ExecStart=/usr/bin/python3 /var/www/html/home-fonta/server.py 8000
Restart=always
[Install]
WantedBy=multi-user.target
Nginx en reverse proxy
# /etc/nginx/sites-available/home-fonta
server {
listen 80;
server_name home-fonta.fr;
location /home-fonta/ {
proxy_pass http://127.0.0.1:8000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Résultat de cette première migration
Site accessible sur http://home-fonta.fr/home-fonta/
Service systemd qui démarre automatiquement
Nginx comme reverse proxy
Mais... http.server n'est pas fait pour la production !
Les limitations de http.server
Après quelques jours, les problèmes sont apparus :
- Lenteur sur les gros fichiers
- Pas de gestion de cache
- Pas de compression gzip
- Single-threaded : une requête à la fois !
- Sécurité limitée
La décision : Il faut du vrai Python de production
Je me suis demandé : "Est-ce qu'il ne serait temps d'aller vers flask ?"
Alors j'ai fait des recherches sur les avantages de flask où Gunicorn était souvent mentionné.
La réponse était claire : Flask + Gunicorn serait bien meilleur pour la production. Mais avant ça, j'avais une autre idée...
"J'aimerais mettre le site sous Docker, je le fait dans une deuxième étape ? Ou c'est mieux de le faire en même temps ?"
Mais il ne faut pas se précipiter, je suis là pour apprendre : faire les choses progressivement. D'abord Docker avec le serveur Python simple, puis migrer vers Flask.
📝 Leçons apprises à ce stade
- http.server = développement uniquement
- Les chemins absolus sont un piège
- systemd est pratique mais pas portable
- Nginx en reverse proxy = bonne pratique
- Toujours faire des backups avant de modifier
🎯 Bilan de cette première étape
| Aspect | Avant | Après |
|---|---|---|
| Hébergement | Fichiers statiques | Serveur Python actif |
| Gestion | Manuelle | systemd automatique |
| Architecture | Monolithique | Nginx + Python |
| Portabilité | Aucune | Limitée au serveur |
Le site fonctionnait, mais c'était fragile. Il était temps de passer à l'étape suivante : Docker !
Suite : Partie 2 - La containerisation avec Docker