more on redmine
authorJulien Moutinho <julm@autogeree.net>
Tue, 9 Oct 2018 17:08:32 +0000 (19:08 +0200)
committerJulien Moutinho <julm@autogeree.net>
Tue, 9 Oct 2018 17:08:40 +0000 (19:08 +0200)
install/logical/friot.nix
install/logical/friot/gitolite.nix
install/logical/friot/nginx.nix
install/logical/friot/redmine.nix
install/logical/friot/rmilter.nix
install/overlays.nix

index efa5cd84d43e8efe1d6d9f5a2fd57fe3542bd8db..2a110bd502417b6d08cead472f1d02e8da2f43fa 100644 (file)
@@ -3,7 +3,7 @@ let inherit (builtins.extraBuiltins) pass;
     inherit (lib) types;
     inherit (config) networking;
     inherit (config.services) dovecot2;
-    userPass = name: pass ("${networking.domain}/${networking.hostName}/"+name);
+    userPass = name: pass "${networking.domain}/${networking.hostName}/${name}/pass";
 in {
 imports = [
   <nixpkgs-commonsoft/install/modules.nix>
@@ -85,15 +85,30 @@ config = {
     };
   };
 
+  boot.initrd = {
+    network = {
+      enable = config.deployment.targetEnv != "virtualbox";
+      ssh = {
+        enable = true;
+        authorizedKeys = [ (pass "${networking.domain}/${networking.hostName}/julm/ssh.pub") ];
+      };
+    };
+  };
+
   services = {
     nixosManual = {
       enable = false; # NOTE: useless on this machine, and CPU intensive.
     };
+    redis = {
+      enable = true;
+    };
     disnix = {
       enable = false;
     };
     openssh = {
       enable = true;
+      extraConfig = ''
+      '';
     };
     gitea = {
       enable = false;
@@ -174,7 +189,78 @@ config = {
       #nss_ldap
       #nss_pam_ldapd
       socat
+      users-init
+      which
     ];
+    etc."inputrc".text = ''
+      # /etc/inputrc - global inputrc for libreadline
+      # See readline(3readline) and `info rluserman' for more information.
+
+      # Be 8 bit clean.
+      set input-meta on
+      set output-meta on
+
+      # To allow the use of 8bit-characters like the german umlauts, uncomment
+      # the line below. However this makes the meta key not work as a meta key,
+      # which is annoying to those which don't need to type in 8-bit characters.
+
+      # set convert-meta off
+
+      # try to enable the application keypad when it is called.  Some systems
+      # need this to enable the arrow keys.
+      # set enable-keypad on
+
+      # see /usr/share/doc/bash/inputrc.arrows for other codes of arrow keys
+
+      # do not bell on tab-completion
+      # set bell-style none
+      # set bell-style visible
+
+      # some defaults / modifications for the emacs mode
+      $if mode=emacs
+
+      # allow the use of the Home/End keys
+      "\e[1~": beginning-of-line
+      "\e[4~": end-of-line
+
+      # allow the use of the Delete/Insert keys
+      "\e[3~": delete-char
+      "\e[2~": quoted-insert
+
+      # mappings for "page up" and "page down" to step to the beginning/end
+      # of the history
+      # "\e[5~": beginning-of-history
+      # "\e[6~": end-of-history
+
+      # alternate mappings for "page up" and "page down" to search the history
+      # "\e[5~": history-search-backward
+      # "\e[6~": history-search-forward
+
+      # mappings for Ctrl-left-arrow and Ctrl-right-arrow for word moving
+      "\e[1;5C": forward-word
+      "\e[1;5D": backward-word
+      "\e[5C": forward-word
+      "\e[5D": backward-word
+      "\e\e[C": forward-word
+      "\e\e[D": backward-word
+
+      $if term=rxvt
+      "\e[7~": beginning-of-line
+      "\e[8~": end-of-line
+      "\eOc": forward-word
+      "\eOd": backward-word
+      $endif
+
+      # for non RH/Debian xterm, can't hurt for RH/Debian xterm
+      # "\eOH": beginning-of-line
+      # "\eOF": end-of-line
+
+      # for freebsd console
+      # "\e[H": beginning-of-line
+      # "\e[F": end-of-line
+
+      $endif
+    '';
   };
 };
 }
index 7a169b93d6012667a9b196e8fe12b3b7f3394e4b..a1e6f136888d109b59fa38099dcb020882193845 100644 (file)
@@ -1,9 +1,9 @@
 {pkgs, lib, config, system, ...}:
 let inherit (builtins.extraBuiltins) pass;
     inherit (lib) types;
