Skip to content

Commit

Permalink
haven: Apply suggestions from code review
Browse files Browse the repository at this point in the history
Co-authored-by: isabel <[email protected]>
  • Loading branch information
felixzieger and isabelroses committed Feb 21, 2025
1 parent 0609c19 commit 835a712
Show file tree
Hide file tree
Showing 2 changed files with 108 additions and 105 deletions.
203 changes: 103 additions & 100 deletions nixos/modules/services/web-apps/haven.nix
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,105 @@
...
}:
let
defaultConfig = {
OWNER_NPUB = cfg.ownerNpub;
RELAY_URL = cfg.relayUrl;
RELAY_PORT = toString cfg.port;
RELAY_BIND_ADDRESS = "0.0.0.0"; # Can be set to a specific IP4 or IP6 address ("" for all interfaces)
DB_ENGINE = "badger"; # badger, lmdb (lmdb works best with an nvme, otherwise you might have stability issues)
LMDB_MAPSIZE = toString 0; # 0 for default (currently ~273GB), or set to a different size in bytes, e.g. 10737418240 for 10GB
BLOSSOM_PATH = "blossom/";

## Private Relay Settings
PRIVATE_RELAY_NAME = " ${cfg.ownerName}'s private relay";
PRIVATE_RELAY_NPUB = cfg.ownerNpub;
PRIVATE_RELAY_DESCRIPTION = "A safe place to store my drafts and ecash";
PRIVATE_RELAY_ICON = "https://i.nostr.build/6G6wW.gif";

## Private Relay Rate Limiters
PRIVATE_RELAY_EVENT_IP_LIMITER_TOKENS_PER_INTERVAL = toString 50;
PRIVATE_RELAY_EVENT_IP_LIMITER_INTERVAL = toString 1;
PRIVATE_RELAY_EVENT_IP_LIMITER_MAX_TOKENS = toString 100;
PRIVATE_RELAY_ALLOW_EMPTY_FILTERS = "true";
PRIVATE_RELAY_ALLOW_COMPLEX_FILTERS = "true";
PRIVATE_RELAY_CONNECTION_RATE_LIMITER_TOKENS_PER_INTERVAL = toString 3;
PRIVATE_RELAY_CONNECTION_RATE_LIMITER_INTERVAL = toString 5;
PRIVATE_RELAY_CONNECTION_RATE_LIMITER_MAX_TOKENS = toString 9;

## Chat Relay Settings
CHAT_RELAY_NAME = " ${cfg.ownerName}'s chat relay";
CHAT_RELAY_NPUB = cfg.ownerNpub;
CHAT_RELAY_DESCRIPTION = "a relay for private chats";
CHAT_RELAY_ICON = "https://i.nostr.build/6G6wW.gif";
CHAT_RELAY_WOT_DEPTH = toString 3;
CHAT_RELAY_WOT_REFRESH_INTERVAL_HOURS = toString 24;
CHAT_RELAY_MINIMUM_FOLLOWERS = toString 3;

## Chat Relay Rate Limiters
CHAT_RELAY_EVENT_IP_LIMITER_TOKENS_PER_INTERVAL = toString 50;
CHAT_RELAY_EVENT_IP_LIMITER_INTERVAL = toString 1;
CHAT_RELAY_EVENT_IP_LIMITER_MAX_TOKENS = toString 100;
CHAT_RELAY_ALLOW_EMPTY_FILTERS = "false";
CHAT_RELAY_ALLOW_COMPLEX_FILTERS = "false";
CHAT_RELAY_CONNECTION_RATE_LIMITER_TOKENS_PER_INTERVAL = toString 3;
CHAT_RELAY_CONNECTION_RATE_LIMITER_INTERVAL = toString 3;
CHAT_RELAY_CONNECTION_RATE_LIMITER_MAX_TOKENS = toString 9;

## Outbox Relay Settings
OUTBOX_RELAY_NAME = " ${cfg.ownerName}'s outbox relay";
OUTBOX_RELAY_NPUB = cfg.ownerNpub;
OUTBOX_RELAY_DESCRIPTION = "a relay and Blossom server for public messages and media";
OUTBOX_RELAY_ICON = "https://i.nostr.build/6G6wW.gif";

## Outbox Relay Rate Limiters
OUTBOX_RELAY_EVENT_IP_LIMITER_TOKENS_PER_INTERVAL = toString 10;
OUTBOX_RELAY_EVENT_IP_LIMITER_INTERVAL = toString 60;
OUTBOX_RELAY_EVENT_IP_LIMITER_MAX_TOKENS = toString 100;
OUTBOX_RELAY_ALLOW_EMPTY_FILTERS = "false";
OUTBOX_RELAY_ALLOW_COMPLEX_FILTERS = "false";
OUTBOX_RELAY_CONNECTION_RATE_LIMITER_TOKENS_PER_INTERVAL = toString 3;
OUTBOX_RELAY_CONNECTION_RATE_LIMITER_INTERVAL = toString 1;
OUTBOX_RELAY_CONNECTION_RATE_LIMITER_MAX_TOKENS = toString 9;

## Inbox Relay Settings
INBOX_RELAY_NAME = " ${cfg.ownerName}'s inbox relay";
INBOX_RELAY_NPUB = cfg.ownerNpub;
INBOX_RELAY_DESCRIPTION = "send your interactions with my notes here";
INBOX_RELAY_ICON = "https://i.nostr.build/6G6wW.gif";
INBOX_PULL_INTERVAL_SECONDS = toString 600;

## Inbox Relay Rate Limiters
INBOX_RELAY_EVENT_IP_LIMITER_TOKENS_PER_INTERVAL = toString 10;
INBOX_RELAY_EVENT_IP_LIMITER_INTERVAL = toString 1;
INBOX_RELAY_EVENT_IP_LIMITER_MAX_TOKENS = toString 20;
INBOX_RELAY_ALLOW_EMPTY_FILTERS = "false";
INBOX_RELAY_ALLOW_COMPLEX_FILTERS = "false";
INBOX_RELAY_CONNECTION_RATE_LIMITER_TOKENS_PER_INTERVAL = toString 3;
INBOX_RELAY_CONNECTION_RATE_LIMITER_INTERVAL = toString 1;
INBOX_RELAY_CONNECTION_RATE_LIMITER_MAX_TOKENS = toString 9;

## Import Settings
IMPORT_START_DATE = "2025-01-01";
IMPORT_QUERY_INTERVAL_SECONDS = toString 600;
IMPORT_SEED_RELAYS_FILE = "${pkgs.writeText "relays_import.json" (
builtins.toJSON cfg.importRelays
)}";

