{"id":46102176,"url":"https://github.com/marcompiler/spring-vue-postgres-keycloak-architecture","last_synced_at":"2026-06-27T11:00:32.683Z","repository":{"id":314213092,"uuid":"1038609169","full_name":"Marcompiler/spring-vue-postgres-keycloak-architecture","owner":"Marcompiler","description":"Example of full-stack architecture with Spring Boot, Vue 3, PostgreSQL, and Keycloak (SSO, OAuth2, JWT) deployed via Podman - ideal as a tutorial or project base.","archived":false,"fork":false,"pushed_at":"2026-03-01T18:13:11.000Z","size":2451,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-01T20:30:57.500Z","etag":null,"topics":["boilerplate","fullstack","java","javascript","jwt","keycloak","oauth2","podman","postgresql","spring-boot","sso","template","tutorial","vue"],"latest_commit_sha":null,"homepage":"","language":"Vue","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Marcompiler.png","metadata":{"files":{"readme":"README.fr.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.fr.md","funding":null,"license":"LICENSE","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":".github/SECURITY.fr.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-08-15T14:12:50.000Z","updated_at":"2026-03-01T18:09:07.000Z","dependencies_parsed_at":null,"dependency_job_id":"95115dea-8d98-4e26-b98e-420a652921c6","html_url":"https://github.com/Marcompiler/spring-vue-postgres-keycloak-architecture","commit_stats":null,"previous_names":["marcompiler/spring-vue-postgres-keycloak-architecture"],"tags_count":6,"template":true,"template_full_name":null,"purl":"pkg:github/Marcompiler/spring-vue-postgres-keycloak-architecture","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Marcompiler%2Fspring-vue-postgres-keycloak-architecture","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Marcompiler%2Fspring-vue-postgres-keycloak-architecture/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Marcompiler%2Fspring-vue-postgres-keycloak-architecture/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Marcompiler%2Fspring-vue-postgres-keycloak-architecture/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Marcompiler","download_url":"https://codeload.github.com/Marcompiler/spring-vue-postgres-keycloak-architecture/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Marcompiler%2Fspring-vue-postgres-keycloak-architecture/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34850575,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-27T02:00:06.362Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["boilerplate","fullstack","java","javascript","jwt","keycloak","oauth2","podman","postgresql","spring-boot","sso","template","tutorial","vue"],"created_at":"2026-03-01T20:01:29.754Z","updated_at":"2026-06-27T11:00:32.659Z","avatar_url":"https://github.com/Marcompiler.png","language":"Vue","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Architecture Web - Exemple Spring-Vue-Postgres-Keycloak\n\n![Image de présentation](./images/presentation.png)\n\n## Description\n\nCe repository est une **architecture permettant de développer un site Web complet** avec tous les éléments nécessaires : un **backend**, un **frontend**, une **base de données** et une **authentification unique**.\n\nLe tout **uniquement avec des éléments/outils open source** (_en tous cas autant que possible_).\n\n## À qui s'adresse ceci\n\nCe projet s'adresse à **toute personne qui** :\n\n- **Souhaite apprendre**.\n- **Cherche** de l'**inspiration** pour constituer sa propre architecture.\n- **Souhaite démarrer le développement d'un site Web** complet et polyvalent.\n- Envisage un **projet personnel/commercial sans frais de licence** (_voir [architecture](#structure-de-larchitecture)_)\n- Souhaite essayer des **technologies sans [GAFAM](https://fr.wikipedia.org/wiki/GAFAM)**.\n- S'est perdue ici (_Bienvenue !_).\n\n## Objectifs\n\nLe **but premier** est de **partager** publiquement ce que je fais habituellement dans mon coin **pour permettre à d'autres** de **s'inspirer** voire de **se motiver** à faire leurs propres créations.\n\nCe repository **peut servir de base** pour **n'importe quel projet de site Web**. En espérant que sa composition corresponde à ce qui vous sera nécessaire pour votre cas particulier.\n**Si vous n'avez aucune exigence**, j'ose penser que **vous disposez ici de tout ce qui est nécessaire** pour développer votre propre solution.\n\nJe vous invite donc à **forker ce projet** ou **en faire ce que bon vous semble** à partir du moment où cela peut **vous aider/inspirer/faire apprendre** quelque chose.\n\n## Architecture\n\n### Structure de l'architecture\n\nL'architecture est donc constituée de la façon suivante :\n\n- [Un backend API REST](./backend/)\n  - [Spring](https://docs.spring.io/spring-framework/reference/index.html) ([_licence Apache 2.0_](https://github.com/spring-projects/spring-framework/blob/main/LICENSE.txt))\n    - [Spring Web](https://docs.spring.io/spring-framework/reference/web/webmvc.html) ([_licence Apache 2.0_](https://github.com/spring-projects/spring-ws/blob/main/LICENSE.txt))\n    - [Spring Data JPA](https://docs.spring.io/spring-data/jpa/reference/index.html) ([_licence Apache 2.0_](https://github.com/spring-projects/spring-data-jpa/blob/main/LICENSE.txt))\n    - [Spring Security](https://docs.spring.io/spring-security/reference/index.html) ([_licence Apache 2.0_](https://github.com/spring-projects/spring-security/blob/main/LICENSE.txt))\n- [Un frontend](./frontend/)\n  - [Vue.JS](https://vuejs.org/) ([_licence MIT_](https://github.com/vuejs/core/blob/main/LICENSE))\n- [Une authentification unique (SSO)](./sso/)\n  - [Keycloak](https://www.keycloak.org/) ([_licence Apache 2.0_](https://github.com/keycloak/keycloak/blob/main/LICENSE.txt))\n- [Une base de données](./database/)\n  - [PostgreSQL](https://www.postgresql.org/) ([_licence PostgreSQL_](https://www.postgresql.org/about/licence/))\n\n### Fonctionnement de l'architecture\n\n![Architecture diagram light-theme](images/fullstack-diagram.light-theme.png#gh-light-mode-only)\n![Architecture diagram dark-theme](images/fullstack-diagram.dark-theme.png#gh-dark-mode-only)\n\nDonc, voici comment ça se présente. Ce schéma permet de visualiser aisément les interactions entre les différents éléments de l'architecture (_Il existe des versions SVG au besoin dans le [répertoire des images](./images/)_).\n\nCe diagramme part du principe que les utilisateurs ont tous un compte préexistant au sein du SSO et que l'utilisateur tente d'accéder à une ressource \"protégées\" (_nécessitant authentification_).\n\nÀ partir du moment où un utilisateur va tenter d'accéder au site Web, une suite d'étapes va s'enclencher pour lui donner le résultat attendu (_code couleur repris du diagramme, non visible sur GitHub_) :\n\n1. Tout d'abord, **l'utilisateur accède au \u003cspan style=\"color:red\"\u003efrontend\u003c/span\u003e** en allant sur l'URL de celui-ci.\n2. **Si l'utilisateur n'est pas authentifié**, il est directement **redirigé vers le \u003cspan style=\"color:violet\"\u003eSSO\u003c/span\u003e**. L'utilisateur va alors devoir **saisir ses identifiants** pour être **authentifié auprès du \u003cspan style=\"color:violet\"\u003eSSO\u003c/span\u003e et aux yeux du \u003cspan style=\"color:red\"\u003efrontend\u003c/span\u003e**.\n3. **Une fois authentifié**, l'utilisateur est **redirigé vers la page initiale du \u003cspan style=\"color:red\"\u003efrontend\u003c/span\u003e** qu'il tentait d'accéder. Le **\u003cspan style=\"color:red\"\u003efrontend\u003c/span\u003e va alors charger** le contenu de la page.\n4. **Pour charger le contenu**, le **\u003cspan style=\"color:red\"\u003efrontend\u003c/span\u003e peut devoir faire appel au \u003cspan style=\"color:lightgreen\"\u003ebackend\u003c/span\u003e**. Cet appel comporte alors un Json Web Token (_JWT_) contenant l'identité de l'utilisateur ayant fait la requête initiale.\n5. **Pour vérifier l'identité et les autorisations** de l'utilisateur, **le \u003cspan style=\"color:lightgreen\"\u003ebackend\u003c/span\u003e contacte alors le \u003cspan style=\"color:violet\"\u003eSSO\u003c/span\u003e avec le JWT** reçu pour lui demander si celui-ci est valide.\n6. **Si le \u003cspan style=\"color:violet\"\u003eSSO\u003c/span\u003e répond positivement**, cela donne alors le **feu vert au \u003cspan style=\"color:lightgreen\"\u003ebackend\u003c/span\u003e pour répondre à la requête du \u003cspan style=\"color:red\"\u003efrontend\u003c/span\u003e** faite à l'étape 4.\n7. Pour répondre, **le \u003cspan style=\"color:lightgreen\"\u003ebackend\u003c/span\u003e va** souvent **interagir avec la \u003cspan style=\"color:cyan\"\u003ebase de données\u003c/span\u003e** pour traiter les données demandées par la requête.\n8. **Le \u003cspan style=\"color:lightgreen\"\u003ebackend\u003c/span\u003e répond enfin à la requête avec le contenu demandé** qui va venir **compléter celui du \u003cspan style=\"color:red\"\u003efrontend\u003c/span\u003e**.\n9. Une fois le contenu chargé, le **\u003cspan style=\"color:red\"\u003efrontend\u003c/span\u003e renvoie le résultat final** à l'utilisateur.\n\n## Pour démarrer\n\nIci, j’explique **comment démarrer l’ensemble de l’architecture** afin que vous puissiez la tester directement.  \n**Si vous souhaitez la parcourir** d’abord pour **la comprendre** et/ou **vous familiariser avec elle**, je vous conseille de consulter d’abord **[la feuille de route ci-dessous](#feuille-de-route-pour-la-prise-en-main)**.\n\nInutile de préciser que **tout ceci** est destiné **à des fins de développement**.  \n**Pour la production**, vous devrez **attribuer des valeurs et déployer** les éléments **selon votre propre infrastructure**.\n\n### Prérequis\n\nAvant de commencer, assurez-vous d’avoir installé :\n\n- **[Podman](https://podman.io/docs/installation)** (_ou [Docker](https://docs.docker.com/get-started/get-docker/)_) pour lancer la base de données et le SSO (_voire le backend et le frontend_).\n  - **[Podman-Compose](https://podman-desktop.io/docs/compose/setting-up-compose)** (_ou [Docker-Compose](https://docs.docker.com/compose/install/)_) est également conseillé. Sinon vous devrez convertir les `.yml` en commandes `run`.\n- **[Java 21+](https://jdk.java.net/21/)** pour le backend Spring.\n- **[Maven](https://maven.apache.org/download.cgi)** pour construire le backend.\n- **[Node.js 22+](https://nodejs.org/fr/download)** et **[npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)** pour le frontend.\n\nSi ce n'est déjà fait, je vous invite à **redémarrer votre machine** une fois la/les installations terminées.\n\n### Variables d'environnement\n\nLa base de données et l'authentification unique (_SSO_) dépendent d'un fichier de variables d'environnement pour démarrer. Veillez donc à créer une copie du fichier `.env.*.template` et le renommer en retirant `.template`.\n\nCela donne donc :\n\n| Élément | Fichier template | Nom de la copie |\n| --- | --- | --- |\n| Base de données | [`.env.database.template`](./database/podman/.env.database.template) | `.env.database` |\n| SSO | [`.env.sso.template`](./sso/podman/dev/.env.sso.template) | `.env.sso` |\n\nAttention que si vous modifiez les valeurs, il faut répercuter ces modifications dans les configurations qui les utilisent :\n\n- Les valeurs de `.env.database` sont utilisées par le backend dans son [application.properties](./backend/app/src/main/resources/application.properties) et ses scripts d'exécution Podman (_[Linux](./backend/app/podman-run.sh)/[Windows](./backend/app/podman-run.ps1)_).\n- Les valeurs de `.env.sso` sont à utiliser lors de la connexion à l'interface Web du SSO en tant qu'administrateur (adresse par défaut : \u003chttp://localhost:8080\u003e).\n\nUne fois les copies créées et renommées, **vous pouvez alors démarrer tous** les éléments de l'architecture [**à l'aide des commandes ci-dessous**](#commandes-à-exécuter).\n\n### Commandes à exécuter\n\n**_Veillez à respecter l'ordre d'exécution_**.\n\nAvant toute chose, certains éléments de l'architecture nécessite Podman/Docker, assurez-vous donc que la machine correspondante existe et est démarrée :\n\n```sh\npodman machine init\npodman machine start\n```\n\n#### Base de données (1/4)\n\nDans un **nouveau terminal**, exécutez la commande suivante pour **démarrer un conteneur Postgres** :\n\n```sh\npodman compose -f \"./database/podman/podman-compose.yml\" up -d\n```\n\n#### Authentification unique (SSO) (2/4)\n\nExécutez la commande suivante pour **démarrer un conteneur Keycloak** (_pour le développement_) :\n\n```sh\npodman compose -f \"./sso/podman/dev/podman-compose.yml\" up -d\n```\n\n#### Backend (3/4)\n\nDans un **nouveau terminal**, allez dans le **répertoire de l'application backend** :\n\n```sh\ncd backend/app\n```\n\n**Démarrez l'application** au moyen des commandes suivantes :\n\n```sh\n./mvnw clean install\n./mvnw spring-boot:run\n```\n\n#### Frontend (4/4)\n\nDans un **nouveau terminal**, allez dans le **répertoire de l'application frontend** :\n\n```sh\ncd frontend/app\n```\n\n**Démarrez l'application** au moyen des commandes suivantes :\n\n```sh\nnpm install\nnpm run dev\n```\n\n**Tous les éléments sont maintenant démarrés** et vous pouvez commencer à **tester votre stack** en vous rendant sur \u003chttp://localhost:5173\u003e.  \nMais avant cela, notre SSO va nous saluer : vous devez donc d’abord [créer vos propres utilisateurs](#une-fois-tout-démarré---créez-vos-utilisateurs).\n\n### Une fois tout démarré -\u003e Créez vos utilisateurs\n\n**Une fois que tout est démarré**, vous devez ajouter deux utilisateurs dans votre instance Keycloak.  \nPour cela, **ouvrez votre navigateur** et allez à son adresse.  \n**Par défaut**, il s’agit de **\u003chttp://localhost:8080\u003e**.\n\nLorsque la page s’affiche, **saisissez les identifiants que vous avez définis dans votre propre fichier [`.env.sso`](./sso/podman/dev/.env.sso)** (_assurez-vous de l’avoir créé au préalable !_).\n\nEnsuite, allez dans **\"Manage Realms\"** et cliquez sur **\"demo-realm\"**.  \nS’il apparaît comme \"Current realm\", allez dans **\"Users\"** et créez deux utilisateurs en leur attribuant ces valeurs :\n\n| Nom du paramètre | Valeur Utilisateur 1 | Valeur Utilisateur 2 |\n| --- | --- | --- |\n| Actions utilisateur requises | Aucune | Aucune |\n| Email vérifié | `On` | `On` |\n| Nom d’utilisateur | demo-user | demo-admin |\n| Email | \u003cdemo-user@example.com\u003e | \u003cdemo-admin@example.com\u003e |\n| Prénom | Demo | Demo |\n| Nom | User | Admin |\n| Groupes | `demo-users` | `demo-admins` |\n\n**Une fois créés**, allez dans leurs **\"Credentials\"** et cliquez sur **\"Set password\"**.  \n**Pour les deux**, définissez **\"demo\"** comme mot de passe et mettez **\"Temporary\" sur `Off`**.\n\n**Ce n’est qu’alors** que vous pourrez **vous connecter au SSO via la redirection du frontend** (_cela devrait ressembler à quelque chose commençant par \"\u003chttp://localhost:8080/realms/demo-realm/protocol/openid-connect/auth[...]\u003e\"_).\n\n## Parcours de développement\n\n**Si vous hésitez à vous lancer**, j'ai longtemps été dans la même situation que vous et **je comprends**. Par conséquent, **je vous invite à lire le [parcours de développement](DEV_JOURNEY.fr.md)** que j'ai rédigé à propos de ce projet.\n\nSi cela peut vous **aider à vous sentir moins seul voire à vous motiver**, j'en serais ravi.\n\n## Feuille de route pour la prise en main\n\n### Connaissances préalables conseillées\n\nPour prendre ce projet en main, je vous invite tout d'abord à disposer des **connaissances nécessaires** afin de **comprendre au mieux** les **concepts abordés ici**.\n\nJe dirais donc que les concepts principaux à connaître sont :\n\n- La [**virtualisation par conteneur**](https://fr.wikipedia.org/wiki/Conteneur_(virtualisation)) avec, dans ce cas-ci, **[Podman](https://fr.wikipedia.org/wiki/Podman)**.\n- Ce qu'est une **[API](https://fr.wikipedia.org/wiki/Interface_de_programmation)**\n  - Dans ce cas-ci, une API **[REST](https://fr.wikipedia.org/wiki/Representational_state_transfer)**. Tenir compte qu'elle n'est qu'au [**niveau 2** du modèle de maturité de Richardson](https://fr.wikipedia.org/wiki/Mod%C3%A8le_de_maturit%C3%A9_de_Richardson#Niveau_2_:_verbes_HTTP).\n- Ce qu'est une **[base de données relationnelle](https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_relationnelle)** et ce qu'est **[PostgreSQL](https://fr.wikipedia.org/wiki/PostgreSQL)**.\n- La différence entre **[backend](https://fr.wikipedia.org/wiki/Backend) et [frontend](https://fr.wikipedia.org/wiki/Frontal_(informatique))**.\n- Ce qu'est un **[Single Sign-On (SSO)](https://fr.wikipedia.org/wiki/Authentification_unique)** et **l'intérêt d'en utiliser un**.\n- Ce qu'est un **[Framework](https://fr.wikipedia.org/wiki/Framework)**. Dans notre cas il s'agit de :\n  - **[Spring](https://fr.wikipedia.org/wiki/Spring_(framework))** (_backend_)\n  - **[Vue.js](https://fr.wikipedia.org/wiki/Vue.js)** (_frontend_)\n- **Les différents langages utilisés** ici que sont :\n  - [HTML](https://fr.wikipedia.org/wiki/Hypertext_Markup_Language)\n  - [Java](https://fr.wikipedia.org/wiki/Java_(langage))\n  - [JavaScript](https://fr.wikipedia.org/wiki/JavaScript)\n- Les connaissances suivantes ne sont pas abordées ici mais peuvent vous aider à **compléter la compréhension** :\n  - Le [langage CSS](https://fr.wikipedia.org/wiki/Feuilles_de_style_en_cascade)\n  - Le [langage SQL](https://fr.wikipedia.org/wiki/Structured_Query_Language)\n\n### Étapes à suivre\n\nUne fois que vous vous sentez prêts à plonger dans ce repository, je vous propose de le faire dans cet ordre :\n\n1. La [**base de données**](./database/). Elle se contente ici d'être **un script Podman** à exécuter pour qu'elle s'instancie.\n2. Le [**SSO**](./sso/). Il ne s'agit principalement que d'**un script Podman** également mais comporte **plusieurs concepts spécifiques**.\n3. Le [**backend**](./backend/). Une **application** Java Spring **reposant sur les deux premiers** pour fonctionner.\n4. Le [**frontend**](./frontend/). C'est la **façade** de votre architecture **qui se greffe par dessus le reste**.\n\n## Tutoriels utilisés\n\nPour leur implémentation, je me suis notamment servi des tutoriels suivants que **je vous invite à consulter en complément d'informations** :\n\n- [Spring Web - API RESTful (HATEOAS)](https://spring.io/guides/tutorials/rest) (_documentation officielle de Spring_)\n- [Spring Boot 3 KeyCloak OAuth2](https://www.youtube.com/watch?v=_0oXZKr97ro\u0026list=PLSVW22jAG8pAXU0th247M7xPCekzeNdrH\u0026index=10) (_vidéo YouTube_)\n- [Repository Spring Security OAuth2 Keycloak Demo](https://github.com/SaiUpadhyayula/spring-security-oauth2-keycloak-demo) (_repository issu de la vidéo ci-dessus_)\n- [Blog OAuth - Basic SPA - Overview](https://github.com/gary-archer/oauth.blog/blob/master/public/posts/basicspa-overview.mdx)\n- [Tutoriel Vue version 3](https://vuejs.org/tutorial/#step-1) (_tutoriel officiel de Vue 3_)\n- [Keycloak JavaScript adapter](https://www.keycloak.org/securing-apps/javascript-adapter) (_documentation officielle de Keycloak_)\n- [Spring Boot Keycloak role based authorization with JWT](https://medium.com/@kspoyraz7/spring-boot-keycloak-role-based-authorization-with-jwt-3bd29bdd9016) (_tutoriel sur les rôles dans le JWT avec Spring/Keycloak_)\n- [Spring Boot with Docker](https://spring.io/guides/gs/spring-boot-docker) (_documentation officielle de Spring_)\n- [Dockerize Vue.js App](https://v2.vuejs.org/v2/cookbook/dockerize-vuejs-app.html?redirect=true) (_documentation officielle de Vue_)\n\n## Outils utilisés\n\n### Pour le développement\n\n- [IntelliJ IDEA Community Edition](https://www.jetbrains.com/idea/) (_développement du backend_)\n- [VSCodium](https://vscodium.com/) (_développement du reste de l'architecture_)\n- [HTTPie](https://httpie.io/) (_requêtes HTTP et tests de l'API_)\n\n### Pour les images\n\n- [draw.io](https://www.drawio.com/) (_constitution des diagrammes_)\n- [GIMP](https://www.gimp.org/) (_découpage des logos, assemblage, etc._)\n\n### Annexes\n\n- [LibreTranslate](https://libretranslate.com/) (_traductions_)\n- [DeepL](https://www.deepl.com) (_traductions, même si le service m’a bloqué après quelques utilisations…_)  \n- [ChatGPT](https://chatgpt.com) (_le mouton noir, il m’a aidé à comprendre des concepts, trouver certaines syntaxes dans le code et pour des traductions_)\n\n## Pour aller plus loin\n\n### Conteneuriser backend/frontend\n\nDéployer la base de données et le SSO fut facile, pas vrai ?\nVous pouvez offrir la même possibilité au sein du backend et du frontend.\n\nPour ce faire, vous trouverez un dossier \"`podman`\" à la racine de leur répertoire respectif.\nCe dossier contient les fichiers de base et les informations nécessaires à votre prise en main sur ce sujet.\n\nPar conséquent, vous pouvez consulter [celui du backend](./backend/podman/) comme [celui du frontend](./frontend/podman/) à votre guise.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarcompiler%2Fspring-vue-postgres-keycloak-architecture","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarcompiler%2Fspring-vue-postgres-keycloak-architecture","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarcompiler%2Fspring-vue-postgres-keycloak-architecture/lists"}