From 812d2085e9398f97848584376de550df40ec3a90 Mon Sep 17 00:00:00 2001 From: Hoid Date: Mon, 16 Feb 2026 17:02:01 +0000 Subject: [PATCH] Add Storage Box backup target to DocFast state --- docfast | 2 +- memory/portfolio.json | 45 ++++++++++++++++++++------- memory/wind-down-log.json | 22 ++++++------- projects/business/memory/decisions.md | 29 +++++++++++++++++ projects/business/memory/state.json | 2 +- 5 files changed, 75 insertions(+), 25 deletions(-) diff --git a/docfast b/docfast index 7391755..1ef8f57 160000 --- a/docfast +++ b/docfast @@ -1 +1 @@ -Subproject commit 73917551bd62d747a588fd27b62842d03555ff65 +Subproject commit 1ef8f5743c5995c305c4590825c03df1e6d8a072 diff --git a/memory/portfolio.json b/memory/portfolio.json index 9ffceed..8a8ccf5 100644 --- a/memory/portfolio.json +++ b/memory/portfolio.json @@ -1,6 +1,6 @@ { "startingCapital": 1000, - "cash": 300, + "cash": 0, "currency": "EUR", "positions": [ { @@ -8,15 +8,25 @@ "name": "VanEck Defense UCITS ETF A", "isin": "IE000YYE6WK5", "buyDate": "2026-02-13", - "avgPrice": 55.93, - "shares": 12.516, - "amount": 700 + "avgPrice": 55.95, + "shares": 17.784, + "amount": 1000 } ], "limitOrders": [], "watchlist": [ - { "symbol": "RHM.DE", "isin": "DE0007030009", "name": "Rheinmetall", "note": "Buy if major dip >10%" }, - { "symbol": "XDWD.DE", "isin": "IE00BJ0KDQ92", "name": "Xtrackers MSCI World", "note": "Safe diversification option" } + { + "symbol": "RHM.DE", + "isin": "DE0007030009", + "name": "Rheinmetall", + "note": "Buy if major dip >10%" + }, + { + "symbol": "XDWD.DE", + "isin": "IE00BJ0KDQ92", + "name": "Xtrackers MSCI World", + "note": "Safe diversification option" + } ], "history": [ { @@ -26,17 +36,28 @@ "isin": "IE000YYE6WK5", "amount": 700, "price": 55.93, + "shares": 12.516, "reason": "European defense rearmament thesis. Diversified defense exposure via ETF. Strong momentum, geopolitical tailwinds." + }, + { + "date": "2026-02-16", + "action": "BUY", + "symbol": "DFNS", + "isin": "IE000YYE6WK5", + "amount": 300, + "price": 56.97, + "shares": 5.268, + "reason": "Doubling down on defense thesis. EU rearmament headlines accelerating. Deploy cash — 30% idle is unacceptable." } ], "notes": "N26 uses Xetra tickers. Always provide ISIN for orders. Fractional shares by EUR amount supported.", "created": "2026-02-12T20:00:00Z", - "lastUpdated": "2026-02-13T16:15:00Z", + "lastUpdated": "2026-02-16T16:31:00Z", "closingSnapshot": { - "date": "2026-02-13", - "DFNS": 56.68, - "portfolioValue": 1009.41, - "dailyPL": 9.39, - "totalReturn": 0.94 + "date": "2026-02-16", + "DFNS": 56.97, + "portfolioValue": 1013.06, + "dailyPL": 1.15, + "totalReturn": 1.31 } } diff --git a/memory/wind-down-log.json b/memory/wind-down-log.json index 9f7c66b..040339a 100644 --- a/memory/wind-down-log.json +++ b/memory/wind-down-log.json @@ -1,14 +1,14 @@ { - "date": "2026-02-14", + "date": "2026-02-15", "events": [ - { "time": "20:08", "activity": "Wind-down check-in sent via WhatsApp. Waiting for response." }, - { "time": "20:10", "activity": "Set up DNS records for DocFast (SPF/DKIM/DMARC). Nose shower done ✅" }, - { "time": "20:17", "activity": "Watching something + playing BG3. Good wind-down combo ✅" }, - { "time": "21:28", "activity": "BG3 question about Adamantine Forge" }, - { "time": "22:06", "activity": "Still reviewing DocFast features/bugs between gaming" }, - { "time": "23:10", "activity": "Wrapping up DocFast work for the night. Last CEO session running, will review tomorrow." }, - { "time": "00:05", "activity": "Listening to audiobook, drinking tea. Good wind-down." }, - { "time": "02:02", "activity": "Going to sleep. Acknowledged it's too late again." } + { + "time": "19:02", + "activity": "Evening check-in sent. Yesterday was 02:00 bedtime." + }, + { + "time": "20:34", + "activity": "Follow-up wind-down nudge sent. Suggested The Substance or Der Herr der Puppen." + } ], - "summary": "Productive Saturday — BG3 gaming, DocFast work, browser tool fixed. Nose shower done. Audiobook + tea wind-down but still up until 02:00 Vienna. Late again." -} + "summary": "" +} \ No newline at end of file diff --git a/projects/business/memory/decisions.md b/projects/business/memory/decisions.md index 2cff272..51efdf9 100644 --- a/projects/business/memory/decisions.md +++ b/projects/business/memory/decisions.md @@ -61,6 +61,35 @@ We don't have custom templates. Listing them is false advertising. Removed from ## 2026-02-14 17:37 UTC — BUG-015: Migrate to SQLite File-based JSON won't survive concurrent requests. SQLite is the right choice for our scale (single server, <1000 users). No need for PostgreSQL yet. DB file on Docker volume for persistence. +## 2026-02-16 — Email Infrastructure: Scaling Strategy + +**Context:** Currently running Postfix on the single app server (docfast-1). Investor asked how this scales behind a load balancer. + +**Options evaluated:** +- **A) Dedicated mail server** — Separate VM running Postfix/Exim. Centralizes DKIM/SPF/PTR config, app servers relay through it. Moderate cost (~€4/mo for CX22), full control. +- **B) External email service** (Postmark, SES, SendGrid) — Best deliverability, no infra to manage, built-in analytics/bounce handling. ~$15-25/mo at our scale. Postmark recommended (focused on transactional email, excellent deliverability). +- **C) Keep Postfix on app server with relay** — Each app server relays through a central SMTP. Quick to set up but still managing Postfix everywhere. + +**Recommendation: Option B (External service — Postmark)** + +Reasons: +1. **Deliverability** — Services like Postmark have pre-warmed IPs with established reputation. We're fighting spam scores on a fresh Hetzner IP. +2. **Scaling** — Zero config when adding app servers. Just use the API/SMTP credentials. +3. **Operational cost** — No PTR/DKIM/SPF debugging. No Postfix maintenance. Engineer time > €15/mo. +4. **Analytics** — Bounce rates, open tracking, delivery confirmation built-in. +5. **When to implement** — After launch validation. Current Postfix setup is fine for MVP with the deliverability fixes applied today. + +**Migration path:** Keep Postfix for now (with today's SPF/DMARC/PTR fixes). Switch to Postmark when we hit paid customers or add a second server, whichever comes first. + +## 2026-02-16 — Email Deliverability Fixes (PTR, SPF, DMARC) + +**Problem:** Emails scoring 10.90 spam score. Three issues identified: +1. PTR record showing generic Hetzner hostname → changed to `mail.docfast.dev` +2. SPF using `~all` (softfail) → changing to `-all` (hardfail) +3. DMARC using `p=none` → changing to `p=quarantine` + +**Status:** PTR fixed via Hetzner Cloud API. SPF and DMARC require Hetzner DNS API token (not currently in credentials). A record for `mail.docfast.dev` also needed. + ## 2026-02-14 17:37 UTC — Deferred items (with reasoning) - BUG-016 (backups): Deferred to next session. Need to research Hetzner object storage or simple cron+scp backup. - BUG-017 (benchmarking): Deferred. Need load testing tools, will do before scaling marketing. diff --git a/projects/business/memory/state.json b/projects/business/memory/state.json index 82deeba..d372530 100644 --- a/projects/business/memory/state.json +++ b/projects/business/memory/state.json @@ -52,7 +52,7 @@ "sshKey": "/home/openclaw/.ssh/docfast", "smtp": "Postfix + OpenDKIM configured. DKIM-signed emails working. SPF/DKIM/DMARC DNS records live.", "email": "noreply@docfast.dev", - "backups": "BorgBackup daily at 03:00 UTC (local). PostgreSQL + Docker volumes + configs.", + "backups": "BorgBackup daily at 03:00 UTC (local). PostgreSQL + Docker volumes + configs. Off-site: ssh -p23 u149513-sub11@u149513-sub11.your-backup.de (SSH key installed at /root/.ssh/id_ed25519)", "cicd": "Forgejo Actions workflow (pending secrets setup)", "infraDocs": "infrastructure/ directory with full provisioning scripts" },