[{"data":1,"prerenderedAt":415},["ShallowReactive",2],{"layout-sidebar-en-sagec":3,"project-en-sagec":265},{"id":4,"title":5,"body":6,"date":245,"description":246,"doc":247,"extension":248,"git":247,"image":249,"isExperimentation":250,"meta":251,"navigation":260,"path":261,"seo":262,"stem":263,"tags":247,"type":247,"updatedAt":247,"website":247,"__hash__":264},"projectsEn\u002Fprojects\u002Fen\u002FSagec.md","Sagec - Accounting Management & Optimization",{"type":7,"value":8,"toc":230},"minimark",[9,14,19,23,35,42,46,80,84,116,120,125,132,150,154,165,169,184,204,208,214,217,221,227],[10,11,13],"h1",{"id":12},"sagec-accounting-management-solution","Sagec - Accounting Management Solution",[15,16,18],"h2",{"id":17},"context","📌 Context",[20,21,22],"p",{},"This project was born from a critical need within a French accounting firm: to centralize and optimize the management of clients and projects during the intense tax season (annual financial statements).",[20,24,25,26,30,31,34],{},"The challenge was to break away from expensive and often rigid proprietary solutions to offer a ",[27,28,29],"strong",{},"fast, reliable, and perfectly tailored"," tool for the firm's specific workflows. I was commissioned to design this solution from end to end, prioritizing a modern technical stack and an ",[27,32,33],{},"SRE (Site Reliability Engineering)"," oriented infrastructure.",[20,36,37,38,41],{},"The goal was not only to meet an immediate need but to build a ",[27,39,40],{},"sustainable and scalable"," architecture via a Kubernetes cluster (K3S), allowing for smooth product evolution without a major technical overhaul.",[15,43,45],{"id":44},"key-objectives","🎯 Key Objectives",[47,48,49,56,62,68,74],"ul",{},[50,51,52,55],"li",{},[27,53,54],{},"Centralization",": Unified registration and management of companies, clients, and projects.",[50,57,58,61],{},[27,59,60],{},"Interoperability",": Data import from existing business tools.",[50,63,64,67],{},[27,65,66],{},"Steering",": Decision-making dashboard offering an overview of ongoing projects.",[50,69,70,73],{},[27,71,72],{},"Security",": Granular access management via an RBAC (Role-Based Access Control) system.",[50,75,76,79],{},[27,77,78],{},"High Availability",": Auto-heal, auto-update, and auto-deploy infrastructure.",[15,81,83],{"id":82},"technical-stack","🛠 Technical Stack",[47,85,86,92,98,104,110],{},[50,87,88,91],{},[27,89,90],{},"Backend",": NestJs (TypeScript) & Prisma ORM",[50,93,94,97],{},[27,95,96],{},"Database",": PostgreSQL with Row Level Security (RLS)",[50,99,100,103],{},[27,101,102],{},"Frontend",": VueJs 3, ShadCnVue & TailwindCSS",[50,105,106,109],{},[27,107,108],{},"Infrastructure",": K3S (Kubernetes), Traefik (Ingress), Let's Encrypt (TLS)",[50,111,112,115],{},[27,113,114],{},"DevOps & GitOps",": GitLab CI, Docker, ArgoCD",[15,117,119],{"id":118},"architecture-development","🏗 Architecture & Development",[121,122,124],"h3",{"id":123},"backend-security","Backend & Security",[20,126,127,128,131],{},"The architecture follows ",[27,129,130],{},"NestJs"," modularity principles, ensuring maintainable and testable code. Security is at the heart of the system:",[47,133,134,140],{},[50,135,136,139],{},[27,137,138],{},"Authentication",": Implementation via JWT (JSON Web Tokens).",[50,141,142,145,146,149],{},[27,143,144],{},"Data Isolation",": Use of ",[27,147,148],{},"Row Level Security (RLS)"," policies directly at the PostgreSQL level, ensuring that each user can only access the data they are explicitly authorized to see.",[121,151,153],{"id":152},"frontend-user-experience","Frontend & User Experience",[20,155,156,157,160,161,164],{},"The frontend relies on ",[27,158,159],{},"VueJs 3"," responsiveness coupled with ",[27,162,163],{},"ShadCnVue"," elegance. Particular attention was paid to route management via middlewares, ensuring smooth and secure navigation.",[121,166,168],{"id":167},"infrastructure-gitops","Infrastructure & GitOps",[20,170,171,172,175,176,179,180,183],{},"Deployment is based on a ",[27,173,174],{},"K3S"," cluster optimized on a VPS (8GB RAM, 4 vCPUs). The ",[27,177,178],{},"GitOps"," approach with ",[27,181,182],{},"ArgoCD"," allows real-time synchronization between the manifest repository and the cluster state:",[47,185,186,192,198],{},[50,187,188,191],{},[27,189,190],{},"Ingress Controller",": Traefik configured with 3 replicas for high availability.",[50,193,194,197],{},[27,195,196],{},"Certificates",": TLS automation via Let's Encrypt.",[50,199,200,203],{},[27,201,202],{},"Observability",": Supervised infrastructure to guarantee auto-healing.",[15,205,207],{"id":206},"deployment-cicd","🚀 Deployment & CI\u002FCD",[20,209,210,211,213],{},"The workflow is fully automated. Each source code modification triggers a GitLab CI pipeline that builds the Docker image. ",[27,212,182],{}," then detects version changes in the configuration repository and deploys the modifications with zero downtime.",[20,215,216],{},"The strict separation between application code and Kubernetes manifests ensures clean and secure environment management.",[15,218,220],{"id":219},"key-takeaways","📈 Key Takeaways",[20,222,223,224,226],{},"This project allowed me to validate the power and lightness of ",[27,225,174],{}," for mid-sized production environments. Adopting ArgoCD radically transformed deployment management, bringing total peace of mind regarding the infrastructure state.",[20,228,229],{},"I was able to dive deeper into advanced security concepts (RBAC, RLS) and consolidate my skills in modern software architecture, where code and infrastructure become one.",{"title":231,"searchDepth":232,"depth":232,"links":233},"",2,[234,235,236,237,243,244],{"id":17,"depth":232,"text":18},{"id":44,"depth":232,"text":45},{"id":82,"depth":232,"text":83},{"id":118,"depth":232,"text":119,"children":238},[239,241,242],{"id":123,"depth":240,"text":124},3,{"id":152,"depth":240,"text":153},{"id":167,"depth":240,"text":168},{"id":206,"depth":232,"text":207},{"id":219,"depth":232,"text":220},"2026-04-27","Internal accounting management application and project optimization tool for accounting firms.",null,"md","\u002Fpictures\u002Fsagec.png",false,{"category":252,"stack":253},"fullstack",[130,254,255,163,256,257,258,182,174,259],"PostgreSQL","VueJs","TailwindCSS","Docker","GitLab","SRE",true,"\u002Fprojects\u002Fen\u002Fsagec",{"title":5,"description":246},"projects\u002Fen\u002FSagec","1hDKQ-BvRS8f1JSAFwpUGvnD2zrve6HfIkIJwkaHi_U",{"id":4,"title":5,"body":266,"date":245,"description":246,"doc":247,"extension":248,"git":247,"image":249,"isExperimentation":250,"meta":412,"navigation":260,"path":261,"seo":414,"stem":263,"tags":247,"type":247,"updatedAt":247,"website":247,"__hash__":264},{"type":7,"value":267,"toc":400},[268,270,272,274,280,284,286,308,310,332,334,336,340,352,354,360,362,370,384,386,390,392,394,398],[10,269,13],{"id":12},[15,271,18],{"id":17},[20,273,22],{},[20,275,25,276,30,278,34],{},[27,277,29],{},[27,279,33],{},[20,281,37,282,41],{},[27,283,40],{},[15,285,45],{"id":44},[47,287,288,292,296,300,304],{},[50,289,290,55],{},[27,291,54],{},[50,293,294,61],{},[27,295,60],{},[50,297,298,67],{},[27,299,66],{},[50,301,302,73],{},[27,303,72],{},[50,305,306,79],{},[27,307,78],{},[15,309,83],{"id":82},[47,311,312,316,320,324,328],{},[50,313,314,91],{},[27,315,90],{},[50,317,318,97],{},[27,319,96],{},[50,321,322,103],{},[27,323,102],{},[50,325,326,109],{},[27,327,108],{},[50,329,330,115],{},[27,331,114],{},[15,333,119],{"id":118},[121,335,124],{"id":123},[20,337,127,338,131],{},[27,339,130],{},[47,341,342,346],{},[50,343,344,139],{},[27,345,138],{},[50,347,348,145,350,149],{},[27,349,144],{},[27,351,148],{},[121,353,153],{"id":152},[20,355,156,356,160,358,164],{},[27,357,159],{},[27,359,163],{},[121,361,168],{"id":167},[20,363,171,364,175,366,179,368,183],{},[27,365,174],{},[27,367,178],{},[27,369,182],{},[47,371,372,376,380],{},[50,373,374,191],{},[27,375,190],{},[50,377,378,197],{},[27,379,196],{},[50,381,382,203],{},[27,383,202],{},[15,385,207],{"id":206},[20,387,210,388,213],{},[27,389,182],{},[20,391,216],{},[15,393,220],{"id":219},[20,395,223,396,226],{},[27,397,174],{},[20,399,229],{},{"title":231,"searchDepth":232,"depth":232,"links":401},[402,403,404,405,410,411],{"id":17,"depth":232,"text":18},{"id":44,"depth":232,"text":45},{"id":82,"depth":232,"text":83},{"id":118,"depth":232,"text":119,"children":406},[407,408,409],{"id":123,"depth":240,"text":124},{"id":152,"depth":240,"text":153},{"id":167,"depth":240,"text":168},{"id":206,"depth":232,"text":207},{"id":219,"depth":232,"text":220},{"category":252,"stack":413},[130,254,255,163,256,257,258,182,174,259],{"title":5,"description":246},1777912143683]