atlas-academy/README.md
Atlas Developer 03829a38b2 feat: Atlas Academy — Odoo eLearning platform, full fusion
9-course Dutch e-learning platform fused onto atlasacademy.nl via Caddy
reverse proxy. Odoo 19 Community as course engine (website_slides), static
HTML for marketing front. Single Odoo account system.

- static/: 8 marketing pages (index, pricing, coaching, leerpad, over, shop, bisl, esf)
- backend/odoo_relay.py: lead relay Flask service (POST /academy-lead → Odoo CRM)
- caddy/academy.caddyfile: full Caddy config with Odoo proxy + auth rewrites
- docs/: ARCHITECTURE, USERFLOW, COURSES, DEPLOYMENT, SECURITY, ODOO

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-23 00:48:45 +02:00

207 lines
8.9 KiB
Markdown

<div align="center">
<img src="https://atlasacademy.nl/atlas-icon.png" width="72" height="72" alt="Atlas Academy">
# Atlas Academy
**Online leerplatform voor ondernemers die bouwen**
[![Live](https://img.shields.io/badge/status-live-brightgreen?style=flat-square)](https://atlasacademy.nl)
[![Courses](https://img.shields.io/badge/cursussen-9-2E80FF?style=flat-square)](https://atlasacademy.nl/slides)
[![Platform](https://img.shields.io/badge/engine-Odoo%2019%20eLearning-714B67?style=flat-square)](https://www.odoo.com)
[![Host](https://img.shields.io/badge/host-Hetzner%20CPX32-D44000?style=flat-square)](https://hetzner.com)
[![License](https://img.shields.io/badge/license-proprietary-lightgrey?style=flat-square)](#)
[**atlasacademy.nl**](https://atlasacademy.nl) &nbsp;·&nbsp; [Cursussen](https://atlasacademy.nl/slides) &nbsp;·&nbsp; [Coaching](https://atlasacademy.nl/coaching.html) &nbsp;·&nbsp; [Prijzen](https://atlasacademy.nl/pricing.html)
</div>
---
## Wat is dit?
Atlas Academy is een **Odoo eLearning-platform** volledig gefused met een statische marketingsite onder één domein. Geen aparte subdomains, geen dubbele login — één URL, één account, één cursusengine.
**Kernidee:** statische marketingpagina's voor branding + Odoo `/slides` als volledige cursusmotor, getranspareerd via Caddy reverse proxy op `atlasacademy.nl`.
```
Browser → atlasacademy.nl (Caddy)
├── / → static index.html (marketing homepage)
├── /pricing → static pricing.html
├── /coaching → static coaching.html
├── /slides → Odoo 19 eLearning (9 cursussen)
├── /web/login → Odoo auth (single login)
└── /web/signup → Odoo signup (open, b2c)
```
---
## Architectuur
```
┌─────────────────────────────────────────────────────────────────────┐
│ atlasacademy.nl │
│ Caddy (atlas-01 Hetzner) │
│ │
│ ┌──────────────────────┐ ┌──────────────────────────────────┐ │
│ │ Static Marketing │ │ Odoo 19 Community (eLearning) │ │
│ │ /var/www/academy/ │ │ http://100.93.16.81:8069 │ │
│ │ │ │ │ │
│ │ index.html │ │ /slides → cursuscatalog │ │
│ │ pricing.html │ │ /slides/<slug> → cursuspagina │ │
│ │ coaching.html │ │ /web/login → inloggen │ │
│ │ leerpad.html │ │ /web/signup → registreren │ │
│ │ over.html │ │ /web/assets/* → JS/CSS │ │
│ │ shop.html │ │ │ │
│ │ bisl.html │ │ Website 3: "Atlas Academy" │ │
│ │ esf.html │ │ domain = atlasacademy.nl │ │
│ └──────────────────────┘ └──────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ Lead Relay /academy-lead → 127.0.0.1:7793 (odoo_relay.py) │ │
│ │ (POST JSON → Odoo CRM lead + email fallback) │ │
│ └──────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
```
---
## Cursuscatalogus
| # | Cursus | URL | Lessen | Quizvragen |
|---|--------|-----|--------|------------|
| 1 | Praktijktraining Lean | `/slides/praktijktraining-lean-1` | 7 | 21 |
| 2 | Sales vanaf Nul | `/slides/sales-vanaf-nul-2` | 10 | 30 |
| 3 | Netwerken & Relaties | `/slides/netwerken-relaties-3` | 5 | 12 |
| 4 | Strategisch Denken | `/slides/strategisch-denken-4` | 9 | 26 |
| 5 | Alles Automatiseren met AI | `/slides/alles-automatiseren-met-ai-5` | 5 | 15 |
| 6 | IT-Basis & Manier van Denken | `/slides/it-basis-manier-van-denken-6` | 3 | 9 |
| 7 | Business & Juridisch | `/slides/business-juridisch-7` | 3 | 9 |
| 8 | Marketing & Funnels | `/slides/marketing-funnels-8` | 4 | 12 |
| 9 | Startup & Groei | `/slides/startup-groei-9` | 7 | 19 |
**Totaal:** 53 lessen · 153 quizvragen
Elke cursus = theorie per les → kennischeck (multiple choice, 1 correct, met uitleg).
---
## Tech stack
| Laag | Technologie | Rol |
|------|------------|-----|
| Domein | Caddy 2 | TLS, routing, static serve, reverse proxy |
| Frontend | Vanilla HTML/CSS/JS | Marketingpagina's |
| eLearning | Odoo 19 Community (`website_slides`) | Cursussen, accounts, voortgang |
| Database | PostgreSQL (Odoo intern) | Users, cursussen, leads |
| CRM | Odoo CRM (`crm.lead`) | Leads van lead-relay |
| Lead relay | Python Flask (`odoo_relay.py`) | `POST /academy-lead` → Odoo + email |
| VPS | Hetzner CPX32 (atlas-01) | Alle services |
| Tailscale | Tailnet `100.93.16.81` | Interne Odoo bereikbaarheid |
---
## User journey
```
[Bezoeker] → atlasacademy.nl
├── leest marketingpagina's (pricing, coaching, over)
├── klikt "Bekijk de cursussen →"
│ → /slides (Odoo cursuscatalogus)
├── opent cursuspagina → lees les → maak quiz
│ (anoniem: preview mogelijk)
├── wil voortgang opslaan → "Aanmelden"
│ → /web/signup (Odoo, b2c open registratie)
│ → account aangemaakt (email bevestiging via atlasacademy.nl)
└── ingelogd → cursus volgen → voortgang opgeslagen
```
---
## Deployment
### Vereisten
- `atlas-01` Hetzner VPS (SSH alias in `~/.ssh/config`)
- Odoo 19 Community draait in Docker (`atlas-odoo` container)
- Caddy draait met Caddyfile in `/etc/caddy/Caddyfile`
### Static marketingpagina aanpassen
```bash
scp coaching.html atlas-01:/var/www/atlasacademy.nl/coaching.html
curl -so /dev/null -w '%{http_code}' https://atlasacademy.nl/coaching.html
```
### Cursus bouwen in Odoo
```bash
# Upload script naar atlas-01, run in Odoo ORM shell
scp my_course.py atlas-01:/tmp/
ssh atlas-01 "docker exec -i atlas-odoo odoo shell -d atlas --no-http < /tmp/my_course.py"
```
Zie [`docs/COURSES.md`](docs/COURSES.md) voor het volledige cursusformaat.
### Caddy herladen
```bash
ssh atlas-01 "caddy reload --config /etc/caddy/Caddyfile"
```
### Lead relay herstarten
```bash
ssh atlas-01 "systemctl restart atlas-academy-relay && systemctl status atlas-academy-relay"
```
---
## Security
- **Secrets:** alle credentials in `/etc/atlas/academy-relay.env` (root 600), niet in source
- **Odoo backend:** `/web` niet geproxied → admin-panel enkel via tailnet/SSO
- **Signup:** `website.auth_signup_uninvited = 'b2c'` alleen op website 3 (academy). Corp website 1 = `b2b` (gesloten)
- **Headers:** `X-Frame-Options DENY`, `X-Content-Type-Options nosniff`, `Strict-Transport-Security`
- **ESF tracker:** `X-Robots-Tag: noindex, nofollow` (persoonlijk ITMG-studieoverzicht)
Zie [`docs/SECURITY.md`](docs/SECURITY.md) voor het volledige security-model.
---
## Projectstructuur
```
atlas-academy/
├── README.md
├── docs/
│ ├── ARCHITECTURE.md # Volledige systeemarchitectuur
│ ├── USERFLOW.md # User journeys & swimlane diagrammen
│ ├── COURSES.md # Cursusstructuur & ERD
│ ├── DEPLOYMENT.md # Deployment runbook
│ ├── SECURITY.md # Security model
│ └── ODOO.md # Odoo eLearning setup & gotcha's
├── static/ # Marketingpagina's (index, pricing, coaching…)
├── backend/
│ └── odoo_relay.py # Lead relay service (Flask)
└── caddy/
└── academy.caddyfile # Caddy-configuratie voor atlasacademy.nl
```
---
## Licentie & eigendom
Proprietary — Atlas Corporation, Tilburg NL. Alle rechten voorbehouden.
**Operator:** Chaib Aarab — [info@atlascorporation.nl](mailto:info@atlascorporation.nl)
---
<div align="center">
<sub>Built with Odoo 19 Community · Caddy · Hetzner · Atlas Corporation 2026</sub>
</div>