A complete chronological record of the SupplyShore infrastructure project.
| Date | Action |
|---|---|
| ~2026-07 | ovh SSH alias added to ~/.bashrc for ssh.cluster131.hosting.ovh.net (user supplye) |
| ~2026-07 | Connected to OVH shared hosting. Discovery: no Docker, no sudo, no port 80/443 → unsuitable for a Docker stack |
| ~2026-07 | Decided to move to a Linode VPS (had $100 Linode credit) |
| ~2026-07 | Requirement gathering: stack = CRM + automation + mail + reverse proxy |
| ~2026-07 | Chose Linode g6-standard-2 (4 GB / 2 vCPU / 80 GB) at $24/mo |
| ~2026-07 | Decision: defer self-hosted mail (Mailu) — later via OVH SMTP/IMAP |
| ~2026-07 | Domain: supplyshoreltd.com (registered at OVH 2026-08-03) |
| Date | Action |
|---|---|
| ~2026-07 | Installed linode-cli in venv /home/admkhalil/.venvs/linode/ |
| ~2026-07 | Linode CLI config created at ~/.config/linode-cli (INI format), API token added |
| ~2026-07 | First node created in gb-lon (ID 102403035) — deleted |
| ~2026-07 | Final node created: supplyshore-stack, ID 102403067, eu-central, IP 139.162.176.234 |
| ~2026-07 | SSH key /home/admkhalil/.ssh/id_ed25519.pub authorized → passwordless root@139.162.176.234 |
| Date | Action |
|---|---|
| ~2026-07 | Built stack locally at ~/supplyshore-stack/ (compose + env) with Traefik + Twenty CRM + n8n + Postgres + Redis |
| ~2026-07 | Generated all secrets (Postgres, Redis, Twenty, n8n encryption keys) |
| ~2026-08-06 | Authenticated Linode CLI; created Linode DNS zone 3497598 for supplyshoreltd.com |
| ~2026-08-06 | Added A records: @, www, crm, n8n, traefik → 139.162.176.234 |
| ~2026-08-06 | Installed ovhcloud CLI (~/bin/ovhcloud) + python-ovh 1.2.0 |
| ~2026-08-06 | First OVH API key pair (zone-only rights) — insufficient for NS changes; created second pair with /domain/* |
| ~2026-08-06 | OVH config written to ~/.ovh.conf (endpoint=ovh-eu, creds in [ovh-eu]) |
| ~2026-08-06 | Switched nameservers OVH → Linode via API (POST /domain/supplyshoreltd.com/nameServers/update, task 597285519 done) |
| ~2026-08-06 | DNS propagation confirmed; all A records resolve to 139.162.176.234 |
| ~2026-08-06 | Pushed stack to node at /opt/supplyshore/ |
| ~2026-08-06 | Installed Docker 29.7.2 + Compose v5.4.0 on the node |
| ~2026-08-06 | Issue: Twenty's healthcheck failed (Postgres didn't have twenty/n8n DBs) → created DBs manually |
| ~2026-08-06 | Issue: Traefik v3.3.7 "client version 1.24 is too old" → upgraded to traefik:v3 (v3.7.10) |
| ~2026-08-06 | Added --log.level=DEBUG to Traefik during debugging |
| ~2026-08-06 | All services up: traefik, twenty-server (healthy), twenty-worker, n8n, postgres, redis |
| ~2026-08-06 | Sites live: crm., n8n. = 200, traefik. = 401 (auth). Let's Encrypt certs issued (valid ~90 days) |
| ~2026-08-06 | Resource check: RAM 2.7/3.8 GB used (Twenty heavy!), disk 8.2/79 GB |
| Date | Action |
|---|---|
| ~2026-08-06 | User decision: Twenty is too heavy → evaluate lighter CRM |
| ~2026-08-06 | Recommended EspoCRM (official espocrm/espocrm image, MariaDB backend, ~300–400 MB) — approved |
| ~2026-08-06 | Removed twenty-server + twenty-worker + redis; added espocrm, espocrm-db (mariadb:11), espocrm-daemon |
| ~2026-08-06 | New secrets: MariaDB root + app passwords; EspoCRM admin creds |
| ~2026-08-06 | Pushed + docker compose up -d; EspoCRM auto-installed (141 tables) |
| ~2026-08-06 | Cleaned up Twenty containers/volumes/images → RAM dropped 2.7 GB → 1.1 GB used |
| ~2026-08-06 | Verified crm.supplyshoreltd.com = EspoCRM, TLS valid, admin login works |
| ~2026-08-06 | Confirmed API auth (login is GET /api/v1/App/user with Authorization: Basic …, not the Espo-Authorization header) |
| Date | Action |
|---|---|
| ~2026-08-07 | User asked about ERPNext ("way too many desired features") |
| ~2026-08-07 | Assessed: full Frappe/ERPNext stack = ~11 containers; needs 4 GB min |
| ~2026-08-07 | User decision: full official stack and keep n8n |
| ~2026-08-07 | Rewrote compose: added configurator, backend, frontend, websocket, queue-short, queue-long, scheduler, redis-cache, redis-queue; repurposed MariaDB as mariadb-database |
| ~2026-08-07 | Added erp.supplyshoreltd.com A record (record ID 45457151) |
| ~2026-08-07 | Pulled frappe/erpnext:v16.31.1 (large image), brought up 12 containers |
| ~2026-08-07 | Created site erp.supplyshoreltd.com via bench new-site (frappe 16.30.0 + erpnext 16.31.1), enabled scheduler |
| ~2026-08-07 | Verified: site live, TLS valid, Administrator login works; RAM 1.7 GB used |
| ~2026-08-07 | User decision: revert — ERPNext "taking a lot of space, overly complex for desired features" |
| ~2026-08-07 | Dropped ERPNext DB, removed all 9 ERPNext containers, volumes, image, and the erp DNS record |
| ~2026-08-07 | Recreated espocrm DB + user; restored EspoCRM compose + env |
| ~2026-08-07 | EspoCRM redeployed (fresh install, 141 tables); admin login verified |
| Date | Action |
|---|---|
| 2026-08-07 | Created the documentation pack under ~/supplyshore-stack/docs/ (infrastructure + product + research) |
| 2026-08-07 | Restructured docs into a unified pack (01-company … 07-research) + top-level README hub |
| 2026-08-07 | Deployed Wiki.js at wiki.supplyshoreltd.com — added wiki A record (45458239), created wiki DB + user in Postgres, added wiki service to compose (reuses postgres), verified HTTPS + TLS |
| Date | Action |
|---|---|
| 2026-08-07 | Researched EspoCRM v10 (feature set, Entity Manager internals, tools API, templates, field types) from official docs + source |
| 2026-08-07 | Designed the full procurement CRM structure: 15 custom entities (Supplier, Factory, Customer, Category, Product, RFQ(+items), Quote(+items), Order(+items), LogisticsProvider, QCProvider, Partner, Location), 48 relationships, ~170 custom fields, option catalogs, Kanban + auto-numbering — mapped onto the Account master + core Lead/Document/Contact |
| 2026-08-07 | Built the structure kit in scripts/espocrm/ (structure.json spec + idempotent PHP installer + apply/verify/seed scripts) — validated: JSON schema checks, PHP 8 syntax parse, naming/link-conflict rules vs. EspoCRM v10 source |
| 2026-08-07 | Documented everything in docs/03-product/crm-structure.md; added ADR-014 (custom entity naming, Sales Pack caveat, scripted-Entity-Manager approach) |
| 2026-08-07 | ✅ Applied structure to live CRM: scp -r scripts/espocrm → /opt/supplyshore/scripts-espocrm/ && ./apply.sh — 15 entities, 48 links, 0 failed. Required installer fix (step 1b: enable CategoryTree customizability + correct Metadata::set('scopes',…) signature) |
| 2026-08-07 | ✅ Seeded categories (seed_categories.php): 28 categories (4 verticals + subcategories). Fix: add $app->setupSystemUser() (silent Could not load 'user' service, exit 255) |
| 2026-08-07 | ✅ API smoke test: created Account 6a75ef205a9cdfb6b (Acme Traders Ltd), Supplier 6a75ef2163c667c2a (Ningbo Electric Co), RFQ 6a75ef3022e562b88 RFQ-000001; verified M2M link POST /api/v1/RFQ/{id}/suppliers and filter where[0][type]=equals&where[0][attribute]=status&where[0][value]=Open (v10 array syntax — legacy /relation + flat where[status]= formats removed) |
down -v.$ in hashes must be $$ in Compose.troubleshooting.md.