[🛠] Journal de développement Secret Messenger #4 : configuration SSH, intégration du script bootstrap
✨ Résumé de GPT
Une journée où j’ai réussi à configurer la connexion SSH, puis à intégrer un script shell écrit auparavant pour automatiser la configuration de l’environnement VPS. Grâce à cela, le temps de préparation de l’environnement projet Flutter+Django a été radicalement réduit.
💭 Journal
Donc se connecter à un serveur distant par SSH, c’était aussi simple que ça ? Avec l’aide de GPT, ça s’est fait rapidement, sans blocage. Avant, je mélangeais sans cesse les concepts, j’oubliais des trucs, c’était n’importe quoi…
Et après la réussite de la connexion SSH, j’ai juste fait “clic” sur le script d’automatisation que j’avais écrit avant, et toute la configuration d’environnement a réussi d’un coup lol
Comme prévu, même les trucs qui ressemblent à du bricolage inutile finissent par servir plus tard, hein ?
🚀 Roadmap
Plan d’exécution pour une messagerie Flutter Web + Django sécurisée et déguisée, destinée à des personnes très surveillées et à haut risque en Chine continentale — en particulier des évadés nord-coréens sans papiers — où la dissimulation et la protection des données sont primordiales. L’application est camouflée en calculatrice en ligne basique tout en fournissant, en dessous, du chat en temps réel, du partage de fichiers et des diffusions d’informations à sens unique.
✅ Phase 1 — Planification et architecture
-
🧠 Définir l’objectif du projet et le modèle de menace
- Public : évadés nord-coréens sans papiers en Chine
- Mission : outil de messagerie sécurisé, déguisé, basé sur le navigateur et sans installation
- Déguisement UX : interface de style calculatrice
-
🤖 Sélectionner un workflow de dev piloté par AI
- Utiliser GPT-4o + o1 pour la conception, le codegen et l’itération
- Suivre le “Vibe Coding” -> dev rapide en langage naturel via AI
-
⚙️ Finaliser la stack technique
- Frontend : Flutter Web (Material 3, go_router, Riverpod, http)
- Backend : Django + Django REST Framework (Django 5.x)
- Déploiement : conteneur VPS unique (statique + API), avec proxy Cloudflare optionnel
-
🌐 Acquérir le domaine
-
Domaine :
___.net - Coût : ₩18,000/an via un bureau d’enregistrement coréen
- Objectif : camouflage visuel en calculatrice en ligne
-
Domaine :
✅ Phase 2 — Configuration VPS et déploiement de base
-
💳 Créer un compte Vultr et payer $10.
-
🛒 Créer une instance VPS
- Région : Singapore (meilleure performance GFW sur Vultr)
- OS : Ubuntu 22.04 x64
- Plan : 1vCPU / 1 Go RAM ($5/mois)
- Configuration par clé SSH ou mot de passe
-
🔑 Fluidifier la connexion SSH Mac <-> serveur
-
Générer une clé ed25519 sur le MacBook et la charger dans l’agent
ssh-keygen -t ed25519 -C "___-remote" ssh-copy-id -i ~/.ssh/id_ed25519.pub root@<IP> -
À partir de maintenant :
ssh root@<IP>-> demande de phrase de passe -> connexion instantanée
-
-
🐚 Bootstrap de l’environnement shell sur le VPS
-
Cloner le dépôt personnel de dotfiles et lancer le script de configuration
git clone https://github.com/JUD210/dev-settings-backup.git ~/dev-settings-backup cd ~/dev-settings-backup chmod +x init_my_shell.sh && ./init_my_shell.sh - Le script installe / vérifie zsh, Oh-My-Zsh, Powerlevel10k, relie
.zshrc,.vimrc,.gitconfig, et définit zsh comme shell par défaut. - Il vérifie aussi que des outils CLI essentiels comme
lessetgitsont installés
-
-
🔐 Accéder au VPS et l’initialiser
-
Se connecter et installer les paquets essentiels (si le script bootstrap ne l’a pas déjà fait)
ssh root@<IP> apt update && apt upgrade -y apt install python3-pip python3-venv nginx ufw -y ufw allow OpenSSH && ufw allow 'Nginx Full' && ufw enable
-
-
📁 Préparer le répertoire projet et le virtualenv
mkdir /srv/___ && cd /srv/___ python3 -m venv venv && source venv/bin/activate pip install django djangorestframework whitenoise gunicorn
Note : Un proxy Cloudflare est recommandé pour masquer l’IP du VPS et absorber les DDoS.
✅ Phase 3 — Initialisation du projet (Django + Flutter)
🔧 Configuration Django
-
django-admin startproject stealthcore .- Crée le dossier
stealthcore/etmanage.pydans/srv/___.
- Crée le dossier
-
python manage.py startapp api- Crée le dossier
api/pour votre logique personnalisée (gestion des messages, uploads de fichiers, annonces de diffusion, etc.).
- Crée le dossier
-
Ajouter
'api','rest_framework'àINSTALLED_APPS-
Dans
stealthcore/stealthcore/settings.py, par exemple :INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', # Add 'api', # Add ]
-
-
python manage.py migrate- Crée les tables initiales de la base de données (SQLite par défaut).
-
python manage.py createsuperuser- Permet d’accéder au panneau d’administration de Django (optionnel mais recommandé).
Extensions futures :
/api/messages/pour le chat de groupe avec TTL/api/upload/pour le partage de fichiers (suppression automatique)/api/notice/pour les messages de diffusion administrateur
🛠️ Configuration Flutter Web
-
flutter create ___web- Produit un projet Flutter Web de base.
-
Remplacer l’UI par une mise en page de style calculatrice
-
Exemple minimal dans
main.dart:TextField( onChanged: (val) { // store user input }, ); ElevatedButton( onPressed: () { // call /api/check-trigger/ }, child: Text("Send"), ); -
En pratique, implémenter un pavé numérique, de l’arithmétique basique, etc.
-
-
Connecter la requête POST à
/api/check-trigger/-
Avec
http:final response = await http.post( Uri.parse('/api/check-trigger/'), body: {'input': userInput}, ); -
Si valide, le backend émet un jeton -> Flutter charge l’UI cachée de la messagerie.
-
-
flutter build web- Compile votre app Flutter vers
build/web/.
- Compile votre app Flutter vers
-
Copier les fichiers :
mkdir frontend_static/ cp -r build/web/* frontend_static/- Ceux-ci peuvent être servis par Nginx ou par WhiteNoise de Django.
✅ Phase 4 — API de déclenchement et intégration Flutter
-
Dans Django
api/views.py:from rest_framework.decorators import api_view from rest_framework.response import Response import os @api_view(['POST']) def check_trigger(request): # Production: store real trigger in os.environ or DB valid_trigger = os.environ.get('___TRIGGER', '1004') if request.data.get('input') == valid_trigger: return Response({'status': 'success', 'token': 'XYZ'}) return Response({'status': 'denied'}) -
Créer
/api/urls.pyet enregistrer la routefrom django.urls import path from .views import check_trigger urlpatterns = [ path('check-trigger/', check_trigger, name='check-trigger'), ] -
Connecter depuis Flutter avec
http.post(...)- Si
"success", stocker le jeton en mémoire (Riverpod) -> afficher l’UI cachée - Si
"denied", rester une simple calculatrice
- Si
-
Vérifier qu’aucune logique sensible n’existe dans le frontend
- Toutes les valeurs secrètes (comme le code de déclenchement) vivent sur le serveur.
✅ Phase 5 — Hébergement Nginx & HTTPS
-
Créer la config Nginx :
server { listen 80; server_name ___.net; location /static/ { alias /srv/___/frontend_static/; } location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } -
Activer la config et redémarrer :
ln -s /etc/nginx/sites-available/___/etc/nginx/sites-enabled/ nginx -t && systemctl restart nginx -
Activer HTTPS :
apt install certbot python3-certbot-nginx -y certbot --nginx -d ___.net- Installe un certificat Let’s Encrypt pour
___.net. - Ensuite,
https://___.netdoit servir la calculatrice déguisée.
- Installe un certificat Let’s Encrypt pour
Gunicorn & systemd
En production, exécuter Django avec Gunicorn derrière Nginx :
gunicorn stealthcore.wsgi:application --bind 127.0.0.1:8000Créer un
/etc/systemd/system/gunicorn.servicepour redémarrer automatiquement au reboot.
✅ Phase 6 — Tests finaux et durcissement du déguisement
-
🧪 Tester l’UI et le déclencheur
-
Visiter
https://___.net -
Saisir
1004(ou le vrai déclencheur) -> vérifier{"status":"success"}+ jeton -
Saisie invalide ->
{"status":"denied"}
-
Visiter
-
🔒 Nettoyer le frontend
- Retirer toutes les références à “chat” ou “trigger”
- Aucun secret ni jeton hardcodé
- Usage minimal de localStorage pour les sessions éphémères
-
🧊 Peaufiner le déguisement final
- Fausse identité visuelle de calculatrice (titre, icône, etc.)
- Arithmétique réelle (optionnelle), pour qu’elle soit pleinement plausible comme calculatrice
- Alignement UI, thème et style final
-
🧠 Créer
deploy.md(doc interne)- Déployer, mettre à jour, rollback et vérifier
-
Résumer les variables d’environnement (
___TRIGGER,SECRET_KEY) - Inclure les bonnes pratiques de sécurité et de journalisation
🔮 Fonctionnalités futures
- 📥 Info Board (annonces en lecture seule)
- 💬 Group Chat avec suppression des messages basée sur TTL
- 📁 File Sharing (expiration automatique pour la sécurité)
- 🔥 Auto-Deletion via cron/commande de gestion pour les données expirées
- 🌐 Cloudflare Proxy pour masquer l’IP du VPS et atténuer les DDoS
Utiliser cette roadmap pour guider le développement de bout en bout de ___ — de la configuration initiale du VPS jusqu’à la production finale.—
👀 Git Log
| Date | Type | Message |
|---|---|---|
| 25.04.17 Thu | docs(roadmap) | refine Phase 2 with SSH setup and bootstrap script integration (HEAD -> main, origin/main) |
| 25.04.13 Sun | docs(roadmap) | refine and finalize Phase 1–6 plan for secure disguised messenger |
| 25.04.03 Thu | docs(roadmap) | edit full Phase 0–3 checklist for Flutter Web + Django deployment |
| 25.04.03 Thu | docs | add dev-principles and roadmap with links from README |
| 25.04.03 Thu | docs(README) | add more details to roadmap |
| 25.04.03 Thu | docs(README) | change backend from Node to Django, and change from Kor to Eng |
| 25.04.02 Wed | docs(README) | add minor details for user |
| 25.04.01 Tue | docs(README) | add description, tech stack, features, roadmap, … |
| 25.04.01 Tue | - | Initial commit |
Laisser un commentaire