【问题标题】:How can I enable Caddy plugins in NixOS?如何在 NixOS 中启用 Caddy 插件?
【发布时间】:2019-08-10 13:53:37
【问题描述】:

我刚刚开始使用 NixOS,到目前为止,我已经设法在我的 NixOS 18.09 VM 中编辑 /etc/nixos/configuration.nix 以启用 PHP-FPM 和 Caddy 网络服务器。

{ config, pkgs, ... }:

{
  imports = [ <nixpkgs/nixos/modules/installer/virtualbox-demo.nix> ];

  users = {
    mutableUsers = false;
    groups = {
      caddy = { };
      php-project = { };
    };
    users = {
      hello = {
        group = "php-project";
      };
    };
  };

  environment.systemPackages = [
    pkgs.htop  
    pkgs.httpie
    pkgs.php  # for PHP CLI
  ];

  services.caddy = {
    enable = true;
    email = "david@example.com";
    agree = true;
    config = ''
      (common) {
        gzip
        header / -Server
        header / -X-Powered-By
      }
      :8080 {
        root /var/www/hello
        fastcgi / /run/phpfpm/hello.sock php
        log syslog
        import common
      }
    '';
  };

  services.phpfpm = {
    phpOptions = ''
      date.timezone = "Europe/Berlin"
    '';
    poolConfigs = {
      hello = ''
        user = hello
        listen = /run/phpfpm/hello.sock
        ; ...
        pm.max_requests = 500
      '';
    };
  };
}

在 localhost:8080 上提供了一个 PHP 处理的响应。 (耶!)

enable Caddy plugins when compiling from source,将Go导入添加到球童的run.go,例如:

_ "github.com/mholt/caddy/caddyhttp" // plug in the HTTP server type
    // This is where other plugins get plugged in (imported)
_ "github.com/nicolasazrak/caddy-cache" // added to use another plugin
)

如何设置在下载源代码之后和构建发生之前执行这样的行插入? (如果在使用 Nix 时这是一种合理的方法?)

The NixOS 18.09 caddy package.

The NixOS 18.09 caddy service.

我相信在编写包时可以分配构建器脚本(Bash 或其他),并且我认为可以在其中完成行插入。但是我不知道在这种情况下如何将脚本分配给现有包(覆盖属性/使用覆盖?)以及将脚本放在磁盘上的什么位置。


状态更新

我一直在阅读有关自定义软件包的一般信息,听起来overlays 可能是我需要的。但是,我似乎无法评估我的叠加层。

我使用覆盖包名称作为测试,因为它比修补代码更简单。

覆盖尝试 1

/etc/nixos/configuration.nix:

{ config, pkgs, options, ... }:

{
  imports = [ <nixpkgs/nixos/modules/installer/virtualbox-demo.nix> ];

  nix.nixPath = options.nix.nixPath.default ++ [
    "nixpkgs-overlays=/etc/nixos/overlays-compat/"
  ];

  # ...
}

/etc/nixos/overlays-compat/overlays.nix:

self: super:
with super.lib;
let
  # Using the nixos plumbing that's used to evaluate the config...
  eval = import <nixpkgs/nixos/lib/eval-config.nix>;
  # Evaluate the config,
  paths = (eval {modules = [(import <nixos-config>)];})
    # then get the `nixpkgs.overlays` option.
    .config.nixpkgs.overlays
  ;
in
foldl' (flip extends) (_: super) paths self

/etc/nixos/overlays-compat/caddy.nix:

self: super:
{
  caddy = super.caddy.override {
    name = "caddy-override";
  };
}

叠加尝试 2

/etc/nixos/configuration.nix:

  nixpkgs.overlays = [ (self: super: {
    caddy = super.caddy.override {
      name = "caddy-override";
    };
  } ) ];

error: anonymous function at /nix/store/mr5sfmz6lm5952ch5q6v49563wzylrkx-nixos-18.09.2327.37694c8cc0e/nixos/pkgs/servers/caddy/default.nix:1:1 called with unexpected argument 'name', at /nix/store/mr5sfmz6lm5952ch5q6v49563wzylrkx-nixos-18.09.2327.37694c8cc0e/nixos/lib/customisation.nix:69:12

覆盖属性

我之前设法用这个覆盖了包名:

{ config, pkgs, options, ... }:

let
  caddyOverride = pkgs.caddy.overrideAttrs (oldAttrs: rec {
    name = "caddy-override-v${oldAttrs.version}";
  });
in {
{
  # ...

  services.caddy = {
    package = caddyOverride;
    # ...
  }
}

我可以在 htop 中看到 caddy 二进制文件位于名为 /nix/store/...-caddy-override-v0.11.0-bin/ 的文件夹中。但我知道以这种方式覆盖已被覆盖所取代。

【问题讨论】:

  • 覆盖用于修改pkgs 变量,但这不是必需的,因为您已经可以在services.caddy.package 中放置任意推导。我能看到的主要是从nixpkgs.overlays 选项中获取覆盖到NIX_PATH 环境变量等其他地方的管道,但我看不到你如何在nixpkgs.overlays 中定义覆盖。
  • 我从 wiki 和其他页面了解到,将使用给定目录中的所有覆盖文件。我的想法是通过 overrideAttrs 或覆盖向包中添加“补丁”属性。

标签: nix nixos caddy nixpkgs


【解决方案1】:

为了给Caddy添加插件,看来the method是要修改源码的。

您需要调整 Nixpkgs expression for Caddy 以使其成为可能。这可以在 Nixpkgs 树之外完成,例如使用 services.caddy.package = callPackage ./my-caddy.nix {},或者通过分叉 Nixpkgs 存储库并将您的 NIX_PATH 指向您的克隆。

【讨论】:

  • 谢谢!回覆。修改来源:确实。回覆。分叉和修改表达式:啊,所以分叉是绝对必要的,我不能用覆盖“扩展”表达式?如果是这样,是否应该在我的 fork 中使用 'patches = [ /path/to/patch ]' 来完成?
  • 对混合信号感到抱歉。我通常 fork 以便我可以轻松地将代码上游化,但您可以使用覆盖或 services.caddy.package 代替。
  • 补丁对此很有用。或者,您可以使用 postPatch 属性通过脚本修改源代码。
  • 仅仅修改preBuild函数是不足以将依赖引入Caddy的。您还必须更新 go-modules 派生以添加额外插件作为依赖项。然而,这在任何地方都有记录,我在github.com/NixOS/nixpkgs/issues/14671 中没有成功
【解决方案2】:

Caddy 插件存在问题:https://github.com/NixOS/nixpkgs/issues/14671

欢迎公关!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-15
    • 2019-04-22
    • 2011-02-26
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    相关资源
    最近更新 更多