{"id":51284842,"url":"https://github.com/yomazini/42cursus-inception","last_synced_at":"2026-06-30T04:30:53.477Z","repository":{"id":355730351,"uuid":"1071068022","full_name":"yomazini/42cursus-inception","owner":"yomazini","description":"Inception: Multi-container Docker infrastructure with NGINX, WordPress, MariaDB, Redis, FTP, Adminer \u0026 Portainer — all custom-built from debian:bookworm. Orchestrated with Docker Compose, secured with TLS and Docker Secrets. 42 School project. ","archived":false,"fork":false,"pushed_at":"2026-05-05T00:50:01.000Z","size":26071,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-05T02:33:43.289Z","etag":null,"topics":["42school","devops","docker","docker-compose","inception","mariadb","nginx","redis","system-administration","wordpress"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yomazini.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"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-10-06T20:25:25.000Z","updated_at":"2026-05-05T00:50:04.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/yomazini/42cursus-inception","commit_stats":null,"previous_names":["yomazini/42cursus-inception"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/yomazini/42cursus-inception","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yomazini%2F42cursus-inception","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yomazini%2F42cursus-inception/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yomazini%2F42cursus-inception/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yomazini%2F42cursus-inception/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yomazini","download_url":"https://codeload.github.com/yomazini/42cursus-inception/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yomazini%2F42cursus-inception/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34952850,"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-30T02:00:05.919Z","response_time":92,"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":["42school","devops","docker","docker-compose","inception","mariadb","nginx","redis","system-administration","wordpress"],"created_at":"2026-06-30T04:30:52.926Z","updated_at":"2026-06-30T04:30:53.471Z","avatar_url":"https://github.com/yomazini.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"*This project has been created as part of the 42 curriculum by ymazini.*\n\nNOTE: Forbidden to add .env files or secrets per subject requirements; Only designed for easy plug-and-play functionality.\n\n\n# Inception (42 Project)\n\n![Inception Architecture](resources/Inception_arch.png)\n\n## Description\nInception is a system administration project designed to broaden knowledge of Docker and containerization. The goal is to set up a small infrastructure composed of different services running under specific rules in a virtual machine. This project stack (Nginx, MariaDB, WordPress + PHP-FPM) alongside several bonus standalone services (Redis, FTP, Adminer, Portainer as my choice, and a Static Website), all orchestrated with `docker compose`.\n\n## Instructions\n\n### Prerequisites\n- Docker Engine\n- Docker Compose plugin\n- `make` utility\n\n### Installation \u0026 Execution\n1. Clone the repository and navigate to the project root.\n2. Ensure you have the `secrets/` directory created with the required password files (`db_password.txt`, `wp_password.txt`, etc.).\n3. Configure your local `/etc/hosts` to point `ymazini.42.fr` to `127.0.0.1`.\n4. Run the project:\n   ```bash\n   make\n   ```\n5. To stop the containers without destroying your volumes:\n   ```bash\n   make down\n   ```\n\n## Resources and AI Usage\n- [Docker Official Documentation](https://docs.docker.com/)\n- [Nginx Documentation](https://nginx.org/en/docs/)\n- [vsftpd Configuration Options](https://security.appspot.com/vsftpd/vsftpd_conf.html)\n- [Adminer](https://www.adminer.org/)\n- [Portainer](https://www.portainer.io/)\n- [WordPress Docker Guide](https://developer.wordpress.org/apis/cli/commands/docker/)\n- [MariaDB Docker Docs](https://hub.docker.com/_/mariadb)\n- [Redis Docker Docs](https://hub.docker.com/_/redis)\n- [Docker Deep Dive PDF](http://103.203.175.90:81/fdScript/RootOfEBooks/E%20Book%20collection%20-%202024%20-%20D/CSE%20%20IT%20AIDS%20ML/Docker%20Deep%20Dive.pdf)\n\n\n**AI Usage:**\n\nAI was used to help write and structure the documentation (`README.md`, `USER_DOC.md`, and `DEV_DOC.md`) to ensure the correct syntax and formatting. I also used AI 'NotebookLM' to help me understand best practices of modern container orchestration and to do a deep dive into Docker's internals and Following the good practices.\n\n\n## Technical Architecure \u0026 Design Choices\n\nThe core design philosophy is total isolation. Each service runs entirely in its own container, using custom-built Alpine/Debian images rather than pulling pre-configured images from DockerHub.\n\n### Virtual Machines vs Docker\nVirtual Machines virtualize the entire hardware stack, requiring a full, heavy guest Operating System for every instance. Docker virtualizes at the OS-level, allowing containers to share the host system's kernel. Docker is astronomically lighter, boots in seconds instead of minutes, and requires far less memory, making it perfect for deploying microservice architectures like this LEMP stack.\n\n### Secrets vs Environment Variables\nEnvironment variables (`.env`) are excellent for non-sensitive configuration data (like domain names or usernames), but they can easily leak in crash logs, `docker inspect` outputs, or shell histories. Docker Secrets physically mount sensitive passwords as encrypted, temporary, read-only files inside the container's RAM, ensuring passwords (like `db_root_password`) are never exposed to the environment space.\n\n### Docker Network vs Host Network\nUsing the Host Network would bind the containers directly to the VM's physical ports, destroying all isolation. By creating a custom Docker bridge network (`docker-network`), the containers exist in a secure internal tunnel where they can communicate via DNS (e.g., WordPress pinging MariaDB). The only way the outside world can interact with the system is through the explicitly exposed ports (443 for Nginx).\n\n### Docker Volumes vs Bind Mounts\nBind Mounts are hardcoded paths directly linking a folder on the host to a folder in the container (often used in development to see live code edits). Docker Named Volumes are securely managed directly by the Docker Daemon. In this project, i use a hybrid approach (Driver Option Bind mounts) to legally adhere to the subject requirement of physically storing the database and web files in `/home/ymazini/data/` while still allowing Docker to internally orchestrate the persistence.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyomazini%2F42cursus-inception","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyomazini%2F42cursus-inception","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyomazini%2F42cursus-inception/lists"}