diff --git a/flake.nix b/flake.nix index 9e66decc..e39d921a 100644 --- a/flake.nix +++ b/flake.nix @@ -106,12 +106,15 @@ knot-unwrapped = self.callPackage ./nix/pkgs/knot-unwrapped.nix {}; knot = self.callPackage ./nix/pkgs/knot.nix {}; dolly = self.callPackage ./nix/pkgs/dolly.nix {}; + did-method-plc = self.callPackage ./nix/pkgs/did-method-plc.nix {}; + bluesky-jetstream = self.callPackage ./nix/pkgs/bluesky-jetstream.nix {}; + bluesky-relay = self.callPackage ./nix/pkgs/bluesky-relay.nix {}; tap = self.callPackage ./nix/pkgs/tap.nix {}; knotmirror = self.callPackage ./nix/pkgs/knotmirror.nix {}; }); in { overlays.default = final: prev: { - inherit (mkPackageSet final) lexgen goat sqlite-lib spindle knot-unwrapped knot appview docs dolly tap knotmirror; + inherit (mkPackageSet final) lexgen goat sqlite-lib spindle knot-unwrapped knot appview docs dolly tap knotmirror did-method-plc bluesky-jetstream bluesky-relay; }; packages = forAllSystems (system: let @@ -132,6 +135,9 @@ sqlite-lib docs dolly + did-method-plc + bluesky-jetstream + bluesky-relay tap knotmirror ; @@ -382,5 +388,29 @@ services.tangled.spindle.package = lib.mkDefault self.packages.${pkgs.stdenv.hostPlatform.system}.spindle; }; + nixosModules.did-method-plc = { + lib, + pkgs, + ... + }: { + imports = [./nix/modules/did-method-plc.nix]; + services.did-method-plc.package = lib.mkDefault self.packages.${pkgs.system}.did-method-plc; + }; + nixosModules.bluesky-relay = { + lib, + pkgs, + ... + }: { + imports = [./nix/modules/bluesky-relay.nix]; + services.bluesky-relay.package = lib.mkDefault self.packages.${pkgs.system}.bluesky-relay; + }; + nixosModules.bluesky-jetstream = { + lib, + pkgs, + ... + }: { + imports = [./nix/modules/bluesky-jetstream.nix]; + services.bluesky-jetstream.package = lib.mkDefault self.packages.${pkgs.system}.bluesky-jetstream; + }; }; } diff --git a/nix/modules/bluesky-jetstream.nix b/nix/modules/bluesky-jetstream.nix new file mode 100644 index 00000000..589d29a0 --- /dev/null +++ b/nix/modules/bluesky-jetstream.nix @@ -0,0 +1,64 @@ +{ + config, + pkgs, + lib, + ... +}: let + cfg = config.services.bluesky-jetstream; +in + with lib; { + options.services.bluesky-jetstream = { + enable = mkEnableOption "jetstream server"; + package = mkPackageOption pkgs "bluesky-jetstream" {}; + + # dataDir = mkOption { + # type = types.str; + # default = "/var/lib/jetstream"; + # description = "directory to store data (pebbleDB)"; + # }; + livenessTtl = mkOption { + type = types.int; + default = 15; + description = "time to restart when no event detected (seconds)"; + }; + websocketUrl = mkOption { + type = types.str; + default = "wss://bsky.network/xrpc/com.atproto.sync.subscribeRepos"; + description = "full websocket path to the ATProto SubscribeRepos XRPC endpoint"; + }; + }; + config = mkIf cfg.enable { + systemd.services.bluesky-jetstream = { + description = "bluesky jetstream"; + after = ["network.target" "pds.service"]; + wantedBy = ["multi-user.target"]; + + serviceConfig = { + User = "jetstream"; + Group = "jetstream"; + StateDirectory = "jetstream"; + StateDirectoryMode = "0755"; + # preStart = '' + # mkdir -p "${cfg.dataDir}" + # chown -R jetstream:jetstream "${cfg.dataDir}" + # ''; + # WorkingDirectory = cfg.dataDir; + Environment = [ + "JETSTREAM_DATA_DIR=/var/lib/jetstream/data" + "JETSTREAM_LIVENESS_TTL=${toString cfg.livenessTtl}s" + "JETSTREAM_WS_URL=${cfg.websocketUrl}" + ]; + ExecStart = getExe cfg.package; + Restart = "always"; + RestartSec = 5; + }; + }; + users = { + users.jetstream = { + group = "jetstream"; + isSystemUser = true; + }; + groups.jetstream = {}; + }; + }; + } diff --git a/nix/modules/bluesky-relay.nix b/nix/modules/bluesky-relay.nix new file mode 100644 index 00000000..4d75372f --- /dev/null +++ b/nix/modules/bluesky-relay.nix @@ -0,0 +1,48 @@ +{ + config, + pkgs, + lib, + ... +}: let + cfg = config.services.bluesky-relay; +in + with lib; { + options.services.bluesky-relay = { + enable = mkEnableOption "relay server"; + package = mkPackageOption pkgs "bluesky-relay" {}; + }; + config = mkIf cfg.enable { + systemd.services.bluesky-relay = { + description = "bluesky relay"; + after = ["network.target" "pds.service"]; + wantedBy = ["multi-user.target"]; + + serviceConfig = { + User = "relay"; + Group = "relay"; + StateDirectory = "relay"; + StateDirectoryMode = "0755"; + Environment = [ + "RELAY_ADMIN_PASSWORD=password" + "RELAY_PLC_HOST=https://plc.tngl.boltless.dev" + "DATABASE_URL=sqlite:///var/lib/relay/relay.sqlite" + "RELAY_IP_BIND=:2470" + "RELAY_PERSIST_DIR=/var/lib/relay" + "RELAY_DISABLE_REQUEST_CRAWL=0" + "RELAY_INITIAL_SEQ_NUMBER=1" + "RELAY_ALLOW_INSECURE_HOSTS=1" + ]; + ExecStart = "${getExe cfg.package} serve"; + Restart = "always"; + RestartSec = 5; + }; + }; + users = { + users.relay = { + group = "relay"; + isSystemUser = true; + }; + groups.relay = {}; + }; + }; + } diff --git a/nix/modules/did-method-plc.nix b/nix/modules/did-method-plc.nix new file mode 100644 index 00000000..a53e210a --- /dev/null +++ b/nix/modules/did-method-plc.nix @@ -0,0 +1,74 @@ +{ + config, + pkgs, + lib, + ... +}: let + cfg = config.services.did-method-plc; +in + with lib; { + options.services.did-method-plc = { + enable = mkEnableOption "did-method-plc server"; + package = mkPackageOption pkgs "did-method-plc" {}; + }; + config = mkIf cfg.enable { + services.postgresql = { + ensureDatabases = ["plc"]; + ensureUsers = [ + { + name = "pg"; + # ensurePermissions."DATABASE plc" = "ALL PRIVILEGES"; + } + ]; + authentication = '' + local all all trust + host all all 127.0.0.1/32 trust + ''; + }; + systemd.services.did-method-plc = { + description = "did-method-plc"; + + after = ["postgresql.service"]; + wants = ["postgresql.service"]; + wantedBy = ["multi-user.target"]; + + environment = let + db_creds_json = builtins.toJSON { + username = "pg"; + password = ""; + host = "127.0.0.1"; + port = 5432; + }; + in { + # TODO: inherit from config + DEBUG_MODE = "1"; + LOG_ENABLED = "true"; + LOG_LEVEL = "debug"; + LOG_DESTINATION = "1"; + ENABLE_MIGRATIONS = "true"; + DB_CREDS_JSON = db_creds_json; + DB_MIGRATE_CREDS_JSON = db_creds_json; + PLC_VERSION = "0.0.1"; + PORT = "8080"; + }; + + serviceConfig = { + ExecStart = getExe cfg.package; + User = "plc"; + Group = "plc"; + StateDirectory = "plc"; + StateDirectoryMode = "0755"; + Restart = "always"; + + # Hardening + }; + }; + users = { + users.plc = { + group = "plc"; + isSystemUser = true; + }; + groups.plc = {}; + }; + }; + } diff --git a/nix/pkgs/bluesky-jetstream.nix b/nix/pkgs/bluesky-jetstream.nix new file mode 100644 index 00000000..7a7a1d41 --- /dev/null +++ b/nix/pkgs/bluesky-jetstream.nix @@ -0,0 +1,20 @@ +{ + buildGoModule, + fetchFromGitHub, +}: +buildGoModule { + pname = "bluesky-jetstream"; + version = "0.1.0"; + src = fetchFromGitHub { + owner = "bluesky-social"; + repo = "jetstream"; + rev = "7d7efa58d7f14101a80ccc4f1085953948b7d5de"; + sha256 = "sha256-1e9SL/8gaDPMA4YZed51ffzgpkptbMd0VTbTTDbPTFw="; + }; + subPackages = ["cmd/jetstream"]; + vendorHash = "sha256-/21XJQH6fo9uPzlABUAbdBwt1O90odmppH6gXu2wkiQ="; + doCheck = false; + meta = { + mainProgram = "jetstream"; + }; +} diff --git a/nix/pkgs/bluesky-relay.nix b/nix/pkgs/bluesky-relay.nix new file mode 100644 index 00000000..5bc7cf2d --- /dev/null +++ b/nix/pkgs/bluesky-relay.nix @@ -0,0 +1,20 @@ +{ + buildGoModule, + fetchFromGitHub, +}: +buildGoModule { + pname = "bluesky-relay"; + version = "0.1.0"; + src = fetchFromGitHub { + owner = "boltlessengineer"; + repo = "indigo"; + rev = "7fe70a304d795b998f354d2b7b2050b909709c99"; + sha256 = "sha256-+h34x67cqH5t30+8rua53/ucvbn3BanrmH0Og3moHok="; + }; + subPackages = ["cmd/relay"]; + vendorHash = "sha256-UOedwNYnM8Jx6B7Y9tFcZX8IeUBESAFAPTRYk7n0yo8="; + doCheck = false; + meta = { + mainProgram = "relay"; + }; +} diff --git a/nix/pkgs/did-method-plc.nix b/nix/pkgs/did-method-plc.nix new file mode 100644 index 00000000..f71cbc6d --- /dev/null +++ b/nix/pkgs/did-method-plc.nix @@ -0,0 +1,65 @@ +# inspired by https://github.com/NixOS/nixpkgs/blob/333bfb7c258fab089a834555ea1c435674c459b4/pkgs/by-name/ga/gatsby-cli/package.nix +{ + lib, + stdenv, + fetchFromGitHub, + fetchYarnDeps, + yarnConfigHook, + yarnBuildHook, + nodejs, + makeBinaryWrapper, +}: +stdenv.mkDerivation (finalAttrs: { + pname = "did-method-plc"; + version = "0.0.1"; + + src = fetchFromGitHub { + owner = "did-method-plc"; + repo = "did-method-plc"; + rev = "158ba5535ac3da4fd4309954bde41deab0b45972"; + sha256 = "sha256-O5smubbrnTDMCvL6iRyMXkddr5G7YHxkQRVMRULHanQ="; + }; + postPatch = '' + # remove dd-trace dependency + sed -i '3d' packages/server/service/index.js + ''; + + yarnOfflineCache = fetchYarnDeps { + yarnLock = finalAttrs.src + "/yarn.lock"; + hash = "sha256-g8GzaAbWSnWwbQjJMV2DL5/ZlWCCX0sRkjjvX3tqU4Y="; + }; + + nativeBuildInputs = [ + yarnConfigHook + yarnBuildHook + nodejs + makeBinaryWrapper + ]; + yarnBuildScript = "lerna"; + yarnBuildFlags = [ + "run" + "build" + "--scope" + "@did-plc/server" + "--include-dependencies" + ]; + + installPhase = '' + runHook preInstall + + mkdir -p $out/lib/node_modules/ + mv packages/ $out/lib/packages/ + mv node_modules/* $out/lib/node_modules/ + + makeWrapper ${lib.getExe nodejs} $out/bin/plc \ + --add-flags $out/lib/packages/server/service/index.js \ + --add-flags --enable-source-maps \ + --set NODE_PATH $out/lib/node_modules + + runHook postInstall + ''; + + meta = { + mainProgram = "plc"; + }; +})