{

    pkgsArg ? import (fetchTarball {
        name = "nixpkgs-21-05";
        url = "https://github.com/NixOS/nixpkgs/archive/7e9b0dff974c89e070da1ad85713ff3c20b0ca97.tar.gz";
        sha256 = "1ckzhh24mgz6jd1xhfgx0i9mijk6xjqxwsshnvq789xsavrmsc36";
    }) {},

    baseConfig ? import ./config.nix,
    skipServices ? [],

}: rec {

    pkgs = pkgsArg;

    config = baseConfig // {
        redisListenPath = "${config.runDir}/redis";
    };

    srv = pkgs.callPackage (import ./srv) {
        inherit config;
    };

    redisCfg = pkgs.writeText "mediocre-blog-redisCfg" ''
        port 0
        unixsocket ${config.redisListenPath}
        daemonize no
        loglevel notice
        logfile ""
        appendonly yes
        appendfilename "appendonly.aof"
        dir ${config.dataDir}/redis
    '';

    redisBin = pkgs.writeScript "mediocre-blog-redisBin" ''
        #!/bin/sh
        mkdir -p ${config.dataDir}/redis
        exec ${pkgs.redis}/bin/redis-server ${redisCfg}
    '';

    srvCircusCfg = ''
        [watcher:srv]
        cmd = ${srv.bin}
        numprocesses = 1
    '';

    redisCircusCfg = ''
        [watcher:redis]
        cmd = ${redisBin}
        numprocesses = 1
    '';

    circusCfg = pkgs.writeText "mediocre-blog-circusCfg" ''
        [circus]
        endpoint = tcp://127.0.0.1:0
        pubsub_endpoint = tcp://127.0.0.1:0

        ${if (!builtins.elem "srv" skipServices) then srvCircusCfg else ""}

        ${if (!builtins.elem "redis" skipServices) then redisCircusCfg else ""}
    '';

    entrypoint = pkgs.writeScript "mediocre-blog-entrypoint" ''
        #!/bin/sh

        set -e

        if [ ! -d ${config.runDir} ]; then
          mkdir -p ${config.runDir}
        fi

        mkdir -p ${config.dataDir}
        exec ${pkgs.circus}/bin/circusd ${circusCfg}
    '';

    service = pkgs.writeText "mediocre-blog" ''
        [Unit]
        Description=mediocregopher mediocre blog
        Requires=network.target
        After=network.target

        [Service]
        Restart=always
        RestartSec=1s
        User=mediocregopher
        Group=mediocregopher
        RuntimeDirectory=mediocre-blog
        ExecStart=${entrypoint}

        [Install]
        WantedBy=multi-user.target
    '';

    install = pkgs.writeScript "mediocre-blog" ''
        set -e -x

        sudo cp ${service} /etc/systemd/system/mediocregopher-mediocre-blog.service
        sudo systemctl daemon-reload
        sudo systemctl enable mediocregopher-mediocre-blog.service
        sudo systemctl restart mediocregopher-mediocre-blog.service
    '';
}
