macOS Linux DNS + HTTP + TCP

Install dnsvard

Stable local hostnames for development, without localhost port conflicts.

macOS and Linux installer script.

Upgrade path: dnsvard upgrade

Homebrew cask for macOS.

Upgrade path: brew upgrade --cask comment-slayer/tap/dnsvard

If macOS shows "dnsvard Not Opened", allow it in System Settings -> Privacy & Security (Scroll to the bottom and "Open Anyway"), then run dnsvard again.

Operate running stacks

List active workspaces, stop one workspace, or force-remove an entire project.

$ dnsvard ps
$ dnsvard stop workspace/feat-auth@myproj
$ dnsvard rm --force project/myproj
  Browser / curl
       |
       | *.<suffix>
       v
 +-----------------------+
 | system resolver       |
 | -> 127.0.0.1:1053     |
 +-----------+-----------+
             |
             v
     +-------+--------+
     | dnsvard daemon |
     | DNS + HTTP/TCP |
     +---+--------+---+
         |        |
         | DNS    | HTTP/TCP proxy
         v        v
  workspace IP  containers

$ setup-worktree feat-1 feat-2 feat-3
worktree ready: sl/feat-1 => ../feat-1
worktree ready: sl/feat-2 => ../feat-2
worktree ready: sl/feat-3 => ../feat-3

$ dnsvard ps
runtime leases: 0
docker containers: 9
- project/breadsticks containers=9
  - [running] workspace/feat-1@breadsticks domain=feat-1.breadsticks.test containers=3
    - [running] container/feat-1-api-1 service=api
    - [running] container/feat-1-frontend-1 service=frontend
    - [running] container/feat-1-postgres-1 service=postgres
  - [running] workspace/feat-2@breadsticks domain=feat-2.breadsticks.test containers=3
    - [running] container/feat-2-api-1 service=api
    - [running] container/feat-2-frontend-1 service=frontend
    - [running] container/feat-2-postgres-1 service=postgres
  - [running] workspace/feat-3@breadsticks domain=feat-3.breadsticks.test containers=3
    - [running] container/feat-3-api-1 service=api
    - [running] container/feat-3-frontend-1 service=frontend
    - [running] container/feat-3-postgres-1 service=postgres

$ curl feat-1.breadsticks.test
frontend: sl/feat-1

$ curl feat-2.breadsticks.test
frontend: sl/feat-2

$ curl api.feat-2.breadsticks.test
{"branch":"sl/feat-2"}

$ psql -c 'select system_identifier from pg_control_system()' -h feat-1.breadsticks.test
7612711402309095461

$ psql -c 'select system_identifier from pg_control_system()' -h feat-2.breadsticks.test
7612711418985173029

$ cd ../feat-1

feat-1$ dnsvard config local set suffix bs
updated local suffix in ~/src/breadsticks/feat-1/dnsvard.yaml
feat-1$ dnsvard config local set host_pattern service-workspace-tld
updated local host_pattern in ~/src/breadsticks/feat-1/dnsvard.yaml

feat-1$ dnsvard ps workspace/feat-1@breadsticks
runtime leases: 0
docker containers: 3
- [running] workspace/feat-1@breadsticks domain=feat-1.bs containers=3
  - [running] container/feat-1-api-1 service=api
  - [running] container/feat-1-frontend-1 service=frontend
  - [running] container/feat-1-postgres-1 service=postgres

feat-1$ curl feat-1.bs
frontend: sl/feat-1

feat-1$ dnsvard rm -f workspace/feat-1@breadsticks
removing containers: 3
done

feat-1$ dnsvard ps
runtime leases: 0
docker containers: 6
- project/breadsticks containers=6
  - [running] workspace/feat-2@breadsticks domain=feat-2.breadsticks.test containers=3
    - [running] container/feat-2-api-1 service=api
    - [running] container/feat-2-frontend-1 service=frontend
    - [running] container/feat-2-postgres-1 service=postgres
  - [running] workspace/feat-3@breadsticks domain=feat-3.breadsticks.test containers=3
    - [running] container/feat-3-api-1 service=api
    - [running] container/feat-3-frontend-1 service=frontend
    - [running] container/feat-3-postgres-1 service=postgres

feat-1$ dnsvard rm -f project/breadsticks
removing containers: 6
done

feat-1$ dnsvard ps
runtime leases: 0
docker containers: 0

github.com/comment-slayer/dnsvard