An interactive programming learning platform.
This project aims to enable students to learn programming.
It is also my capstone project for the Web and Web Mobile Developer REAC certification, which I am currently undergoing at La Plateforme_.
- Provide an interactive environment for learning programming concepts
- Support multiple user roles (such as Student, Instructor, Admin)
- Demonstrate full-stack development skills using industry standards
This project is built with Java/Spring Boot backend and Thymeleaf frontend.
- Language: Java 21
- Frameworks:
- Java Framework used to build (Web) Applications and REST endpoints.
- Spring Boot 3.x:
- Thymeleaf
- Java Framework used to build (Web) Applications and REST endpoints.
- Authentication and authorization framework:
- Spring Security:
- Database:
- PostgreSQL version 17
- Build and dependency management tool:
- Containerization:
TODO
- JetBrains IntelliJ IDEA: IDE
- Git: Version control
- Maven: Build and dependency management
- Podman: Containerization
- Swagger: API documentation
See the Tech Stack section.
- Clone the
ebouchut/learn-devGit Repository - Install Docker, Docker Desktop, and Docker Compose
#
git clone git@github.com:ebouchut/learn-dev.git
# git clone https://github.com/ebouchut/learn-dev.git
cd learn-devFrom the project root folder. Install Docker and Docker Compose:
- on macOS (read this for Windows or Linux install):
brew install docker docker-compose docker-desktop
- on Windows and Linux
This is optional if you only need to run the application.
This is necessary in order to regenerate the MERISE database diagrams (MCD, MLD and MPD) after any changes have been made to the database design.
You will need to install Python and:
mocodo: a CLI tool to generate the MCD and MLD database diagrams from a text-file description of the conceptual data model.tbls: a CLI tool to reverse engineer the live database to generate the MPD.
Here is the procedure:
- Install Python
- Install Python on macOS
brew install python@3.14
- Install Python on other OSes:
https://docs.python-guide.org/en/latest/starting/installation/
- Install Python on macOS
- Create a Python Virtual Environment:
# cd to the folder where you cloned the repository python3 -m venv venv # Do it once source venv/bin/activate # Run this line each time you open a new shell/terminal/window/tab
- Install mocodo
# mocodo >= 4.3.3 is required (the `make mld` target relies on its `-t diagram` template) pip install 'mocodo[svg,clipboard]>=4.3.3'
- Install tbls
# On macOS brew install tbls # or any OS with Go installed go install github.com/k1LoW/tbls@latest
- Edit
.env- Set a value for the variables
POSTGRES_PASSWORD,LEARNDEV_DB_PASSWORD,MONGO_ROOT_PASSWORD
- Set a value for the variables
# Make sure the required versions of Java and Maven are active for this shell
sdk env
# Ensure the Podman "machine" is up and running
podman info >/dev/null 2>&1 || podman machine start
# Start the "Docker" services for the application
docker compose up -d
# Run the app from the project root
./mvnw spring-boot:runThe first command starts the Podman machine if it is not already running.
Then docker compoose up -d starts all the application Docker services
as declared in docker-compose.yaml
(the Docker Compose configuration file), like this.
For each service (postgres and mongo):
- Download the Docker image for this service as specified in
docker-compose.yamlfrom the Docker Hub public registry, only if the Docker image is not already cached locally. - Store the downloaded image in the local Docker image cache.
- Start a Docker container (if it is not already running) based on this image
and the configuration in
docker-compose.yaml.
Note
A Docker init script automatically creates the database user and the application database
when the postgres service is run for the first time.
It does not create the database structure or populate the database.
Note
TODO: Explain how the database is created in MongoDB and when.
Note
For Docker or Podman to run on macOS and Windows they need a Linux OS.
Why?
Containers rely on Linux kernel features (namespaces and cgroups).
Windows and macOS do not have a Linux kernel.
This is why Docker Desktop and Podman run a lightweight Linux VM
behind the scenes.
The containers run inside that hidden VM, not directly on macOS/Windows.
This command stops all the application services containers
declared in the Docker Compose file (docker-compose.yaml):
docker compose downI use Docker Compose (a CLI tool) to describe and handle the lifecycle of services that comprise my application.
A service is basically a component of the application packaged as a Docker container. It specifies the Docker image and version, configuration, and the network and Docker volume(s) if any.
A Docker image is pre-packaged piece of software that can work as a standalone on Linux. Docker Hub is a public registry that hosts and serves public Docker images.
Once the postgres service container and its named data volume
have been created with docker compose up -d,
you can stop then restart the postgres service container individually.
docker compose stop postgresThis command stops the postgres service container.
It does NOT remove its data volume (its databases).
This command restarts the existing stopped postgres service container.
If the service container does not already exist, use docker compose up -d to create it.
docker compose start postgresNow, check that postgres is running:
docker compose ps | grep postgresTo recreate the database, and start from scratch you need to stop the
postgrescontainer and remove the (data) volumes.
See theRemove all Posgres Databasessection for details.
Stops and remove the postgres service container and its data volumes (meaning all its databases).
Caution
This destructive command will:
- stop and remove the
postgresservice container, - remove ALL its databases: structure and content, (i.e., everything created by Postgres running in the container).
docker compose down -v postgresOnce the mongoservice container has been created with docker compose up -d,
you can stop then restart the mongo service container individually.
docker compose stop mongoThis command stops the mongo service container.
It does NOT remove its data volume (i.e., the MongoDB databases created in this container).
This command restarts the existing stopped mongo service container.
If the service container does not already exist, use docker compose up -d to create it.
docker compose start mongoNow, check that mongo is running:
docker compose ps | grep mongoCaution
This destructive command will:
- stop and remove the
mongoservice container, - remove its data volumes (i.e., ALL the databases created by MongoDB running in the container).
docker compose down -v mongo Where:
-vrequest Compose to remove the named data volumes created for this service
For up-to-date information about the status of the project, visit this link.
- ARCHITECTURE.md — how the pieces fit together (layers, request flow, authentication, data, testing).
- docs/tech-stacks.md — catalogue of tools, languages, and frameworks with versions used in the project.
- GLOSSARY.md — definitions of the domain and technical terms used across the project.
- Architecture Decision Records — A list of design decisions and their trade-offs.
CONTRIBUTING.md contains:
- How to help
- Code of Conduct
- Architecture overview
- Architecture Decision Records (ADRs)
- Codebase:
- Database:
- Database Naming Conventions
- Database schema:
- Database migrations
- Git:
- Dependencies:
- Adding dependencies
- Installing dependencies
- Running tests
- Submitting Pull Requests
- TODO: ...
This project is dual-licensed
under AGPL v3 for open source use
and a commercial license for proprietary use.
See LICENSE for details.
Eric Bouchut:
- LinkedIn: https://linkedin.com/in/ebouchut
- GitHub: @ebouchut
- Blog: https://EricBouchut.com
- 💙 A big thank you to our instructors for their involvement and help:
- REAC Developpeur Web et Web mobile