chore(ops/modules): Cleanup leftovers from TVL
Change-Id: I979cb18f3b8d461d21424e8dae6b0b2d7407809d Reviewed-on: https://cl.snix.dev/c/snix/+/30106 Tested-by: besadii Reviewed-by: Ryan Lahfa <masterancpp@gmail.com> Autosubmit: Ilan Joselevich <personal@ilanjoselevich.com>
This commit is contained in:
parent
f8bdafd3f2
commit
580f03f6fd
21 changed files with 0 additions and 1113 deletions
|
|
@ -1,38 +0,0 @@
|
|||
{ depot, config, lib, pkgs, ... }:
|
||||
|
||||
let
|
||||
cfg = config.services.depot.atward;
|
||||
description = "atward - (attempt to) cleverly route queries";
|
||||
in
|
||||
{
|
||||
options.services.depot.atward = {
|
||||
enable = lib.mkEnableOption description;
|
||||
|
||||
host = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = "[::1]";
|
||||
description = "Host on which atward should listen";
|
||||
};
|
||||
|
||||
port = lib.mkOption {
|
||||
type = lib.types.int;
|
||||
default = 28973;
|
||||
description = "Port on which atward should listen";
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
systemd.services.atward = {
|
||||
inherit description;
|
||||
script = "${depot.web.atward}/bin/atward";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
|
||||
serviceConfig = {
|
||||
DynamicUser = true;
|
||||
Restart = "always";
|
||||
};
|
||||
|
||||
environment.ATWARD_LISTEN_ADDRESS = "${cfg.host}:${toString cfg.port}";
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
# Automatically performs a scrub on all btrfs filesystems configured in
|
||||
# `config.fileSystems` on a daily schedule (by default). Activated by importing.
|
||||
{ config, lib, ... }:
|
||||
|
||||
{
|
||||
config = {
|
||||
services = {
|
||||
btrfs.autoScrub = {
|
||||
enable = true;
|
||||
interval = lib.mkDefault "*-*-* 03:30:00";
|
||||
# gather all btrfs fileSystems, extra ones can be added via the NixOS
|
||||
# module merging mechanism, of course.
|
||||
fileSystems = lib.concatLists (
|
||||
lib.mapAttrsToList
|
||||
(
|
||||
_:
|
||||
{ fsType, mountPoint, ... }:
|
||||
if fsType == "btrfs" then [ mountPoint ] else [ ]
|
||||
)
|
||||
config.fileSystems
|
||||
);
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
@ -1,110 +0,0 @@
|
|||
# This is a fork of the nixpkgs module for Harmonia, which adds compatibility
|
||||
# with Nix 2.3.
|
||||
#
|
||||
# We will upstream this eventually.
|
||||
{ config, pkgs, lib, ... }:
|
||||
let
|
||||
cfg = config.services.depot.harmonia;
|
||||
format = pkgs.formats.toml { };
|
||||
|
||||
credentials = lib.imap0
|
||||
(i: signKeyPath: {
|
||||
id = "sign-key-${builtins.toString i}";
|
||||
path = signKeyPath;
|
||||
})
|
||||
cfg.signKeyPaths;
|
||||
in
|
||||
{
|
||||
options = {
|
||||
services.depot.harmonia = {
|
||||
enable = lib.mkEnableOption "Harmonia: Nix binary cache written in Rust";
|
||||
|
||||
signKeyPaths = lib.mkOption {
|
||||
type = lib.types.listOf lib.types.path;
|
||||
default = [ ];
|
||||
description = "Paths to the signing keys to use for signing the cache";
|
||||
};
|
||||
|
||||
package = lib.mkPackageOption pkgs "harmonia" { };
|
||||
|
||||
settings = lib.mkOption {
|
||||
inherit (format) type;
|
||||
default = { };
|
||||
description = ''
|
||||
Settings to merge with the default configuration.
|
||||
For the list of the default configuration, see <https://github.com/nix-community/harmonia/tree/master#configuration>.
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
users.users.harmonia = {
|
||||
isSystemUser = true;
|
||||
group = "harmonia";
|
||||
};
|
||||
users.groups.harmonia = { };
|
||||
|
||||
systemd.services.harmonia = {
|
||||
description = "harmonia binary cache service";
|
||||
|
||||
requires = [ "nix-daemon.socket" ];
|
||||
after = [ "network.target" ];
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
|
||||
environment = {
|
||||
CONFIG_FILE = format.generate "harmonia.toml" cfg.settings;
|
||||
SIGN_KEY_PATHS = lib.strings.concatMapStringsSep " "
|
||||
(
|
||||
credential: "%d/${credential.id}"
|
||||
)
|
||||
credentials;
|
||||
# Note: it's important to set this for nix-store, because it wants to use
|
||||
# $HOME in order to use a temporary cache dir. bizarre failures will occur
|
||||
# otherwise
|
||||
HOME = "/run/harmonia";
|
||||
};
|
||||
|
||||
serviceConfig = {
|
||||
ExecStart = lib.getExe cfg.package;
|
||||
User = "harmonia";
|
||||
Group = "harmonia";
|
||||
Restart = "on-failure";
|
||||
PrivateUsers = true;
|
||||
DeviceAllow = [ "" ];
|
||||
UMask = "0066";
|
||||
RuntimeDirectory = "harmonia";
|
||||
LoadCredential = builtins.map (credential: "${credential.id}:${credential.path}") credentials;
|
||||
SystemCallFilter = [
|
||||
"@system-service"
|
||||
"~@privileged"
|
||||
"~@resources"
|
||||
];
|
||||
CapabilityBoundingSet = "";
|
||||
ProtectKernelModules = true;
|
||||
ProtectKernelTunables = true;
|
||||
ProtectControlGroups = true;
|
||||
ProtectKernelLogs = true;
|
||||
ProtectHostname = true;
|
||||
ProtectClock = true;
|
||||
RestrictRealtime = true;
|
||||
MemoryDenyWriteExecute = true;
|
||||
ProcSubset = "pid";
|
||||
ProtectProc = "invisible";
|
||||
RestrictNamespaces = true;
|
||||
SystemCallArchitectures = "native";
|
||||
PrivateNetwork = false;
|
||||
PrivateTmp = true;
|
||||
PrivateDevices = true;
|
||||
PrivateMounts = true;
|
||||
NoNewPrivileges = true;
|
||||
ProtectSystem = "strict";
|
||||
ProtectHome = true;
|
||||
LockPersonality = true;
|
||||
RestrictAddressFamilies = "AF_UNIX AF_INET AF_INET6";
|
||||
LimitNOFILE = 65536;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
|
|
@ -1,64 +0,0 @@
|
|||
{ depot, config, lib, pkgs, ... }:
|
||||
|
||||
let
|
||||
cfg = config.services.depot.irccat;
|
||||
description = "irccat - forward messages to IRC";
|
||||
|
||||
# irccat expects to read its configuration from the *current
|
||||
# directory*, and its configuration contains secrets.
|
||||
#
|
||||
# To make this work we construct the JSON configuration file and
|
||||
# then recursively merge it with an on-disk secret using jq on
|
||||
# service launch.
|
||||
configJson = pkgs.writeText "irccat.json" (builtins.toJSON cfg.config);
|
||||
|
||||
# Right now, merging configuration file with secrets and running the main
|
||||
# application needs to happen both in ExecStart=, due to
|
||||
# https://github.com/systemd/systemd/issues/19604#issuecomment-989279884
|
||||
mergeAndLaunch = pkgs.writeShellScript "merge-irccat-config" ''
|
||||
if [ ! -f "$CREDENTIALS_DIRECTORY/secrets" ]; then
|
||||
echo "irccat secrets file is missing"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# jq's * is the recursive merge operator
|
||||
${pkgs.jq}/bin/jq -s '.[0] * .[1]' ${configJson} "$CREDENTIALS_DIRECTORY/secrets" \
|
||||
> /var/lib/irccat/irccat.json
|
||||
|
||||
exec ${depot.third_party.irccat}/bin/irccat
|
||||
'';
|
||||
in
|
||||
{
|
||||
options.services.depot.irccat = {
|
||||
enable = lib.mkEnableOption description;
|
||||
|
||||
config = lib.mkOption {
|
||||
type = lib.types.attrsOf lib.types.anything; # varying value types
|
||||
description = "Configuration structure (unchecked!)";
|
||||
};
|
||||
|
||||
secretsFile = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "Path to the secrets file to be merged";
|
||||
default = config.age.secretsDir + "/irccat";
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
systemd.services.irccat = {
|
||||
inherit description;
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
after = [ "network-online.target" ];
|
||||
wants = [ "network-online.target" ];
|
||||
|
||||
serviceConfig = {
|
||||
ExecStart = "${mergeAndLaunch}";
|
||||
DynamicUser = true;
|
||||
StateDirectory = "irccat";
|
||||
WorkingDirectory = "/var/lib/irccat";
|
||||
LoadCredential = "secrets:${cfg.secretsFile}";
|
||||
Restart = "always";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
# Configures the public josh instance for serving the depot.
|
||||
{ config, depot, lib, pkgs, ... }:
|
||||
|
||||
let
|
||||
cfg = config.services.depot.josh;
|
||||
in
|
||||
{
|
||||
options.services.depot.josh = with lib; {
|
||||
enable = mkEnableOption "Enable josh for serving the depot";
|
||||
|
||||
port = mkOption {
|
||||
description = "Port on which josh should listen";
|
||||
type = types.int;
|
||||
default = 5674;
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
# Run josh for the depot.
|
||||
systemd.services.josh = {
|
||||
description = "josh - partial cloning of monorepos";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
path = [ pkgs.git pkgs.bash ];
|
||||
|
||||
serviceConfig = {
|
||||
DynamicUser = true;
|
||||
StateDirectory = "josh";
|
||||
Restart = "always";
|
||||
ExecStart = "${pkgs.josh}/bin/josh-proxy --no-background --local /var/lib/josh --port ${toString cfg.port} --remote https://cl.tvl.fyi/ --require-auth";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
@ -1,102 +0,0 @@
|
|||
# Configures a code search instance using Livegrep.
|
||||
#
|
||||
# We do not currently build Livegrep in Nix, because it's a complex,
|
||||
# multi-language Bazel build and doesn't play nicely with Nix.
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
let
|
||||
cfg = config.services.depot.livegrep;
|
||||
|
||||
livegrepConfig = {
|
||||
name = "livegrep";
|
||||
|
||||
fs_paths = [{
|
||||
name = "depot";
|
||||
path = "/depot";
|
||||
metadata.url_pattern = "https://code.tvl.fyi/tree/{path}?id={version}#n{lno}";
|
||||
}];
|
||||
|
||||
repositories = [{
|
||||
name = "depot";
|
||||
path = "/depot";
|
||||
revisions = [ "HEAD" ];
|
||||
|
||||
metadata = {
|
||||
url_pattern = "https://code.tvl.fyi/tree/{path}?id={version}#n{lno}";
|
||||
remote = "https://cl.tvl.fyi/depot.git";
|
||||
};
|
||||
}];
|
||||
};
|
||||
|
||||
configFile = pkgs.writeText "livegrep-config.json" (builtins.toJSON livegrepConfig);
|
||||
|
||||
# latest as of 2024-02-17
|
||||
image = "ghcr.io/livegrep/livegrep/base:033fa0e93c";
|
||||
in
|
||||
{
|
||||
options.services.depot.livegrep = with lib; {
|
||||
enable = mkEnableOption "Run livegrep code search for depot";
|
||||
|
||||
port = mkOption {
|
||||
description = "Port on which livegrep web UI should listen";
|
||||
type = types.int;
|
||||
default = 5477; # lgrp
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
virtualisation.oci-containers.containers.livegrep-codesearch = {
|
||||
inherit image;
|
||||
extraOptions = [ "--net=host" ];
|
||||
|
||||
volumes = [
|
||||
"${configFile}:/etc/livegrep-config.json:ro"
|
||||
"/var/lib/gerrit/git/depot.git:/depot:ro"
|
||||
];
|
||||
|
||||
entrypoint = "/livegrep/bin/codesearch";
|
||||
cmd = [
|
||||
"-grpc"
|
||||
"0.0.0.0:5427" # lgcs
|
||||
"-reload_rpc"
|
||||
"-revparse"
|
||||
"/etc/livegrep-config.json"
|
||||
];
|
||||
};
|
||||
|
||||
virtualisation.oci-containers.containers.livegrep-frontend = {
|
||||
inherit image;
|
||||
dependsOn = [ "livegrep-codesearch" ];
|
||||
extraOptions = [ "--net=host" ];
|
||||
|
||||
entrypoint = "/livegrep/bin/livegrep";
|
||||
cmd = [
|
||||
"-listen"
|
||||
"0.0.0.0:${toString cfg.port}"
|
||||
"-reload"
|
||||
"-connect"
|
||||
"localhost:5427"
|
||||
"-docroot"
|
||||
"/livegrep/web"
|
||||
# TODO(tazjin): docroot with styles etc.
|
||||
];
|
||||
};
|
||||
|
||||
systemd.services.livegrep-reindex = {
|
||||
script = "${pkgs.podman}/bin/podman exec livegrep-codesearch /livegrep/bin/livegrep-reload localhost:5427";
|
||||
serviceConfig.Type = "oneshot";
|
||||
};
|
||||
|
||||
systemd.paths.livegrep-reindex = {
|
||||
description = "Executes a livegrep reindex if depot refs change";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
|
||||
pathConfig = {
|
||||
PathChanged = [
|
||||
"/var/lib/gerrit/git/depot.git/packed-refs"
|
||||
"/var/lib/gerrit/git/depot.git/refs"
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
@ -1,106 +0,0 @@
|
|||
# Runs the TVL Monitoring setup (currently Grafana + Prometheus).
|
||||
{ depot, pkgs, config, lib, ... }:
|
||||
|
||||
{
|
||||
# Required for prometheus to be able to scrape stats
|
||||
services.nginx.statusPage = true;
|
||||
|
||||
# Configure Prometheus & Grafana. Exporter configuration for
|
||||
# Prometheus is inside the respective service modules.
|
||||
services.prometheus = {
|
||||
enable = true;
|
||||
retentionTime = "90d";
|
||||
|
||||
exporters = {
|
||||
node = {
|
||||
enable = true;
|
||||
|
||||
enabledCollectors = [
|
||||
"logind"
|
||||
"processes"
|
||||
"systemd"
|
||||
];
|
||||
};
|
||||
|
||||
nginx = {
|
||||
enable = true;
|
||||
sslVerify = false;
|
||||
constLabels = [ "host=${config.networking.hostName}" ];
|
||||
};
|
||||
};
|
||||
|
||||
scrapeConfigs = [{
|
||||
job_name = "node";
|
||||
scrape_interval = "5s";
|
||||
static_configs = [{
|
||||
targets = [ "localhost:${toString config.services.prometheus.exporters.node.port}" ];
|
||||
}];
|
||||
}
|
||||
{
|
||||
job_name = "nginx";
|
||||
scrape_interval = "5s";
|
||||
static_configs = [{
|
||||
targets = [ "localhost:${toString config.services.prometheus.exporters.nginx.port}" ];
|
||||
}];
|
||||
}];
|
||||
};
|
||||
|
||||
services.grafana = {
|
||||
enable = true;
|
||||
|
||||
settings = {
|
||||
server = {
|
||||
http_port = 4723; # "graf" on phone keyboard
|
||||
domain = "status.tvl.su";
|
||||
root_url = "https://status.tvl.su";
|
||||
};
|
||||
|
||||
analytics.reporting_enabled = false;
|
||||
|
||||
"auth.generic_oauth" = {
|
||||
enabled = true;
|
||||
client_id = "grafana";
|
||||
scopes = "openid profile email";
|
||||
name = "TVL";
|
||||
email_attribute_path = "mail";
|
||||
login_attribute_path = "sub";
|
||||
name_attribute_path = "displayName";
|
||||
auth_url = "https://auth.tvl.fyi/auth/realms/TVL/protocol/openid-connect/auth";
|
||||
token_url = "https://auth.tvl.fyi/auth/realms/TVL/protocol/openid-connect/token";
|
||||
api_url = "https://auth.tvl.fyi/auth/realms/TVL/protocol/openid-connect/userinfo";
|
||||
|
||||
# Give lukegb, aspen, tazjin "Admin" rights.
|
||||
role_attribute_path = "((sub == 'lukegb' || sub == 'aspen' || sub == 'tazjin') && 'Admin') || 'Editor'";
|
||||
|
||||
# Allow creating new Grafana accounts from OAuth accounts.
|
||||
allow_sign_up = true;
|
||||
};
|
||||
|
||||
"auth.anonymous" = {
|
||||
enabled = true;
|
||||
org_name = "The Virus Lounge";
|
||||
org_role = "Viewer";
|
||||
};
|
||||
|
||||
"auth.basic".enabled = false;
|
||||
|
||||
auth = {
|
||||
oauth_auto_login = true;
|
||||
disable_login_form = true;
|
||||
};
|
||||
};
|
||||
|
||||
provision = {
|
||||
enable = true;
|
||||
datasources.settings.datasources = [{
|
||||
name = "Prometheus";
|
||||
type = "prometheus";
|
||||
url = "http://localhost:9090";
|
||||
}];
|
||||
};
|
||||
};
|
||||
|
||||
# Contains GF_AUTH_GENERIC_OAUTH_CLIENT_SECRET.
|
||||
systemd.services.grafana.serviceConfig.EnvironmentFile = config.age.secretsDir + "/grafana";
|
||||
}
|
||||
|
||||
|
|
@ -1,54 +0,0 @@
|
|||
# NixOS module to configure the Estonian e-ID software.
|
||||
{ pkgs, ... }:
|
||||
|
||||
{
|
||||
services.pcscd.enable = true;
|
||||
|
||||
# Tell p11-kit to load/proxy opensc-pkcs11.so, providing all available slots
|
||||
# (PIN1 for authentication/decryption, PIN2 for signing).
|
||||
environment.etc."pkcs11/modules/opensc-pkcs11".text = ''
|
||||
module: ${pkgs.opensc}/lib/opensc-pkcs11.so
|
||||
'';
|
||||
|
||||
# Configure Firefox (in case users set `programs.firefox.enable = true;`)
|
||||
programs.firefox = {
|
||||
# Allow a possibly installed "Web eID" extension to do native messaging with
|
||||
# the "web-eid-app" native component.
|
||||
# Users not using `programs.firefox.enable` can override their firefox
|
||||
# derivation, by setting `extraNativeMessagingHosts = [ pkgs.web-eid-app ]`.
|
||||
nativeMessagingHosts.packages = [ pkgs.web-eid-app ];
|
||||
# Configure Firefox to load smartcards via p11kit-proxy.
|
||||
# Users not using `programs.firefox.enable` can override their firefox
|
||||
# derivation, by setting
|
||||
# `extraPolicies.SecurityDevices.p11-kit-proxy "${pkgs.p11-kit}/lib/p11-kit-proxy.so"`.
|
||||
policies.SecurityDevices.p11-kit-proxy = "${pkgs.p11-kit}/lib/p11-kit-proxy.so";
|
||||
};
|
||||
|
||||
# Chromium users need a symlink to their (slightly different) .json file
|
||||
# in the native messaging hosts' manifest file location.
|
||||
environment.etc."chromium/native-messaging-hosts/eu.webeid.json".source = "${pkgs.web-eid-app}/share/web-eid/eu.webeid.json";
|
||||
environment.etc."opt/chrome/native-messaging-hosts/eu.webeid.json".source = "${pkgs.web-eid-app}/share/web-eid/eu.webeid.json";
|
||||
|
||||
environment.systemPackages = with pkgs; [
|
||||
libdigidocpp.bin # provides digidoc-tool(1)
|
||||
qdigidoc
|
||||
|
||||
# Wrapper script to tell to Chrome/Chromium to use p11-kit-proxy to load
|
||||
# security devices, so they can be used for TLS client auth.
|
||||
# Each user needs to run this themselves, it does not work on a system level
|
||||
# due to a bug in Chromium:
|
||||
#
|
||||
# https://bugs.chromium.org/p/chromium/issues/detail?id=16387
|
||||
#
|
||||
# Firefox users can just set
|
||||
# extraPolicies.SecurityDevices.p11-kit-proxy "${pkgs.p11-kit}/lib/p11-kit-proxy.so";
|
||||
# when overriding the firefox derivation.
|
||||
(pkgs.writeShellScriptBin "setup-browser-eid" ''
|
||||
NSSDB="''${HOME}/.pki/nssdb"
|
||||
mkdir -p ''${NSSDB}
|
||||
|
||||
${pkgs.nssTools}/bin/modutil -force -dbdir sql:$NSSDB -add p11-kit-proxy \
|
||||
-libfile ${pkgs.p11-kit}/lib/p11-kit-proxy.so
|
||||
'')
|
||||
];
|
||||
}
|
||||
|
|
@ -1,68 +0,0 @@
|
|||
# Run the owothia IRC bot.
|
||||
{ depot, config, lib, pkgs, ... }:
|
||||
|
||||
let
|
||||
cfg = config.services.depot.owothia;
|
||||
description = "owothia - i'm a service owo";
|
||||
in
|
||||
{
|
||||
options.services.depot.owothia = {
|
||||
enable = lib.mkEnableOption description;
|
||||
|
||||
secretsFile = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "File path from which systemd should read secrets";
|
||||
default = config.age.secretsDir + "/owothia";
|
||||
};
|
||||
|
||||
owoChance = lib.mkOption {
|
||||
type = lib.types.int;
|
||||
description = "How likely is owo?";
|
||||
default = 200;
|
||||
};
|
||||
|
||||
ircServer = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "IRC server hostname";
|
||||
};
|
||||
|
||||
ircPort = lib.mkOption {
|
||||
type = lib.types.int;
|
||||
description = "IRC server port";
|
||||
};
|
||||
|
||||
ircIdent = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "IRC username";
|
||||
default = "owothia";
|
||||
};
|
||||
|
||||
ircChannels = lib.mkOption {
|
||||
type = with lib.types; listOf str;
|
||||
description = "IRC channels to join";
|
||||
default = [ "#tvl" ];
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
systemd.services.owothia = {
|
||||
inherit description;
|
||||
script = "${depot.fun.owothia}/bin/owothia";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
|
||||
serviceConfig = {
|
||||
DynamicUser = true;
|
||||
Restart = "always";
|
||||
EnvironmentFile = cfg.secretsFile;
|
||||
};
|
||||
|
||||
environment = {
|
||||
OWO_CHANCE = toString cfg.owoChance;
|
||||
IRC_SERVER = cfg.ircServer;
|
||||
IRC_PORT = toString cfg.ircPort;
|
||||
IRC_IDENT = cfg.ircIdent;
|
||||
IRC_CHANNELS = builtins.toJSON cfg.ircChannels;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
{ depot, config, lib, pkgs, ... }:
|
||||
|
||||
let
|
||||
cfg = config.services.depot.paroxysm;
|
||||
description = "TVL's majestic IRC bot";
|
||||
in
|
||||
{
|
||||
options.services.depot.paroxysm.enable = lib.mkEnableOption description;
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
systemd.services.paroxysm = {
|
||||
inherit description;
|
||||
script = "${depot.fun.paroxysm}/bin/paroxysm";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
|
||||
environment = {
|
||||
PARX_DATABASE_URL = "postgresql://tvldb:tvldb@localhost/tvldb";
|
||||
PARX_IRC_CONFIG_PATH = "/var/lib/paroxysm/irc.toml";
|
||||
};
|
||||
|
||||
serviceConfig = {
|
||||
DynamicUser = true;
|
||||
StateDirectory = "paroxysm";
|
||||
Restart = "always";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
@ -1,52 +0,0 @@
|
|||
{ config, lib, pkgs, depot, ... }:
|
||||
|
||||
let
|
||||
cfg = config.services.prometheus-fail2ban-exporter;
|
||||
in
|
||||
|
||||
{
|
||||
options.services.prometheus-fail2ban-exporter = with lib; {
|
||||
enable = mkEnableOption "Prometheus Fail2ban Exporter";
|
||||
|
||||
interval = mkOption {
|
||||
description = "Systemd calendar expression for how often to run the interval";
|
||||
type = types.str;
|
||||
default = "minutely";
|
||||
example = "hourly";
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
systemd.services."prometheus-fail2ban-exporter" = {
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
after = [ "network.target" "fail2ban.service" ];
|
||||
serviceConfig = {
|
||||
User = "root";
|
||||
Type = "oneshot";
|
||||
ExecStart = pkgs.writeShellScript "prometheus-fail2ban-exporter" ''
|
||||
set -eo pipefail
|
||||
mkdir -p /var/lib/prometheus/node-exporter
|
||||
exec prometheus-fail2ban-exporter
|
||||
'';
|
||||
};
|
||||
|
||||
path = [
|
||||
pkgs.fail2ban
|
||||
depot.third_party.prometheus-fail2ban-exporter
|
||||
];
|
||||
};
|
||||
|
||||
systemd.timers."prometheus-fail2ban-exporter" = {
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
timerConfig.OnCalendar = cfg.interval;
|
||||
};
|
||||
|
||||
services.prometheus.exporters.node = {
|
||||
enabledCollectors = [ "textfile" ];
|
||||
|
||||
extraFlags = [
|
||||
"--collector.textfile.directory=/var/lib/prometheus/node-exporter"
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
@ -1,83 +0,0 @@
|
|||
# A more modern module for running Quassel.
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
let
|
||||
cfg = config.services.depot.quassel;
|
||||
quasselDaemon = pkgs.quassel.override {
|
||||
monolithic = false;
|
||||
enableDaemon = true;
|
||||
withKDE = false;
|
||||
};
|
||||
in
|
||||
{
|
||||
options.services.depot.quassel = with lib; {
|
||||
enable = mkEnableOption "Quassel IRC daemon";
|
||||
|
||||
acmeHost = mkOption {
|
||||
description = "ACME host to use for the Quassel TLS certificate";
|
||||
type = lib.types.str;
|
||||
};
|
||||
|
||||
bindAddresses = mkOption {
|
||||
description = "Addresses Quassel will bind to/listen on";
|
||||
default = [ "127.0.0.1" ];
|
||||
};
|
||||
|
||||
logLevel = mkOption {
|
||||
description = "Log level for Quassel Core";
|
||||
default = "Info";
|
||||
type = lib.types.enum [
|
||||
"Debug"
|
||||
"Info"
|
||||
"Warning"
|
||||
"Error"
|
||||
];
|
||||
};
|
||||
|
||||
port = mkOption {
|
||||
default = 6698;
|
||||
description = ''
|
||||
The port number the Quassel daemon will be listening to.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = with lib; mkIf cfg.enable {
|
||||
networking.firewall.allowedTCPPorts = [ cfg.port ];
|
||||
|
||||
systemd.services.quassel = {
|
||||
description = "Quassel IRC daemon";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
|
||||
script = concatStringsSep " " [
|
||||
"${quasselDaemon}/bin/quasselcore"
|
||||
"--listen=${concatStringsSep "," cfg.bindAddresses}"
|
||||
"--port=${toString cfg.port}"
|
||||
"--configdir=/var/lib/quassel"
|
||||
"--require-ssl"
|
||||
"--ssl-cert=$CREDENTIALS_DIRECTORY/quassel.pem"
|
||||
"--loglevel=${cfg.logLevel}"
|
||||
];
|
||||
|
||||
serviceConfig = {
|
||||
Restart = "always";
|
||||
User = "quassel";
|
||||
Group = "quassel";
|
||||
StateDirectory = "quassel";
|
||||
|
||||
# Avoid trouble with the ACME file permissions by using the
|
||||
# systemd credentials feature.
|
||||
LoadCredential = "quassel.pem:/var/lib/acme/${cfg.acmeHost}/full.pem";
|
||||
};
|
||||
};
|
||||
|
||||
users = {
|
||||
users.quassel = {
|
||||
isSystemUser = true;
|
||||
group = "quassel";
|
||||
};
|
||||
|
||||
groups.quassel = { };
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
@ -1,61 +0,0 @@
|
|||
# NixOS module for configuring the simple SMTP relay.
|
||||
{ depot, pkgs, config, lib, ... }:
|
||||
|
||||
let
|
||||
inherit (builtins) attrValues mapAttrs;
|
||||
inherit (lib)
|
||||
concatStringsSep
|
||||
mkEnableOption
|
||||
mkIf
|
||||
mkOption
|
||||
types
|
||||
;
|
||||
|
||||
cfg = config.services.depot.smtprelay;
|
||||
description = "Simple SMTP relay";
|
||||
|
||||
# Configuration values that are always overridden.
|
||||
#
|
||||
# - logging is pinned to stdout for journald compatibility
|
||||
# - secret config is loaded through systemd's credential loading facility
|
||||
overrideArgs = {
|
||||
logfile = "";
|
||||
config = "$CREDENTIALS_DIRECTORY/secrets";
|
||||
};
|
||||
|
||||
# Creates the command line argument string for the service.
|
||||
prepareArgs = args:
|
||||
concatStringsSep " "
|
||||
(attrValues (mapAttrs (key: value: "-${key} \"${toString value}\"")
|
||||
(args // overrideArgs)));
|
||||
in
|
||||
{
|
||||
options.services.depot.smtprelay = {
|
||||
enable = mkEnableOption description;
|
||||
|
||||
args = mkOption {
|
||||
type = types.attrsOf types.str;
|
||||
description = "Key value pairs for command line arguments";
|
||||
};
|
||||
|
||||
secretsFile = mkOption {
|
||||
type = types.str;
|
||||
default = config.age.secretsDir + "/smtprelay";
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
systemd.services.smtprelay = {
|
||||
inherit description;
|
||||
script = "${pkgs.smtprelay}/bin/smtprelay ${prepareArgs cfg.args}";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
|
||||
serviceConfig = {
|
||||
Restart = "always";
|
||||
StateDirectory = "smtprelay";
|
||||
DynamicUser = true;
|
||||
LoadCredential = "secrets:${cfg.secretsFile}";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
@ -1,40 +0,0 @@
|
|||
# Run the Telegram<>IRC sync bot for the Volga Sprint channel.
|
||||
#
|
||||
# This module is written in a pretty ad-hoc style, as it is sort of a
|
||||
# throwaway thing (will be removed again after the event).
|
||||
{ depot, config, lib, pkgs, ... }:
|
||||
|
||||
let
|
||||
cfg = config.services.depot.teleirc;
|
||||
description = "IRC<>Telegram sync for Volga Sprint channel";
|
||||
configFile = builtins.toFile "teleirc.env" ''
|
||||
# connect through tvlbot's ZNC bouncer
|
||||
IRC_SERVER="localhost"
|
||||
IRC_PORT=2627
|
||||
IRC_USE_SSL=false
|
||||
IRC_CHANNEL="#volgasprint"
|
||||
IRC_BLACKLIST="tvlbot"
|
||||
IRC_BOT_NAME="tvlbot"
|
||||
IRC_BOT_REALNAME="TVL bot for Volga Sprint"
|
||||
IRC_BOT_IDENT="tvlbot"
|
||||
IRC_SEND_STICKER_EMOJI=false # look into this
|
||||
TELEGRAM_CHAT_ID=-1002153072030
|
||||
'';
|
||||
in
|
||||
{
|
||||
options.services.depot.teleirc.enable = lib.mkEnableOption description;
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
systemd.services.teleirc = {
|
||||
inherit description;
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
|
||||
serviceConfig = {
|
||||
DynamicUser = true;
|
||||
Restart = "always";
|
||||
EnvironmentFile = "/run/agenix/teleirc";
|
||||
ExecStart = "${depot.third_party.teleirc}/bin/teleirc -conf ${configFile}";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
@ -1,22 +0,0 @@
|
|||
{ config, lib, pkgs, ... }:
|
||||
|
||||
{
|
||||
options = {
|
||||
tvl.cache.enable = lib.mkEnableOption "the TVL binary cache";
|
||||
tvl.cache.builderball = lib.mkEnableOption "use experimental builderball cache";
|
||||
};
|
||||
|
||||
config = lib.mkIf config.tvl.cache.enable {
|
||||
nix.settings = {
|
||||
trusted-public-keys = [
|
||||
"cache.tvl.su:kjc6KOMupXc1vHVufJUoDUYeLzbwSr9abcAKdn/U1Jk="
|
||||
];
|
||||
|
||||
substituters = [
|
||||
(if config.tvl.cache.builderball
|
||||
then "https://cache.tvl.fyi"
|
||||
else "https://cache.tvl.su")
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
@ -1,71 +0,0 @@
|
|||
# Configuration for the coordination server for net.tvl.fyi, a
|
||||
# tailscale network run using headscale.
|
||||
#
|
||||
# All TVL members can join this network, which provides several exit
|
||||
# nodes through which traffic can be routed.
|
||||
#
|
||||
# The coordination server is currently run on sanduny.tvl.su. It is
|
||||
# managed manually, ping somebody with access ... for access.
|
||||
#
|
||||
# Servers should join using approximately this command:
|
||||
# tailscale up --login-server https://net.tvl.fyi --accept-dns=false --advertise-exit-node
|
||||
#
|
||||
# Clients should join using approximately this command:
|
||||
# tailscale up --login-server https://net.tvl.fyi --accept-dns=false
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
let
|
||||
acl = with builtins; toFile "headscale-acl.json" (toJSON {
|
||||
acls = [{
|
||||
action = "accept";
|
||||
src = [ "*" ];
|
||||
dst = [ "*:*" ];
|
||||
}];
|
||||
|
||||
groups."group:builders" = [ "tvl" "tvl-builders" ];
|
||||
tagOwners."tag:builders" = [ "group:builders" ];
|
||||
});
|
||||
in
|
||||
{
|
||||
# TODO(tazjin): run embedded DERP server
|
||||
services.headscale = {
|
||||
enable = true;
|
||||
port = 4725; # hscl
|
||||
|
||||
settings = {
|
||||
server_url = "https://net.tvl.fyi";
|
||||
dns.magic_dns = false;
|
||||
policy.path = acl;
|
||||
|
||||
# TLS is handled by nginx
|
||||
tls_cert_path = null;
|
||||
tls_key_path = null;
|
||||
};
|
||||
};
|
||||
|
||||
environment.systemPackages = [ pkgs.headscale ]; # admin CLI
|
||||
|
||||
services.nginx.virtualHosts."net.tvl.fyi" = {
|
||||
serverName = "net.tvl.fyi";
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
|
||||
# See https://github.com/juanfont/headscale/blob/v0.22.3/docs/reverse-proxy.md#nginx
|
||||
extraConfig = ''
|
||||
location / {
|
||||
proxy_pass http://localhost:${toString config.services.headscale.port};
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection $connection_upgrade;
|
||||
proxy_set_header Host $server_name;
|
||||
proxy_redirect http:// https://;
|
||||
proxy_buffering off;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
|
||||
add_header Strict-Transport-Security "max-age=15552000; includeSubDomains" always;
|
||||
}
|
||||
'';
|
||||
};
|
||||
|
||||
}
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
{ config, ... }:
|
||||
|
||||
{
|
||||
imports = [
|
||||
./base.nix
|
||||
];
|
||||
|
||||
config = {
|
||||
services.nginx.virtualHosts."nixery.dev" = {
|
||||
serverName = "nixery.dev";
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
|
||||
extraConfig = ''
|
||||
location / {
|
||||
proxy_pass http://localhost:${toString config.services.depot.nixery.port};
|
||||
}
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
# Redirect the hostname of a machine to its configuration in a web
|
||||
# browser.
|
||||
#
|
||||
# Works by convention, assuming that the machine has its configuration
|
||||
# at //ops/machines/${hostname}.
|
||||
{ config, ... }:
|
||||
|
||||
let
|
||||
host = "${config.networking.hostName}.${config.networking.domain}";
|
||||
in
|
||||
{
|
||||
imports = [
|
||||
./base.nix
|
||||
];
|
||||
|
||||
config.services.nginx.virtualHosts."${host}" = {
|
||||
serverName = host;
|
||||
addSSL = true; # SSL is not forced on these redirects
|
||||
enableACME = true;
|
||||
|
||||
extraConfig = ''
|
||||
location = / {
|
||||
return 302 https://at.tvl.fyi/?q=%2F%2Fops%2Fmachines%2F${config.networking.hostName};
|
||||
}
|
||||
'';
|
||||
};
|
||||
}
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
{ depot, ... }:
|
||||
|
||||
{
|
||||
imports = [
|
||||
./base.nix
|
||||
];
|
||||
|
||||
config = {
|
||||
services.nginx.virtualHosts."volgasprint.org" = {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
root = "${depot.web.volgasprint}";
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
{ depot, lib, pkgs, ... }:
|
||||
|
||||
{
|
||||
imports = [
|
||||
./base.nix
|
||||
];
|
||||
|
||||
config = {
|
||||
services.nginx.virtualHosts."wigglydonke.rs" = {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
root = "${depot.path + "/users/aspen/wigglydonke.rs"}";
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
@ -1,78 +0,0 @@
|
|||
# Profile for virtual machines on Yandex Cloud, intended for disk
|
||||
# images.
|
||||
#
|
||||
# https://cloud.yandex.com/en/docs/compute/operations/image-create/custom-image
|
||||
#
|
||||
# TODO(tazjin): Upstream to nixpkgs once it works well.
|
||||
{ config, lib, pkgs, modulesPath, ... }:
|
||||
|
||||
let
|
||||
cfg = config.virtualisation.yandexCloud;
|
||||
|
||||
# Kernel modules required for interacting with the hypervisor. These
|
||||
# must be available during stage 1 boot and during normal operation,
|
||||
# as disks and network do not work without them.
|
||||
modules = [
|
||||
"virtio-net"
|
||||
"virtio-blk"
|
||||
"virtio-pci"
|
||||
"virtiofs"
|
||||
];
|
||||
in
|
||||
{
|
||||
imports = [
|
||||
"${modulesPath}/profiles/headless.nix"
|
||||
];
|
||||
|
||||
options = {
|
||||
virtualisation.yandexCloud.rootPartitionUuid = with lib; mkOption {
|
||||
type = types.str;
|
||||
default = "C55A5EE2-E5FA-485C-B3AE-CC928429AB6B";
|
||||
|
||||
description = ''
|
||||
UUID to use for the root partition of the disk image. Yandex
|
||||
Cloud requires that root partitions are mounted by UUID.
|
||||
|
||||
Most users do not need to set this to a non-default value.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = {
|
||||
fileSystems."/" = {
|
||||
device = "/dev/disk/by-uuid/${lib.toLower cfg.rootPartitionUuid}";
|
||||
fsType = "ext4";
|
||||
autoResize = true;
|
||||
};
|
||||
|
||||
boot = {
|
||||
loader.grub.device = "/dev/vda";
|
||||
|
||||
initrd.kernelModules = modules;
|
||||
kernelModules = modules;
|
||||
kernelParams = [
|
||||
# Enable support for the serial console
|
||||
"console=ttyS0"
|
||||
];
|
||||
|
||||
growPartition = true;
|
||||
};
|
||||
|
||||
environment.etc.securetty = {
|
||||
text = "ttyS0";
|
||||
mode = "0644";
|
||||
};
|
||||
|
||||
systemd.services."serial-getty@ttyS0".enable = true;
|
||||
|
||||
services.openssh.enable = true;
|
||||
|
||||
system.build.yandexCloudImage = import (pkgs.path + "/nixos/lib/make-disk-image.nix") {
|
||||
inherit lib config pkgs;
|
||||
additionalSpace = "128M";
|
||||
format = "qcow2";
|
||||
partitionTableType = "legacy+gpt";
|
||||
rootGPUID = cfg.rootPartitionUuid;
|
||||
};
|
||||
};
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue