Integrate core-services-01 in a nice workflow (#1)
This enables the tracking of core-services-01 over the infrastructure repository. Co-authored-by: Gabriel DORIATH DOHLER <gabriel.doriath.dohler@ens.psl.eu> Reviewed-on: https://git.rz.ens.wtf/Klub-RZ/infrastructure/pulls/1 Co-authored-by: raito <raito@noreply.git.rz.ens.wtf> Co-committed-by: raito <raito@noreply.git.rz.ens.wtf>
This commit is contained in:
parent
cd84498987
commit
2283ee602a
31 changed files with 937 additions and 1 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
result
|
|
@ -1,2 +1,2 @@
|
|||
# config-core-services-01
|
||||
# NixOS configuration of klubrz's machines
|
||||
|
||||
|
|
24
krops.nix
Normal file
24
krops.nix
Normal file
|
@ -0,0 +1,24 @@
|
|||
let
|
||||
krops = builtins.fetchGit {
|
||||
url = "https://cgit.krebsco.de/krops/";
|
||||
};
|
||||
lib = import "${krops}/lib";
|
||||
pkgs = import "${krops}/pkgs" {};
|
||||
source = machine: lib.evalSource [
|
||||
{
|
||||
config.file = toString ./machines;
|
||||
nixos-config.symlink = "config/${machine}/configuration.nix";
|
||||
nixpkgs.git = {
|
||||
clean.exclude = [ "/.version-suffix" ];
|
||||
ref = "973910f5c31b9ba6c171c33a8bd7199990b14c72"; # nixos-21.05
|
||||
url = https://github.com/NixOS/nixpkgs;
|
||||
};
|
||||
}
|
||||
];
|
||||
in
|
||||
{
|
||||
core-services-01 = pkgs.krops.writeDeploy "deploy-core-services-01" {
|
||||
source = source "core-services-01";
|
||||
target = "root@core01.internal.rz.ens.wtf";
|
||||
};
|
||||
}
|
26
machines/core-services-01/acme-dns.nix
Normal file
26
machines/core-services-01/acme-dns.nix
Normal file
|
@ -0,0 +1,26 @@
|
|||
{ config, ... }:
|
||||
let
|
||||
my = config.my;
|
||||
in
|
||||
{
|
||||
services.acme-dns = {
|
||||
enable = true;
|
||||
domain = "acme.${my.subZone}";
|
||||
nsname = "acme.${my.subZone}";
|
||||
nsadmin = my.emailWithDot;
|
||||
dns.listen = "[${my.ipv6.acme}]"; # :-).
|
||||
records = [
|
||||
"acme.${my.subZone}. AAAA ${my.ipv6.acme}"
|
||||
"acme.${my.subZone}. NS acme.${my.subZone}."
|
||||
];
|
||||
};
|
||||
|
||||
services.nginx.enable = true;
|
||||
services.nginx.virtualHosts."acme.${my.subZone}" = {
|
||||
forceSSL = true;
|
||||
enableACME = true;
|
||||
locations."/" = {
|
||||
proxyPass = "http://localhost:8090";
|
||||
};
|
||||
};
|
||||
}
|
14
machines/core-services-01/acme-ssl.nix
Normal file
14
machines/core-services-01/acme-ssl.nix
Normal file
|
@ -0,0 +1,14 @@
|
|||
{ config, lib, ... }:
|
||||
|
||||
let
|
||||
my = config.my;
|
||||
in
|
||||
{
|
||||
security.acme.acceptTerms = true;
|
||||
security.acme.email = my.email;
|
||||
|
||||
security.acme.server =
|
||||
if my.acmeStaging
|
||||
then "https://acme-staging-v02.api.letsencrypt.org/directory"
|
||||
else null;
|
||||
}
|
92
machines/core-services-01/configuration.nix
Normal file
92
machines/core-services-01/configuration.nix
Normal file
|
@ -0,0 +1,92 @@
|
|||
{ config, pkgs, lib, ... }:
|
||||
|
||||
{
|
||||
imports =
|
||||
[ # Include the results of the hardware scan.
|
||||
./hardware-configuration.nix
|
||||
./nur.nix
|
||||
./rz.nix
|
||||
./monitoring.nix
|
||||
./programs.nix
|
||||
./system.nix
|
||||
./acme-ssl.nix
|
||||
./dns.nix
|
||||
./netboot-server.nix
|
||||
./qemu.nix
|
||||
./gitea.nix
|
||||
./dokuwiki.nix
|
||||
./nginx.nix
|
||||
./keycloak.nix
|
||||
./acme-dns.nix
|
||||
./secrets
|
||||
# TODO push to gitea
|
||||
# TODO ./gotify.nix
|
||||
# TODO(Raito): ./backups.nix
|
||||
# TODO(Raito): ./snmp.nix
|
||||
# TODO(Raito): ./sflow.nix?
|
||||
];
|
||||
|
||||
# Use the systemd-boot EFI boot loader.
|
||||
boot.loader.systemd-boot.enable = true;
|
||||
boot.loader.efi.canTouchEfiVariables = true;
|
||||
|
||||
boot.initrd.supportedFilesystems = [ "zfs" ];
|
||||
boot.supportedFilesystems = [ "zfs" ];
|
||||
|
||||
networking.hostName = "klubrz-core-services-01";
|
||||
networking.hostId = "64838310";
|
||||
|
||||
time.timeZone = "Europe/Paris";
|
||||
|
||||
# The global useDHCP flag is deprecated, therefore explicitly set to false here.
|
||||
# Per-interface useDHCP will be mandatory in the future, so this generated config
|
||||
# replicates the default behaviour.
|
||||
networking.useDHCP = false;
|
||||
# Adieu, hackENS — networking.interfaces.ens18.useDHCP = true;
|
||||
networking.interfaces.ens19.useDHCP = true;
|
||||
|
||||
# Configure network proxy if necessary
|
||||
# networking.proxy.default = "http://user:password@proxy:port/";
|
||||
# networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain";
|
||||
|
||||
# Select internationalisation properties.
|
||||
i18n.defaultLocale = "en_US.UTF-8";
|
||||
console = {
|
||||
font = "Lat2-Terminus16";
|
||||
keyMap = "us";
|
||||
};
|
||||
|
||||
# Some programs need SUID wrappers, can be configured further or are
|
||||
# started in user sessions.
|
||||
programs.mtr.enable = true;
|
||||
programs.gnupg.agent = {
|
||||
enable = true;
|
||||
enableSSHSupport = true;
|
||||
};
|
||||
|
||||
# List services that you want to enable:
|
||||
|
||||
services.zfs.autoScrub.enable = true;
|
||||
|
||||
# Enable the OpenSSH daemon.
|
||||
services.openssh.enable = true;
|
||||
users.users.root.openssh.authorizedKeys.keyFiles = [
|
||||
./pubkeys/gdd.keys
|
||||
./pubkeys/raito.keys
|
||||
./pubkeys/hackens-milieu.keys
|
||||
];
|
||||
|
||||
# Open ports in the firewall.
|
||||
# networking.firewall.allowedTCPPorts = [ ... ];
|
||||
# networking.firewall.allowedUDPPorts = [ ... ];
|
||||
# Or disable the firewall altogether.
|
||||
networking.firewall.enable = false;
|
||||
|
||||
# This value determines the NixOS release from which the default
|
||||
# settings for stateful data, like file locations and database versions
|
||||
# on your system were taken. It‘s perfectly fine and recommended to leave
|
||||
# this value at the release version of the first install of this system.
|
||||
# Before changing this value read the documentation for this option
|
||||
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
||||
system.stateVersion = "20.09"; # Did you read the comment?
|
||||
}
|
28
machines/core-services-01/dns.nix
Normal file
28
machines/core-services-01/dns.nix
Normal file
|
@ -0,0 +1,28 @@
|
|||
{ config, lib, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
dns = import (builtins.fetchTarball "https://github.com/kirelagin/dns.nix/archive/master.tar.gz");
|
||||
my = config.my;
|
||||
in
|
||||
{
|
||||
services.unbound = {
|
||||
enable = true;
|
||||
settings = {
|
||||
server = {
|
||||
access-control = [ "127.0.0.0/8 allow" "::1/128 allow" ] ++ map (v: "${v} allow") my.privateRanges;
|
||||
interface = [ "127.0.0.1" ] ++ my.ipv4;
|
||||
};
|
||||
};
|
||||
};
|
||||
services.nsd = {
|
||||
enable = true;
|
||||
interfaces = my.ipv6.standard;
|
||||
zones = {
|
||||
${my.subZone} = {
|
||||
data = dns.lib.toString my.subZone (import ./subZone.nix { inherit dns config; });
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
33
machines/core-services-01/dokuwiki.nix
Normal file
33
machines/core-services-01/dokuwiki.nix
Normal file
|
@ -0,0 +1,33 @@
|
|||
{ config, ... }:
|
||||
|
||||
let
|
||||
my = config.my;
|
||||
in
|
||||
{
|
||||
services.dokuwiki."wiki.${my.subZone}" = {
|
||||
enable = true;
|
||||
hostName = "wiki.${my.subZone}";
|
||||
acl = ''
|
||||
* @ALL 1
|
||||
* @admin 16
|
||||
'';
|
||||
nginx = {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
};
|
||||
};
|
||||
|
||||
/*
|
||||
services.nginx = {
|
||||
enable = true;
|
||||
|
||||
virtualHosts."wiki.${my.subZone}" = {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
locations."/" = {
|
||||
proxyPass = "htttp://127.0.0.1:${toString port}";
|
||||
};
|
||||
};
|
||||
};
|
||||
*/
|
||||
}
|
29
machines/core-services-01/gitea.nix
Normal file
29
machines/core-services-01/gitea.nix
Normal file
|
@ -0,0 +1,29 @@
|
|||
{ config, ... }:
|
||||
|
||||
let
|
||||
my = config.my;
|
||||
port = 3000;
|
||||
in
|
||||
{
|
||||
services.gitea = {
|
||||
enable = true;
|
||||
domain = "git.${my.subZone}";
|
||||
rootUrl = "https://git.${my.subZone}/";
|
||||
httpAddress = "127.0.0.1";
|
||||
httpPort = port;
|
||||
database.type = "postgres";
|
||||
disableRegistration = true;
|
||||
};
|
||||
|
||||
services.nginx = {
|
||||
enable = true;
|
||||
|
||||
virtualHosts."git.${my.subZone}" = {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
locations."/" = {
|
||||
proxyPass = "http://127.0.0.1:${toString port}";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
35
machines/core-services-01/hardware-configuration.nix
Normal file
35
machines/core-services-01/hardware-configuration.nix
Normal file
|
@ -0,0 +1,35 @@
|
|||
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||
# and may be overwritten by future invocations. Please make changes
|
||||
# to /etc/nixos/configuration.nix instead.
|
||||
{ config, lib, pkgs, modulesPath, ... }:
|
||||
|
||||
{
|
||||
imports =
|
||||
[ (modulesPath + "/profiles/qemu-guest.nix")
|
||||
];
|
||||
|
||||
boot.initrd.availableKernelModules = [ "ata_piix" "uhci_hcd" "virtio_pci" "sd_mod" "sr_mod" ];
|
||||
boot.initrd.kernelModules = [ ];
|
||||
boot.kernelModules = [ ];
|
||||
boot.extraModulePackages = [ ];
|
||||
|
||||
fileSystems."/" =
|
||||
{ device = "rpool/root/nixos";
|
||||
fsType = "zfs";
|
||||
};
|
||||
|
||||
fileSystems."/home" =
|
||||
{ device = "rpool/home";
|
||||
fsType = "zfs";
|
||||
};
|
||||
|
||||
fileSystems."/boot" =
|
||||
{ device = "/dev/disk/by-uuid/56B8-1FC0";
|
||||
fsType = "vfat";
|
||||
};
|
||||
|
||||
swapDevices =
|
||||
[ { device = "/dev/disk/by-uuid/0fe95042-8197-4969-a549-65565cf70171"; }
|
||||
];
|
||||
|
||||
}
|
27
machines/core-services-01/keycloak.nix
Normal file
27
machines/core-services-01/keycloak.nix
Normal file
|
@ -0,0 +1,27 @@
|
|||
{ config, ... }:
|
||||
let
|
||||
my = config.my;
|
||||
port = 8080;
|
||||
in
|
||||
{
|
||||
services.keycloak = {
|
||||
enable = true;
|
||||
initialAdminPassword = "changemeasap";
|
||||
database.createLocally = true;
|
||||
database.passwordFile = config.age.secrets.keycloakDatabasePasswordFile.path;
|
||||
frontendUrl = "https://auth.${my.subZone}/auth/";
|
||||
forceBackendUrlToFrontendUrl = true;
|
||||
httpPort = toString port;
|
||||
extraConfig = {
|
||||
"subsystem=undertow"."server=default-server"."http-listener=default".proxy-address-forwarding = true;
|
||||
};
|
||||
};
|
||||
|
||||
services.nginx.virtualHosts."auth.${my.subZone}" = {
|
||||
forceSSL = true;
|
||||
enableACME = true;
|
||||
locations."/" = {
|
||||
proxyPass = "http://127.0.0.1:${toString port}";
|
||||
};
|
||||
};
|
||||
}
|
44
machines/core-services-01/monitoring.nix
Normal file
44
machines/core-services-01/monitoring.nix
Normal file
|
@ -0,0 +1,44 @@
|
|||
{ config, pkgs, ... }:
|
||||
let
|
||||
my = config.my;
|
||||
realm = "ClubReseau";
|
||||
in
|
||||
{
|
||||
services.netdata.enable = true;
|
||||
|
||||
services.oauth2_proxy = {
|
||||
enable = true;
|
||||
keyFile = config.age.secrets.oauth2ProxyKeyFile.path;
|
||||
provider = "keycloak";
|
||||
email.domains = [ "*" ];
|
||||
setXauthrequest = true;
|
||||
scope = "profile";
|
||||
loginURL = "https://auth.${my.subZone}/auth/realms/${realm}/protocol/openid-connect/auth";
|
||||
redeemURL = "https://auth.${my.subZone}/auth/realms/${realm}/protocol/openid-connect/token";
|
||||
profileURL = "https://auth.${my.subZone}/auth/realms/${realm}/protocol/openid-connect/userinfo";
|
||||
validateURL = "https://auth.${my.subZone}/auth/realms/${realm}/protocol/openid-connect/userinfo";
|
||||
redirectURL = "https://monitoring.${my.subZone}/oauth2/callback";
|
||||
reverseProxy = true;
|
||||
passHostHeader = true;
|
||||
|
||||
nginx = {
|
||||
virtualHosts = [ "monitoring.${my.subZone}" ];
|
||||
};
|
||||
};
|
||||
|
||||
services.nginx = {
|
||||
enable = true;
|
||||
|
||||
virtualHosts."monitoring.${my.subZone}" = {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
|
||||
locations."/".proxyPass = "http://localhost:19999";
|
||||
};
|
||||
};
|
||||
|
||||
# services.smartd = {
|
||||
# enable = true;
|
||||
# extraOptions = [ "-A /var/log/smartd/" ]; # For netdata
|
||||
# };
|
||||
}
|
95
machines/core-services-01/my.nix
Normal file
95
machines/core-services-01/my.nix
Normal file
|
@ -0,0 +1,95 @@
|
|||
{ config, lib, ... }:
|
||||
|
||||
with lib;
|
||||
with types;
|
||||
let
|
||||
cfg = config.my;
|
||||
mkAddress = addr: let
|
||||
splitted = lib.splitString "/" addr;
|
||||
elemAt = builtins.elemAt splitted;
|
||||
in
|
||||
{ address = (elemAt 0); prefixLength = lib.toInt (elemAt 1); };
|
||||
in
|
||||
{
|
||||
options.my = {
|
||||
email = mkOption {
|
||||
description = "Admin email";
|
||||
type = str;
|
||||
default = "";
|
||||
example = "clipper@ens.fr";
|
||||
};
|
||||
|
||||
emailWithDot = mkOption {
|
||||
description = "Admin email with dots";
|
||||
type = str;
|
||||
default = lib.replaceStrings ["@"] ["."] cfg.email;
|
||||
example = "clipper.ens.fr";
|
||||
};
|
||||
|
||||
acmeStaging = mkOption {
|
||||
description = "Enable staging servers";
|
||||
type = bool;
|
||||
default = false;
|
||||
};
|
||||
|
||||
subZone = mkOption {
|
||||
description = "Sub zone for hosting the services";
|
||||
type = str;
|
||||
default = "";
|
||||
example = "ens.pizza";
|
||||
};
|
||||
|
||||
ipv4 = mkOption {
|
||||
description = "Public IPv4 addresses without prefix";
|
||||
type = listOf str;
|
||||
example = [ "192.186.1.153" ];
|
||||
default = map (v: (mkAddress v).address) cfg.ipv4Full;
|
||||
};
|
||||
|
||||
ipv4Full = mkOption {
|
||||
description = "Public IPv4 addresses with prefix";
|
||||
type = listOf str;
|
||||
default = [];
|
||||
example = [ "192.186.1.153/24" ];
|
||||
};
|
||||
|
||||
ipv6.standard = mkOption {
|
||||
description = "Public IPv6 addresses for standard services without prefix";
|
||||
type = listOf str;
|
||||
example = [ "2001:470:1f13:21d:f515:b348:cd48:e064" ];
|
||||
default = map (v: (mkAddress v).address) cfg.ipv6.standardFull;
|
||||
};
|
||||
|
||||
ipv6.standardFull = mkOption {
|
||||
description = "Public IPv6 addresses for standard services with prefix";
|
||||
type = listOf str;
|
||||
example = [ "2001:470:1f13:21d:f515:b348:cd48:e064/64" ];
|
||||
};
|
||||
|
||||
ipv6.acme = mkOption {
|
||||
description = "Public IPv6 address for ACME services (acme-dns) without prefi";
|
||||
type = str;
|
||||
default = (mkAddress cfg.ipv6.acmeFull).address;
|
||||
example = "2001:470:1f13:21d:f515:b348:cd48:e064/64";
|
||||
};
|
||||
|
||||
ipv6.acmeFull = mkOption {
|
||||
description = "Public IPv6 address for ACME services (acme-dns) with prefix";
|
||||
type = str;
|
||||
example = "2001:470:1f13:21d:f515:b348:cd48:e064/64";
|
||||
};
|
||||
|
||||
privateRanges = mkOption {
|
||||
description = "Internal management ranges for access control";
|
||||
type = listOf str;
|
||||
example = [ "10.1.0.0/22" ];
|
||||
};
|
||||
};
|
||||
|
||||
config = {
|
||||
networking.interfaces.ens19 = {
|
||||
ipv4.addresses = map mkAddress cfg.ipv4Full;
|
||||
ipv6.addresses = map mkAddress (cfg.ipv6.standardFull ++ [ cfg.ipv6.acmeFull ]);
|
||||
};
|
||||
};
|
||||
}
|
45
machines/core-services-01/netboot-server.nix
Normal file
45
machines/core-services-01/netboot-server.nix
Normal file
|
@ -0,0 +1,45 @@
|
|||
{ pkgs, config, ... }:
|
||||
let
|
||||
bootSystem = import <nixpkgs/nixos> {
|
||||
configuration = { config, pkgs, lib, ... }: with lib; {
|
||||
imports = [
|
||||
<nixpkgs/nixos/modules/installer/netboot/netboot-minimal.nix>
|
||||
];
|
||||
# Early init the serial console
|
||||
boot.kernelParams = [ "console=tty1" "console=ttyS0,115200" ];
|
||||
|
||||
## Some useful options for setting up a new system
|
||||
services.getty.autologinUser = mkForce "root";
|
||||
# Enable sshd wich gets disabled by netboot-minimal.nix
|
||||
systemd.services.sshd.wantedBy = mkOverride 0 [ "multi-user.target" ];
|
||||
users.users.root.openssh.authorizedKeys.keyFiles = [
|
||||
./pubkeys/gdd.keys
|
||||
./pubkeys/raito.keys
|
||||
./pubkeys/hackens-milieu.keys
|
||||
];
|
||||
programs.mosh.enable = true;
|
||||
|
||||
console.keyMap = "us";
|
||||
};
|
||||
};
|
||||
netboot = pkgs.symlinkJoin {
|
||||
name = "netboot";
|
||||
paths = with bootSystem.config.system.build; [
|
||||
netbootRamdisk
|
||||
kernel
|
||||
netbootIpxeScript
|
||||
];
|
||||
preferLocalBuild = true;
|
||||
};
|
||||
in {
|
||||
services.pixiecore = {
|
||||
enable = true;
|
||||
kernel = "${netboot}/bzImage";
|
||||
initrd = "${netboot}/initrd";
|
||||
cmdLine = "init=${bootSystem.config.system.build.toplevel}/init loglevel=4";
|
||||
debug = true;
|
||||
dhcpNoBind = true;
|
||||
port = 64172;
|
||||
statusPort = 64172;
|
||||
};
|
||||
}
|
9
machines/core-services-01/nginx.nix
Normal file
9
machines/core-services-01/nginx.nix
Normal file
|
@ -0,0 +1,9 @@
|
|||
{ ... }:
|
||||
{
|
||||
services.nginx = {
|
||||
recommendedTlsSettings = true;
|
||||
recommendedProxySettings = true;
|
||||
recommendedOptimisation = true;
|
||||
recommendedGzipSettings = true;
|
||||
};
|
||||
}
|
32
machines/core-services-01/nix/sources.json
Normal file
32
machines/core-services-01/nix/sources.json
Normal file
|
@ -0,0 +1,32 @@
|
|||
{
|
||||
"agenix": {
|
||||
"branch": "master",
|
||||
"description": "age-encrypted secrets for NixOS",
|
||||
"homepage": "",
|
||||
"owner": "ryantm",
|
||||
"repo": "agenix",
|
||||
"rev": "fb00f178b3a49a39cc964049075439b575d36d60",
|
||||
"sha256": "0rb99dbwnaf8sgjbshwk1bizs51jild3zg61a5yqw3h0vcxalzrp",
|
||||
"type": "tarball",
|
||||
"url": "https://github.com/ryantm/agenix/archive/fb00f178b3a49a39cc964049075439b575d36d60.tar.gz",
|
||||
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
|
||||
},
|
||||
"klubrz-nur": {
|
||||
"branch": "main",
|
||||
"repo": "https://git.rz.ens.wtf/Klub-RZ/nur",
|
||||
"rev": "48597e362c87365976ebc0168fb0e5678aa3865d",
|
||||
"type": "git"
|
||||
},
|
||||
"niv": {
|
||||
"branch": "master",
|
||||
"description": "Easy dependency management for Nix projects",
|
||||
"homepage": "https://github.com/nmattia/niv",
|
||||
"owner": "nmattia",
|
||||
"repo": "niv",
|
||||
"rev": "e0ca65c81a2d7a4d82a189f1e23a48d59ad42070",
|
||||
"sha256": "1pq9nh1d8nn3xvbdny8fafzw87mj7gsmp6pxkdl65w2g18rmcmzx",
|
||||
"type": "tarball",
|
||||
"url": "https://github.com/nmattia/niv/archive/e0ca65c81a2d7a4d82a189f1e23a48d59ad42070.tar.gz",
|
||||
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
|
||||
}
|
||||
}
|
174
machines/core-services-01/nix/sources.nix
Normal file
174
machines/core-services-01/nix/sources.nix
Normal file
|
@ -0,0 +1,174 @@
|
|||
# This file has been generated by Niv.
|
||||
|
||||
let
|
||||
|
||||
#
|
||||
# The fetchers. fetch_<type> fetches specs of type <type>.
|
||||
#
|
||||
|
||||
fetch_file = pkgs: name: spec:
|
||||
let
|
||||
name' = sanitizeName name + "-src";
|
||||
in
|
||||
if spec.builtin or true then
|
||||
builtins_fetchurl { inherit (spec) url sha256; name = name'; }
|
||||
else
|
||||
pkgs.fetchurl { inherit (spec) url sha256; name = name'; };
|
||||
|
||||
fetch_tarball = pkgs: name: spec:
|
||||
let
|
||||
name' = sanitizeName name + "-src";
|
||||
in
|
||||
if spec.builtin or true then
|
||||
builtins_fetchTarball { name = name'; inherit (spec) url sha256; }
|
||||
else
|
||||
pkgs.fetchzip { name = name'; inherit (spec) url sha256; };
|
||||
|
||||
fetch_git = name: spec:
|
||||
let
|
||||
ref =
|
||||
if spec ? ref then spec.ref else
|
||||
if spec ? branch then "refs/heads/${spec.branch}" else
|
||||
if spec ? tag then "refs/tags/${spec.tag}" else
|
||||
abort "In git source '${name}': Please specify `ref`, `tag` or `branch`!";
|
||||
in
|
||||
builtins.fetchGit { url = spec.repo; inherit (spec) rev; inherit ref; };
|
||||
|
||||
fetch_local = spec: spec.path;
|
||||
|
||||
fetch_builtin-tarball = name: throw
|
||||
''[${name}] The niv type "builtin-tarball" is deprecated. You should instead use `builtin = true`.
|
||||
$ niv modify ${name} -a type=tarball -a builtin=true'';
|
||||
|
||||
fetch_builtin-url = name: throw
|
||||
''[${name}] The niv type "builtin-url" will soon be deprecated. You should instead use `builtin = true`.
|
||||
$ niv modify ${name} -a type=file -a builtin=true'';
|
||||
|
||||
#
|
||||
# Various helpers
|
||||
#
|
||||
|
||||
# https://github.com/NixOS/nixpkgs/pull/83241/files#diff-c6f540a4f3bfa4b0e8b6bafd4cd54e8bR695
|
||||
sanitizeName = name:
|
||||
(
|
||||
concatMapStrings (s: if builtins.isList s then "-" else s)
|
||||
(
|
||||
builtins.split "[^[:alnum:]+._?=-]+"
|
||||
((x: builtins.elemAt (builtins.match "\\.*(.*)" x) 0) name)
|
||||
)
|
||||
);
|
||||
|
||||
# The set of packages used when specs are fetched using non-builtins.
|
||||
mkPkgs = sources: system:
|
||||
let
|
||||
sourcesNixpkgs =
|
||||
import (builtins_fetchTarball { inherit (sources.nixpkgs) url sha256; }) { inherit system; };
|
||||
hasNixpkgsPath = builtins.any (x: x.prefix == "nixpkgs") builtins.nixPath;
|
||||
hasThisAsNixpkgsPath = <nixpkgs> == ./.;
|
||||
in
|
||||
if builtins.hasAttr "nixpkgs" sources
|
||||
then sourcesNixpkgs
|
||||
else if hasNixpkgsPath && ! hasThisAsNixpkgsPath then
|
||||
import <nixpkgs> {}
|
||||
else
|
||||
abort
|
||||
''
|
||||
Please specify either <nixpkgs> (through -I or NIX_PATH=nixpkgs=...) or
|
||||
add a package called "nixpkgs" to your sources.json.
|
||||
'';
|
||||
|
||||
# The actual fetching function.
|
||||
fetch = pkgs: name: spec:
|
||||
|
||||
if ! builtins.hasAttr "type" spec then
|
||||
abort "ERROR: niv spec ${name} does not have a 'type' attribute"
|
||||
else if spec.type == "file" then fetch_file pkgs name spec
|
||||
else if spec.type == "tarball" then fetch_tarball pkgs name spec
|
||||
else if spec.type == "git" then fetch_git name spec
|
||||
else if spec.type == "local" then fetch_local spec
|
||||
else if spec.type == "builtin-tarball" then fetch_builtin-tarball name
|
||||
else if spec.type == "builtin-url" then fetch_builtin-url name
|
||||
else
|
||||
abort "ERROR: niv spec ${name} has unknown type ${builtins.toJSON spec.type}";
|
||||
|
||||
# If the environment variable NIV_OVERRIDE_${name} is set, then use
|
||||
# the path directly as opposed to the fetched source.
|
||||
replace = name: drv:
|
||||
let
|
||||
saneName = stringAsChars (c: if isNull (builtins.match "[a-zA-Z0-9]" c) then "_" else c) name;
|
||||
ersatz = builtins.getEnv "NIV_OVERRIDE_${saneName}";
|
||||
in
|
||||
if ersatz == "" then drv else
|
||||
# this turns the string into an actual Nix path (for both absolute and
|
||||
# relative paths)
|
||||
if builtins.substring 0 1 ersatz == "/" then /. + ersatz else /. + builtins.getEnv "PWD" + "/${ersatz}";
|
||||
|
||||
# Ports of functions for older nix versions
|
||||
|
||||
# a Nix version of mapAttrs if the built-in doesn't exist
|
||||
mapAttrs = builtins.mapAttrs or (
|
||||
f: set: with builtins;
|
||||
listToAttrs (map (attr: { name = attr; value = f attr set.${attr}; }) (attrNames set))
|
||||
);
|
||||
|
||||
# https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/lists.nix#L295
|
||||
range = first: last: if first > last then [] else builtins.genList (n: first + n) (last - first + 1);
|
||||
|
||||
# https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L257
|
||||
stringToCharacters = s: map (p: builtins.substring p 1 s) (range 0 (builtins.stringLength s - 1));
|
||||
|
||||
# https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L269
|
||||
stringAsChars = f: s: concatStrings (map f (stringToCharacters s));
|
||||
concatMapStrings = f: list: concatStrings (map f list);
|
||||
concatStrings = builtins.concatStringsSep "";
|
||||
|
||||
# https://github.com/NixOS/nixpkgs/blob/8a9f58a375c401b96da862d969f66429def1d118/lib/attrsets.nix#L331
|
||||
optionalAttrs = cond: as: if cond then as else {};
|
||||
|
||||
# fetchTarball version that is compatible between all the versions of Nix
|
||||
builtins_fetchTarball = { url, name ? null, sha256 }@attrs:
|
||||
let
|
||||
inherit (builtins) lessThan nixVersion fetchTarball;
|
||||
in
|
||||
if lessThan nixVersion "1.12" then
|
||||
fetchTarball ({ inherit url; } // (optionalAttrs (!isNull name) { inherit name; }))
|
||||
else
|
||||
fetchTarball attrs;
|
||||
|
||||
# fetchurl version that is compatible between all the versions of Nix
|
||||
builtins_fetchurl = { url, name ? null, sha256 }@attrs:
|
||||
let
|
||||
inherit (builtins) lessThan nixVersion fetchurl;
|
||||
in
|
||||
if lessThan nixVersion "1.12" then
|
||||
fetchurl ({ inherit url; } // (optionalAttrs (!isNull name) { inherit name; }))
|
||||
else
|
||||
fetchurl attrs;
|
||||
|
||||
# Create the final "sources" from the config
|
||||
mkSources = config:
|
||||
mapAttrs (
|
||||
name: spec:
|
||||
if builtins.hasAttr "outPath" spec
|
||||
then abort
|
||||
"The values in sources.json should not have an 'outPath' attribute"
|
||||
else
|
||||
spec // { outPath = replace name (fetch config.pkgs name spec); }
|
||||
) config.sources;
|
||||
|
||||
# The "config" used by the fetchers
|
||||
mkConfig =
|
||||
{ sourcesFile ? if builtins.pathExists ./sources.json then ./sources.json else null
|
||||
, sources ? if isNull sourcesFile then {} else builtins.fromJSON (builtins.readFile sourcesFile)
|
||||
, system ? builtins.currentSystem
|
||||
, pkgs ? mkPkgs sources system
|
||||
}: rec {
|
||||
# The sources, i.e. the attribute set of spec name to spec
|
||||
inherit sources;
|
||||
|
||||
# The "pkgs" (evaluated nixpkgs) to use for e.g. non-builtin fetchers
|
||||
inherit pkgs;
|
||||
};
|
||||
|
||||
in
|
||||
mkSources (mkConfig {}) // { __functor = _: settings: mkSources (mkConfig settings); }
|
17
machines/core-services-01/nur.nix
Normal file
17
machines/core-services-01/nur.nix
Normal file
|
@ -0,0 +1,17 @@
|
|||
{ lib, pkgs, ... }:
|
||||
let
|
||||
nivSources = import ./nix/sources.nix;
|
||||
rz-src = nivSources.klubrz-nur;
|
||||
rz-no-pkgs = (import nivSources.klubrz-nur {});
|
||||
in
|
||||
{
|
||||
nixpkgs.config.packageOverrides = {
|
||||
rz = import rz-src { inherit pkgs; };
|
||||
};
|
||||
|
||||
imports = [
|
||||
"${nivSources.agenix}/modules/age.nix"
|
||||
] ++ lib.attrValues rz-no-pkgs.modules;
|
||||
|
||||
nixpkgs.overlays = [];
|
||||
}
|
23
machines/core-services-01/programs.nix
Normal file
23
machines/core-services-01/programs.nix
Normal file
|
@ -0,0 +1,23 @@
|
|||
{ pkgs, ... }:
|
||||
let pkgsList = with pkgs; [
|
||||
nix-prefetch-git
|
||||
dnsutils
|
||||
|
||||
unzip
|
||||
zip
|
||||
ripgrep
|
||||
|
||||
niv
|
||||
nixfmt
|
||||
];
|
||||
in
|
||||
{
|
||||
imports = [
|
||||
./vim.nix
|
||||
];
|
||||
programs.tmux.enable = true;
|
||||
programs.wireshark.enable = true;
|
||||
programs.mosh.enable = true;
|
||||
|
||||
environment.systemPackages = pkgsList;
|
||||
}
|
2
machines/core-services-01/pubkeys/gdd.keys
Normal file
2
machines/core-services-01/pubkeys/gdd.keys
Normal file
|
@ -0,0 +1,2 @@
|
|||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICE7TN5NQKGojNGIeTFiHjLHTDQGT8i05JFqX/zLW2zc
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIFbkPWWZzOBaRdx4+7xQUgxDwuncSl2fxAeVuYfVUPZ
|
1
machines/core-services-01/pubkeys/hackens-milieu.keys
Normal file
1
machines/core-services-01/pubkeys/hackens-milieu.keys
Normal file
|
@ -0,0 +1 @@
|
|||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIH3+w4+nyJG8lr2mh0S9Zf8j2/6H5smlO87s6KNLlhkF hackens@hackens-milieu
|
4
machines/core-services-01/pubkeys/raito.keys
Normal file
4
machines/core-services-01/pubkeys/raito.keys
Normal file
|
@ -0,0 +1,4 @@
|
|||
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDcEkYM1r8QVNM/G5CxJInEdoBCWjEHHDdHlzDYNSUIdHHsn04QY+XI67AdMCm8w30GZnLUIj5RiJEWXREUApby0GrfxGGcy8otforygfgtmuUKAUEHdU2MMwrQI7RtTZ8oQ0USRGuqvmegxz3l5caVU7qGvBllJ4NUHXrkZSja2/51vq80RF4MKkDGiz7xUTixI2UcBwQBCA/kQedKV9G28EH+1XfvePqmMivZjl+7VyHsgUVj9eRGA1XWFw59UPZG8a7VkxO/Eb3K9NF297HUAcFMcbY6cPFi9AaBgu3VC4eetDnoN/+xT1owiHi7BReQhGAy/6cdf7C/my5ehZwD
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKIIcqryU28FkV+UpiTnGCOfwKO5jFhkdvU7a7Ew2KoZ
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMLf6B8VV//BhOWihYK8Zy1CJ3sg4w2bP0aBO0VPs4hS
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE0xMwWedkKosax9+7D2OlnMxFL/eV4CvFZLsbLptpXr
|
4
machines/core-services-01/qemu.nix
Normal file
4
machines/core-services-01/qemu.nix
Normal file
|
@ -0,0 +1,4 @@
|
|||
{ pkgs, ... }:
|
||||
{
|
||||
services.qemuGuest.enable = true;
|
||||
}
|
18
machines/core-services-01/rz.nix
Normal file
18
machines/core-services-01/rz.nix
Normal file
|
@ -0,0 +1,18 @@
|
|||
{ lib, ... }:
|
||||
|
||||
{
|
||||
imports = [ ./my.nix ];
|
||||
|
||||
my = {
|
||||
email = "club-reseau@lists.ens.psl.eu";
|
||||
acmeStaging = false;
|
||||
subZone = "rz.ens.wtf";
|
||||
ipv6.standardFull = [
|
||||
"2001:470:1f13:187:fd34:80c3:a761:ff2/64"
|
||||
];
|
||||
ipv6.acmeFull = "2001:470:1f13:187:a039:c3ff:fe4f:8661/64";
|
||||
ipv4Full = [ "10.1.1.20/24" ];
|
||||
|
||||
privateRanges = [ "10.1.0.0/22 "];
|
||||
};
|
||||
}
|
5
machines/core-services-01/secrets/default.nix
Normal file
5
machines/core-services-01/secrets/default.nix
Normal file
|
@ -0,0 +1,5 @@
|
|||
{ ... }:
|
||||
{
|
||||
age.secrets.keycloakDatabasePasswordFile.file = ./keycloakDatabasePasswordFile.age;
|
||||
age.secrets.oauth2ProxyKeyFile.file = ./oauth2ProxyKeyFile.age;
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
age-encryption.org/v1
|
||||
-> ssh-ed25519 lHr4YQ FHOLoe1idBzwzFB5v1UqrVIgIjmyVMqhC60F+7bsslY
|
||||
+4jeqlOONU712hstLOOU59dHgx48CB3+Z4xn1faH8Q0
|
||||
-> ssh-ed25519 Wu8JLQ hqwTH7IVS1GTep9tNy6vrUUVtPcVXBxDnJj77S+l/Ek
|
||||
gmnQhE5wnxQgEhyE18RKKemMQr4ewtRkQRt0bJo8O7Y
|
||||
-> ssh-ed25519 cvTB5g bw+GZVk23ok4lgUF86PqTkZOM7BPNY7foMYYMZSEemU
|
||||
6BAoCmLYb1oJwPPW3X2AaS3ZOttSxAykOeKIJM/03+k
|
||||
-> ssh-ed25519 /vwQcQ Kqg5WdWhAuxCxMgWPpXWk77utvbIbBdcZXNSOF+a938
|
||||
4361sLVjBWOoWqTl7sIktNiulSU4gHnD2Q5gjDkZ2po
|
||||
-> ssh-ed25519 reTIKw abLB9hwppWQhlkAHx3AiFgePvigajethU03CjTu6SUg
|
||||
sueQMp1LPmF4h1EPsyGrSDH6RoXVXoWm1i3OISZlyPw
|
||||
-> ssh-ed25519 85WiGg T6amGqzBiF7BLhnhPrz8BCu/NDikWBDnRv+UL2Y8mXs
|
||||
xghk5e+D3O4rX4FT4TNu/bowSj7HCn3Wi4E6F7pseiw
|
||||
-> ssh-rsa krWCLQ
|
||||
KDsZM/5myCVtb7RL9Mo1F2WUKzBPhwillBvrIONZKH0dh3mCMjeVfyYTto1NxKxp
|
||||
GsvYltgLbDggo3ittwQedB9s/JXL5z0+f3DroKVJzw82ti6w3SMpvKiCR2x+5DjH
|
||||
D4Wzt/CQFujxAMOghKQGlFuCM6nVkpmL9ucgUPEp7ApbNWuc4patJgLpvkE0yj7X
|
||||
Q4ScTPg86Oh5RFf4Qwa3QhG7IdnIoSSJxK+rK5qZb2vPST9zc2OKZKQXOh2h6hBy
|
||||
tEAhRYBTu6oqprwYlEWL7dCsbBeHjLmBE6Zvovp51PizZhzub1jCh/fuka1VTFSq
|
||||
f1oWAdTS3Ow5gXWKoH5TkQ
|
||||
-> +_u~Wjak-grease cU8 ?4 8Y(inxl+
|
||||
h+7nxip00iflkCYBX2HvbHYc0SjsLvn4WVYUPzhDGjyauwARfA5zCfuIbGnEcxzF
|
||||
FOWG9QQzr90JDCkonUjGTJ3N+ykLpiYCvLDJgXZB4MVEONyutwM
|
||||
--- dZ6ca/xXQAOh82oeOyV/EkjTzK+oUj0YgzGTqyzJ8Rs
|
||||
a™éæOvF·âŒžú‘ÞñÃúÓÊ›
|
||||
¤¦ÄÃJF¾»ÈÐßjëjŒ+
|
BIN
machines/core-services-01/secrets/oauth2ProxyKeyFile.age
Normal file
BIN
machines/core-services-01/secrets/oauth2ProxyKeyFile.age
Normal file
Binary file not shown.
13
machines/core-services-01/secrets/secrets.nix
Normal file
13
machines/core-services-01/secrets/secrets.nix
Normal file
|
@ -0,0 +1,13 @@
|
|||
let
|
||||
pkgs = import <nixpkgs> {};
|
||||
lib = pkgs.lib;
|
||||
readPubkeys = user: builtins.filter (k: k != "") (lib.splitString "\n" (builtins.readFile (../pubkeys + "/${user}.keys")));
|
||||
superadmins = (readPubkeys "raito") ++ (readPubkeys "gdd");
|
||||
core-services-01 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILrnZxP4OUGDzd1uykMghzFNLH0Fg42hH+0qxif6O6oU";
|
||||
systems = [ core-services-01 ];
|
||||
in
|
||||
{
|
||||
"keycloakDatabasePasswordFile.age".publicKeys = superadmins ++ systems;
|
||||
"oauth2ProxyKeyFile.age".publicKeys = superadmins ++ systems;
|
||||
}
|
||||
|
56
machines/core-services-01/subZone.nix
Normal file
56
machines/core-services-01/subZone.nix
Normal file
|
@ -0,0 +1,56 @@
|
|||
{ config, dns, ... }:
|
||||
|
||||
with dns.lib.combinators;
|
||||
|
||||
let
|
||||
my = config.my;
|
||||
delegateACMEDNSChallenge = acme: { _acme-challenge.CNAME = [ acme ]; };
|
||||
in
|
||||
with my.ipv6; # contains { standard, acme }
|
||||
{
|
||||
SOA = {
|
||||
nameServer = "ns1.${my.subZone}.";
|
||||
adminEmail = my.email;
|
||||
serial = 2021072400; # Y M D Version
|
||||
};
|
||||
|
||||
NS = [
|
||||
"ns1.${my.subZone}."
|
||||
];
|
||||
|
||||
AAAA = standard;
|
||||
|
||||
CAA = letsEncrypt my.email;
|
||||
|
||||
subdomains = {
|
||||
git.AAAA = standard;
|
||||
wiki.AAAA = standard;
|
||||
monitoring.AAAA = standard;
|
||||
auth.AAAA = standard;
|
||||
push.AAAA = standard;
|
||||
ns1.AAAA = standard;
|
||||
|
||||
# Délégation de sous zone à he.gdd pour la certification HE.
|
||||
gdd.subdomains.he = {
|
||||
NS = [ "ns1.he.gdd.${my.subZone}." ];
|
||||
subdomains.ns1.AAAA = [ "2001:470:1f13:187:b80d:21ff:fe43:f1a5" ];
|
||||
};
|
||||
|
||||
acme = {
|
||||
NS = [ "acme.${my.subZone}." ];
|
||||
AAAA = [ acme ];
|
||||
};
|
||||
|
||||
internal.subdomains = {
|
||||
core01 = {
|
||||
A = [ "10.1.1.20" ];
|
||||
};
|
||||
pve01 = {
|
||||
A = [ "10.1.1.10" ];
|
||||
subdomains = {
|
||||
idrac.A = [ "10.1.2.20" ];
|
||||
} // delegateACMEDNSChallenge "7c663a49-151c-4eea-a34f-725ff9f19d41.acme.rz.ens.wtf.";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
28
machines/core-services-01/system.nix
Normal file
28
machines/core-services-01/system.nix
Normal file
|
@ -0,0 +1,28 @@
|
|||
{ pkgs, ... }:
|
||||
{
|
||||
# Auto upgrades
|
||||
system.autoUpgrade = {
|
||||
enable = true;
|
||||
allowReboot = false;
|
||||
};
|
||||
|
||||
# Auto GC and store optimizations
|
||||
nix = {
|
||||
trustedUsers = [ "root" "gab" ];
|
||||
gc = {
|
||||
automatic = true;
|
||||
dates = "weekly";
|
||||
options = "--delete-older-than 90d";
|
||||
};
|
||||
optimise.automatic = true;
|
||||
extraOptions = ''
|
||||
min-free = ${toString (100 * 1024 * 1024)}
|
||||
max-free = ${toString (1024 * 1024 * 1024)}
|
||||
'';
|
||||
};
|
||||
|
||||
services.locate = {
|
||||
enable = true;
|
||||
interval = "04:05";
|
||||
};
|
||||
}
|
31
machines/core-services-01/vim.nix
Normal file
31
machines/core-services-01/vim.nix
Normal file
|
@ -0,0 +1,31 @@
|
|||
{ pkgs, ... }:
|
||||
{
|
||||
environment.variables = { EDITOR = "vim"; };
|
||||
|
||||
environment.systemPackages = with pkgs; [
|
||||
nixfmt
|
||||
git
|
||||
(neovim.override {
|
||||
vimAlias = true;
|
||||
configure = {
|
||||
packages.myPlugins = with pkgs.vimPlugins; {
|
||||
start = [ vim-lastplace vim-nix ];
|
||||
opt = [];
|
||||
};
|
||||
customRC = ''
|
||||
set encoding=utf-8
|
||||
set wildmenu
|
||||
|
||||
set nocompatible
|
||||
set backspace=indent,eol,start
|
||||
set cursorline
|
||||
hi CursorLine term=bold cterm=bold ctermbg=darkgrey
|
||||
set number
|
||||
set relativenumber
|
||||
set tabstop=4
|
||||
set expandtab
|
||||
'';
|
||||
};
|
||||
}
|
||||
)];
|
||||
}
|
Loading…
Add table
Reference in a new issue