Files
tiny-forge/plans/cloudflare-dns-management/phase-5-dns-records-page.md
T
alexei.dolgolyov c730cfaa45 feat: Cloudflare DNS management with automatic record sync
Add flexible DNS management to Docker Watcher. By default, wildcard DNS
is assumed (current behavior). When disabled, users can configure a
Cloudflare DNS provider with API token and zone selection. DNS A records
are automatically created/updated/deleted in sync with proxy consumers
(deployed instances and standalone proxies).

- Settings: wildcard_dns toggle, dns_provider, cloudflare credentials
- Cloudflare client: Provider interface with EnsureRecord/DeleteRecord/ListRecords
- DNS lifecycle hooks in deployer and proxy manager (best-effort)
- Settings UI: DNS config section with provider picker, zone selector, test button
- DNS Records page at /dns with filtering, sync status, reconciliation
- Records visible in both wildcard and managed modes
- Cleanup on provider change: removes old records when switching modes
2026-04-02 14:49:21 +03:00

2.7 KiB

Phase 5: DNS Records Page

Status: Not Started Parent plan: PLAN.md Domain: fullstack

Objective

Create a dedicated DNS Records page that lists all managed DNS records with filtering, consumer mapping, and sync status visibility.

Tasks

  • Task 1: Add backend endpoint GET /api/dns/records
    • Returns merged view: local dns_records + Cloudflare actual records
    • Each record: fqdn, type, value (IP), consumer_type, consumer_name, status (synced/orphaned/missing)
    • Orphaned = exists in Cloudflare but no local consumer
    • Missing = local consumer exists but no Cloudflare record
  • Task 2: Add API handler in internal/api/dns.go
    • New handler file for DNS-related endpoints
    • Register routes in router.go
  • Task 3: Add frontend API function getDnsRecords() in api.ts
  • Task 4: Create DNS Records page at web/src/routes/dns/+page.svelte
    • Table with columns: FQDN, Type, Value, Consumer, Status
    • Consumer column shows: instance name (project/stage) or standalone proxy name
    • Status badges: synced (green), orphaned (yellow), missing (red)
    • Search filter (by FQDN substring)
    • Filter by consumer type: all / managed / standalone
    • Filter by status: all / synced / orphaned / missing
    • Manual sync button (calls POST /api/dns/sync — Phase 6)
    • Refresh button to re-fetch from Cloudflare
  • Task 5: Add navigation link to DNS page
    • Only visible when wildcard DNS is disabled
    • Add to sidebar/nav under Settings or as top-level
  • Task 6: Add i18n keys for DNS records page

Files to Modify/Create

  • internal/api/dns.go — new handler file
  • internal/api/router.go — register DNS routes
  • web/src/lib/api.ts — add DNS records API function
  • web/src/routes/dns/+page.svelte — new page
  • web/src/routes/dns/+page.ts — optional load function
  • Navigation component — add DNS link
  • Locale files — add i18n keys

Acceptance Criteria

  • DNS Records page accessible at /dns
  • Table shows all records with correct status
  • Filtering works: search text, consumer type, sync status
  • Only accessible/visible when wildcard DNS is disabled
  • Consumer names resolve correctly (project/stage for managed, proxy name for standalone)

Notes

  • Status computation: compare local dns_records table with Cloudflare ListRecords response
  • Cache Cloudflare response for a few seconds to avoid rate limiting on page load
  • Navigation link visibility tied to settings (may need a store or settings check)

Review Checklist

  • All tasks completed
  • Code follows project conventions
  • No unintended side effects
  • Build passes
  • Tests pass (new + existing)

Handoff to Next Phase