1 { lib, pkgs, config, ... }:
4 cfg = config.services.webstats;
6 options.services.webstats = {
7 dataDir = lib.mkOption {
9 default = "/var/lib/${name}";
11 The directory where Goaccess stores its data.
14 sites = lib.mkOption {
15 type = lib.types.listOf (lib.types.submodule {
18 type = lib.types.nullOr lib.types.path;
21 use custom goaccess configuration file instead of the
28 Domain name. Corresponds to the Apache file name and the
29 folder name in which the state will be saved.
35 description = "Sites to generate stats";
39 config = lib.mkIf (builtins.length cfg.sites > 0) {
40 services.duplyBackup.profiles.goaccess = {
41 rootDir = cfg.dataDir;
43 users.users.root.packages = [
50 stats = domain: conf: let
51 config = if builtins.isNull conf
52 then pkgs.runCommand "goaccess.conf" {
53 dbPath = "${cfg.dataDir}/${domain}";
54 } "substituteAll ${./goaccess.conf} $out"
56 d = pkgs.writeScriptBin "stats-${domain}" ''
57 #!${pkgs.stdenv.shell}
61 trap "rm -f $TMPFILE" EXIT
63 mkdir -p ${cfg.dataDir}/${domain}
64 for i in /var/log/httpd/access-${domain}*.gz; do
67 cat /var/log/httpd/access-${domain}.log > $TMPFILE
68 ${pkgs.goaccess}/bin/goaccess $TMPFILE --no-progress -o ${cfg.dataDir}/${domain}/index.html -p ${config}
70 in "${d}/bin/stats-${domain}";
71 allStats = sites: pkgs.writeScript "stats" ''
72 #!${pkgs.stdenv.shell}
74 mkdir -p ${cfg.dataDir}
75 ${builtins.concatStringsSep "\n" (map (v: stats v.name v.conf) sites)}
79 "5 0 * * * root ${allStats cfg.sites}"