From a48a2c4f788003a9e19dd63730732f82e835ba0f Mon Sep 17 00:00:00 2001 From: Eric Litak Date: Tue, 8 Aug 2017 01:52:08 -0700 Subject: [PATCH 1/6] ipfs: add autoMount option --- .../services/network-filesystems/ipfs.nix | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/nixos/modules/services/network-filesystems/ipfs.nix b/nixos/modules/services/network-filesystems/ipfs.nix index 60822b5b547..74711a10abb 100644 --- a/nixos/modules/services/network-filesystems/ipfs.nix +++ b/nixos/modules/services/network-filesystems/ipfs.nix @@ -7,7 +7,11 @@ let cfg = config.services.ipfs; - ipfsFlags = ''${if cfg.autoMigrate then "--migrate" else ""} ${if cfg.enableGC then "--enable-gc" else ""} ${toString cfg.extraFlags}''; + ipfsFlags = toString ([ + (optionalString cfg.autoMount "--mount") + (optionalString cfg.autoMigrate "--migrate") + (optionalString cfg.enableGC "--enable-gc") + ] ++ cfg.extraFlags); # Before Version 17.09, ipfs would always use "/var/lib/ipfs/.ipfs" as it's dataDir defaultDataDir = if versionAtLeast config.system.stateVersion "17.09" then @@ -17,7 +21,9 @@ let # Wrapping the ipfs binary with the environment variable IPFS_PATH set to dataDir because we can't set it in the user environment wrapped = runCommand "ipfs" { buildInputs = [ makeWrapper ]; } '' mkdir -p "$out/bin" - makeWrapper "${ipfs}/bin/ipfs" "$out/bin/ipfs" --set IPFS_PATH ${cfg.dataDir} + makeWrapper "${ipfs}/bin/ipfs" "$out/bin/ipfs" \ + --set IPFS_PATH ${cfg.dataDir} \ + --prefix PATH : /run/wrappers/bin ''; in @@ -63,6 +69,12 @@ in ''; }; + autoMount = mkOption { + type = types.bool; + default = false; + description = "Whether IPFS should try to mount /ipfs and /ipns at startup."; + }; + gatewayAddress = mkOption { type = types.str; default = "/ip4/127.0.0.1/tcp/8080"; @@ -133,12 +145,16 @@ in preStart = '' install -m 0755 -o ${cfg.user} -g ${cfg.group} -d ${cfg.dataDir} ''; - script = '' + script = '' if [[ ! -f ${cfg.dataDir}/config ]]; then ${ipfs}/bin/ipfs init ${optionalString cfg.emptyRepo "-e"} fi ${ipfs}/bin/ipfs --local config Addresses.API ${cfg.apiAddress} ${ipfs}/bin/ipfs --local config Addresses.Gateway ${cfg.gatewayAddress} + '' + optionalString cfg.autoMount '' + ${ipfs}/bin/ipfs --local config Mounts.FuseAllowOther --json true + mkdir -p $(${ipfs}/bin/ipfs --local config Mounts.IPFS) + mkdir -p $(${ipfs}/bin/ipfs --local config Mounts.IPNS) ''; serviceConfig = { From 5f9bad6ceb75713c051ef722f5b57dd6c036a67a Mon Sep 17 00:00:00 2001 From: Eric Litak Date: Sun, 27 Aug 2017 09:52:56 -0700 Subject: [PATCH 2/6] ipfs: add extraConfig option --- .../services/network-filesystems/ipfs.nix | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/nixos/modules/services/network-filesystems/ipfs.nix b/nixos/modules/services/network-filesystems/ipfs.nix index 74711a10abb..f93f5bcb628 100644 --- a/nixos/modules/services/network-filesystems/ipfs.nix +++ b/nixos/modules/services/network-filesystems/ipfs.nix @@ -103,11 +103,32 @@ in ''; }; + extraConfig = mkOption { + type = types.attrs; + description = toString [ + "Attrset of daemon configuration to set using `ipfs config`, every time the daemon starts." + "These are applied last, so may override configuration set by other options in this module." + "Keep in mind that this configuration is stateful; i.e., unsetting anything in here does not reset the value to the default!" + ]; + default = {}; + example = { + Datastore.StorageMax = "100GB"; + Discovery.MDNS.Enabled = false; + Bootstrap = [ + "/ip4/128.199.219.111/tcp/4001/ipfs/QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu" + "/ip4/162.243.248.213/tcp/4001/ipfs/QmSoLueR4xBeUbY9WZ9xGUUxunbKWcrNFTDAadQJmocnWm" + ]; + Swarm.AddrFilters = null; + }; + + }; + extraFlags = mkOption { type = types.listOf types.str; description = "Extra flags passed to the IPFS daemon"; default = []; }; + }; }; @@ -155,7 +176,19 @@ in ${ipfs}/bin/ipfs --local config Mounts.FuseAllowOther --json true mkdir -p $(${ipfs}/bin/ipfs --local config Mounts.IPFS) mkdir -p $(${ipfs}/bin/ipfs --local config Mounts.IPNS) - ''; + '' + concatStringsSep "\n" (collect + isString + (mapAttrsRecursive + (path: value: + # Using heredoc below so that the value is never improperly quoted + '' + read value < Date: Mon, 31 Jul 2017 07:15:02 -0700 Subject: [PATCH 3/6] ipfs: optionally manage ulimit -n in serviceConfig --- .../services/network-filesystems/ipfs.nix | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/nixos/modules/services/network-filesystems/ipfs.nix b/nixos/modules/services/network-filesystems/ipfs.nix index f93f5bcb628..df8506dd3d4 100644 --- a/nixos/modules/services/network-filesystems/ipfs.nix +++ b/nixos/modules/services/network-filesystems/ipfs.nix @@ -8,6 +8,7 @@ let cfg = config.services.ipfs; ipfsFlags = toString ([ + (optionalString (cfg.serviceFdlimit != null) "--manage-fdlimit=true") (optionalString cfg.autoMount "--mount") (optionalString cfg.autoMigrate "--migrate") (optionalString cfg.enableGC "--enable-gc") @@ -129,6 +130,15 @@ in default = []; }; + serviceFdlimit = mkOption { + type = types.nullOr types.int; + default = null; + description = '' + The fdlimit for the IPFS systemd unit or `null` to have the daemon attempt to manage it. + ''; + example = 256*1024; + }; + }; }; @@ -219,7 +229,7 @@ in Group = cfg.group; Restart = "on-failure"; RestartSec = 1; - }; + } // optionalAttrs (cfg.serviceFdlimit != null) { LimitNOFILE = cfg.serviceFdlimit; }; }; systemd.services.ipfs-offline = { @@ -242,7 +252,7 @@ in Group = cfg.group; Restart = "on-failure"; RestartSec = 1; - }; + } // optionalAttrs (cfg.serviceFdlimit != null) { LimitNOFILE = cfg.serviceFdlimit; }; }; systemd.services.ipfs-norouting = { @@ -265,7 +275,7 @@ in Group = cfg.group; Restart = "on-failure"; RestartSec = 1; - }; + } // optionalAttrs (cfg.serviceFdlimit != null) { LimitNOFILE = cfg.serviceFdlimit; }; }; }; From ba976021af3b191263e86d4f1b8605d12ae56387 Mon Sep 17 00:00:00 2001 From: Eric Litak Date: Mon, 28 Aug 2017 13:09:39 -0700 Subject: [PATCH 4/6] ipfs: refactor; wrapper adjustment --- .../services/network-filesystems/ipfs.nix | 113 ++++++------------ 1 file changed, 37 insertions(+), 76 deletions(-) diff --git a/nixos/modules/services/network-filesystems/ipfs.nix b/nixos/modules/services/network-filesystems/ipfs.nix index df8506dd3d4..d6840b0ea0d 100644 --- a/nixos/modules/services/network-filesystems/ipfs.nix +++ b/nixos/modules/services/network-filesystems/ipfs.nix @@ -1,20 +1,19 @@ { config, lib, pkgs, ... }: - with lib; - let inherit (pkgs) ipfs runCommand makeWrapper; cfg = config.services.ipfs; ipfsFlags = toString ([ - (optionalString (cfg.serviceFdlimit != null) "--manage-fdlimit=true") - (optionalString cfg.autoMount "--mount") - (optionalString cfg.autoMigrate "--migrate") - (optionalString cfg.enableGC "--enable-gc") + (optionalString cfg.autoMount "--mount") + (optionalString cfg.autoMigrate "--migrate") + (optionalString cfg.enableGC "--enable-gc") + (optionalString (cfg.serviceFdlimit != null) "--manage-fdlimit=false") + (optionalString (cfg.defaultMode == "offline") "--offline") + (optionalString (cfg.defaultMode == "norouting") "--routing=none") ] ++ cfg.extraFlags); - # Before Version 17.09, ipfs would always use "/var/lib/ipfs/.ipfs" as it's dataDir defaultDataDir = if versionAtLeast config.system.stateVersion "17.09" then "/var/lib/ipfs" else "/var/lib/ipfs/.ipfs"; @@ -26,9 +25,24 @@ let --set IPFS_PATH ${cfg.dataDir} \ --prefix PATH : /run/wrappers/bin ''; -in -{ + + commonEnv = { + environment.IPFS_PATH = cfg.dataDir; + path = [ wrapped ]; + serviceConfig.User = cfg.user; + serviceConfig.Group = cfg.group; + }; + + baseService = recursiveUpdate commonEnv { + wants = [ "ipfs-init.service" ]; + serviceConfig = { + ExecStart = "${wrapped}/bin/ipfs daemon ${ipfsFlags}"; + Restart = "on-failure"; + RestartSec = 1; + } // optionalAttrs (cfg.serviceFdlimit != null) { LimitNOFILE = cfg.serviceFdlimit; }; + }; +in { ###### interface @@ -158,34 +172,28 @@ in }; users.extraGroups = mkIf (cfg.group == "ipfs") { - ipfs = { - gid = config.ids.gids.ipfs; - }; + ipfs.gid = config.ids.gids.ipfs; }; - systemd.services.ipfs-init = { + systemd.services.ipfs-init = recursiveUpdate commonEnv { description = "IPFS Initializer"; after = [ "local-fs.target" ]; before = [ "ipfs.service" "ipfs-offline.service" ]; - environment.IPFS_PATH = cfg.dataDir; - - path = [ pkgs.ipfs pkgs.su pkgs.bash ]; - preStart = '' install -m 0755 -o ${cfg.user} -g ${cfg.group} -d ${cfg.dataDir} ''; script = '' if [[ ! -f ${cfg.dataDir}/config ]]; then - ${ipfs}/bin/ipfs init ${optionalString cfg.emptyRepo "-e"} + ipfs init ${optionalString cfg.emptyRepo "-e"} fi - ${ipfs}/bin/ipfs --local config Addresses.API ${cfg.apiAddress} - ${ipfs}/bin/ipfs --local config Addresses.Gateway ${cfg.gatewayAddress} + ipfs --local config Addresses.API ${cfg.apiAddress} + ipfs --local config Addresses.Gateway ${cfg.gatewayAddress} '' + optionalString cfg.autoMount '' - ${ipfs}/bin/ipfs --local config Mounts.FuseAllowOther --json true - mkdir -p $(${ipfs}/bin/ipfs --local config Mounts.IPFS) - mkdir -p $(${ipfs}/bin/ipfs --local config Mounts.IPNS) + ipfs --local config Mounts.FuseAllowOther --json true + mkdir -p $(ipfs --local config Mounts.IPFS) + mkdir -p $(ipfs --local config Mounts.IPNS) '' + concatStringsSep "\n" (collect isString (mapAttrsRecursive @@ -201,81 +209,34 @@ in ); serviceConfig = { - User = cfg.user; - Group = cfg.group; Type = "oneshot"; RemainAfterExit = true; PermissionsStartOnly = true; }; }; - systemd.services.ipfs = { + # TODO These 3 definitions possibly be further abstracted through use of a function + # like: mutexServices "ipfs" [ "", "offline", "norouting" ] { ... shared conf here ... } + + systemd.services.ipfs = recursiveUpdate baseService { description = "IPFS Daemon"; - wantedBy = mkIf (cfg.defaultMode == "online") [ "multi-user.target" ]; - after = [ "network.target" "local-fs.target" "ipfs-init.service" ]; - conflicts = [ "ipfs-offline.service" "ipfs-norouting.service"]; - wants = [ "ipfs-init.service" ]; - - environment.IPFS_PATH = cfg.dataDir; - - path = [ pkgs.ipfs ]; - - serviceConfig = { - ExecStart = "${ipfs}/bin/ipfs daemon ${ipfsFlags}"; - User = cfg.user; - Group = cfg.group; - Restart = "on-failure"; - RestartSec = 1; - } // optionalAttrs (cfg.serviceFdlimit != null) { LimitNOFILE = cfg.serviceFdlimit; }; }; - systemd.services.ipfs-offline = { + systemd.services.ipfs-offline = recursiveUpdate baseService { description = "IPFS Daemon (offline mode)"; - wantedBy = mkIf (cfg.defaultMode == "offline") [ "multi-user.target" ]; - after = [ "local-fs.target" "ipfs-init.service" ]; - conflicts = [ "ipfs.service" "ipfs-norouting.service"]; - wants = [ "ipfs-init.service" ]; - - environment.IPFS_PATH = cfg.dataDir; - - path = [ pkgs.ipfs ]; - - serviceConfig = { - ExecStart = "${ipfs}/bin/ipfs daemon ${ipfsFlags} --offline"; - User = cfg.user; - Group = cfg.group; - Restart = "on-failure"; - RestartSec = 1; - } // optionalAttrs (cfg.serviceFdlimit != null) { LimitNOFILE = cfg.serviceFdlimit; }; }; - systemd.services.ipfs-norouting = { + systemd.services.ipfs-norouting = recursiveUpdate baseService { description = "IPFS Daemon (no routing mode)"; - wantedBy = mkIf (cfg.defaultMode == "norouting") [ "multi-user.target" ]; - after = [ "local-fs.target" "ipfs-init.service" ]; - conflicts = [ "ipfs.service" "ipfs-offline.service"]; - wants = [ "ipfs-init.service" ]; - - environment.IPFS_PATH = cfg.dataDir; - - path = [ pkgs.ipfs ]; - - serviceConfig = { - ExecStart = "${ipfs}/bin/ipfs daemon ${ipfsFlags} --routing=none"; - User = cfg.user; - Group = cfg.group; - Restart = "on-failure"; - RestartSec = 1; - } // optionalAttrs (cfg.serviceFdlimit != null) { LimitNOFILE = cfg.serviceFdlimit; }; }; }; From 5554ea55838f7b4fd3bf8f3efd7ef51180965eae Mon Sep 17 00:00:00 2001 From: Eric Litak Date: Tue, 29 Aug 2017 10:34:48 -0700 Subject: [PATCH 5/6] ipfs: preStart configuration moved into daemon services --- .../services/network-filesystems/ipfs.nix | 40 ++++++++++--------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/nixos/modules/services/network-filesystems/ipfs.nix b/nixos/modules/services/network-filesystems/ipfs.nix index d6840b0ea0d..34bb6770efd 100644 --- a/nixos/modules/services/network-filesystems/ipfs.nix +++ b/nixos/modules/services/network-filesystems/ipfs.nix @@ -36,6 +36,26 @@ let baseService = recursiveUpdate commonEnv { wants = [ "ipfs-init.service" ]; + preStart = '' + ipfs --local config Addresses.API ${cfg.apiAddress} + ipfs --local config Addresses.Gateway ${cfg.gatewayAddress} + '' + optionalString cfg.autoMount '' + ipfs --local config Mounts.FuseAllowOther --json true + mkdir -p $(ipfs --local config Mounts.IPFS) + mkdir -p $(ipfs --local config Mounts.IPNS) + '' + concatStringsSep "\n" (collect + isString + (mapAttrsRecursive + (path: value: + # Using heredoc below so that the value is never improperly quoted + '' + read value < Date: Wed, 30 Aug 2017 08:24:09 -0700 Subject: [PATCH 6/6] ipfs: adding mountDir options but disabling broken autoMount --- .../services/network-filesystems/ipfs.nix | 31 ++++++++++++++----- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/nixos/modules/services/network-filesystems/ipfs.nix b/nixos/modules/services/network-filesystems/ipfs.nix index 34bb6770efd..cd320c5c462 100644 --- a/nixos/modules/services/network-filesystems/ipfs.nix +++ b/nixos/modules/services/network-filesystems/ipfs.nix @@ -6,7 +6,7 @@ let cfg = config.services.ipfs; ipfsFlags = toString ([ - (optionalString cfg.autoMount "--mount") + #(optionalString cfg.autoMount "--mount") (optionalString cfg.autoMigrate "--migrate") (optionalString cfg.enableGC "--enable-gc") (optionalString (cfg.serviceFdlimit != null) "--manage-fdlimit=false") @@ -39,10 +39,10 @@ let preStart = '' ipfs --local config Addresses.API ${cfg.apiAddress} ipfs --local config Addresses.Gateway ${cfg.gatewayAddress} - '' + optionalString cfg.autoMount '' + '' + optionalString false/*cfg.autoMount*/ '' ipfs --local config Mounts.FuseAllowOther --json true - mkdir -p $(ipfs --local config Mounts.IPFS) - mkdir -p $(ipfs --local config Mounts.IPNS) + ipfs --local config Mounts.IPFS ${cfg.ipfsMountDir} + ipfs --local config Mounts.IPNS ${cfg.ipnsMountDir} '' + concatStringsSep "\n" (collect isString (mapAttrsRecursive @@ -104,10 +104,22 @@ in { ''; }; - autoMount = mkOption { - type = types.bool; - default = false; - description = "Whether IPFS should try to mount /ipfs and /ipns at startup."; + #autoMount = mkOption { + # type = types.bool; + # default = false; + # description = "Whether IPFS should try to mount /ipfs and /ipns at startup."; + #}; + + ipfsMountDir = mkOption { + type = types.str; + default = "/ipfs"; + description = "Where to mount the IPFS namespace to"; + }; + + ipnsMountDir = mkOption { + type = types.str; + default = "/ipns"; + description = "Where to mount the IPNS namespace to"; }; gatewayAddress = mkOption { @@ -203,6 +215,9 @@ in { preStart = '' install -m 0755 -o ${cfg.user} -g ${cfg.group} -d ${cfg.dataDir} + '' + optionalString false/*cfg.autoMount*/ '' + install -m 0755 -o ${cfg.user} -g ${cfg.group} -d ${cfg.ipfsMountDir} + install -m 0755 -o ${cfg.user} -g ${cfg.group} -d ${cfg.ipnsMountDir} ''; script = '' if [[ ! -f ${cfg.dataDir}/config ]]; then