c730cfaa45
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
2.7 KiB
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()inapi.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 fileinternal/api/router.go— register DNS routesweb/src/lib/api.ts— add DNS records API functionweb/src/routes/dns/+page.svelte— new pageweb/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)