aboutsummaryrefslogtreecommitdiff
path: root/modules/services/nixos/glance.nix
blob: 38e5e1d27b5e6fad17c93cbb63ca468c3be3c89e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
{
  pkgs,
  config,
  lib,
  ...
}: let
  cfg = config.collinux.services.glance;

  pure = x: [x];

  servicesLinks = builtins.attrValues cfg.homelabServices;

  settings = {
    server = {
      inherit (cfg) port;
      proxied = true;
      host = "127.0.0.1";
      assets-path = "/var/lib/glance";
    };

    branding.hide-footer = true;
    pages = pure {
      name = "Dashboard";
      width = "slim";
      hide-desktop-navigation = true;
      center-vertically = true;
      columns = pure {
        size = "full";
        widgets = [
          {
            type = "search";
            autofocus = true;
            search-engine = "duckduckgo";
            bangs = [
              {
                title = "GitHub";
                shortcut = "gh";
                url = "https://github.com/search?q={QUERY}&type=repositories";
              }
              {
                title = "I'm Feeling Lucky";
                shortcut = "!";
                url = "https://www.google.com/search?q={QUERY}&btnI=&sourceid=navclient&gfns=1";
              }
              {
                title = "YouTube Music";
                shortcut = "ytm";
                url = "https://music.youtube.com/search?q={QUERY}";
              }
              {
                title = "Google AI Mode";
                shortcut = "ai";
                url = "https://www.google.com/search?udm=50&q={QUERY}";
              }
            ];
          }
          {
            type = "server-stats";
            servers = pure {
              type = "local";
              name = "Ganymede";
              hide-mountpoints-by-default = true;
              mountpoints = {
                "/".hide = false;
                "/media".hide = false;
              };
            };
          }
          {
            type = "monitor";
            cache = "1m";
            title = "Services";
            sites = servicesLinks;
          }
        ];
      };
    };
  };

  settingsFile = (pkgs.formats.yaml {}).generate "config.yml" settings;
in {
  config = lib.mkIf cfg.enable {
    users.groups."glance" = {};
    users.users."glance" = {
      isSystemUser = true;
      group = "glance";

      home = "/var/lib/glance";
      createHome = true;
    };

    systemd.services."glance" = {
      restartIfChanged = true;
      wants = ["network-online.target"];
      after = ["network-online.target"];
      wantedBy = ["multi-user.target"];

      serviceConfig = {
        User = "glance";
        Type = "simple";

        ReadWritePaths = "/var/lib/glance";
        WorkingDirectory = "/var/lib/glance";
        ExecStart = "${pkgs.glance}/bin/glance -config ${settingsFile}";

        NoNewPrivileges = true;
        PrivateTmp = true;
        ProtectSystem = "strict";
        ProtectHome = true;
        ProtectKernelTunables = true;
        ProtectKernelModules = true;
        ProtectControlGroups = true;
      };
    };

    services.caddy.virtualHosts."home.ganymede".extraConfig = ''
      tls internal
      reverse_proxy 127.0.0.1:${toString cfg.port}
    '';
  };
}