Tangled infrastructure definitions in Nix

wip: add knotmirror service in mirror host

using dedicated flake input `tangled-mirror`

Signed-off-by: Seongmin Lee <git@boltless.me>

boltless.me bdae5179 8a2e6f38

verified
+258 -4
+224 -1
flake.lock
··· 16 16 "url": "https://tangled.org/@jakelazaroff.com/actor-typeahead" 17 17 } 18 18 }, 19 + "actor-typeahead-src_2": { 20 + "flake": false, 21 + "locked": { 22 + "lastModified": 1762835797, 23 + "narHash": "sha256-heizoWUKDdar6ymfZTnj3ytcEv/L4d4fzSmtr0HlXsQ=", 24 + "ref": "refs/heads/main", 25 + "rev": "677fe7f743050a4e7f09d4a6f87bbf1325a06f6b", 26 + "revCount": 6, 27 + "type": "git", 28 + "url": "https://tangled.org/@jakelazaroff.com/actor-typeahead" 29 + }, 30 + "original": { 31 + "type": "git", 32 + "url": "https://tangled.org/@jakelazaroff.com/actor-typeahead" 33 + } 34 + }, 19 35 "colmena": { 20 36 "inputs": { 21 37 "flake-compat": "flake-compat", ··· 88 104 "url": "https://git.lix.systems/lix-project/flake-compat/archive/main.tar.gz" 89 105 } 90 106 }, 107 + "flake-compat_3": { 108 + "flake": false, 109 + "locked": { 110 + "lastModified": 1751685974, 111 + "narHash": "sha256-NKw96t+BgHIYzHUjkTK95FqYRVKB8DHpVhefWSz/kTw=", 112 + "rev": "549f2762aebeff29a2e5ece7a7dc0f955281a1d1", 113 + "type": "tarball", 114 + "url": "https://git.lix.systems/api/v1/repos/lix-project/flake-compat/archive/549f2762aebeff29a2e5ece7a7dc0f955281a1d1.tar.gz?rev=549f2762aebeff29a2e5ece7a7dc0f955281a1d1" 115 + }, 116 + "original": { 117 + "type": "tarball", 118 + "url": "https://git.lix.systems/lix-project/flake-compat/archive/main.tar.gz" 119 + } 120 + }, 91 121 "flake-utils": { 92 122 "locked": { 93 123 "lastModified": 1659877975, ··· 121 151 "type": "github" 122 152 } 123 153 }, 154 + "flake-utils_3": { 155 + "inputs": { 156 + "systems": "systems_2" 157 + }, 158 + "locked": { 159 + "lastModified": 1731533236, 160 + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", 161 + "owner": "numtide", 162 + "repo": "flake-utils", 163 + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", 164 + "type": "github" 165 + }, 166 + "original": { 167 + "owner": "numtide", 168 + "repo": "flake-utils", 169 + "type": "github" 170 + } 171 + }, 124 172 "gomod2nix": { 125 173 "inputs": { 126 174 "flake-utils": "flake-utils_2", ··· 143 191 "type": "github" 144 192 } 145 193 }, 194 + "gomod2nix_2": { 195 + "inputs": { 196 + "flake-utils": "flake-utils_3", 197 + "nixpkgs": [ 198 + "tangled-mirror", 199 + "nixpkgs" 200 + ] 201 + }, 202 + "locked": { 203 + "lastModified": 1763982521, 204 + "narHash": "sha256-ur4QIAHwgFc0vXiaxn5No/FuZicxBr2p0gmT54xZkUQ=", 205 + "owner": "nix-community", 206 + "repo": "gomod2nix", 207 + "rev": "02e63a239d6eabd595db56852535992c898eba72", 208 + "type": "github" 209 + }, 210 + "original": { 211 + "owner": "nix-community", 212 + "repo": "gomod2nix", 213 + "type": "github" 214 + } 215 + }, 146 216 "htmx-src": { 147 217 "flake": false, 148 218 "locked": { ··· 155 225 "url": "https://unpkg.com/htmx.org@2.0.4/dist/htmx.min.js" 156 226 } 157 227 }, 228 + "htmx-src_2": { 229 + "flake": false, 230 + "locked": { 231 + "narHash": "sha256-nm6avZuEBg67SSyyZUhjpXVNstHHgUxrtBHqJgowU08=", 232 + "type": "file", 233 + "url": "https://unpkg.com/htmx.org@2.0.4/dist/htmx.min.js" 234 + }, 235 + "original": { 236 + "type": "file", 237 + "url": "https://unpkg.com/htmx.org@2.0.4/dist/htmx.min.js" 238 + } 239 + }, 158 240 "htmx-ws-src": { 159 241 "flake": false, 160 242 "locked": { ··· 167 249 "url": "https://cdn.jsdelivr.net/npm/htmx-ext-ws@2.0.2" 168 250 } 169 251 }, 252 + "htmx-ws-src_2": { 253 + "flake": false, 254 + "locked": { 255 + "narHash": "sha256-2fg6KyEJoO24q0fQqbz9RMaYNPQrMwpZh29tkSqdqGY=", 256 + "type": "file", 257 + "url": "https://cdn.jsdelivr.net/npm/htmx-ext-ws@2.0.2" 258 + }, 259 + "original": { 260 + "type": "file", 261 + "url": "https://cdn.jsdelivr.net/npm/htmx-ext-ws@2.0.2" 262 + } 263 + }, 170 264 "ibm-plex-mono-src": { 171 265 "flake": false, 172 266 "locked": { ··· 180 274 "url": "https://github.com/IBM/plex/releases/download/@ibm/plex-mono@1.1.0/ibm-plex-mono.zip" 181 275 } 182 276 }, 277 + "ibm-plex-mono-src_2": { 278 + "flake": false, 279 + "locked": { 280 + "lastModified": 1731402384, 281 + "narHash": "sha256-OwUmrPfEehLDz0fl2ChYLK8FQM2p0G1+EMrGsYEq+6g=", 282 + "type": "tarball", 283 + "url": "https://github.com/IBM/plex/releases/download/@ibm/plex-mono@1.1.0/ibm-plex-mono.zip" 284 + }, 285 + "original": { 286 + "type": "tarball", 287 + "url": "https://github.com/IBM/plex/releases/download/@ibm/plex-mono@1.1.0/ibm-plex-mono.zip" 288 + } 289 + }, 183 290 "indigo": { 184 291 "flake": false, 185 292 "locked": { ··· 196 303 "type": "github" 197 304 } 198 305 }, 306 + "indigo_2": { 307 + "flake": false, 308 + "locked": { 309 + "lastModified": 1753693716, 310 + "narHash": "sha256-DMIKnCJRODQXEHUxA+7mLzRALmnZhkkbHlFT2rCQYrE=", 311 + "owner": "oppiliappan", 312 + "repo": "indigo", 313 + "rev": "5f170569da9360f57add450a278d73538092d8ca", 314 + "type": "github" 315 + }, 316 + "original": { 317 + "owner": "oppiliappan", 318 + "repo": "indigo", 319 + "type": "github" 320 + } 321 + }, 199 322 "inter-fonts-src": { 200 323 "flake": false, 201 324 "locked": { ··· 209 332 "url": "https://github.com/rsms/inter/releases/download/v4.1/Inter-4.1.zip" 210 333 } 211 334 }, 335 + "inter-fonts-src_2": { 336 + "flake": false, 337 + "locked": { 338 + "lastModified": 1731687360, 339 + "narHash": "sha256-5vdKKvHAeZi6igrfpbOdhZlDX2/5+UvzlnCQV6DdqoQ=", 340 + "type": "tarball", 341 + "url": "https://github.com/rsms/inter/releases/download/v4.1/Inter-4.1.zip" 342 + }, 343 + "original": { 344 + "type": "tarball", 345 + "url": "https://github.com/rsms/inter/releases/download/v4.1/Inter-4.1.zip" 346 + } 347 + }, 212 348 "lucide-src": { 213 349 "flake": false, 214 350 "locked": { ··· 222 358 "url": "https://github.com/lucide-icons/lucide/releases/download/0.536.0/lucide-icons-0.536.0.zip" 223 359 } 224 360 }, 361 + "lucide-src_2": { 362 + "flake": false, 363 + "locked": { 364 + "lastModified": 1754044466, 365 + "narHash": "sha256-+exBR2OToB1iv7ZQI2S4B0lXA/QRvC9n6U99UxGpJGs=", 366 + "type": "tarball", 367 + "url": "https://github.com/lucide-icons/lucide/releases/download/0.536.0/lucide-icons-0.536.0.zip" 368 + }, 369 + "original": { 370 + "type": "tarball", 371 + "url": "https://github.com/lucide-icons/lucide/releases/download/0.536.0/lucide-icons-0.536.0.zip" 372 + } 373 + }, 225 374 "nixery-flake": { 226 375 "flake": false, 227 376 "locked": { ··· 286 435 "type": "github" 287 436 } 288 437 }, 438 + "nixpkgs_4": { 439 + "locked": { 440 + "lastModified": 1766070988, 441 + "narHash": "sha256-G/WVghka6c4bAzMhTwT2vjLccg/awmHkdKSd2JrycLc=", 442 + "owner": "nixos", 443 + "repo": "nixpkgs", 444 + "rev": "c6245e83d836d0433170a16eb185cefe0572f8b8", 445 + "type": "github" 446 + }, 447 + "original": { 448 + "owner": "nixos", 449 + "ref": "nixos-unstable", 450 + "repo": "nixpkgs", 451 + "type": "github" 452 + } 453 + }, 289 454 "root": { 290 455 "inputs": { 291 456 "colmena": "colmena", 292 457 "disko": "disko", 293 458 "nixery-flake": "nixery-flake", 294 459 "nixpkgs": "nixpkgs_2", 295 - "tangled": "tangled" 460 + "tangled": "tangled", 461 + "tangled-mirror": "tangled-mirror" 296 462 } 297 463 }, 298 464 "sqlite-lib-src": { ··· 308 474 "url": "https://sqlite.org/2024/sqlite-amalgamation-3450100.zip" 309 475 } 310 476 }, 477 + "sqlite-lib-src_2": { 478 + "flake": false, 479 + "locked": { 480 + "lastModified": 1706631843, 481 + "narHash": "sha256-bJoMjirsBjm2Qk9KPiy3yV3+8b/POlYe76/FQbciHro=", 482 + "type": "tarball", 483 + "url": "https://sqlite.org/2024/sqlite-amalgamation-3450100.zip" 484 + }, 485 + "original": { 486 + "type": "tarball", 487 + "url": "https://sqlite.org/2024/sqlite-amalgamation-3450100.zip" 488 + } 489 + }, 311 490 "stable": { 312 491 "locked": { 313 492 "lastModified": 1669735802, ··· 339 518 "type": "github" 340 519 } 341 520 }, 521 + "systems_2": { 522 + "locked": { 523 + "lastModified": 1681028828, 524 + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", 525 + "owner": "nix-systems", 526 + "repo": "default", 527 + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", 528 + "type": "github" 529 + }, 530 + "original": { 531 + "owner": "nix-systems", 532 + "repo": "default", 533 + "type": "github" 534 + } 535 + }, 342 536 "tangled": { 343 537 "inputs": { 344 538 "actor-typeahead-src": "actor-typeahead-src", ··· 363 557 "url": "https://tangled.org/tangled.org/core" 364 558 }, 365 559 "original": { 560 + "type": "git", 561 + "url": "https://tangled.org/tangled.org/core" 562 + } 563 + }, 564 + "tangled-mirror": { 565 + "inputs": { 566 + "actor-typeahead-src": "actor-typeahead-src_2", 567 + "flake-compat": "flake-compat_3", 568 + "gomod2nix": "gomod2nix_2", 569 + "htmx-src": "htmx-src_2", 570 + "htmx-ws-src": "htmx-ws-src_2", 571 + "ibm-plex-mono-src": "ibm-plex-mono-src_2", 572 + "indigo": "indigo_2", 573 + "inter-fonts-src": "inter-fonts-src_2", 574 + "lucide-src": "lucide-src_2", 575 + "nixpkgs": "nixpkgs_4", 576 + "sqlite-lib-src": "sqlite-lib-src_2" 577 + }, 578 + "locked": { 579 + "lastModified": 1772722431, 580 + "narHash": "sha256-4ZpRmrhN2jqZwzQy7f8KcelW2S4bms9+0qoH8YlwkeU=", 581 + "ref": "sl/knotmirror", 582 + "rev": "560f3429c24d62c6cc144f951101d5493c917b82", 583 + "revCount": 2044, 584 + "type": "git", 585 + "url": "https://tangled.org/tangled.org/core" 586 + }, 587 + "original": { 588 + "ref": "sl/knotmirror", 366 589 "type": "git", 367 590 "url": "https://tangled.org/tangled.org/core" 368 591 }
+8 -3
flake.nix
··· 4 4 inputs = { 5 5 nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11"; 6 6 tangled.url = "git+https://tangled.org/tangled.org/core"; 7 + tangled-mirror.url = "git+https://tangled.org/tangled.org/core?ref=sl/knotmirror"; 7 8 colmena.url = "github:zhaofengli/colmena/release-0.4.x"; 8 9 disko = { 9 10 url = "github:nix-community/disko"; ··· 17 18 }; 18 19 }; 19 20 20 - outputs = { nixpkgs, disko, colmena, nixery-flake, tangled, ... }: 21 + outputs = { nixpkgs, disko, colmena, nixery-flake, tangled, tangled-mirror, ... }: 21 22 let 22 23 system = "x86_64-linux"; 23 24 commonArgs = import ./common/ssh.nix; ··· 102 103 }; 103 104 104 105 mirror = { 105 - modules = []; 106 - target = "213.163.194.13"; 106 + modules = [ 107 + tangled-mirror.nixosModules.knotmirror 108 + { nixpkgs.overlays = [ tangled-mirror.overlays.default ]; } 109 + ./hosts/mirror/services/knotmirror.nix 110 + ]; 111 + target = "81.27.110.122"; 107 112 }; 108 113 }; 109 114 in
+26
hosts/mirror/services/knotmirror.nix
··· 1 + { pkgs, ... }: { 2 + environment.systemPackages = [ 3 + pkgs.postgresql_14 4 + ]; 5 + services.postgresql = { 6 + enable = true; 7 + package = pkgs.postgresql_14; 8 + ensureDatabases = ["mirrordb"]; 9 + ensureUsers = [ 10 + { name = "tnglr"; } 11 + ]; 12 + authentication = '' 13 + local mirrordb tnglr trust 14 + host mirrordb tnglr 127.0.0.1/32 trust 15 + ''; 16 + }; 17 + services.tangled.knotmirror = { 18 + enable = true; 19 + package = pkgs.knotmirror; 20 + listenAddr = "0.0.0.0:7000"; 21 + hostname = "mirror.tngl.boltless.me"; 22 + dbUrl = "postgresql://tnglr@127.0.0.1:5432/mirrordb"; 23 + fullNetwork = true; 24 + }; 25 + networking.firewall.allowedTCPPorts = [7000 7200]; 26 + }