From 8262bcd1c5bbd3514d2de52a350a6cc4a6ebd01b Mon Sep 17 00:00:00 2001 From: Seongmin Lee Date: Fri, 17 Oct 2025 02:13:44 +0900 Subject: [PATCH] nix: add more nix packages/modules related to atproto - did-method-plc - bluesky-jetstream - bluesky-relay - tap Signed-off-by: Seongmin Lee --- flake.nix | 34 +++++++++++++- nix/modules/bluesky-jetstream.nix | 64 ++++++++++++++++++++++++++ nix/modules/bluesky-relay.nix | 48 +++++++++++++++++++ nix/modules/did-method-plc.nix | 76 +++++++++++++++++++++++++++++++ nix/pkgs/bluesky-jetstream.nix | 20 ++++++++ nix/pkgs/bluesky-relay.nix | 20 ++++++++ nix/pkgs/did-method-plc.nix | 65 ++++++++++++++++++++++++++ nix/pkgs/tap.nix | 20 ++++++++ 8 files changed, 346 insertions(+), 1 deletion(-) create mode 100644 nix/modules/bluesky-jetstream.nix create mode 100644 nix/modules/bluesky-relay.nix create mode 100644 nix/modules/did-method-plc.nix create mode 100644 nix/pkgs/bluesky-jetstream.nix create mode 100644 nix/pkgs/bluesky-relay.nix create mode 100644 nix/pkgs/did-method-plc.nix create mode 100644 nix/pkgs/tap.nix diff --git a/flake.nix b/flake.nix index 673613da..4b22a143 100644 --- a/flake.nix +++ b/flake.nix @@ -95,10 +95,14 @@ 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 {}; }); in { overlays.default = final: prev: { - inherit (mkPackageSet final) lexgen goat sqlite-lib spindle knot-unwrapped knot appview docs dolly; + inherit (mkPackageSet final) lexgen goat sqlite-lib spindle knot-unwrapped knot appview docs dolly did-method-plc bluesky-jetstream bluesky-relay tap; }; packages = forAllSystems (system: let @@ -119,6 +123,10 @@ sqlite-lib docs dolly + did-method-plc + bluesky-jetstream + bluesky-relay + tap ; pkgsStatic-appview = staticPackages.appview; @@ -324,5 +332,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..94f24d0b --- /dev/null +++ b/nix/modules/did-method-plc.nix @@ -0,0 +1,76 @@ +{ + 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 = { + enable = true; + package = pkgs.postgresql_14; + 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"; + }; +}) diff --git a/nix/pkgs/tap.nix b/nix/pkgs/tap.nix new file mode 100644 index 00000000..604727ef --- /dev/null +++ b/nix/pkgs/tap.nix @@ -0,0 +1,20 @@ +{ + buildGoModule, + fetchFromGitHub, +}: +buildGoModule { + pname = "tap"; + version = "0.1.0"; + src = fetchFromGitHub { + owner = "bluesky-social"; + repo = "indigo"; + rev = "498ecb9693e8ae050f73234c86f340f51ad896a9"; + sha256 = "sha256-KASCdwkg/hlKBt7RTW3e3R5J3hqJkphoarFbaMgtN1k="; + }; + subPackages = ["cmd/tap"]; + vendorHash = "sha256-UOedwNYnM8Jx6B7Y9tFcZX8IeUBESAFAPTRYk7n0yo8="; + doCheck = false; + meta = { + mainProgram = "tap"; + }; +} -- 2.51.2