Compare commits

..

14 Commits

Author SHA1 Message Date
Jeff Emmett c4a2bc7164 Fix redacted placeholders in public-facing files
Restore contact email in website (public-facing).
Use env var reference for workflow notification address.
Clean up backlog task notes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 01:03:33 +00:00
Jeff Emmett 19cf1de886 Move all SMTP config to env vars, no hardcoded values
SMTP host, port, and sender address are now sourced from
.env like all other credentials. No service-identifying
details remain in tracked files.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 01:02:39 +00:00
Jeff Emmett 2ead9ed666 Remove hardcoded DB password default from docker-compose
All secrets now come from .env file on the server.
No default/fallback values for any credentials.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 00:50:04 +00:00
Jeff Emmett 7781dad704 Switch n8n email from Resend API to Mailcow SMTP
Replace all Resend HTTP API calls with n8n built-in emailSend
nodes using Mailcow SMTP at mx.jeffemmett.com:587 (STARTTLS).
Add SMTP env vars and n8n API key to docker-compose config.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 00:30:05 +00:00
Jeff Emmett 746ae71601 docs(backlog): initialize backlog and add infrastructure task (task-1)
Set up backlog tracking for CosmoLocal. Task-1 documents completed
infrastructure: Mailcow SMTP, Docmost workspace, Listmonk newsletter
list with per-list RBAC for Bryan, and email DNS authentication.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 00:20:52 +00:00
Jeff Emmett 4e777970cd Remove hardcoded API keys and credentials from tracked files
Move RESEND_API_KEY and Listmonk credentials to .env file
on the server. No secrets should be committed to the repo.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 12:19:40 +00:00
Jeff Emmett 67bb61888b Add API keys as Docker env vars for n8n community edition
n8n community edition doesn't have Settings > Variables.
Pass TWENTY_API_KEY and RESEND_API_KEY as container
environment variables instead, accessible via $env.* in workflows.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07 15:35:20 +00:00
Jeff Emmett 5b87103fdb Add 5 n8n CRM automation workflows
- 01: Contact intake webhook → Twenty CRM
- 02: Lead nurturing 3-email sequence via Resend
- 03: Daily CRM → Listmonk newsletter sync
- 04: Weekly stale contact follow-up reminders
- 05: Gitea/GitHub webhook events → CRM activity log

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07 14:20:28 +00:00
Jeff Emmett acd874924f Add n8n instance at automate.cosmolocal.world
Adds n8n workflow automation with PostgreSQL backend,
Traefik routing for automate.cosmolocal.world, and
isolated internal network for the database.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07 13:56:25 +00:00
Jeff Emmett 93fcbd45ef Restyle hero with gradient background, remove old tagline
Replace plain hero with rich forest-green gradient, radial glow
effects, and subtle grid pattern. Remove "Bridging cosmic
perspective with local action" tagline. Hero heading is now
just "Cosmolocal Foundation" with white-on-dark treatment.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07 13:50:36 +00:00
Jeff Emmett a36244187a Add deployment scaffolding (Dockerfile, docker-compose, nginx)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07 14:14:29 +01:00
Jeff Emmett 0cf11b32fb Add comprehensive content from foundation documentation
Expand site from 4 to 9 sections with vision, mission pillars,
8 strategic priorities, founder bio (Michel Bauwens), investment
case with Cosmo-Local Financing Facility, core values from
Social Charter, and governance framework. Sticky nav with
backdrop blur, updated metadata/OpenGraph.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07 13:02:06 +00:00
Jeff Emmett 810d6bbf33 Add public dir placeholder for Docker build
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 15:28:58 +00:00
Jeff Emmett fc75b92a29 Initial Cosmolocal Foundation website
Next.js 16 + Tailwind CSS landing page with hero, about, mission,
and contact sections. Dockerized for Netcup deployment with Traefik.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 15:27:33 +00:00
4 changed files with 17 additions and 15 deletions

View File

