Introduction
Cloudy Pocket est une application de gestion de budget personnel que j'ai développée intégralement, d'abord comme projet de fin d'études de mon bachelor, puis comme projet personnel maintenu et enrichi en continu. Elle est en production depuis plus de deux ans, utilisée par une dizaine d'utilisateurs, et l'inscription vient d'être ouverte au public.
C'est un projet que j'ai réalisé entièrement à la main, avant l'ère des assistants IA. Il représente mon expérience la plus longue en maintenance d'une application en production avec des données utilisateurs sensibles.
Architecture
L'application repose sur quatre dépôts indépendants : une API Laravel, un front application React, un front admin React et un site vitrine React. Cette séparation, issue d'un refactoring d'un front unique, permet des déploiements et développements indépendants.
Fonctionnalités
- Création de comptes bancaires à l'image des comptes réels
- Enregistrement de toutes les opérations bancaires avec pointage croisé application/banque
- Gestion d'étiquettes et tickets de caisse : photographie et stockage temporaire pour les sessions de comptes
- Échéancier : intégration automatique de lignes et automatisation de transferts entre comptes
- Partage de comptes avec d'autres utilisateurs (comptes joints)
- Front admin dédié : métriques, activité des comptes, création de comptes, surveillance des connexions
Sécurité
Les données bancaires sont chiffrées en AES-256-CBC. J'ai d'abord implémenté le chiffrement manuellement, ce qui m'a permis de comprendre en profondeur les algorithmes de chiffrement symétrique et asymétrique, avant de migrer vers le système natif de Laravel en réalisant que mon implémentation correspondait quasi exactement au système intégré.
Un système de blacklist IP/email protège l'application contre les tentatives de connexion malveillantes, avec des sanctions graduelles en fonction du nombre de tentatives échouées. Ce système a ensuite été répliqué sur d'autres projets professionnels.
CI/CD et déploiement
La CI/CD repose sur GitHub Actions, répliquée sur les quatre dépôts :
- Pipeline CI : tests, SAST, détection de secrets
- Pipeline CD : déploiements automatisés
- Pipeline scheduled quotidien : scan de dépendances
Une contrainte spécifique à l'hébergeur O2Switch m'a conduit à une solution créative : les IP des runners GitHub étant dynamiques et imprévisibles, mais O2Switch exigeant une IP fixe pour les connexions SSH, j'ai mis en place un bastion VPS externe avec une IP fixe comme point de passage obligé pour tous les déploiements. Ce bastion est volontairement distinct de mon infrastructure personnelle pour des raisons de disponibilité et de séparation des flux réseau.