feat(networking): migrate host services from ZeroTier to Tailscale
test ebook search / test-ebook-search (pull_request) Successful in 35s
build_systems / build-bob (pull_request) Successful in 52s
build_systems / build-brain (pull_request) Successful in 52s
treefmt / nix fmt (pull_request) Successful in 5s
pytest / pytest (pull_request) Successful in 30s
build_systems / build-rhapsody-in-green (pull_request) Successful in 1m3s
build_systems / build-brain (push) Successful in 35s
build_systems / build-bob (push) Successful in 36s
build_systems / build-jeeves (pull_request) Successful in 2m20s
treefmt / nix fmt (push) Successful in 5s
pytest / pytest (push) Successful in 29s
test ebook search / test-ebook-search (push) Successful in 34s
build_systems / build-rhapsody-in-green (push) Successful in 49s
build_systems / build-jeeves (push) Successful in 2m2s

- replace legacy IP addresses with Tailscale MagicDNS names
- route Prometheus scraping and exporter firewall access through Tailscale
- wait for Tailscale before starting Prometheus
- restrict service UI ports to the Tailscale interface
- update PostgreSQL and Transmission access rules
- remove Jeeves ZeroTier configuration and Docker host overrides
This commit was merged in pull request #63.
This commit is contained in:
2026-08-27 12:25:27 -04:00
parent dd51e89abf
commit 7e6908ef3d
14 changed files with 34 additions and 34 deletions
+1 -1
View File
@@ -5,7 +5,7 @@
... ...
}: }:
let let
monitoringInterface = "ztwfunumly"; monitoringInterface = "tailscale0";
nodeTextfileDir = "/var/lib/prometheus-node-exporter-textfile"; nodeTextfileDir = "/var/lib/prometheus-node-exporter-textfile";
mkProcessNameTemplate = mkProcessNameTemplate =
+2 -2
View File
@@ -37,7 +37,7 @@ class RerankConfig(BaseSettings):
model_config = SettingsConfigDict(env_prefix="EBOOK_SEARCH_RERANK_", frozen=True, protected_namespaces=()) model_config = SettingsConfigDict(env_prefix="EBOOK_SEARCH_RERANK_", frozen=True, protected_namespaces=())
enabled: bool = True enabled: bool = True
base_url: str = "http://192.168.90.25:8001" base_url: str = "http://bob:8001"
model: str = "qwen3-reranker-06b" model: str = "qwen3-reranker-06b"
candidates: int = 24 candidates: int = 24
timeout_seconds: float = 30.0 timeout_seconds: float = 30.0
@@ -67,7 +67,7 @@ class EbookSearchConfig(BaseSettings):
) )
chat_model: str = "deepseek-v4-flash" chat_model: str = "deepseek-v4-flash"
answer_enabled: bool = True answer_enabled: bool = True
embedding_base_url: str = "http://192.168.90.25:8000/v1" embedding_base_url: str = "http://bob:8000/v1"
embedding_api_key: str = "not-needed" embedding_api_key: str = "not-needed"
embedding_model: str = "qwen3-embedding-0.6b" embedding_model: str = "qwen3-embedding-0.6b"
embedding_batch_size: int = 32 embedding_batch_size: int = 32
@@ -9,8 +9,6 @@ services:
restart: unless-stopped restart: unless-stopped
ports: ports:
- "${EBOOK_SEARCH_PORT:-8070}:8070" - "${EBOOK_SEARCH_PORT:-8070}:8070"
extra_hosts:
- "jeeves:192.168.90.40"
env_file: env_file:
- ../../../.env - ../../../.env
environment: environment:
+1 -1
View File
@@ -86,7 +86,7 @@
esphome = { esphome = {
enable = true; enable = true;
openFirewall = true; openFirewall = true;
address = "192.168.90.35"; address = "0.0.0.0";
}; };
}; };
} }
+2 -2
View File
@@ -19,7 +19,7 @@
local all richie trust local all richie trust
host all richie 127.0.0.1/32 trust host all richie 127.0.0.1/32 trust
host all richie ::1/128 trust host all richie ::1/128 trust
host all richie 192.168.90.1/24 trust host all richie 100.64.0.0/10 trust
host all richie 192.168.99.1/24 trust host all richie 192.168.99.1/24 trust
local vaninventory vaninventory trust local vaninventory vaninventory trust
@@ -28,7 +28,7 @@
local hass hass trust local hass hass trust
# ipv4 # ipv4
host hass hass 192.168.90.1/24 trust host hass hass 100.64.0.0/10 trust
host hass hass 127.0.0.1/32 trust host hass hass 127.0.0.1/32 trust
# ipv6 # ipv6
+1 -1
View File
@@ -3,7 +3,7 @@
services.syncthing = { services.syncthing = {
overrideFolders = false; overrideFolders = false;
guiAddress = "192.168.90.35:8384"; guiAddress = "0.0.0.0:8384";
settings = { settings = {
"dotfiles" = { "dotfiles" = {
path = "/home/richie/dotfiles"; path = "/home/richie/dotfiles";
+12 -10
View File
@@ -41,29 +41,29 @@ let
{ {
job_name = "node"; job_name = "node";
static_configs = [ static_configs = [
(mkTarget "jeeves" "192.168.90.40:9100") (mkTarget "jeeves" "jeeves.taile39c31.ts.net:9100")
(mkTarget "bob" "192.168.90.25:9100") (mkTarget "bob" "bob.taile39c31.ts.net:9100")
]; ];
} }
{ {
job_name = "process_grouped"; job_name = "process_grouped";
static_configs = [ static_configs = [
(mkTarget "jeeves" "192.168.90.40:9256") (mkTarget "jeeves" "jeeves.taile39c31.ts.net:9256")
(mkTarget "bob" "192.168.90.25:9256") (mkTarget "bob" "bob.taile39c31.ts.net:9256")
]; ];
} }
{ {
job_name = "smartctl"; job_name = "smartctl";
static_configs = [ static_configs = [
(mkTarget "jeeves" "192.168.90.40:9633") (mkTarget "jeeves" "jeeves.taile39c31.ts.net:9633")
(mkTarget "bob" "192.168.90.25:9633") (mkTarget "bob" "bob.taile39c31.ts.net:9633")
]; ];
} }
{ {
job_name = "zfs"; job_name = "zfs";
static_configs = [ static_configs = [
(mkTarget "jeeves" "192.168.90.40:9134") (mkTarget "jeeves" "jeeves.taile39c31.ts.net:9134")
(mkTarget "bob" "192.168.90.25:9134") (mkTarget "bob" "bob.taile39c31.ts.net:9134")
]; ];
} }
]; ];
@@ -79,8 +79,8 @@ let
{ {
job_name = "process_pid"; job_name = "process_pid";
static_configs = [ static_configs = [
(mkTarget "jeeves" "192.168.90.40:9257") (mkTarget "jeeves" "jeeves.taile39c31.ts.net:9257")
(mkTarget "bob" "192.168.90.25:9257") (mkTarget "bob" "bob.taile39c31.ts.net:9257")
]; ];
} }
]; ];
@@ -97,7 +97,9 @@ let
after = [ after = [
"zfs-media-database-prometheus.mount" "zfs-media-database-prometheus.mount"
"network.target" "network.target"
"tailscaled-autoconnect.service"
]; ];
wants = [ "tailscaled-autoconnect.service" ];
requires = [ "zfs-media-database-prometheus.mount" ]; requires = [ "zfs-media-database-prometheus.mount" ];
wantedBy = [ "multi-user.target" ]; wantedBy = [ "multi-user.target" ];
unitConfig.RequiresMountsFor = [ dataDir ]; unitConfig.RequiresMountsFor = [ dataDir ];
+2 -2
View File
@@ -19,9 +19,9 @@ in
secret_key = "$__file{${vars.secrets}/services/grafana/secret_key}"; secret_key = "$__file{${vars.secrets}/services/grafana/secret_key}";
}; };
server = { server = {
http_addr = "192.168.90.40"; http_addr = "0.0.0.0";
http_port = 3000; http_port = 3000;
root_url = "http://192.168.90.40:3000/"; root_url = "http://jeeves:3000/";
}; };
}; };
provision = { provision = {
+3 -3
View File
@@ -27,7 +27,7 @@ in
local all richie trust local all richie trust
host all richie 127.0.0.1/32 trust host all richie 127.0.0.1/32 trust
host all richie ::1/128 trust host all richie ::1/128 trust
host all richie 192.168.90.1/24 trust host all richie 100.64.0.0/10 trust
host all richie 192.168.99.1/24 trust host all richie 192.168.99.1/24 trust
host all richie 172.16.0.0/12 trust host all richie 172.16.0.0/12 trust
@@ -42,12 +42,12 @@ in
local postgres math trust local postgres math trust
host postgres math 127.0.0.1/32 trust host postgres math 127.0.0.1/32 trust
host postgres math ::1/128 trust host postgres math ::1/128 trust
host postgres math 192.168.90.1/24 trust host postgres math 100.64.0.0/10 trust
local data_science_dev math trust local data_science_dev math trust
host data_science_dev math 127.0.0.1/32 trust host data_science_dev math 127.0.0.1/32 trust
host data_science_dev math ::1/128 trust host data_science_dev math ::1/128 trust
host data_science_dev math 192.168.90.1/24 trust host data_science_dev math 100.64.0.0/10 trust
''; '';
identMap = '' identMap = ''
+2 -2
View File
@@ -21,11 +21,11 @@ in
message-level = 3; message-level = 3;
peer-port = 51413; peer-port = 51413;
rpc-bind-address = "0.0.0.0"; rpc-bind-address = "0.0.0.0";
rpc-host-whitelist = "127.0.0.1,192.168.90.40"; rpc-host-whitelist = "127.0.0.1,jeeves,jeeves.taile39c31.ts.net";
rpc-host-whitelist-enabled = true; rpc-host-whitelist-enabled = true;
rpc-port = 9091; rpc-port = 9091;
rpc-whitelist-enabled = true; rpc-whitelist-enabled = true;
rpc-whitelist = "127.0.0.1,192.168.90.49"; rpc-whitelist = "127.0.0.1,100.*.*.*";
seed-queue-enabled = false; seed-queue-enabled = false;
}; };
}; };
+2 -2
View File
@@ -2,11 +2,11 @@ let
vars = import ./vars.nix; vars = import ./vars.nix;
in in
{ {
networking.firewall.allowedTCPPorts = [ 8384 ]; networking.firewall.interfaces.tailscale0.allowedTCPPorts = [ 8384 ];
services.syncthing = { services.syncthing = {
overrideFolders = false; overrideFolders = false;
guiAddress = "192.168.90.40:8384"; guiAddress = "0.0.0.0:8384";
settings = { settings = {
devices.davids-server.id = "7GXTDGR-AOXFW2O-K6J7NM3-XYZNRRW-AKHAFWM-GBOWUPQ-OA6JIWD-ER7RDQL"; # cspell:disable-line devices.davids-server.id = "7GXTDGR-AOXFW2O-K6J7NM3-XYZNRRW-AKHAFWM-GBOWUPQ-OA6JIWD-ER7RDQL"; # cspell:disable-line
folders = { folders = {
+1 -1
View File
@@ -51,7 +51,7 @@ def test_config_defaults_enable_reranking(mocker: MockerFixture) -> None:
config = load_rerank_config() config = load_rerank_config()
assert config.enabled is True assert config.enabled is True
assert config.base_url == "http://192.168.90.25:8001" assert config.base_url == "http://bob:8001"
assert config.model == "qwen3-reranker-06b" assert config.model == "qwen3-reranker-06b"
assert config.candidates == 24 assert config.candidates == 24
assert config.timeout_seconds == 30 assert config.timeout_seconds == 30
+1 -1
View File
@@ -35,7 +35,7 @@
"sqltools.connections": [ "sqltools.connections": [
{ {
"previewLimit": 50, "previewLimit": 50,
"server": "192.168.90.40", "server": "jeeves.taile39c31.ts.net",
"port": 5432, "port": 5432,
"askForPassword": true, "askForPassword": true,
"driver": "PostgreSQL", "driver": "PostgreSQL",
+4 -4
View File
@@ -4,7 +4,7 @@
enableDefaultConfig = false; enableDefaultConfig = false;
settings = { settings = {
jeeves = { jeeves = {
HostName = "192.168.90.40"; HostName = "jeeves";
User = "richie"; User = "richie";
IdentityFile = "~/.ssh/id_ed25519"; IdentityFile = "~/.ssh/id_ed25519";
Port = 629; Port = 629;
@@ -18,7 +18,7 @@
Port = 2222; Port = 2222;
}; };
brain = { brain = {
HostName = "192.168.90.35"; HostName = "brain";
User = "richie"; User = "richie";
IdentityFile = "~/.ssh/id_ed25519"; IdentityFile = "~/.ssh/id_ed25519";
Port = 129; Port = 129;
@@ -31,14 +31,14 @@
Port = 2222; Port = 2222;
}; };
bob = { bob = {
HostName = "192.168.90.25"; HostName = "bob";
User = "richie"; User = "richie";
IdentityFile = "~/.ssh/id_ed25519"; IdentityFile = "~/.ssh/id_ed25519";
Port = 262; Port = 262;
DynamicForward = [ { port = 9050; } ]; DynamicForward = [ { port = 9050; } ];
}; };
rhapsody-in-green = { rhapsody-in-green = {
HostName = "192.168.90.221"; HostName = "rhapsody-in-green";
User = "richie"; User = "richie";
IdentityFile = "~/.ssh/id_ed25519"; IdentityFile = "~/.ssh/id_ed25519";
Port = 922; Port = 922;