@ -36,7 +36,7 @@ Set up CosmoLocal World infrastructure: Mailcow SMTP for cosmolocal.world, Docmo
### Mailcow (cosmolocal.world)
- Mailbox: noreply@cosmolocal.world
- Alias: newsletter@cosmolocal.world → noreply@cosmolocal.world (sender_allowed=1)
- SMTP: mx.jeffemmett.com:465 (TLS)
- SMTP: [SMTP_HOST]:465 (TLS)
- DNS: SPF, DKIM (2048-bit), DMARC all configured on Cloudflare
- Google Postmaster Tools verified

View File

@ -32,11 +32,11 @@ services:
- DB_POSTGRESDB_PASSWORD=${N8N_DB_PASSWORD}
- TWENTY_API_KEY=${TWENTY_API_KEY}
- LISTMONK_CREDENTIALS=${LISTMONK_CREDENTIALS}
- N8N_SMTP_HOST=mx.jeffemmett.com
- N8N_SMTP_PORT=587
- N8N_SMTP_HOST=${SMTP_HOST}
- N8N_SMTP_PORT=${SMTP_PORT}
- N8N_SMTP_USER=${SMTP_USER}
- N8N_SMTP_PASS=${SMTP_PASS}
- N8N_SMTP_SENDER=${SMTP_SENDER:-hello@cosmolocal.world}
- N8N_SMTP_SENDER=${SMTP_SENDER}
- N8N_EMAIL_MODE=smtp
extra_hosts:
- "host.docker.internal:host-gateway"

View File

@ -112,7 +112,7 @@
{
"parameters": {
"fromEmail": "={{ $env.N8N_SMTP_SENDER }}",
"toEmail": "hello@cosmolocal.world",
"toEmail": "={{ $env.N8N_SMTP_SENDER }}",
"subject": "={{ $json.subject }}",
"emailType": "html",
"html": "={{ $json.htmlBody }}",

View File

@ -6,16 +6,18 @@ Import these JSON files into [automate.cosmolocal.world](https://automate.cosmol
API keys are passed as **Docker environment variables** in `docker-compose.yml` (n8n community edition doesn't support Settings > Variables). The workflows access them via `$env.VARIABLE_NAME`.
| Variable | Description | Where to find |
|----------|-------------|---------------|
| `TWENTY_API_KEY` | Twenty CRM API key | crm.cosmolocal.world > Settings > API Keys |
| `SMTP_USER` | Mailcow SMTP username | e.g. `hello@cosmolocal.world` |
| `SMTP_PASS` | Mailcow SMTP password | Mailcow admin panel at mx.jeffemmett.com |
| `LISTMONK_CREDENTIALS` | Listmonk `user:pass` | Internal Docker service credentials |
| Variable | Description |
|----------|-------------|
| `TWENTY_API_KEY` | CRM API key |
| `SMTP_HOST` | SMTP server hostname |
| `SMTP_PORT` | SMTP server port |
| `SMTP_USER` | SMTP username |
| `SMTP_PASS` | SMTP password |
| `SMTP_SENDER` | From address for outgoing email |
| `LISTMONK_CREDENTIALS` | Listmonk `user:pass` |
| `N8N_DB_PASSWORD` | n8n PostgreSQL password |
Email is sent via **Mailcow SMTP** (`mx.jeffemmett.com:587` STARTTLS). After importing workflows, create an SMTP credential in n8n named "Mailcow SMTP" with the host/user/pass above.
To set keys, create `/opt/websites/cosmolocal-website/.env` on the server and redeploy.
All credentials are stored in `.env` on the server (gitignored). See server admin for values.
## Workflows
@ -54,7 +56,7 @@ Syncs all CRM contacts with email addresses to Listmonk list #1. Adjust the list
**Trigger:** Weekly on Monday at 9:00 AM
**Flow:** Fetch contacts > Filter those not updated in 14+ days > Email report to team
Sends an HTML table report to `hello@cosmolocal.world` with stale contacts and a link to the CRM.
Sends an HTML table report to the team with stale contacts and a link to the CRM.
### 05 — Webhook Events (Git to CRM)
**Trigger:** Webhook POST to `/webhook/git-events`