+    inherit (config) networking;
     inherit (config.services) gitolite;
     inherit (config.users) users groups;
-    userPass = name: pass ("${config.networking.domain}/${config.networking.hostName}/"+name);
     gitolite-admin = "julm";
 in
 {
@@ -17,14 +17,16 @@ in
         enable = true;
         user   = "git";
         group  = users."git-daemon".name;
-        adminPubkey = pass "${config.networking.domain}/ssh/${gitolite-admin}";
+        adminPubkey = pass "${networking.domain}/${networking.hostName}/${gitolite-admin}/ssh.pub";
         extraGitoliteRc = ''
           $RC{UMASK}           = 0027; # NOTE: no quote around in Perl, so it's octal
           $RC{LOG_DEST}        = 'repo-log,syslog';
           $RC{LOG_FACILITY}    = 'local0';
-          $RC{GIT_CONFIG_KEYS} = 'hooks.* gitweb.*';
-          $RC{LOCAL_CODE}      = "$rc{GL_ADMIN_BASE}/local"
-            if -d "$rc{GL_ADMIN_BASE}/local";
+          #$RC{GIT_CONFIG_KEYS} = 'hooks.* gitweb.*';
+          $RC{GIT_CONFIG_KEYS} = '.*';
+          #$RC{LOCAL_CODE} = "$rc{GL_ADMIN_BASE}/local"
+          #  if -d "$rc{GL_ADMIN_BASE}/local";
+          $RC{LOCAL_CODE} = "$ENV{HOME}/local";
           push(@{$RC{ENABLE}}, ( 'Alias'
                                #, 'cgit'
                                , 'D'
@@ -34,7 +36,7 @@ in
                                , 'fork'
                                , 'keysubdirs-as-groups'
                                , 'readme'
-                               , (-d "$rc{GL_ADMIN_BASE}/local" ? 'repo-specific-hooks' : ())
+                               , (-d "$ENV{HOME}/local" ? 'repo-specific-hooks' : ())
                                , 'ssh-authkeys-split'
                                ));
         '';
@@ -44,6 +46,11 @@ in
       preStart = ''
         chmod g+x "${gitolite.dataDir}"
           # NOTE: allow git-daemon to enter ~git
+        install -D -d -o ${gitolite.user} -g ${gitolite.group} -m 750 \
+         ${gitolite.dataDir}/local \
+         ${gitolite.dataDir}/local/hooks \
+         ${gitolite.dataDir}/local/hooks/common \
+         ${gitolite.dataDir}/local/hooks/repo-specific
       '';
     };
     systemd.services.git-daemon = {
@@ -51,10 +58,10 @@ in
       after = [ "network.target" ];
       wantedBy = [ "multi-user.target" ];
       serviceConfig = {
-        User             = users."git-daemon".name;
-        Group            = groups."git-daemon".name;
-        Restart          = "always";
-        RestartSec       = 5;
+        User       = users."git-daemon".name;
+        Group      = groups."git-daemon".name;
+        Restart    = "always";
+        RestartSec = 5;
       };
       script = "${pkgs.git}/bin/git daemon --verbose --reuseaddr"
         + " --base-path=${gitolite.dataDir}/repositories"
index 1fde964554573a8e5c31140ac1b65ef6a3bfb1d7..01aa7a76e96dc6533d8bb3dd3444b80c975d3371 100644 (file)
@@ -1,16 +1,21 @@
 {pkgs, lib, config, system, ...}:
 let inherit (lib) types;
     inherit (config.services) nginx x509;
-    logDir    = "/var/log/nginx";
     domainDir = dom: lib.concatStringsSep "/" (lib.reverseList (lib.splitString "." dom));
 in
 {
 imports = [
   nginx/gitweb.nix
 ];
-options.services.nginx.webDir = lib.mkOption {
-  type    = types.str;
-  default = "/var/www"; # TODO: /var/lib/nginx ?
+options.services.nginx = {
+  webDir = lib.mkOption {
+    type    = types.str;
+    default = "/var/lib/nginx";
+  };
+  logDir = lib.mkOption {
+    type    = types.str;
+    default = "/var/log/nginx";
+  };
 };
 config = {
   security.dhparams = {
@@ -19,6 +24,13 @@ config = {
       nginx = 1024;
     };
   };
+  systemd.services.nginx = {
+    preStart = lib.mkBefore ''
+      install -D -d -o ${nginx.user} -g ${nginx.group} -m 0700 \
+       ${nginx.webDir} \
+       ${nginx.logDir}
+    '';
+  };
   services.nginx = {
     enable = true;
     stateDir = "/dev/shm/nginx";
@@ -51,8 +63,8 @@ config = {
           #ssl_certificate_key ${x509.key};
         '';
         log = ''
-          access_log ${logDir}/access.log main buffer=32k;
-          error_log  ${logDir}/error.log warn;
+          access_log ${nginx.logDir}/access.log main buffer=32k;
+          error_log  ${nginx.logDir}/error.log warn;
           open_log_file_cache max=1000 inactive=20s min_uses=2 valid=1m;
         '';
         proxy = ''
index b19793168e6d9c018f18d08cc87403543f42f6e9..38f659b51614e56fb7a242b3de970c5bf624ca97 100644 (file)
 {pkgs, lib, config, ...}:
-let inherit (config) networking;
-    inherit (config.services) redmine postgresql;
+let inherit (builtins.extraBuiltins) pass;
+    inherit (config) networking;
+    inherit (config.services) redmine postgresql gitolite;
+    redmine_git_hosting_settings = pkgs.writeText "settings.yml" ''
+      ---
+      # Gitolite SSH Config
+      gitolite_user:                  '${gitolite.user}'
+      gitolite_server_host:           'localhost'
+      gitolite_server_port:           '22'
+      #gitolite_ssh_private_key:       <%= Rails.root.join('plugins', 'redmine_git_hosting', 'ssh_keys', 'redmine_gitolite_admin_id_rsa') %>
+      #gitolite_ssh_public_key:        <%= Rails.root.join('plugins', 'redmine_git_hosting', 'ssh_keys', 'redmine_gitolite_admin_id_rsa.pub') %>
+      gitolite_ssh_private_key:       '${redmine.stateDir}/.ssh/id_ed25519'
+      gitolite_ssh_public_key:        '${redmine.stateDir}/.ssh/id_ed25519.pub'
+
+      # Gitolite Storage Config
+      gitolite_global_storage_dir:    'repositories/'
+      gitolite_redmine_storage_dir:   ""
+      gitolite_recycle_bin_dir:       'recycle_bin/'
+      gitolite_lib_dir:               '${pkgs.gitolite}/bin/lib'
+      gitolite_local_code_dir:        'local/'
+
+      # Gitolite Config File
+      gitolite_config_file:              'gitolite.conf'
+      gitolite_identifier_prefix:        'redmine_'
+      gitolite_identifier_strip_user_id: 'false'
+
+      # Gitolite Global Config
+      gitolite_temp_dir:                     <%= Rails.root.join('tmp', 'redmine_git_hosting') %>
+      gitolite_recycle_bin_expiration_time:  '24.0'
+      gitolite_log_level:                    'info'
+      git_config_username:                   'Redmine Git Hosting'
+      git_config_email:                      'redmine@${networking.domain}'
+
+      # Gitolite Hooks Config
+      gitolite_overwrite_existing_hooks: 'true'
+      gitolite_hooks_are_asynchronous:   'false'
+      gitolite_hooks_debug:              'false'
+      gitolite_hooks_url:                'http://localhost:3000'
+
+      # Gitolite Cache Config
+      gitolite_cache_max_time:          '86400'
+      gitolite_cache_max_size:          '16'
+      gitolite_cache_max_elements:      '2000'
+      gitolite_cache_adapter:           'database'
+
+      # Gitolite Access Config
+      ssh_server_domain:                'localhost'
+      http_server_domain:               'localhost'
+      https_server_domain:              'localhost'
+      http_server_subdir:               ""
+      show_repositories_url:            'true'
+      gitolite_daemon_by_default:       'false'
+      gitolite_http_by_default:         '1'
+
+      # Redmine Config
+      redmine_has_rw_access_on_all_repos: 'true'
+      all_projects_use_git:               'false'
+      init_repositories_on_create:        'false'
+      delete_git_repositories:            'true'
+
+      # This params work together!
+      # When hierarchical_organisation = true unique_repo_identifier MUST be false
+      # When hierarchical_organisation = false unique_repo_identifier MUST be true
+      hierarchical_organisation:        'true'
+      unique_repo_identifier:           'false'
+
+      # Download Revision Config
+      download_revision_enabled:        'true'
+
+      # Git Mailing List Config
+      gitolite_notify_by_default:            'false'
+      gitolite_notify_global_prefix:         '[REDMINE]'
+      gitolite_notify_global_sender_address: 'redmine@${networking.domain}'
+      gitolite_notify_global_include:        []
+      gitolite_notify_global_exclude:        []
+
+      # Sidekiq Config
+      gitolite_use_sidekiq:                  'false'
+    '';
 in
 {
   config = {
     services = {
       redmine = {
         enable = true;
+        package = with pkgs.redmine.plugins; pkgs.redmineWithPlugins [
+          #redmine_git_hosting
+          #clipboard_image_paste
+          #redmine_revision_branches
+        ];
         database = {
           type = "postgresql";
           host = "/tmp";
           port = postgresql.port;
         };
+        config = {
+          "configuration.yml" = lib.mkForce ''
+            default:
+              scm_git_command: ${pkgs.git}/bin/git
+          '';
+        };
       };
       postgresql = {
         users."${redmine.user}" = {
@@ -48,10 +136,77 @@ in
       };
     };
     systemd.services.redmine = {
-      environment.REDMINE_LANG = lib.mkForce "fr";
+      path = lib.mkForce [
+        pkgs.gitAndTools.git
+        pkgs.imagemagickBig
+        pkgs.coreutils
+        pkgs.findutils
+        pkgs.gnused
+        /*
+        pkgs.gitolite
+        pkgs.coreutils
+        pkgs.openssh
+        (config.security.wrapperDir + "/..")
+        */
+      ];
+      #environment.REDMINE_LANG = lib.mkForce "fr";
+      /*
+      path = [
+        pkgs.gitolite
+        pkgs.coreutils
+        pkgs.openssh
+        (config.security.wrapperDir + "/..")
+      ];
+      after = [ "keys.target" ];
+      preStart = ''
+        # comply with openssh's strict mode
+        install -D -d -o ${redmine.user} -g ${redmine.group} -m 0700 \
+         ${redmine.stateDir}/.ssh
+        install -o ${redmine.user} -g ${redmine.group} -m 0400 \
+         /run/keys/redmine_git_hosting_id_ed25519 \
+         ${redmine.stateDir}/.ssh/id_ed25519
+        install -o ${redmine.user} -g ${redmine.group} -m 0400 \
+         ${pkgs.writeText "redmine_git_hosting_id_ed25519.pub"
+          (builtins.readFile ../../../sec/var/ssh/redmine_git_hosting/id_ed25519.pub)} \
+         ${redmine.stateDir}/.ssh/id_ed25519.pub
+        install -o ${redmine.user} -g ${redmine.group} -m 0400 \
+         ${pkgs.writeText "config" ''
+          Host localhost
+            PasswordAuthentication no
+            PreferredAuthentications publickey
+            StrictHostKeyChecking no
+            UserKnownHostsFile /dev/null
+         ''} \
+         ${redmine.stateDir}/.ssh/config
+
+        # push settings.yml
+        ln -fns ${redmine_git_hosting_settings} \
+         ${redmine.stateDir}/redmine_git_hosting.yml
+        ${redmine.stateDir}/bundle exec rake redmine_git_hosting:update_settings
+         install hooks and parameters
+        ${redmine.stateDir}/bundle exec rake redmine_git_hosting:install_gitolite_hooks
+      '';
+      */
+    };
+    users.users."${redmine.user}" = {
+      extraGroups = [
+        gitolite.group
+      ];
+    };
+    deployment.keys.redmine_git_hosting_id_ed25519 = {
+      text    = pass "${networking.domain}/${networking.hostName}/redmine_git_hosting/ssh" + "\n";
+      #destDir = "${redmine.stateDir}/.ssh";
+      #path    = "${redmine.stateDir}/.ssh/id_ed25519";
+      user    = redmine.user;
+      group   = redmine.group;
+      permissions = "0400"; # XXX: not enforced when deployment.storeKeysOnMachine = true
     };
-    #users.users."${redmine.user}" = {
-    #  extraGroups = [ "postgres" ];
-    #};
+    security.sudo.extraRules = [
+      { users    = [ redmine.user ];
+        groups   = [ redmine.group ];
+        runAs    = gitolite.user;
+        commands = [ { command = "ALL"; options = [ "SETENV" "NOPASSWD" ]; } ];
+      }
+    ];
   };
 }
index 2046829d685008afafbb3081b0a99889c5164f25..0fded4818a6b00607b900ed7c375486e7d149dc8 100644 (file)
@@ -42,6 +42,11 @@ in
     services.rspamd = {
       enable = true;
     };
+    /*
+    services.redis = {
+      enable = true;
+    };
+    */
     services.rmilter = {
       enable = true;
       #debug = true;
index 57b26a2a907b59970b6d73e2bff9a438a19f6364..763aa36bd4fab178f9297a1308891a481f1c2607 100644 (file)
@@ -2,4 +2,6 @@ map import
 [ #overlays/servers/mail/dovecot.nix
   overlays/servers/mail/postfix.nix
   overlays/lib/strings.nix
+  overlays/users-init.nix
+  #overlays/applications/version-management/redmine/redmine_git_hosting.nix
 ]