LINUX.ORG.RU

История изменений

Исправление Tsukasa, (текущая версия) :

А ничего, что kdepim ощутимо даёт проседание в производительности?

УМВР

Ну вот тебе другой пример. Чисто рабочий. Понадобился мне так же nginx. С нестандартными модулями для webdav, которых нет в дефолтной сборке. А так же понадобилось для него нагенерить конфигов с подключением ssl с разными параметрами для разных виртхостов. Ну и разумеется с возможностью включать-выключать эти виртхосты и для них давать разные настройки.

Пожалуйста, nginx с модулем dav, автоматически обновляемымими сертификатами letsencrypt для двух доменов и настроенным фаерволом:

{ config, pkgs, ... }:
{
  networking.firewall.allowedTCPPorts = [ 80 443 ];

  security.acme.acceptTerms = true;
  security.acme.defaults.email = "admin@myhost.org";

  services.nginx = {
    enable = true;
    additionalModules = [ pkgs.nginxModules.dav ];
    recommendedTlsSettings = true;
    virtualHosts = {  # можно генерить как душе угодно, пример для двух хостов
      "example1.com" =  {
        enableACME = true;
        forceSSL = true;
        locations."/" = {
          proxyPass = "http://127.0.0.1:1234";
        };
      };
      "example2.com" =  {
        enableACME = true;
        forceSSL = true;
        locations."/" = {
          proxyPass = "http://127.0.0.1:1235";
        };
      };
    };
  };
}

Сколько нужно всего сделать чтобы получить аналогичный результат на генте? Мне достаточно одной команды чтобы это раскатить.

Сделать по уму и написать генераторы конфигов

NixOS практически полностью из них и состоит. Можно сказать это и есть вся суть NixOS.

Положить под каждый виртхост шаблон конфига и копипастить его в нужное место. Второй подход расходится с принципом конфигурации nixos и не даёт возможности гибко добавлять виртхосты одной строкой как задумано, а требует для каждого из них копипастить очередной шаблон(в десятки строк) в конфигурации.

Открой для себя функции:

{ config, pkgs, ... }:
let
  makeVhost = port: {
    enableACME = true;
    forceSSL = true;
    locations."/" = {
      proxyPass = "http://127.0.0.1:${toString port}";
    };
  };
in
{
  networking.firewall.allowedTCPPorts = [ 80 443 ];

  security.acme.acceptTerms = true;
  security.acme.defaults.email = "admin@myhost.org";

  services.nginx = {
    enable = true;
    additionalModules = [ pkgs.nginxModules.dav ];
    recommendedTlsSettings = true;
    virtualHosts = {
      "example1.com" = makeVhost 1234;
      "example2.com" = makeVhost 1235;
    };
  };
}

Если не сделать этого, и просто положить конфиги в обычном текстовом виде, это ломает весь принцип повторяемости nixos, ради которого и сделан весь этот язык конфигурации.

Не ломает, если они часть конфига. К примеру

  .......
  locations."/" = {
    proxyPass = "http://127.0.0.1:1234";
    extraConfig = ''
      include ${./my-config-file.conf}; # my-config-file.conf копируется в /nix/store
    '';
  };

Файл my-config-file.conf становится частью системы, все гарантии работают.

Блин. Ну вот почему всем надо обозвать оппонента, не ознакомившись даже первыми главами хендбука? Если ты ни разу в жизни не сталкивался ни с чем, кроме дефолта и ни разу не читал документацию на дистрибутив, который пытаешься использовать, то это не значит, что так же и у остальных. Если же ты просто кладёшь файлы с конфигами приложения вместо написания описания конфигурации, то зачем тебе тогда NixOS. Это любой другой дистрибутив умеет.

Не на того напал. Запустишь на генте кластер из пяти виртуалок Talos в одной сети одним конфигом? Я смогу своим модулем (да, мне нехуй делать):

{ config, pkgs, ... }:
{
  networking.bridges.br0.interfaces = [ "eth1" ];

  networking.interfaces.eth0.useDHCP = true;
  networking.interfaces.br0.useDHCP = false;
  networking.interfaces.br0.ipv4.addresses = [
    { address = "192.168.1.1"; prefixLength = 24; }
  ];

  networking.nat = {
    enable = true;
    externalInterface = "eth0";
    internalInterfaces = [ "br0" ];
    internalIPs = [ "192.168.1.0/24" ];
  };

  services.dhcpd4 = {
    enable = true;
    interfaces = config.networking.nat.internalInterfaces;
    extraConfig = ''
      option domain-name-servers 8.8.8.8, 8.8.4.4;
      option routers 192.168.1.1;
      subnet 192.168.1.0 netmask 255.255.255.0 {
        range 192.168.1.10 192.168.1.254;
      }
    '';
  };

  services.talos = {
    control-plane-1 = {
      smp = "cores=2";
      mem = 2;
      disk = 10;
      bridge = "br0";
    };
    control-plane-2 = {
      smp = "cores=2";
      mem = 2;
      disk = 10;
      bridge = "br0";
    };
    worker-1 = {
      smp = "cores=4";
      mem = 4;
      disk = 50;
      bridge = "br0";
    };
    worker-2 = {
      smp = "cores=4";
      mem = 4;
      disk = 50;
      bridge = "br0";
    };
    worker-3 = {
      smp = "cores=4";
      mem = 4;
      disk = 50;
      bridge = "br0";
    };
  };
}