## Backup Settings
BACKUP_PROVIDER = "none"; # s3, none (or leave blank to disable)
BACKUP_INTERVAL_HOURS = toString 1;

## Generic S3 Bucket Backup Settings - REQUIRED IF BACKUP_PROVIDER="s3"
S3_ACCESS_KEY_ID = "access";
S3_SECRET_KEY = "secret";
S3_ENDPOINT = "nyc3.digitaloceanspaces.com";
S3_REGION = "nyc3";
S3_BUCKET_NAME = "backups";

## Blastr Settings
BLASTR_RELAYS_FILE = "${pkgs.writeText "relays_blastr.json" (builtins.toJSON cfg.blastrRelays)}";
};

cfg = config.services.haven;
in
{
Expand Down Expand Up @@ -60,6 +159,7 @@ in
settings = lib.mkOption {
type = lib.types.attrsOf lib.types.str;
default = { };
apply = lib.mergeAttrs defaultConfig;
description = "Additional environment variables to set for the Haven service. See https://github.com/bitvora/haven for documentation.";
example = lib.literalExpression ''
{
Expand Down Expand Up @@ -95,108 +195,11 @@ in
description = "haven";
wants = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
environment = {
OWNER_NPUB = cfg.ownerNpub;
RELAY_URL = cfg.relayUrl;
RELAY_PORT = toString cfg.port;
RELAY_BIND_ADDRESS = "0.0.0.0"; # Can be set to a specific IP4 or IP6 address ("" for all interfaces)
DB_ENGINE = "badger"; # badger, lmdb (lmdb works best with an nvme, otherwise you might have stability issues)
LMDB_MAPSIZE = toString 0; # 0 for default (currently ~273GB), or set to a different size in bytes, e.g. 10737418240 for 10GB
BLOSSOM_PATH = "blossom/";

## Private Relay Settings
PRIVATE_RELAY_NAME = " ${cfg.ownerName}'s private relay";
PRIVATE_RELAY_NPUB = cfg.ownerNpub;
PRIVATE_RELAY_DESCRIPTION = "A safe place to store my drafts and ecash";
PRIVATE_RELAY_ICON = "https://i.nostr.build/6G6wW.gif";

## Private Relay Rate Limiters
PRIVATE_RELAY_EVENT_IP_LIMITER_TOKENS_PER_INTERVAL = toString 50;
PRIVATE_RELAY_EVENT_IP_LIMITER_INTERVAL = toString 1;
PRIVATE_RELAY_EVENT_IP_LIMITER_MAX_TOKENS = toString 100;
PRIVATE_RELAY_ALLOW_EMPTY_FILTERS = "true";
PRIVATE_RELAY_ALLOW_COMPLEX_FILTERS = "true";
PRIVATE_RELAY_CONNECTION_RATE_LIMITER_TOKENS_PER_INTERVAL = toString 3;
PRIVATE_RELAY_CONNECTION_RATE_LIMITER_INTERVAL = toString 5;
PRIVATE_RELAY_CONNECTION_RATE_LIMITER_MAX_TOKENS = toString 9;

## Chat Relay Settings
CHAT_RELAY_NAME = " ${cfg.ownerName}'s chat relay";
CHAT_RELAY_NPUB = cfg.ownerNpub;
CHAT_RELAY_DESCRIPTION = "a relay for private chats";
CHAT_RELAY_ICON = "https://i.nostr.build/6G6wW.gif";
CHAT_RELAY_WOT_DEPTH = toString 3;
CHAT_RELAY_WOT_REFRESH_INTERVAL_HOURS = toString 24;
CHAT_RELAY_MINIMUM_FOLLOWERS = toString 3;

## Chat Relay Rate Limiters
CHAT_RELAY_EVENT_IP_LIMITER_TOKENS_PER_INTERVAL = toString 50;
CHAT_RELAY_EVENT_IP_LIMITER_INTERVAL = toString 1;
CHAT_RELAY_EVENT_IP_LIMITER_MAX_TOKENS = toString 100;
CHAT_RELAY_ALLOW_EMPTY_FILTERS = "false";
CHAT_RELAY_ALLOW_COMPLEX_FILTERS = "false";
CHAT_RELAY_CONNECTION_RATE_LIMITER_TOKENS_PER_INTERVAL = toString 3;
CHAT_RELAY_CONNECTION_RATE_LIMITER_INTERVAL = toString 3;
CHAT_RELAY_CONNECTION_RATE_LIMITER_MAX_TOKENS = toString 9;

## Outbox Relay Settings
OUTBOX_RELAY_NAME = " ${cfg.ownerName}'s outbox relay";
OUTBOX_RELAY_NPUB = cfg.ownerNpub;
OUTBOX_RELAY_DESCRIPTION = "a relay and Blossom server for public messages and media";
OUTBOX_RELAY_ICON = "https://i.nostr.build/6G6wW.gif";

## Outbox Relay Rate Limiters
OUTBOX_RELAY_EVENT_IP_LIMITER_TOKENS_PER_INTERVAL = toString 10;
OUTBOX_RELAY_EVENT_IP_LIMITER_INTERVAL = toString 60;
OUTBOX_RELAY_EVENT_IP_LIMITER_MAX_TOKENS = toString 100;
OUTBOX_RELAY_ALLOW_EMPTY_FILTERS = "false";
OUTBOX_RELAY_ALLOW_COMPLEX_FILTERS = "false";
OUTBOX_RELAY_CONNECTION_RATE_LIMITER_TOKENS_PER_INTERVAL = toString 3;
OUTBOX_RELAY_CONNECTION_RATE_LIMITER_INTERVAL = toString 1;
OUTBOX_RELAY_CONNECTION_RATE_LIMITER_MAX_TOKENS = toString 9;

## Inbox Relay Settings
INBOX_RELAY_NAME = " ${cfg.ownerName}'s inbox relay";
INBOX_RELAY_NPUB = cfg.ownerNpub;
INBOX_RELAY_DESCRIPTION = "send your interactions with my notes here";
INBOX_RELAY_ICON = "https://i.nostr.build/6G6wW.gif";
INBOX_PULL_INTERVAL_SECONDS = toString 600;

## Inbox Relay Rate Limiters
INBOX_RELAY_EVENT_IP_LIMITER_TOKENS_PER_INTERVAL = toString 10;
INBOX_RELAY_EVENT_IP_LIMITER_INTERVAL = toString 1;
INBOX_RELAY_EVENT_IP_LIMITER_MAX_TOKENS = toString 20;
INBOX_RELAY_ALLOW_EMPTY_FILTERS = "false";
INBOX_RELAY_ALLOW_COMPLEX_FILTERS = "false";
INBOX_RELAY_CONNECTION_RATE_LIMITER_TOKENS_PER_INTERVAL = toString 3;
INBOX_RELAY_CONNECTION_RATE_LIMITER_INTERVAL = toString 1;
INBOX_RELAY_CONNECTION_RATE_LIMITER_MAX_TOKENS = toString 9;

## Import Settings
IMPORT_START_DATE = "2025-01-01";
IMPORT_QUERY_INTERVAL_SECONDS = toString 600;
IMPORT_SEED_RELAYS_FILE = "${pkgs.writeText "relays_import.json" (
builtins.toJSON cfg.importRelays
)}";

## Backup Settings
BACKUP_PROVIDER = "none"; # s3, none (or leave blank to disable)
BACKUP_INTERVAL_HOURS = toString 1;

## Generic S3 Bucket Backup Settings - REQUIRED IF BACKUP_PROVIDER="s3"
S3_ACCESS_KEY_ID = "access";
S3_SECRET_KEY = "secret";
S3_ENDPOINT = "nyc3.digitaloceanspaces.com";
S3_REGION = "nyc3";
S3_BUCKET_NAME = "backups";

## Blastr Settings
BLASTR_RELAYS_FILE = "${pkgs.writeText "relays_blastr.json" (builtins.toJSON cfg.blastrRelays)}";
} // cfg.settings;
environment = cfg.settings;

serviceConfig = {
ExecStart = "${cfg.package}/bin/haven";
EnvironmentFile = lib.mkIf (cfg.environmentFile != null) cfg.environmentFile;
ExecStart = lib.getExe cfg.package;
EnvironmentFile = cfg.environmentFile;
User = "haven";
Group = "haven";
Restart = "on-failure";
Expand Down
10 changes: 5 additions & 5 deletions pkgs/by-name/ha/haven/package.nix
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ buildGoModule rec {
src = fetchFromGitHub {
owner = "bitvora";
repo = "haven";
rev = "v${version}";
sha256 = "sha256-rSycrHW53TgqbsfgaRn3492EWtpu440GtbegozqnzMQ=";
tag = "v${version}";
hash = "sha256-rSycrHW53TgqbsfgaRn3492EWtpu440GtbegozqnzMQ=";
};

vendorHash = "sha256-5d6C2sNG8aCaC+z+hyLgOiEPWP/NmAcRRbRVC4KuCEw=";
Expand All @@ -22,12 +22,12 @@ buildGoModule rec {
cp -r $src/templates $out/share/haven/
'';

meta = with lib; {
meta = {
description = "High Availability Vault for Events on Nostr";
homepage = "https://github.com/bitvora/haven";
changelog = "https://github.com/bitvora/haven/releases/tag/v${version}";
license = licenses.mit;
maintainers = with maintainers; [ felixzieger ];
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ felixzieger ];
mainProgram = "haven";
};
}

0 comments on commit 835a712

Please sign in to comment.