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
66 lines
2.7 KiB
Markdown
66 lines
2.7 KiB
Markdown
# Phase 5: DNS Records Page
|
|
|
|
**Status:** ⬜ Not Started
|
|
**Parent plan:** [PLAN.md](./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
|
|
<!-- Filled in after completion -->
|