···
nixpkgs.lib.nixosSystem {
26
+
self.nixosModules.did-method-plc
27
+
self.nixosModules.jetstream
self.nixosModules.spindle
···
···
# as SQLite is incompatible with them. So instead we
# mount the shared directories to a different location
# and copy the contents around on service start/stop.
86
+
source = "$TANGLED_VM_DATA_DIR/caddy";
87
+
target = config.services.caddy.dataDir;
source = "$TANGLED_VM_DATA_DIR/knot";
target = "/mnt/knot-data";
···
target = "/var/log/spindle";
102
+
useHostCerts = true;
# This is fine because any and all ports that are forwarded to host are explicitly marked above, we don't need a separate guest firewall
networking.firewall.enable = false;
106
+
# resolve `*.tngl.boltless.dev` to host
107
+
services.dnsmasq.enable = true;
108
+
services.dnsmasq.settings.address = "/tngl.boltless.dev/10.0.2.2";
time.timeZone = "Europe/London";
110
+
services.timesyncd.enable = lib.mkVMOverride true;
services.getty.autologinUser = "root";
environment.systemPackages = with pkgs; [curl vim git sqlite litecli];
services.tangled.knot = {
···
142
+
# overriding package version to support emails
143
+
package = pkgs.pds.overrideAttrs (old: rec {
144
+
version = "0.4.188";
145
+
src = pkgs.fetchFromGitHub {
146
+
owner = "bluesky-social";
148
+
tag = "v${version}";
149
+
hash = "sha256-t8KdyEygXdbj/5Rhj8W40e1o8mXprELpjsKddHExmo0=";
151
+
pnpmDeps = pkgs.pnpm_9.fetchDeps {
152
+
inherit version src;
154
+
sourceRoot = old.sourceRoot;
155
+
fetcherVersion = 2;
156
+
hash = "sha256-lQie7f8JbWKSpoavnMjHegBzH3GB9teXsn+S2SLJHHU=";
160
+
LOG_ENABLED = "true";
162
+
PDS_JWT_SECRET = "8cae8bffcc73d9932819650791e4e89a";
163
+
PDS_ADMIN_PASSWORD = "d6a902588cd93bee1af83f924f60cfd3";
164
+
PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX = "2e92e336a50a618458e1097d94a1db86ec3fd8829d7735020cbae80625c761d7";
166
+
PDS_EMAIL_SMTP_URL = envVarOr "TANGLED_VM_PDS_EMAIL_SMTP_URL" null;
167
+
PDS_EMAIL_FROM_ADDRESS = envVarOr "TANGLED_VM_PDS_EMAIL_FROM_ADDRESS" null;
169
+
PDS_DID_PLC_URL = "http://localhost:8080";
170
+
PDS_HOSTNAME = "pds.tngl.boltless.dev";
174
+
services.plc.enable = true;
175
+
services.jetstream = {
178
+
websocketUrl = "ws://localhost:3000/xrpc/com.atproto.sync.subscribeRepos";
182
+
configFile = pkgs.writeText "Caddyfile" ''
185
+
cert_lifetime 3601d
188
+
intermediate_lifetime 3599d
193
+
plc.tngl.boltless.dev {
195
+
reverse_proxy http://localhost:8080
198
+
*.pds.tngl.boltless.dev, pds.tngl.boltless.dev {
200
+
reverse_proxy http://localhost:3000
203
+
jetstream.tngl.boltless.dev {
205
+
reverse_proxy http://localhost:6008
208
+
knot.tngl.boltless.dev {
210
+
reverse_proxy http://localhost:6444
213
+
spindle.tngl.boltless.dev {
215
+
reverse_proxy http://localhost:6555
# So we don't have to deal with permission clashing between
# blank disk VMs and existing state