Something went wrong. Try again.
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106{ hydrant-src, tangled-lexicons-src, lib, pkgs, peers, ...}: let port = 13010; lexiconFiles = dir: let entries = builtins.readDir dir; in lib.concatMap ( name: let type = entries.${name}; path = "${dir}/${name}"; in if type == "directory" then lexiconFiles path else lib.optional (type == "regular" && lib.hasSuffix ".json" name) path ) (builtins.attrNames entries); lexicons = map (path: builtins.fromJSON (builtins.readFile path)) (lexiconFiles "${tangled-lexicons-src}/lexicons"); signals = lib.sort builtins.lessThan ( map (lexicon: lexicon.id) (builtins.filter (lexicon: (lexicon.defs.main.type or null) == "record") lexicons) ); hydrant = (pkgs.callPackage "${hydrant-src}/default.nix" {}).overrideAttrs { cargoBuildFeatures = ["jetstream"]; };in { users.groups.hydrant = {}; users.users.hydrant = { isSystemUser = true; group = "hydrant"; };
# holds the api port across restarts and connects queue instead of getting refused systemd.sockets.hydrant = { wantedBy = ["sockets.target"]; listenStreams = ["127.0.0.1:${toString port}"]; };
systemd.services.hydrant = { description = "tangled atproto indexer and jetstream service"; wantedBy = ["multi-user.target"]; requires = ["hydrant.socket"]; wants = ["network-online.target"]; after = ["network-online.target" "hydrant.socket"];
environment = { HYDRANT_API_BIND = "127.0.0.1:${toString port}"; # bobbin reads /repos over tcp, and nginx is what keeps the rest of the management api shut HYDRANT_API_TCP_MANAGEMENT = "true"; HYDRANT_DATABASE_PATH = "/var/lib/hydrant/db"; HYDRANT_RELAY_HOSTS = ""; # the other hydrants too, so a host one of them was asked to crawl reaches this one HYDRANT_SEED_HOSTS = lib.concatStringsSep "," (["https://relay.fire.hose.cam" "https://bsky.network"] ++ map (ip: "http://${ip}") peers); HYDRANT_CRAWLER_URLS = "list_repos::https://tngl.sh,by_collection::https://lightrail.microcosm.blue"; HYDRANT_PLC_URL = "https://plc.directory"; HYDRANT_FILTER_COLLECTIONS = "sh.tangled.*,org.tangled.*"; HYDRANT_FILTER_SIGNALS = lib.concatStringsSep "," signals; HYDRANT_VERIFY_SIGNATURES = "full"; HYDRANT_BACKFILL_CONCURRENCY_LIMIT = "10"; HYDRANT_CRAWLER_MAX_PENDING_REPOS = "256"; HYDRANT_CRAWLER_RESUME_PENDING_REPOS = "128"; HYDRANT_CACHE_SIZE = "128"; HYDRANT_DATA_COMPRESSION = "lz4"; HYDRANT_DB_EVENTS_MEMTABLE_SIZE_MB = "16"; HYDRANT_DB_RECORDS_MEMTABLE_SIZE_MB = "16"; HYDRANT_DB_REPOS_MEMTABLE_SIZE_MB = "8"; HYDRANT_DB_WORKER_THREADS = "2"; HYDRANT_FIREHOSE_MAX_FAILURES = "5"; HYDRANT_FIREHOSE_WORKERS = "4"; HYDRANT_GET_REPO_CONCURRENCY_LIMIT = "1"; HYDRANT_IDENTITY_CACHE_SIZE = "50000"; HYDRANT_MAX_CAR_BODY_BYTES = "268435456"; HYDRANT_PER_PDS_CONCURRENCY = "10"; HYDRANT_OFFLINE_HOST_RETRY_INTERVAL = "6h"; HYDRANT_STREAM_PENDING_EVENT_LIMIT = "1024"; HYDRANT_TIER_RULES = "tngl.sh:trusted,*.mock.tangled.org:trusted"; RUST_LOG = "info"; };
serviceConfig = { Type = "simple"; ExecStart = "${hydrant}/bin/hydrant"; Restart = "on-failure"; RestartSec = "10s"; User = "hydrant"; Group = "hydrant"; StateDirectory = "hydrant"; StateDirectoryMode = "0750"; WorkingDirectory = "/var/lib/hydrant"; NoNewPrivileges = true; PrivateTmp = true; ProtectSystem = "strict"; ProtectHome = true; LimitNOFILE = 1048576; }; };}