Comments had drifted into multi-paragraph narrative (git commit lineage, debugging stories, restated code) in several hot spots (scripts/deploy, hermes-agent.nix, flake.nix, gitea.nix, headscale.nix). Trim every comment to its load-bearing "why" — gotchas, safety warnings, and non-obvious rationale survive verbatim in substance, just tightened to 1-2 sentences; historical narrative and anything already covered in CLAUDE.md is cut. No code/logic changed. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UJqEmY1y3AYX3JoX4Y6b21
52 lines
2.4 KiB
Nix
52 lines
2.4 KiB
Nix
{ config, pkgs, lib, ... }:
|
|
|
|
# mercury — Raspberry Pi 3B+ (aarch64). Network DNS + DHCP (+ adblock).
|
|
# Boots from an SD image (see flake: nixosConfigurations.mercury), so there is
|
|
# no disko / hardware-configuration here — the sd-image module provides them.
|
|
{
|
|
imports = [
|
|
../../common.nix # shared base: user / ssh / nix / firewall
|
|
./secrets.nix # sops-nix: darman password (age key on boot part.)
|
|
../../services/network/unbound.nix # local recursive resolver (127.0.0.1:5335)
|
|
../../services/network/pihole.nix # DNS adblock + DHCP (declarative static leases)
|
|
../../services/vpn/tailscale.nix # tailnet node (headscale on neptun)
|
|
../../services/monitoring/node-exporter.nix
|
|
];
|
|
|
|
networking.hostName = "mercury";
|
|
|
|
# ---- Static networking ----
|
|
# A DNS/DHCP server needs a fixed address (values from `ip -brief a` / `ip
|
|
# route` on the running Pi; eth0 is its NIC).
|
|
networking.useDHCP = false;
|
|
networking.usePredictableInterfaceNames = false; # keep it named eth0
|
|
networking.interfaces.eth0.ipv4.addresses = [
|
|
{ address = "10.0.0.10"; prefixLength = 24; } # the Pi's current IP
|
|
];
|
|
# Stable IPv6 (FRITZ!Box ULA prefix) so mercury is a fixed IPv6 DNS target —
|
|
# SLAAC still handles the GUA + default route. Announce this address as the
|
|
# FRITZ!Box's DNSv6 server so IPv6 clients resolve .sol via pihole.
|
|
networking.interfaces.eth0.ipv6.addresses = [
|
|
{ address = "fd18:df17:9078:0::10"; prefixLength = 64; }
|
|
];
|
|
networking.defaultGateway = { address = "10.0.0.1"; interface = "eth0"; };
|
|
networking.nameservers = [ "1.1.1.1" "9.9.9.9" ];
|
|
|
|
# Never take the tailnet's DNS here: headscale points every node at pihole,
|
|
# which runs on this host, so mercury would resolve through itself — keep
|
|
# the public resolvers above for its own lookups.
|
|
services.tailscale.extraUpFlags = [ "--accept-dns=false" ];
|
|
|
|
# ---- pihole web admin password (from sops) ----
|
|
# The pihole container reads FTLCONF_* env vars. Render an env file from the
|
|
# sops secret and feed it to the container — password stays out of repo/store.
|
|
sops.secrets.pihole_webpassword = { };
|
|
sops.templates."pihole.env".content =
|
|
"FTLCONF_webserver_api_password=${config.sops.placeholder.pihole_webpassword}";
|
|
virtualisation.oci-containers.containers.pihole.environmentFiles =
|
|
[ config.sops.templates."pihole.env".path ];
|
|
|
|
# Do not modify after first flash.
|
|
system.stateVersion = "26.05";
|
|
}
|