Het fundament van een schaalbare, onderhoudbare business suite
graph TB
USER[Gebruikers]
CADDY[Caddy Reverse Proxy]
ZA[Zammad]
RM[Redmine]
EP[ERPNext]
MM[Mattermost]
SS[Superset]
WK[Wiki.js]
N8N[n8n]
PG[(PostgreSQL)]
MDB[(MariaDB)]
REDIS[(Redis)]
USER --> CADDY
CADDY --> ZA
CADDY --> RM
CADDY --> EP
CADDY --> MM
CADDY --> SS
CADDY --> WK
CADDY --> N8N
ZA --> N8N
RM --> N8N
EP --> N8N
MM --> N8N
ZA --> PG
RM --> PG
MM --> PG
WK --> PG
EP --> MDB
SS --> PG
SS --> MDB
ZA --> REDIS
EP --> REDIS
style CADDY fill:#00c853
style N8N fill:#ff6d00
style SS fill:#7c4dff
Elke service draait in een geïsoleerde Docker container met gedefinieerde resource limits:
graph LR
C1[asd-caddy]
C2[asd-zammad]
C3[asd-redmine]
C4[asd-erpnext]
C5[asd-mattermost]
C6[asd-superset]
C7[asd-wikijs]
C8[asd-n8n]
C9[(asd-postgres)]
C10[(asd-mariadb)]
C11[(asd-redis)]
C1 --> C2
C1 --> C3
C1 --> C4
C1 --> C5
C1 --> C6
C1 --> C7
C1 --> C8
C2 --> C9
C3 --> C9
C5 --> C9
C7 --> C9
C4 --> C10
C2 --> C11
C4 --> C11
style C1 fill:#e8f5e9
style C8 fill:#fff3e0
style C9 fill:#e3f2fd
style C10 fill:#e3f2fd
| Container |
Image |
Geheugen |
CPU |
Persistent Storage |
| asd-caddy |
caddy:2-alpine |
128MB |
0.25 |
./caddy/data |
| asd-zammad |
zammad/zammad |
2GB |
1.0 |
./zammad/data |
| asd-redmine |
redmine:5 |
512MB |
0.5 |
./redmine/files |
| asd-erpnext |
frappe/erpnext |
2GB |
1.0 |
./erpnext/sites |
| asd-mattermost |
mattermost/mattermost |
1GB |
0.5 |
./mattermost/data |
| asd-superset |
apache/superset |
1GB |
0.5 |
./superset/data |
| asd-wikijs |
ghcr.io/requarks/wiki |
512MB |
0.25 |
Via PostgreSQL |
| asd-n8n |
n8nio/n8n |
512MB |
0.5 |
./n8n/data |
| asd-postgres |
postgres:15 |
1GB |
0.5 |
./postgres/data |
| asd-mariadb |
mariadb:10 |
1GB |
0.5 |
./mariadb/data |
graph TB
USERS[Gebruikers]
DNS[Wildcard DNS]
TUNNEL[Cloudflare Tunnel]
CADDY[Caddy Reverse Proxy]
ZA[asd-zammad]
RM[asd-redmine]
EP[asd-erpnext]
MM[asd-mattermost]
SS[asd-superset]
WK[asd-wikijs]
N8N[asd-n8n]
PG[PostgreSQL]
MDB[MariaDB]
REDIS[Redis]
USERS-->DNS
DNS-->TUNNEL
TUNNEL-->CADDY
CADDY-->ZA
CADDY-->RM
CADDY-->EP
CADDY-->MM
CADDY-->SS
CADDY-->WK
CADDY-->N8N
ZA-->PG
ZA-->REDIS
RM-->PG
MM-->PG
WK-->PG
EP-->MDB
EP-->REDIS
SS-->PG
SS-->MDB
graph TB
DNS[Wildcard DNS]
CADDY[Caddy - Auto HTTPS]
R1[zammad]
R2[redmine]
R3[erpnext]
R4[mattermost]
R5[superset]
R6[wikijs]
R7[n8n]
DNS --> CADDY
CADDY --> R1
CADDY --> R2
CADDY --> R3
CADDY --> R4
CADDY --> R5
CADDY --> R6
CADDY --> R7
style CADDY fill:#00c853
| Service |
Interne Poort |
Externe Toegang |
| Zammad |
8080 |
Via Caddy HTTPS |
| Redmine |
3000 |
Via Caddy HTTPS |
| ERPNext |
8000 |
Via Caddy HTTPS |
| Mattermost |
8065 |
Via Caddy HTTPS |
| Superset |
8088 |
Via Caddy HTTPS |
| Wiki.js |
3001 |
Via Caddy HTTPS |
| n8n |
5678 |
Via Caddy HTTPS |
| PostgreSQL |
5432 |
Intern alleen |
| MariaDB |
3306 |
Intern alleen |
| Redis |
6379 |
Intern alleen |
graph TB
T1[Email ontvangen]
T2[Ticket aangemaakt]
T3[Chat bericht]
T4[Project update]
T5[Schedule]
N8N[n8n Workflow Engine]
A1[Ticket aanmaken]
A2[Notificatie sturen]
A3[Data synchroniseren]
A4[Dashboard updaten]
A5[Rapport genereren]
T1 --> N8N
T2 --> N8N
T3 --> N8N
T4 --> N8N
T5 --> N8N
N8N --> A1
N8N --> A2
N8N --> A3
N8N --> A4
N8N --> A5
style N8N fill:#ff6d00
Voorbeeld: Klant meldt bug via email
- Zammad ontvangt email, maakt ticket
- n8n detecteert nieuw ticket via webhook
- n8n parsed ticket content
- n8n maakt Redmine issue aan
- n8n update Zammad custom field met Redmine ID
- n8n post notificatie naar Mattermost
| Database |
Engine |
Services |
| zammad_production |
PostgreSQL |
Zammad |
| redmine |
PostgreSQL |
Redmine |
| mattermost |
PostgreSQL |
Mattermost |
| wikijs |
PostgreSQL |
Wiki.js |
| erpnext_site |
MariaDB |
ERPNext |
Superset kan queries uitvoeren over meerdere databases:
-- Voorbeeld: Gecombineerd ticket overzicht
SELECT 'Zammad' as source, t.number as ticket_id, t.title
FROM tickets t
WHERE t.created_at > NOW() - INTERVAL '7 days'
UNION ALL
SELECT 'Redmine' as source, i.id::text, i.subject
FROM issues i
WHERE i.created_on > NOW() - INTERVAL '7 days'
graph TB
USER[Gebruiker]
LOCAL[Local Auth]
LDAP[LDAP - Optioneel]
SAML[SAML SSO - Enterprise]
ZA[Zammad]
RM[Redmine]
EP[ERPNext]
MM[Mattermost]
SS[Superset]
USER --> LOCAL
USER --> LDAP
USER --> SAML
LOCAL --> ZA
LOCAL --> RM
LOCAL --> EP
LOCAL --> MM
LOCAL --> SS
| Aspect |
Implementatie |
| Transport |
TLS 1.3 via Caddy (Let's Encrypt) |
| API Auth |
Token-based per service |
| Rate Limiting |
Caddy rate limiting module |
| CORS |
Configureerbaar per service |
| Secrets |
Environment variables, niet in code |
.asd/workspace/
├── zammad/credentials.env
├── redmine/credentials.env
├── erpnext/credentials.env
└── n8n/credentials.env
graph TB
LB[Load Balancer]
ZA1[Zammad 1]
ZA2[Zammad 2]
RM1[Redmine 1]
RM2[Redmine 2]
PG1[(PostgreSQL Primary)]
PG2[(PostgreSQL Replica)]
LB --> ZA1
LB --> ZA2
LB --> RM1
LB --> RM2
ZA1 --> PG1
ZA2 --> PG1
RM1 --> PG1
RM2 --> PG1
PG1 --> PG2
style LB fill:#e8f5e9
style PG1 fill:#e3f2fd
| Fase |
Gebruikers |
Setup |
Resources |
| Start |
1-10 |
Single server |
4 CPU, 8GB RAM |
| Groei |
10-50 |
Single server + replicas |
8 CPU, 16GB RAM |
| Scale |
50-200 |
Multi-server |
16+ CPU, 32GB+ RAM |
| Enterprise |
200+ |
Kubernetes cluster |
Auto-scaling |
graph LR
HC[Health Checker - n8n]
ZA[Zammad]
RM[Redmine]
EP[ERPNext]
MM[Mattermost]
SS[Superset]
ALERT[Mattermost Alert Channel]
HC --> ZA
HC --> RM
HC --> EP
HC --> MM
HC --> SS
HC --> ALERT
style HC fill:#ff6d00
| Service |
Log Locatie |
Rotatie |
| Caddy |
Docker logs |
7 dagen |
| Zammad |
/var/log/zammad |
30 dagen |
| Redmine |
Docker logs |
7 dagen |
| ERPNext |
sites/logs |
30 dagen |
| n8n |
Docker logs |
7 dagen |
graph TB
DAILY[Dagelijks 02:00]
WEEKLY[Wekelijks Zondag]
DB[Database Dumps]
FILES[File Backups]
FULL[Full Snapshots]
LOCAL[Lokale Storage - 7 dagen]
REMOTE[Remote Storage - 30 dagen]
ARCHIVE[Archive - 1 jaar]
DAILY --> DB
DAILY --> FILES
WEEKLY --> FULL
DB --> LOCAL
FILES --> LOCAL
LOCAL --> REMOTE
REMOTE --> ARCHIVE
style LOCAL fill:#fff3e0
style REMOTE fill:#e3f2fd
style ARCHIVE fill:#f3e5f5
| Scenario |
RTO |
RPO |
Procedure |
| Container crash |
5 min |
0 |
Docker restart |
| Database corrupt |
30 min |
24h |
Restore from backup |
| Server failure |
2 uur |
24h |
Deploy op nieuwe server |
| Volledige uitval |
4 uur |
24h |
Disaster recovery |
# Clone repository
git clone https://github.com/asd-framework/asd-pma.git
cd asd-pma
# Start development stack
docker compose -f docker-compose.dev.yml up -d
# Bekijk logs
docker compose logs -f
# Stop stack
docker compose down
graph LR
DEV[Developer Push]
TEST[Unit Tests]
BUILD[Build Images]
SCAN[Security Scan]
STAGING[Deploy Staging]
APPROVE[Manual Approval]
PROD[Deploy Production]
DEV --> TEST
TEST --> BUILD
BUILD --> SCAN
SCAN --> STAGING
STAGING --> APPROVE
APPROVE --> PROD
style TEST fill:#e8f5e9
style PROD fill:#e3f2fd
Executive Summary | Monitoring | Services