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}
60 date_regex=$(LC_ALL=C date -d yesterday +'%d\/%b\/%Y')
62 trap "rm -f $TMPFILE" EXIT
64 mkdir -p ${cfg.dataDir}/${domain}
65 cat /var/log/httpd/access-${domain}.log | sed -n "/\\[$date_regex/ p" > $TMPFILE
66 for i in /var/log/httpd/access-${domain}*.gz; do
67 zcat "$i" | sed -n "/\\[$date_regex/ p" >> $TMPFILE
69 ${pkgs.goaccess}/bin/goaccess $TMPFILE --no-progress -o ${cfg.dataDir}/${domain}/index.html -p ${config}
71 in "${d}/bin/stats-${domain}";
72 allStats = sites: pkgs.writeScript "stats" ''
73 #!${pkgs.stdenv.shell}
75 mkdir -p ${cfg.dataDir}
76 ${builtins.concatStringsSep "\n" (map (v: stats v.name v.conf) sites)}
80 "5 0 * * * root ${allStats cfg.sites}"