Architecture¶
This page documents the Zwerfkei system architecture in two stages: the current (legacy) situation and the target architecture. A full integration overview is included at the bottom.
Current Architecture¶
The current platform is built around Zwerfkei Old, a legacy monolithic application. It connects to Microsoft Dynamics Navision as the ERP and uses True Object Storage for file storage.
End of support
Microsoft Navision 2018 reaches end-of-support in 2026. Migration to the new architecture is required before that date.
C4Container
title Current Architecture - Zwerfkei
Person(employee, "Employee", "Internal user of Zwerfkei")
Person(customer, "Customer", "External customer")
System_Boundary(zwerfkei, "Zwerfkei Systems") {
Container(old, "Zwerfkei Old", "Legacy application", "Central application for all business processes")
Container(customerportal, "Zwerfkei Klant", "Customer portal", "Portal for customers")
ContainerDb(olddb, "Zwerfkei Old Database", "MySQL", "Central database")
}
System_Ext(navision, "Microsoft Navision 2018", "ERP system (end-of-support 2026)")
System_Ext(storage, "True Object Storage", "S3-compatible storage")
Rel(employee, old, "Uses")
Rel(customer, customerportal, "Uses")
Rel(customer, old, "Uses (webshop)")
Rel(old, olddb, "Reads/writes")
Rel(old, navision, "Synchronises")
Rel(old, storage, "File storage")
Rel(customerportal, old, "API calls")
Rel(customerportal, olddb, "Reads")
Notes
- Zwerfkei Old is the central system communicating with all other components.
- Zwerfkei Klant is a separate customer portal connecting to Zwerfkei Old and directly to the database.
- Microsoft 365 (calendar integration) has already been phased out.
Target Architecture¶
The target architecture introduces a new Zwerfkei Backend, Zwerfkei Website and Zwerfkei CMS alongside the existing legacy systems. The legacy environment remains operational during the transition.
High-level flowchart of all systems, services and data flows in the target architecture.
graph TD
subgraph Actors["Users & Actors"]
Visitor["Website Visitor"]
Employee["Employee"]
ContentMgr["Content Manager"]
end
subgraph ZwerfkeiPlatform["Zwerfkei Platform"]
Cloudflare["Cloudflare\nCDN & Security"]
Website["Zwerfkei Website\nLaravel · Vue.js · TypeScript"]
CMS["Zwerfkei CMS\nLaravel · Statamic"]
Backend["Zwerfkei Backend\nLaravel"]
BackendDB[("Backend Database\nMySQL")]
end
subgraph LegacySystems["Legacy Systems"]
ZwerfkeiOld["Zwerfkei Old"]
OldDB[("Zwerfkei Old Database\nMySQL")]
end
subgraph ExternalServices["External Services"]
Navision["Microsoft Dynamics\nNavision ERP"]
Ergonode["Ergonode PIM"]
PostNL["PostNL\nShipment"]
PayNL["PayNL\nPayments"]
Kiyoh["Kiyoh\nReviews"]
Copernica["Copernica\nEmail Marketing"]
Storage["True Object Storage\nS3"]
end
subgraph AnalyticsTracking["Analytics & Tracking"]
GTM["Google Tag Manager"]
GA4["Google Analytics 4"]
end
Suppliers(["~17 Brand &\nSupplier Sources"])
%% Actor flows
Visitor --> Cloudflare
Employee --> ZwerfkeiOld
ContentMgr --> CMS
%% Frontend flows
Cloudflare --> Website
Website -- "File Storage" --> CMS
Website -- "HTTP / API" --> Backend
Website --> GTM
GTM --> GA4
%% Backend flows
Backend --> BackendDB
Backend -- "Pricing & Availability" --> Navision
Backend -- "Product Data API" --> Ergonode
Backend --> PostNL
Backend --> PayNL
Backend --> Kiyoh
Backend -- "Newsletter opt-in/out" --> Copernica
Backend --> S3["New S3 Bucket\nObject Storage"]
Backend -- "Legacy API" --> ZwerfkeiOld
%% CMS
CMS --> S3
%% Legacy flows
ZwerfkeiOld --> OldDB
ZwerfkeiOld --> Navision
%% Product data sources
Suppliers -- "Product info &\nAvailability" --> Ergonode
Suppliers -- "Stock & Pricing" --> Navision
Legacy API
The connection between the Zwerfkei Backend and Zwerfkei Old via the Legacy API is required during the transition period. Certain business logic and data (e.g. historical orders, account data) still reside in Zwerfkei Old and are not yet migrated to the new backend. This connection will be removed once the migration is complete.
New components
| Component | Technology | Purpose |
|---|---|---|
| Cloudflare | CDN & Security | Traffic routing, caching, DDoS protection |
| Zwerfkei Website | Laravel, Vue.js, TypeScript | Fast public storefront with static caching |
| Zwerfkei CMS | Laravel, Statamic (headless) | Website content and translation management |
| Zwerfkei Backend | Laravel | Central business logic and all external integrations |
| Backend Database | MySQL | New database for the backend |
| Ergonode PIM | SaaS | Product information management |