Ещё вопросы?

Исходная версия Tsukasa, :

А ничего, что kdepim ощутимо даёт проседание в производительности?

УМВР

Ну вот тебе другой пример. Чисто рабочий. Понадобился мне так же nginx. С нестандартными модулями для webdav, которых нет в дефолтной сборке. А так же понадобилось для него нагенерить конфигов с подключением ssl с разными параметрами для разных виртхостов. Ну и разумеется с возможностью включать-выключать эти виртхосты и для них давать разные настройки.

Пожалуйста, nginx с модулем dav, автоматически обновляемымими сертификатами letsencrypt для двух доменов и настроенным фаерволом:

{ config, pkgs, ... }:
{
  networking.firewall.allowedTCPPorts = [ 80 443 ];

  security.acme.acceptTerms = true;
  security.acme.defaults.email = "admin@myhost.org";

  services.nginx = {
    enable = true;
    additionalModules = [ pkgs.nginxModules.dav ];
    recommendedTlsSettings = true;
    virtualHosts = {  # можно генерить как душе угодно, пример для двух хостов
      "example1.com" =  {
        enableACME = true;
        forceSSL = true;
        locations."/" = {
          proxyPass = "http://127.0.0.1:1234";
        };
      };
      "example2.com" =  {
        enableACME = true;
        forceSSL = true;
        locations."/" = {
          proxyPass = "http://127.0.0.1:1235";
        };
      };
    };
  };
}

Сколько нужно всего сделать чтобы получить аналогичный результат на генте? Мне достаточно одной команды чтобы это раскатить.

Сделать по уму и написать генераторы конфигов

NixOS практически полностью из них и состоит

Положить под каждый виртхост шаблон конфига и копипастить его в нужное место. Второй подход расходится с принципом конфигурации nixos и не даёт возможности гибко добавлять виртхосты одной строкой как задумано, а требует для каждого из них копипастить очередной шаблон(в десятки строк) в конфигурации.

Открой для себя функции:

{ config, pkgs, ... }:
let
  makeVhost = port: {
    enableACME = true;
    forceSSL = true;
    locations."/" = {
      proxyPass = "http://127.0.0.1:${toString port}";
    };
  };
in
{
  networking.firewall.allowedTCPPorts = [ 80 443 ];

  security.acme.acceptTerms = true;
  security.acme.defaults.email = "admin@myhost.org";

  services.nginx = {
    enable = true;
    additionalModules = [ pkgs.nginxModules.dav ];
    recommendedTlsSettings = true;
    virtualHosts = {
      "example1.com" = makeVhost 1234;
      "example2.com" = makeVhost 1235;
    };
  };
}

Если не сделать этого, и просто положить конфиги в обычном текстовом виде, это ломает весь принцип повторяемости nixos, ради которого и сделан весь этот язык конфигурации.

Не ломает, если они часть конфига. К примеру

  .......
  locations."/" = {
    proxyPass = "http://127.0.0.1:1234";
    extraConfig = ''
      include ${./my-config-file.conf}; # my-config-file.conf копируется в /nix/store
    '';
  };

Файл my-config-file.conf становится частью системы, все гарантии работают.

Блин. Ну вот почему всем надо обозвать оппонента, не ознакомившись даже первыми главами хендбука? Если ты ни разу в жизни не сталкивался ни с чем, кроме дефолта и ни разу не читал документацию на дистрибутив, который пытаешься использовать, то это не значит, что так же и у остальных. Если же ты просто кладёшь файлы с конфигами приложения вместо написания описания конфигурации, то зачем тебе тогда NixOS. Это любой другой дистрибутив умеет.

Не на того напал. Запустишь на генте кластер из пяти виртуалок Talos в одной сети одним конфигом на генте? Я смогу своим модулем (да, мне нехуй делать):

{ config, pkgs, ... }:
{
  networking.bridges.br0.interfaces = [ "eth1" ];

  networking.interfaces.eth0.useDHCP = true;
  networking.interfaces.br0.useDHCP = false;
  networking.interfaces.br0.ipv4.addresses = [
    { address = "192.168.1.1"; prefixLength = 24; }
  ];

  networking.nat = {
    enable = true;
    externalInterface = "eth0";
    internalInterfaces = [ "br0" ];
    internalIPs = [ "192.168.1.0/24" ];
  };

  services.dhcpd4 = {
    enable = true;
    interfaces = config.networking.nat.internalInterfaces;
    extraConfig = ''
      option domain-name-servers 8.8.8.8, 8.8.4.4;
      option routers 192.168.1.1;
      subnet 192.168.1.0 netmask 255.255.255.0 {
        range 192.168.1.10 192.168.1.254;
      }
    '';
  };

  services.talos = {
    control-plane-1 = {
      smp = "cores=2";
      mem = 2;
      disk = 10;
      bridge = "br0";
    };
    control-plane-2 = {
      smp = "cores=2";
      mem = 2;
      disk = 10;
      bridge = "br0";
    };
    worker-1 = {
      smp = "cores=4";
      mem = 4;
      disk = 50;
      bridge = "br0";
    };
    worker-2 = {
      smp = "cores=4";
      mem = 4;
      disk = 50;
      bridge = "br0";
    };
    worker-3 = {
      smp = "cores=4";
      mem = 4;
      disk = 50;
      bridge = "br0";
    };
  };
}

Ещё вопросы?