{ config, pkgs, lib, mkDomain, ... }: { # Shlink # URL shortener with REST API and command line interface # manage with https://app.shlink.io/ # TODO: self-host shlink web client? https://shlink.io/documentation/shlink-web-client/ /** / # data can be destryoed with `nixos-container destroy shlink` virtualisation.oci-containers.containers."shlink" = { autoStart = true; image = "shlinkio/shlink:stable"; # https://shlink.io/documentation/install-docker-image/ environment = { "DEFAULT_DOMAIN" = mkDomain "shlink"; "IS_HTTPS_ENABLED" = "true"; "TIMEZONE" = "Europe/Oslo"; #"GEOLITE_LICENSE_KEY" = ; # https://shlink.io/documentation/geolite-license-key/ # TODO: use postgres? default is sqlite3? }; ports = [ "127.0.0.1:5757:8080/tcp" # webui ]; volumes = [ "/var/lib/shlink/database.sqlite:/etc/shlink/data/database.sqlite" # TODO: where is the sqlite file? ]; }; systemd.services."create-shlink-volume-dirs" = { wantedBy = [ "${config.virtualisation.oci-containers.backend}-shlink.service" ]; serviceConfig.Type = "oneshot"; script = '' mkdir -p /var/lib/shlink touch /var/lib/shlink/database.sqlite ''; }; services.nginx.virtualHosts.${mkDomain "shlink"} = lib.mkIf config.virtualisation.oci-containers.containers."shlink".autoStart { forceSSL = true; # addSSL = true; enableACME = true; #useACMEHost = acmeDomain; locations."/" = { proxyPass = "http://127.0.0.1:5757"; proxyWebsockets = true; }; }; programs.bash.shellAliases = { shlink = "docker exec -it shlink shlink"; }; /**/ }