You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: DEVELOPMENT.md
+60-35Lines changed: 60 additions & 35 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,6 +4,8 @@ This document covers development setup, configuration, and contributing to Hypem
4
4
5
5
## Prerequisites
6
6
7
+
> **macOS Users:** Hypeman requires KVM, which is only available on Linux. See [scripts/utm/README.md](scripts/utm/README.md) for instructions on setting up a Linux VM with nested virtualization on Apple Silicon Macs.
|`CADDY_LISTEN_ADDRESS`| Address for Caddy ingress listeners |`0.0.0.0`|
104
+
|`CADDY_ADMIN_ADDRESS`| Address for Caddy admin API |`127.0.0.1`|
105
+
|`CADDY_ADMIN_PORT`| Port for Caddy admin API |`2019`|
106
+
|`CADDY_STOP_ON_SHUTDOWN`| Stop Caddy when hypeman shuts down (set to `true` for dev) |`false`|
107
+
|`ACME_EMAIL`| Email for ACME certificate registration (required for TLS ingresses) |_(empty)_|
108
+
|`ACME_DNS_PROVIDER`| DNS provider for ACME challenges: `cloudflare`|_(empty)_|
109
+
|`ACME_CA`| ACME CA URL (empty = Let's Encrypt production) |_(empty)_|
110
+
|`TLS_ALLOWED_DOMAINS`| Comma-separated allowed domains for TLS (e.g., `*.example.com,api.other.com`) |_(empty)_|
111
+
|`DNS_PROPAGATION_TIMEOUT`| Max time to wait for DNS propagation (e.g., `2m`) |_(empty)_|
112
+
|`DNS_RESOLVERS`| Comma-separated DNS resolvers for propagation checking |_(empty)_|
113
+
|`CLOUDFLARE_API_TOKEN`| Cloudflare API token (when using `cloudflare` provider) |_(empty)_|
109
114
110
115
**Important: Subnet Configuration**
111
116
@@ -114,10 +119,12 @@ The default subnet `10.100.0.0/16` is chosen to avoid common conflicts. Hypeman
114
119
If you need a different subnet, set `SUBNET_CIDR` in your environment. The gateway is automatically derived as the first IP in the subnet (e.g., `10.100.0.0/16` → `10.100.0.1`).
115
120
116
121
**Alternative subnets if needed:**
122
+
117
123
-`172.30.0.0/16` - Private range between common Docker (172.17.x.x) and cloud provider (172.31.x.x) ranges
118
124
-`10.200.0.0/16` - Another private range option
119
125
120
126
**Example:**
127
+
121
128
```bash
122
129
# In your .env file
123
130
SUBNET_CIDR=172.30.0.0/16
@@ -128,23 +135,30 @@ SUBNET_CIDR=172.30.0.0/16
128
135
`UPLINK_INTERFACE` tells Hypeman which host interface to use for routing VM traffic to the outside world (for iptables MASQUERADE rules). On many hosts this is `eth0`, but laptops and more complex setups often use Wi‑Fi or other names.
129
136
130
137
**Quick way to discover it:**
138
+
131
139
```bash
132
140
# Ask the kernel which interface is used to reach the internet
133
141
ip route get 1.1.1.1
134
142
```
143
+
135
144
Look for the `dev` field in the output, for example:
145
+
136
146
```text
137
147
1.1.1.1 via 192.168.12.1 dev wlp2s0 src 192.168.12.98
138
148
```
149
+
139
150
In this case, `wlp2s0` is the uplink interface, so you would set:
151
+
140
152
```bash
141
153
UPLINK_INTERFACE=wlp2s0
142
154
```
143
155
144
156
You can also inspect all routes:
157
+
145
158
```bash
146
159
ip route show
147
160
```
161
+
148
162
Pick the interface used by the default route (usually the line starting with `default`). Avoid using local bridges like `docker0`, `br-...`, `virbr0`, or `vmbr0` as the uplink; those are typically internal virtual networks, not your actual internet-facing interface.
149
163
150
164
### TLS Ingress (HTTPS)
@@ -154,6 +168,7 @@ Hypeman uses Caddy with automatic ACME certificates for TLS termination. Certifi
0 commit comments