Per-application details: access, configuration, maintenance.
URL: https://crm.supplyshoreltd.com
Container: espocrm (image espocrm/espocrm:latest, v10.0.3)
Login: admin / see credentials.md
EspoCRM is an open-source CRM (Contact/Account/Opportunity management, email
integration, BPM/Workflow, custom entities via the Entity Manager). It is
lightweight (~300–400 MB) — the reason it was chosen over Twenty CRM (~1.4 GB)
and ERPNext (full ERP, too heavy/complex for current needs).
On first boot with an empty database it auto-installs using:
| Env var | Value |
|---|---|
ESPOCRM_DATABASE_HOST |
espocrm-db |
ESPOCRM_DATABASE_USER |
espocrm |
ESPOCRM_DATABASE_PASSWORD |
$MARIADB_PASSWORD |
ESPOCRM_ADMIN_USERNAME |
admin |
ESPOCRM_ADMIN_PASSWORD |
$ESPOCRM_ADMIN_PASSWORD |
ESPOCRM_SITE_URL |
https://crm.supplyshoreltd.com |
espocrm-data → /var/www/html/dataespocrm-custom → /var/www/html/customespocrm-custom-client → /var/www/html/client/customespocrm-daemon runs docker-daemon.sh (scheduled jobs — email sending,
workflows, cleanup). It shares the espocrm image and volumes and only starts
after espocrm is healthy.
docker compose logs -f espocrm # logs (Apache + PHP)
docker compose logs -f espocrm-daemon # job scheduler logs
docker exec espocrm bin/command app-check # health
docker exec espocrm bin/command config:get isInstalled # install state
docker exec espocrm bin/command migrate # apply upgrades
docker compose pull espocrm espocrm-daemon # fetch new image
docker compose up -d espocrm espocrm-daemon # recreate
docker exec espocrm bin/command migrate
EspoCRM runs migrate automatically on container start when installed.
# Page + TLS
curl -sS -o /dev/null -w "%{http_code}\n" https://crm.supplyshoreltd.com # 200
# Auth check (returns user JSON)
curl -sS -G https://crm.supplyshoreltd.com/api/v1/App/user \
-H "Authorization: Basic $(echo -n 'admin:<pwd>' | base64)" -w "\n%{http_code}\n"
The full procurement data model (15 custom entities, 48 relationships, ~170 custom
fields, Kanban, auto-numbering) is defined in scripts/espocrm/structure.json
and applied with scripts/espocrm/apply.sh (run on the node; idempotent). Reference:
03-product/crm-structure.md. Since 2026-08-07 the live CRM carries this
structure: Suppliers, Factories, Customers, Categories, Products, RFQ/Quote/Order
(+ line items), Logistics/QC Providers, Partners, Locations — all linked to the
Account master table.
curl -sS -o /dev/null -w "%{http_code}\n" https://crm.supplyshoreltd.com # 200
# or after a structure change:
ESPOCRM_URL=https://crm.supplyshoreltd.com ESPOCRM_USER=admin ESPOCRM_PASSWORD=<pwd> \
bash scripts/espocrm/verify_structure.sh
URL: https://n8n.supplyshoreltd.com
Container: n8n (image n8nio/n8n:latest, v2.33.5)
n8n is a low-code automation tool (400+ integrations) used for integrations,
webhooks, email automation, CRM sync, etc.
| Env var | Value |
|---|---|
N8N_HOST |
n8n.supplyshoreltd.com |
N8N_PROTOCOL |
https |
N8N_PORT |
5678 |
N8N_SECURE_COOKIE |
true |
WEBHOOK_URL |
https://n8n.supplyshoreltd.com/ |
DB_TYPE |
postgresdb |
| DB host/db/user/password | postgres / n8n / postgres / $PG_PASSWORD |
N8N_ENCRYPTION_KEY |
fixed in .env |
n8n-data → /home/node/.n8n (workflows, credentials)docker compose logs -f n8n
docker compose restart n8n
# bump N8N_TAG in .env (or keep latest), then:
docker compose pull n8n && docker compose up -d n8n
Browser warning note: n8n.supplyshoreltd.com currently triggers a Chrome
"Deceptive site ahead" warning. This is a false positive on a new domain +
login page. Fix = verify the domain in Google Search Console and submit a
security review request. Not yet done.
URL: https://wiki.supplyshoreltd.com
Container: wiki (image ghcr.io/requarks/wiki:2)
Wiki.js is a modern, lightweight open-source wiki (Node.js) used as the team's
internal knowledge base. First visit runs the Setup wizard (choose
PostgreSQL, DB wiki, create the admin account and site name). After setup,
the app binds the site URL.
| Env var | Value |
|---|---|
DB_TYPE |
postgres |
DB_HOST |
postgres |
DB_PORT |
5432 |
DB_NAME |
wiki |
DB_USER |
wiki |
DB_PASS |
$PG_PASSWORD |
The wiki role + database were created manually in Postgres (the postgres
container predates Wiki.js, so POSTGRES_DB env does not apply; the DB/user
must exist already).
wiki database.docker compose logs -f wiki
docker compose restart wiki
# Verify DB connectivity inside the container
docker exec wiki node -e "require('pg').Client && console.log('pg ok')"
docker compose pull wiki && docker compose up -d wiki
curl -sS -o /dev/null -w "%{http_code}\n" https://wiki.supplyshoreltd.com # 200
Before the Setup wizard is completed, / serves the "Wiki.js Setup" page
(HTTP 200).
URL: https://traefik.supplyshoreltd.com (requires basic auth)
Container: traefik (image traefik:v3, v3.7.10)
--api.dashboard=true + --api.insecure=true.Host(\traefik.supplyshoreltd.com`)→api@internal`.DASHBOARD_USER / password, hash in compose labels).docker compose logs -f traefik
# ACME / certificate issues
docker exec traefik cat /certificates/acme.json | head
for h in crm n8n traefik wiki; do
echo "$h: $(curl -sS -o /dev/null -w '%{http_code}' https://$h.supplyshoreltd.com)"
done
espocrm-dbmariadb:11, volume espocrm-db.espocrm, user espocrm.docker exec -it espocrm-db mariadb -uroot -p$MARIADB_ROOT_PASSWORDpostgrespostgres:16-alpine, volume twenty-db (historical name).n8n) and Wiki.js (DB wiki).docker exec -it postgres psql -U postgres| Service | Status | Version |
|---|---|---|
| espocrm | healthy | 10.0.3 |
| espocrm-daemon | healthy | 10.0.3 |
| espocrm-db | healthy | mariadb 11 |
| n8n | running | 2.33.5 |
| postgres | healthy | 16 |
| traefik | running | v3.7.10 |
| wiki | healthy | 2.x |
RAM: 1.2 GB used / 2.6 GB available. Disk: 8.4 GB / 79 GB (12%).