Compare commits
No commits in common. "main" and "main" have entirely different histories.
57 changed files with 648 additions and 236 deletions
|
|
@ -4,7 +4,6 @@
|
|||
enable = true;
|
||||
package = pkgs.forgejo;
|
||||
database.type = "postgres";
|
||||
lfs.enable = true;
|
||||
|
||||
settings = {
|
||||
DEFAULT = {
|
||||
|
|
@ -18,7 +17,6 @@
|
|||
ROOT_URL = "https://git.nekover.se/";
|
||||
# LOCAL_ROOT_URL is apparently what Forgejo uses to access itself.
|
||||
# Doesn't need to be set.
|
||||
OFFLINE_MODE = true;
|
||||
};
|
||||
admin = {
|
||||
DISABLE_REGULAR_ORG_CREATION = false;
|
||||
|
|
@ -36,10 +34,11 @@
|
|||
DEFAULT_USER_VISIBILITY = "limited";
|
||||
DEFAULT_KEEP_EMAIL_PRIVATE = true;
|
||||
ENABLE_BASIC_AUTHENTICATION = false;
|
||||
ENABLE_NOTIFY_MAIL = true;
|
||||
};
|
||||
repo = {
|
||||
DEFAULT_REPO_UNITS = "repo.code,repo.issues,repo.pulls";
|
||||
};
|
||||
repository = {
|
||||
DEFAULT_REPO_UNITS = "repo.code";
|
||||
ENABLE_PUSH_CREATE_USER = true;
|
||||
ENABLE_PUSH_CREATE_ORG = true;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -29,8 +29,7 @@
|
|||
};
|
||||
|
||||
extraConfig = ''
|
||||
set_real_ip_from 10.202.41.100; # IPv4 from web-public-2
|
||||
set_real_ip_from 10.203.10.3; # IPv6 from valkyrie
|
||||
set_real_ip_from 10.202.41.100;
|
||||
real_ip_header proxy_protocol;
|
||||
'';
|
||||
};
|
||||
|
|
|
|||
|
|
@ -16,8 +16,7 @@
|
|||
extraConfig = ''
|
||||
listen 0.0.0.0:8443 http2 ssl proxy_protocol;
|
||||
|
||||
set_real_ip_from 10.202.41.100; # IPv4 from web-public-2
|
||||
set_real_ip_from 10.203.10.3; # IPv6 from valkyrie
|
||||
set_real_ip_from 10.202.41.100;
|
||||
real_ip_header proxy_protocol;
|
||||
'';
|
||||
};
|
||||
|
|
@ -34,8 +33,7 @@
|
|||
extraConfig = ''
|
||||
listen 0.0.0.0:8443 http2 ssl proxy_protocol;
|
||||
|
||||
set_real_ip_from 10.202.41.100; # IPv4 from web-public-2
|
||||
set_real_ip_from 10.203.10.3; # IPv6 from valkyrie
|
||||
set_real_ip_from 10.202.41.100;
|
||||
real_ip_header proxy_protocol;
|
||||
'';
|
||||
};
|
||||
|
|
|
|||
|
|
@ -39,8 +39,7 @@ in
|
|||
};
|
||||
};
|
||||
extraConfig = ''
|
||||
set_real_ip_from 10.202.41.100; # IPv4 from web-public-2
|
||||
set_real_ip_from 10.203.10.3; # IPv6 from valkyrie
|
||||
set_real_ip_from 10.202.41.100;
|
||||
real_ip_header proxy_protocol;
|
||||
'';
|
||||
};
|
||||
|
|
|
|||
|
|
@ -27,8 +27,7 @@
|
|||
extraConfig = ''
|
||||
listen 0.0.0.0:8443 http2 ssl proxy_protocol;
|
||||
|
||||
set_real_ip_from 10.202.41.100; # IPv4 from web-public-2
|
||||
set_real_ip_from 10.203.10.3; # IPv6 from valkyrie
|
||||
set_real_ip_from 10.202.41.100;
|
||||
real_ip_header proxy_protocol;
|
||||
|
||||
add_header Strict-Transport-Security "max-age=63072000" always;
|
||||
|
|
|
|||
23
config/hosts/mastodon/containers/fedifetcher/default.nix
Normal file
23
config/hosts/mastodon/containers/fedifetcher/default.nix
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
{ nixpkgs-unstable, ... }:
|
||||
{
|
||||
containers.fedifetcher = {
|
||||
nixpkgs = nixpkgs-unstable;
|
||||
autoStart = true;
|
||||
|
||||
bindMounts = {
|
||||
"/secrets" = {
|
||||
hostPath = "/secrets-fedifetcher";
|
||||
isReadOnly = true;
|
||||
};
|
||||
};
|
||||
|
||||
config = { ... }: {
|
||||
imports = [
|
||||
./fedifetcher.nix
|
||||
];
|
||||
|
||||
networking.useHostResolvConf = true;
|
||||
system.stateVersion = "24.05";
|
||||
};
|
||||
};
|
||||
}
|
||||
42
config/hosts/mastodon/containers/fedifetcher/fedifetcher.nix
Normal file
42
config/hosts/mastodon/containers/fedifetcher/fedifetcher.nix
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
{ pkgs, lib, ... }:
|
||||
{
|
||||
# config copied from https://github.com/arachnist/nibylandia/blob/main/nixos/zorigami/default.nix
|
||||
systemd.services.fedifetcher = {
|
||||
path = [ pkgs.fedifetcher ];
|
||||
description = "fetch fedi posts";
|
||||
script = ''
|
||||
fedifetcher
|
||||
'';
|
||||
environment = lib.mapAttrs' (n: v:
|
||||
(lib.nameValuePair ("ff_" + builtins.replaceStrings [ "-" ] [ "_" ] n)
|
||||
(builtins.toString v))) {
|
||||
server = "social.nekover.se";
|
||||
state-dir = "/var/lib/fedifetcher";
|
||||
lock-file = "/run/fedifetcher/fedifetcher.lock";
|
||||
from-lists = 1;
|
||||
from-notifications = 1;
|
||||
max-bookmarks = 80;
|
||||
max-favourites = 40;
|
||||
max-follow-requests = 80;
|
||||
max-followers = 80;
|
||||
max-followings = 80;
|
||||
remember-hosts-for-days = 30;
|
||||
remember-users-for-hours = 168;
|
||||
reply-interval-in-hours = 2;
|
||||
};
|
||||
serviceConfig = {
|
||||
DynamicUser = true;
|
||||
User = "fedifetcher";
|
||||
RuntimeDirectory = "fedifetcher";
|
||||
RuntimeDirectoryPreserve = true;
|
||||
StateDirectory = "fedifetcher";
|
||||
UMask = "0077";
|
||||
EnvironmentFile = [ "/secrets/mastodon-fedifetcher-access-token.secret" ];
|
||||
};
|
||||
};
|
||||
|
||||
systemd.timers.fedifetcher = {
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
timerConfig = { OnCalendar = "*:0/5"; };
|
||||
};
|
||||
}
|
||||
|
|
@ -5,5 +5,6 @@
|
|||
./mastodon.nix
|
||||
./opensearch.nix
|
||||
./nginx.nix
|
||||
./containers/fedifetcher
|
||||
];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@
|
|||
let
|
||||
tangerineUI = pkgs.fetchgit {
|
||||
url = "https://github.com/nileane/TangerineUI-for-Mastodon.git";
|
||||
rev = "v2.5.3";
|
||||
hash = "sha256-fs/pwIwXZvSNVmlSG304CMT/hSW/RtrzraMsrhg/TbE=";
|
||||
rev = "v2.5.2";
|
||||
hash = "sha256-RJPP3QynE42cr9Km8twyZrHiZnhMdNcYOOJ7nW0mx1c=";
|
||||
};
|
||||
mastodonModern = pkgs.fetchgit {
|
||||
url = "https://git.gay/freeplay/Mastodon-Modern.git";
|
||||
|
|
@ -16,14 +16,14 @@ let
|
|||
};
|
||||
mastodonNekoverseOverlay = final: prev: {
|
||||
mastodon = (prev.mastodon.override rec {
|
||||
version = "4.5.8";
|
||||
version = "4.5.2";
|
||||
srcOverride = final.applyPatches {
|
||||
src = pkgs.stdenv.mkDerivation {
|
||||
name = "mastodonWithThemes";
|
||||
src = pkgs.fetchgit {
|
||||
url = "https://github.com/mastodon/mastodon.git";
|
||||
rev = "v${version}";
|
||||
sha256 = "sha256-03PdAB9KOvMgQJPx+7ik13QE18fjdLIab7zEXaPc4nk=";
|
||||
sha256 = "sha256-LePly+CcM+Dv6ipX9jIWWKhy2PiF1j8vgc9CXn2o+DQ=";
|
||||
};
|
||||
# mastodon ships with broken symlinks, disable the check for that for now
|
||||
dontCheckForBrokenSymlinks = true;
|
||||
|
|
|
|||
|
|
@ -57,8 +57,7 @@
|
|||
};
|
||||
|
||||
extraConfig = ''
|
||||
set_real_ip_from 10.202.41.100; # IPv4 from web-public-2
|
||||
set_real_ip_from 10.203.10.3; # IPv6 from valkyrie
|
||||
set_real_ip_from 10.202.41.100;
|
||||
real_ip_header proxy_protocol;
|
||||
'';
|
||||
};
|
||||
|
|
|
|||
|
|
@ -57,5 +57,13 @@
|
|||
permissions = "0640";
|
||||
uploadAt = "pre-activation";
|
||||
};
|
||||
"mastodon-fedifetcher-access-token.secret" = {
|
||||
keyCommand = keyCommandEnv ++ [ "pass" "mastodon/fedifetcher-access-token" ];
|
||||
destDir = "/secrets-fedifetcher";
|
||||
user = "root";
|
||||
group = "root";
|
||||
permissions = "0640";
|
||||
uploadAt = "pre-activation";
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,17 +33,6 @@ let
|
|||
}];
|
||||
proxy_protocol = false;
|
||||
}
|
||||
{
|
||||
name = "admin";
|
||||
resources = [{
|
||||
name = "adminapi";
|
||||
}];
|
||||
binds = [{
|
||||
host = "localhost";
|
||||
port = 8083;
|
||||
}];
|
||||
proxy_protocol = false;
|
||||
}
|
||||
];
|
||||
trusted_proxies = [
|
||||
"192.168.0.0/16"
|
||||
|
|
@ -74,7 +63,8 @@ let
|
|||
version = 2;
|
||||
algorithm = "argon2id";
|
||||
}
|
||||
];
|
||||
];
|
||||
minimum_complexity = 8;
|
||||
};
|
||||
};
|
||||
masSettingsFile = ((pkgs.formats.yaml { }).generate "mas-config" masSettings);
|
||||
|
|
|
|||
|
|
@ -34,25 +34,11 @@
|
|||
client_max_body_size ${config.services.matrix-synapse.settings.max_upload_size};
|
||||
'';
|
||||
};
|
||||
"~ ^/_synapse/admin" = {
|
||||
# Only proxy to the local host on IPv4, because localhost doesn't seem to work
|
||||
# even if matrix-synapse is listening on ::1 as well.
|
||||
proxyPass = "http://127.0.0.1:8008";
|
||||
extraConfig = ''
|
||||
# Restrict access to admin API.
|
||||
allow 172.21.87.0/24; # management VPN
|
||||
deny all;
|
||||
# Nginx by default only allows file uploads up to 1M in size
|
||||
# Increase client_max_body_size to match max_upload_size defined in homeserver.yaml
|
||||
client_max_body_size ${config.services.matrix-synapse.settings.max_upload_size};
|
||||
'';
|
||||
};
|
||||
};
|
||||
extraConfig = ''
|
||||
listen 0.0.0.0:8443 http2 ssl proxy_protocol;
|
||||
|
||||
set_real_ip_from 10.202.41.100; # IPv4 from web-public-2
|
||||
set_real_ip_from 10.203.10.3; # IPv6 from valkyrie
|
||||
set_real_ip_from 10.202.41.100;
|
||||
real_ip_header proxy_protocol;
|
||||
'';
|
||||
};
|
||||
|
|
@ -65,24 +51,13 @@
|
|||
port = 80;
|
||||
}
|
||||
];
|
||||
locations = {
|
||||
"/" = {
|
||||
proxyPass = "http://localhost:8080";
|
||||
};
|
||||
"~ ^/api/admin" = {
|
||||
proxyPass = "http://localhost:8083";
|
||||
extraConfig = ''
|
||||
# Restrict access to admin API.
|
||||
allow 172.21.87.0/24; # management VPN
|
||||
deny all;
|
||||
'';
|
||||
};
|
||||
locations."/" = {
|
||||
proxyPass = "http://localhost:8080";
|
||||
};
|
||||
extraConfig = ''
|
||||
listen 0.0.0.0:8443 http2 ssl proxy_protocol;
|
||||
|
||||
set_real_ip_from 10.202.41.100; # IPv4 from web-public-2
|
||||
set_real_ip_from 10.203.10.3; # IPv6 from valkyrie
|
||||
set_real_ip_from 10.202.41.100;
|
||||
real_ip_header proxy_protocol;
|
||||
'';
|
||||
};
|
||||
|
|
@ -105,8 +80,7 @@
|
|||
extraConfig = ''
|
||||
listen 0.0.0.0:8443 http2 ssl proxy_protocol;
|
||||
|
||||
set_real_ip_from 10.202.41.100; # IPv4 from web-public-2
|
||||
set_real_ip_from 10.203.10.3; # IPv6 from valkyrie
|
||||
set_real_ip_from 10.202.41.100;
|
||||
real_ip_header proxy_protocol;
|
||||
'';
|
||||
};
|
||||
|
|
|
|||
|
|
@ -13,7 +13,6 @@
|
|||
admin_user = "admin";
|
||||
admin_password = "$__file{/secrets/metrics-nekomesh-grafana-admin-password.secret}";
|
||||
admin_email = "fi@nekover.se";
|
||||
secret_key = "$__file{/secrets/metrics-nekomesh-grafana-secret-key.secret}";
|
||||
};
|
||||
smtp = {
|
||||
enabled = true;
|
||||
|
|
|
|||
|
|
@ -23,8 +23,7 @@
|
|||
proxyWebsockets = true;
|
||||
};
|
||||
extraConfig = ''
|
||||
set_real_ip_from 10.202.41.100; # IPv4 from web-public-2
|
||||
set_real_ip_from 10.203.10.3; # IPv6 from valkyrie
|
||||
set_real_ip_from 10.202.41.100;
|
||||
real_ip_header proxy_protocol;
|
||||
'';
|
||||
};
|
||||
|
|
|
|||
|
|
@ -17,14 +17,6 @@
|
|||
permissions = "0640";
|
||||
uploadAt = "pre-activation";
|
||||
};
|
||||
"metrics-nekomesh-grafana-secret-key.secret" = {
|
||||
keyCommand = keyCommandEnv ++ [ "pass" "metrics-nekomesh/grafana/secret-key" ];
|
||||
destDir = "/secrets";
|
||||
user = "grafana";
|
||||
group = "grafana";
|
||||
permissions = "0640";
|
||||
uploadAt = "pre-activation";
|
||||
};
|
||||
"mail-nekomesh-nekover-se.secret" = {
|
||||
keyCommand = keyCommandEnv ++ [ "pass" "mail/nekomesh-nekover-se" ];
|
||||
destDir = "/secrets";
|
||||
|
|
|
|||
33
config/hosts/navidrome/configuration.nix
Normal file
33
config/hosts/navidrome/configuration.nix
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
{ ... }:
|
||||
{
|
||||
boot.loader.grub = {
|
||||
enable = true;
|
||||
device = "/dev/vda";
|
||||
};
|
||||
|
||||
networking = {
|
||||
hostName = "navidrome";
|
||||
firewall = {
|
||||
enable = true;
|
||||
allowedTCPPorts = [ 80 443 ];
|
||||
};
|
||||
};
|
||||
|
||||
fileSystems = {
|
||||
"/mnt/music" = {
|
||||
device = "//10.202.40.5/music-ro";
|
||||
fsType = "cifs";
|
||||
options = [
|
||||
"username=navidrome"
|
||||
"credentials=/secrets/navidrome-samba-credentials.secret"
|
||||
"iocharset=utf8"
|
||||
"vers=3.1.1"
|
||||
"uid=navidrome"
|
||||
"gid=navidrome"
|
||||
"_netdev"
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
system.stateVersion = "23.05";
|
||||
}
|
||||
7
config/hosts/navidrome/default.nix
Normal file
7
config/hosts/navidrome/default.nix
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
{ ... }: {
|
||||
imports = [
|
||||
./configuration.nix
|
||||
./navidrome.nix
|
||||
./nginx.nix
|
||||
];
|
||||
}
|
||||
9
config/hosts/navidrome/navidrome.nix
Normal file
9
config/hosts/navidrome/navidrome.nix
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
{ ... }: {
|
||||
services.navidrome = {
|
||||
enable = true;
|
||||
settings = {
|
||||
Address = "unix:/run/navidrome/navidrome.socket";
|
||||
MusicFolder = "/mnt/music";
|
||||
};
|
||||
};
|
||||
}
|
||||
24
config/hosts/navidrome/nginx.nix
Normal file
24
config/hosts/navidrome/nginx.nix
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
{ ... }: {
|
||||
services.nginx = {
|
||||
enable = true;
|
||||
user = "navidrome";
|
||||
virtualHosts."navidrome.grzb.de" = {
|
||||
forceSSL = true;
|
||||
enableACME = true;
|
||||
listen = [
|
||||
{
|
||||
addr = "0.0.0.0";
|
||||
port = 80;
|
||||
}
|
||||
{
|
||||
addr = "0.0.0.0";
|
||||
port = 443;
|
||||
ssl = true;
|
||||
}
|
||||
];
|
||||
locations."/" = {
|
||||
proxyPass = "http://unix:/run/navidrome/navidrome.socket";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
13
config/hosts/navidrome/secrets.nix
Normal file
13
config/hosts/navidrome/secrets.nix
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
{ keyCommandEnv, ... }:
|
||||
{
|
||||
deployment.keys = {
|
||||
"navidrome-samba-credentials.secret" = {
|
||||
keyCommand = keyCommandEnv ++ [ "pass" "navidrome/samba-credentials" ];
|
||||
destDir = "/secrets";
|
||||
user = "root";
|
||||
group = "root";
|
||||
permissions = "0640";
|
||||
uploadAt = "pre-activation";
|
||||
};
|
||||
};
|
||||
}
|
||||
17
config/hosts/netbox/configuration.nix
Normal file
17
config/hosts/netbox/configuration.nix
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
{ ... }:
|
||||
{
|
||||
boot.loader.grub = {
|
||||
enable = true;
|
||||
device = "/dev/vda";
|
||||
};
|
||||
|
||||
networking = {
|
||||
hostName = "netbox";
|
||||
firewall = {
|
||||
enable = true;
|
||||
allowedTCPPorts = [ 80 443 ];
|
||||
};
|
||||
};
|
||||
|
||||
system.stateVersion = "23.05";
|
||||
}
|
||||
8
config/hosts/netbox/default.nix
Normal file
8
config/hosts/netbox/default.nix
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{ ... }:
|
||||
{
|
||||
imports = [
|
||||
./configuration.nix
|
||||
./netbox.nix
|
||||
./nginx.nix
|
||||
];
|
||||
}
|
||||
8
config/hosts/netbox/netbox.nix
Normal file
8
config/hosts/netbox/netbox.nix
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{ pkgs, ... }:
|
||||
{
|
||||
services.netbox = {
|
||||
enable = true;
|
||||
package = pkgs.netbox;
|
||||
secretKeyFile = "/secrets/netbox-secret-key.secret";
|
||||
};
|
||||
}
|
||||
29
config/hosts/netbox/nginx.nix
Normal file
29
config/hosts/netbox/nginx.nix
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
{ config, ... }:
|
||||
{
|
||||
services.nginx = {
|
||||
enable = true;
|
||||
clientMaxBodySize = "25m";
|
||||
user = "netbox";
|
||||
virtualHosts."netbox.grzb.de" = {
|
||||
forceSSL = true;
|
||||
enableACME = true;
|
||||
listen = [
|
||||
{
|
||||
addr = "0.0.0.0";
|
||||
port = 80;
|
||||
}
|
||||
{
|
||||
addr = "0.0.0.0";
|
||||
port = 443;
|
||||
ssl = true;
|
||||
}
|
||||
];
|
||||
locations."/static/" = {
|
||||
alias = "${config.services.netbox.dataDir}/static/";
|
||||
};
|
||||
locations."/" = {
|
||||
proxyPass = "http://${config.services.netbox.listenAddress}:${builtins.toString config.services.netbox.port}";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
11
config/hosts/netbox/secrets.nix
Normal file
11
config/hosts/netbox/secrets.nix
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
{ keyCommandEnv, ... }:
|
||||
{
|
||||
deployment.keys."netbox-secret-key.secret" = {
|
||||
keyCommand = keyCommandEnv ++ [ "pass" "netbox/secret-key" ];
|
||||
destDir = "/secrets";
|
||||
user = "netbox";
|
||||
group = "netbox";
|
||||
permissions = "0640";
|
||||
uploadAt = "pre-activation";
|
||||
};
|
||||
}
|
||||
|
|
@ -44,8 +44,7 @@
|
|||
extraConfig = ''
|
||||
listen 0.0.0.0:8443 http2 ssl proxy_protocol;
|
||||
|
||||
set_real_ip_from 10.202.41.100; # IPv4 from web-public-2
|
||||
set_real_ip_from 10.203.10.3; # IPv6 from valkyrie
|
||||
set_real_ip_from 10.202.41.100;
|
||||
real_ip_header proxy_protocol;
|
||||
'';
|
||||
};
|
||||
|
|
|
|||
17
config/hosts/nitter/configuration.nix
Normal file
17
config/hosts/nitter/configuration.nix
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
{ ... }:
|
||||
{
|
||||
boot.loader.grub = {
|
||||
enable = true;
|
||||
device = "/dev/vda";
|
||||
};
|
||||
|
||||
networking = {
|
||||
hostName = "nitter";
|
||||
firewall = {
|
||||
enable = true;
|
||||
allowedTCPPorts = [ 8443 ];
|
||||
};
|
||||
};
|
||||
|
||||
system.stateVersion = "23.05";
|
||||
}
|
||||
8
config/hosts/nitter/default.nix
Normal file
8
config/hosts/nitter/default.nix
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{ ... }:
|
||||
{
|
||||
imports = [
|
||||
./configuration.nix
|
||||
./nginx.nix
|
||||
./nitter.nix
|
||||
];
|
||||
}
|
||||
23
config/hosts/nitter/nginx.nix
Normal file
23
config/hosts/nitter/nginx.nix
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
{ config, ... }:
|
||||
{
|
||||
services.nginx = {
|
||||
enable = true;
|
||||
virtualHosts."birdsite.nekover.se" = {
|
||||
forceSSL = true;
|
||||
enableACME = true;
|
||||
locations."/robots.txt" = {
|
||||
return = "200 \"User-agent: *\\nDisallow: /\\n\"";
|
||||
};
|
||||
locations."/" = {
|
||||
proxyPass = "http://${config.services.nitter.server.address}:${builtins.toString config.services.nitter.server.port}";
|
||||
proxyWebsockets = true;
|
||||
};
|
||||
extraConfig = ''
|
||||
listen 0.0.0.0:8443 http2 ssl proxy_protocol;
|
||||
|
||||
set_real_ip_from 10.202.41.100;
|
||||
real_ip_header proxy_protocol;
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
21
config/hosts/nitter/nitter.nix
Normal file
21
config/hosts/nitter/nitter.nix
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
{ ... }:
|
||||
{
|
||||
services.nitter = {
|
||||
enable = true;
|
||||
|
||||
server = {
|
||||
title = "Birdsite";
|
||||
https = true;
|
||||
address = "127.0.0.1";
|
||||
port = 8080;
|
||||
hostname = "birdsite.nekover.se";
|
||||
};
|
||||
|
||||
preferences = {
|
||||
theme = "Mastodon";
|
||||
replaceTwitter = "birdsite.nekover.se";
|
||||
infiniteScroll = true;
|
||||
hlsPlayback = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
17
config/hosts/paperless/configuration.nix
Normal file
17
config/hosts/paperless/configuration.nix
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
{ ... }:
|
||||
{
|
||||
boot.loader.grub = {
|
||||
enable = true;
|
||||
device = "/dev/vda";
|
||||
};
|
||||
|
||||
networking = {
|
||||
hostName = "paperless";
|
||||
firewall = {
|
||||
enable = true;
|
||||
allowedTCPPorts = [ 80 443 ];
|
||||
};
|
||||
};
|
||||
|
||||
system.stateVersion = "23.05";
|
||||
}
|
||||
9
config/hosts/paperless/default.nix
Normal file
9
config/hosts/paperless/default.nix
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
{ ... }:
|
||||
{
|
||||
imports = [
|
||||
./configuration.nix
|
||||
./hardware-configuration.nix
|
||||
./nginx.nix
|
||||
./paperless.nix
|
||||
];
|
||||
}
|
||||
30
config/hosts/paperless/hardware-configuration.nix
Normal file
30
config/hosts/paperless/hardware-configuration.nix
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
{ ... }:
|
||||
{
|
||||
fileSystems = {
|
||||
"/mnt/data" = {
|
||||
device = "/dev/disk/by-label/data";
|
||||
fsType = "ext4";
|
||||
autoFormat = true;
|
||||
autoResize = true;
|
||||
};
|
||||
"/mnt/paperless-consume" = {
|
||||
device = "//10.201.40.10/paperless-consume";
|
||||
fsType = "cifs";
|
||||
options = [
|
||||
"username=paperless"
|
||||
"credentials=/secrets/paperless-samba-credentials.secret"
|
||||
"iocharset=utf8"
|
||||
"vers=3.1.1"
|
||||
"uid=paperless"
|
||||
"gid=paperless"
|
||||
"_netdev"
|
||||
];
|
||||
};
|
||||
"/var/lib/paperless" = {
|
||||
depends = [ "/mnt/data" ];
|
||||
device = "/mnt/data/paperless";
|
||||
fsType = "none";
|
||||
options = [ "bind" ];
|
||||
};
|
||||
};
|
||||
}
|
||||
31
config/hosts/paperless/nginx.nix
Normal file
31
config/hosts/paperless/nginx.nix
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
{ config, ... }:
|
||||
{
|
||||
services.nginx = {
|
||||
enable = true;
|
||||
virtualHosts."paperless.grzb.de" = {
|
||||
forceSSL = true;
|
||||
enableACME = true;
|
||||
listen = [
|
||||
{
|
||||
addr = "0.0.0.0";
|
||||
port = 80;
|
||||
}
|
||||
{
|
||||
addr = "0.0.0.0";
|
||||
port = 443;
|
||||
ssl = true;
|
||||
}
|
||||
];
|
||||
locations."/" = {
|
||||
proxyPass = "http://${config.services.paperless.address}:${builtins.toString config.services.paperless.port}";
|
||||
proxyWebsockets = true;
|
||||
extraConfig = ''
|
||||
add_header Referrer-Policy "strict-origin-when-cross-origin";
|
||||
'';
|
||||
};
|
||||
extraConfig = ''
|
||||
client_max_body_size 100M;
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
8
config/hosts/paperless/paperless.nix
Normal file
8
config/hosts/paperless/paperless.nix
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{ ... }:
|
||||
{
|
||||
services.paperless = {
|
||||
enable = true;
|
||||
consumptionDir = "/mnt/paperless-consume";
|
||||
passwordFile = "/secrets/paperless-admin-password.secret";
|
||||
};
|
||||
}
|
||||
21
config/hosts/paperless/secrets.nix
Normal file
21
config/hosts/paperless/secrets.nix
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
{ keyCommandEnv, ... }:
|
||||
{
|
||||
deployment.keys = {
|
||||
"paperless-admin-password.secret" = {
|
||||
keyCommand = keyCommandEnv ++ [ "pass" "paperless/admin-password" ];
|
||||
destDir = "/secrets";
|
||||
user = "paperless";
|
||||
group = "paperless";
|
||||
permissions = "0640";
|
||||
uploadAt = "pre-activation";
|
||||
};
|
||||
"paperless-samba-credentials.secret" = {
|
||||
keyCommand = keyCommandEnv ++ [ "pass" "paperless/samba-credentials" ];
|
||||
destDir = "/secrets";
|
||||
user = "root";
|
||||
group = "root";
|
||||
permissions = "0640";
|
||||
uploadAt = "pre-activation";
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
@ -21,8 +21,7 @@
|
|||
proxyPass = "http://${config.services.searx.settings.server.bind_address}:${builtins.toString config.services.searx.settings.server.port}";
|
||||
};
|
||||
extraConfig = ''
|
||||
set_real_ip_from 10.202.41.100; # IPv4 from web-public-2
|
||||
set_real_ip_from 10.203.10.3; # IPv6 from valkyrie
|
||||
set_real_ip_from 10.202.41.100;
|
||||
real_ip_header proxy_protocol;
|
||||
'';
|
||||
};
|
||||
|
|
|
|||
|
|
@ -33,31 +33,5 @@
|
|||
};
|
||||
};
|
||||
};
|
||||
|
||||
streamConfig = ''
|
||||
map $ssl_preread_server_name $address {
|
||||
cloud.nekover.se 10.202.41.122:8443;
|
||||
element.nekover.se 10.202.41.100:8443;
|
||||
element-admin.nekover.se 10.202.41.100:8443;
|
||||
fi.nekover.se 10.202.41.125:8443;
|
||||
git.nekover.se 10.202.41.106:8443;
|
||||
hydra.nekover.se 10.202.41.121:8443;
|
||||
id.nekover.se 10.202.41.124:8443;
|
||||
mas.nekover.se 10.202.41.112:8443;
|
||||
matrix.nekover.se 10.202.41.112:8443;
|
||||
matrix-rtc.nekover.se 10.202.41.112:8443;
|
||||
mesh.nekover.se 10.202.41.126:8443;
|
||||
nekover.se 10.202.41.100:8443;
|
||||
nix-cache.nekover.se 10.202.41.121:8443;
|
||||
searx.nekover.se 10.202.41.105:8443;
|
||||
social.nekover.se 10.202.41.104:8443;
|
||||
}
|
||||
server {
|
||||
listen [::]:443;
|
||||
proxy_pass $address;
|
||||
ssl_preread on;
|
||||
proxy_protocol on;
|
||||
}
|
||||
'';
|
||||
};
|
||||
}
|
||||
|
|
|
|||
17
config/hosts/web-public-1/configuration.nix
Normal file
17
config/hosts/web-public-1/configuration.nix
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
{ ... }:
|
||||
{
|
||||
boot.loader.grub = {
|
||||
enable = true;
|
||||
device = "/dev/vda";
|
||||
};
|
||||
|
||||
networking = {
|
||||
hostName = "web-public-1";
|
||||
firewall = {
|
||||
enable = true;
|
||||
allowedTCPPorts = [ 80 443 ];
|
||||
};
|
||||
};
|
||||
|
||||
system.stateVersion = "23.05";
|
||||
}
|
||||
7
config/hosts/web-public-1/default.nix
Normal file
7
config/hosts/web-public-1/default.nix
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
{ ... }:
|
||||
{
|
||||
imports = [
|
||||
./configuration.nix
|
||||
./nginx.nix
|
||||
];
|
||||
}
|
||||
10
config/hosts/web-public-1/nginx.nix
Normal file
10
config/hosts/web-public-1/nginx.nix
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{ ... }:
|
||||
{
|
||||
imports = [
|
||||
./virtualHosts
|
||||
];
|
||||
|
||||
services.nginx = {
|
||||
enable = true;
|
||||
};
|
||||
}
|
||||
18
config/hosts/web-public-1/virtualHosts/acme-challenge.nix
Normal file
18
config/hosts/web-public-1/virtualHosts/acme-challenge.nix
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
{ ... }:
|
||||
let
|
||||
acmeDomainMap = {
|
||||
"paperless.grzb.de" = "paperless.wg.grzb.de";
|
||||
"navidrome.grzb.de" = "navidrome.wg.grzb.de";
|
||||
};
|
||||
in
|
||||
{
|
||||
services.nginx.virtualHosts = (builtins.mapAttrs (domain: target: {
|
||||
listen = [{
|
||||
addr = "0.0.0.0";
|
||||
port = 80;
|
||||
}];
|
||||
locations."^~ /.well-known/acme-challenge/" = {
|
||||
proxyPass = "http://${target}:80";
|
||||
};
|
||||
}) acmeDomainMap);
|
||||
}
|
||||
16
config/hosts/web-public-1/virtualHosts/default.nix
Normal file
16
config/hosts/web-public-1/virtualHosts/default.nix
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
{ ... }:
|
||||
{
|
||||
imports = [
|
||||
./acme-challenge.nix
|
||||
];
|
||||
|
||||
services.nginx.virtualHosts."_" = {
|
||||
listen = [{
|
||||
addr = "0.0.0.0";
|
||||
port = 80;
|
||||
}];
|
||||
locations."/" = {
|
||||
return = "301 https://$host$request_uri";
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
@ -16,16 +16,19 @@
|
|||
|
||||
stream {
|
||||
map $ssl_preread_server_name $address {
|
||||
anisync.grzb.de 127.0.0.1:8443;
|
||||
cloud.nekover.se 10.202.41.122:8443;
|
||||
element.nekover.se 127.0.0.1:8443;
|
||||
element-admin.nekover.se 127.0.0.1:8443;
|
||||
fi.nekover.se 10.202.41.125:8443;
|
||||
gameserver.grzb.de 127.0.0.1:8443;
|
||||
git.grzb.de 127.0.0.1:8443;
|
||||
git.nekover.se 10.202.41.106:8443;
|
||||
hydra.nekover.se 10.202.41.121:8443;
|
||||
id.nekover.se 10.202.41.124:8443;
|
||||
mas.nekover.se 10.202.41.112:8443;
|
||||
matrix.nekover.se 10.202.41.112:8443;
|
||||
matrix-rtc.nekover.se 10.202.41.112:8443;
|
||||
mewtube.nekover.se 127.0.0.1:8443;
|
||||
nekover.se 127.0.0.1:8443;
|
||||
mesh.nekover.se 10.202.41.126:8443;
|
||||
nix-cache.nekover.se 10.202.41.121:8443;
|
||||
|
|
@ -34,6 +37,7 @@
|
|||
}
|
||||
server {
|
||||
listen 0.0.0.0:443;
|
||||
listen [::]:443;
|
||||
proxy_pass $address;
|
||||
ssl_preread on;
|
||||
proxy_protocol on;
|
||||
|
|
|
|||
23
config/hosts/web-public-2/virtualHosts/anisync.grzb.de.nix
Normal file
23
config/hosts/web-public-2/virtualHosts/anisync.grzb.de.nix
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
{ ... }:
|
||||
{
|
||||
services.nginx.virtualHosts."anisync.grzb.de" = {
|
||||
forceSSL = true;
|
||||
enableACME = true;
|
||||
listen = [{
|
||||
addr = "localhost";
|
||||
port = 8443;
|
||||
ssl = true;
|
||||
extraParameters = ["proxy_protocol"];
|
||||
}];
|
||||
locations."/" = {
|
||||
proxyPass = "http://anisync.vs.grzb.de:8080";
|
||||
proxyWebsockets = true;
|
||||
};
|
||||
extraConfig = ''
|
||||
add_header X-Content-Type-Options nosniff;
|
||||
|
||||
set_real_ip_from 127.0.0.1;
|
||||
real_ip_header proxy_protocol;
|
||||
'';
|
||||
};
|
||||
}
|
||||
|
|
@ -2,8 +2,11 @@
|
|||
{
|
||||
imports = [
|
||||
./acme-challenge.nix
|
||||
./anisync.grzb.de.nix
|
||||
./element.nekover.se.nix
|
||||
./element-admin.nekover.se.nix
|
||||
./gameserver.grzb.de.nix
|
||||
./git.grzb.de.nix
|
||||
./mewtube.nekover.se.nix
|
||||
./nekover.se.nix
|
||||
];
|
||||
|
||||
|
|
|
|||
|
|
@ -1,96 +0,0 @@
|
|||
{ config, pkgs, ... }:
|
||||
|
||||
let
|
||||
elementAdminVersion = "0.1.10";
|
||||
elementAdmin = pkgs.stdenv.mkDerivation (finalAttrs: {
|
||||
pname = "element-admin";
|
||||
version = elementAdminVersion;
|
||||
|
||||
src = pkgs.fetchzip {
|
||||
url = "https://github.com/element-hq/element-admin/archive/refs/tags/v${elementAdminVersion}.zip";
|
||||
sha256 = "sha256-dh7tmzAaTfKB9FuOVhLHpOIsTZK1qMvNq16HeObHOqI=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [
|
||||
pkgs.nodejs
|
||||
pkgs.pnpm.configHook
|
||||
];
|
||||
|
||||
pnpmDeps = pkgs.pnpm.fetchDeps {
|
||||
inherit (finalAttrs) pname version src;
|
||||
fetcherVersion = 2;
|
||||
hash = "sha256-S/MdfUv6q+PaAKWYHxVY80BcpL81dOfpPVhNxEPQVE4=";
|
||||
};
|
||||
|
||||
buildPhase = ''
|
||||
pnpm build
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
cp -a dist $out
|
||||
'';
|
||||
});
|
||||
in
|
||||
{
|
||||
services.nginx.virtualHosts."element-admin.nekover.se" = {
|
||||
forceSSL = true;
|
||||
enableACME = true;
|
||||
|
||||
listen = [{
|
||||
addr = "0.0.0.0";
|
||||
port = 8443;
|
||||
ssl = true;
|
||||
extraParameters = ["proxy_protocol"];
|
||||
}];
|
||||
|
||||
root = elementAdmin;
|
||||
|
||||
locations."/assets" = {
|
||||
extraConfig = ''
|
||||
expires 1y;
|
||||
add_header Cache-Control "public, max-age=31536000, immutable";
|
||||
# Security headers.
|
||||
add_header X-Frame-Options "DENY" always;
|
||||
add_header X-XSS-Protection "1; mode=block" always;
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
|
||||
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' blob: data:; font-src 'self'; connect-src *; object-src 'none'; media-src 'self'; child-src 'none'; worker-src 'self'; manifest-src 'self';" always;
|
||||
add_header Permissions-Policy "geolocation=(), camera=(), microphone=(), payment=(), usb=(), magnetometer=(), accelerometer=(), gyroscope=()" always;
|
||||
'';
|
||||
};
|
||||
|
||||
locations."/" = {
|
||||
index = "/index.html";
|
||||
tryFiles = "$uri $uri/ /";
|
||||
extraConfig = ''
|
||||
# Security headers.
|
||||
add_header X-Frame-Options "DENY" always;
|
||||
add_header X-XSS-Protection "1; mode=block" always;
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
|
||||
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' blob: data:; font-src 'self'; connect-src *; object-src 'none'; media-src 'self'; child-src 'none'; worker-src 'self'; manifest-src 'self';" always;
|
||||
add_header Permissions-Policy "geolocation=(), camera=(), microphone=(), payment=(), usb=(), magnetometer=(), accelerometer=(), gyroscope=()" always;
|
||||
'';
|
||||
};
|
||||
|
||||
extraConfig = ''
|
||||
# Security headers.
|
||||
add_header X-Frame-Options "DENY" always;
|
||||
add_header X-XSS-Protection "1; mode=block" always;
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
|
||||
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' blob: data:; font-src 'self'; connect-src *; object-src 'none'; media-src 'self'; child-src 'none'; worker-src 'self'; manifest-src 'self';" always;
|
||||
add_header Permissions-Policy "geolocation=(), camera=(), microphone=(), payment=(), usb=(), magnetometer=(), accelerometer=(), gyroscope=()" always;
|
||||
|
||||
# Make use of the ngx_http_realip_module to set the $remote_addr and
|
||||
# $remote_port to the client address and client port, when using proxy
|
||||
# protocol.
|
||||
# First set our proxy protocol proxy as trusted.
|
||||
set_real_ip_from 10.202.41.100; # IPv4 from web-public-2
|
||||
set_real_ip_from 10.203.10.3; # IPv6 from valkyrie
|
||||
# Then tell the realip_module to get the addreses from the proxy protocol
|
||||
# header.
|
||||
real_ip_header proxy_protocol;
|
||||
'';
|
||||
};
|
||||
}
|
||||
|
|
@ -1,9 +1,9 @@
|
|||
{ pkgs, ... }:
|
||||
let
|
||||
elementWebVersion = "1.12.10";
|
||||
elementWebVersion = "1.12.2";
|
||||
element-web = pkgs.fetchzip {
|
||||
url = "https://github.com/vector-im/element-web/releases/download/v${elementWebVersion}/element-v${elementWebVersion}.tar.gz";
|
||||
sha256 = "sha256-YpxfV4BCXh2fffQvVsZGOfK82TpGzg6uOx7iUPqiXVE=";
|
||||
sha256 = "sha256-EZtySIQHgb+Boq97LhzFYKTEO///6YMH3O2DrAy+7Fs=";
|
||||
};
|
||||
elementWebSecurityHeaders = ''
|
||||
# Configuration best practices
|
||||
|
|
@ -28,7 +28,7 @@ in
|
|||
];
|
||||
};
|
||||
listen = [{
|
||||
addr = "0.0.0.0";
|
||||
addr = "localhost";
|
||||
port = 8443;
|
||||
ssl = true;
|
||||
extraParameters = ["proxy_protocol"];
|
||||
|
|
@ -60,8 +60,7 @@ in
|
|||
# redirect server error pages to the static page /50x.html
|
||||
error_page 500 502 503 504 /50x.html;
|
||||
|
||||
set_real_ip_from 10.202.41.100; # IPv4 from web-public-2
|
||||
set_real_ip_from 10.203.10.3; # IPv6 from valkyrie
|
||||
set_real_ip_from 127.0.0.1;
|
||||
real_ip_header proxy_protocol;
|
||||
'';
|
||||
};
|
||||
|
|
|
|||
|
|
@ -0,0 +1,28 @@
|
|||
{ ... }:
|
||||
{
|
||||
services.nginx.virtualHosts."gameserver.grzb.de" = {
|
||||
forceSSL = true;
|
||||
enableACME = true;
|
||||
listen = [{
|
||||
addr = "localhost";
|
||||
port = 8443;
|
||||
ssl = true;
|
||||
extraParameters = ["proxy_protocol"];
|
||||
}];
|
||||
locations."/" = {
|
||||
proxyPass = "http://pterodactyl.vs.grzb.de";
|
||||
extraConfig = ''
|
||||
proxy_redirect off;
|
||||
proxy_buffering off;
|
||||
proxy_request_buffering off;
|
||||
'';
|
||||
};
|
||||
extraConfig = ''
|
||||
client_max_body_size 1024m;
|
||||
add_header X-Content-Type-Options nosniff;
|
||||
|
||||
set_real_ip_from 127.0.0.1;
|
||||
real_ip_header proxy_protocol;
|
||||
'';
|
||||
};
|
||||
}
|
||||
30
config/hosts/web-public-2/virtualHosts/git.grzb.de.nix
Normal file
30
config/hosts/web-public-2/virtualHosts/git.grzb.de.nix
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
{ ... }:
|
||||
{
|
||||
services.nginx.virtualHosts."git.grzb.de" = {
|
||||
forceSSL = true;
|
||||
enableACME = true;
|
||||
listen = [{
|
||||
addr = "localhost";
|
||||
port = 8443;
|
||||
ssl = true;
|
||||
extraParameters = ["proxy_protocol"];
|
||||
}];
|
||||
locations."/" = {
|
||||
proxyPass = "http://gitlab.vs.grzb.de:80";
|
||||
extraConfig = ''
|
||||
gzip off;
|
||||
proxy_read_timeout 300;
|
||||
proxy_connect_timeout 300;
|
||||
proxy_redirect off;
|
||||
'';
|
||||
};
|
||||
extraConfig = ''
|
||||
client_max_body_size 1024m;
|
||||
add_header X-Frame-Options DENY;
|
||||
add_header X-Content-Type-Options nosniff;
|
||||
|
||||
set_real_ip_from 127.0.0.1;
|
||||
real_ip_header proxy_protocol;
|
||||
'';
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
{ ... }:
|
||||
{
|
||||
services.nginx.virtualHosts."mewtube.nekover.se" = {
|
||||
forceSSL = true;
|
||||
enableACME = true;
|
||||
listen = [{
|
||||
addr = "localhost";
|
||||
port = 8443;
|
||||
ssl = true;
|
||||
extraParameters = ["proxy_protocol"];
|
||||
}];
|
||||
locations."/" = {
|
||||
proxyPass = "http://cloudtube.vs.grzb.de:10412";
|
||||
};
|
||||
extraConfig = ''
|
||||
set_real_ip_from 127.0.0.1;
|
||||
real_ip_header proxy_protocol;
|
||||
'';
|
||||
};
|
||||
}
|
||||
|
|
@ -23,8 +23,7 @@
|
|||
'';
|
||||
};
|
||||
extraConfig = ''
|
||||
set_real_ip_from 10.202.41.100; # IPv4 from web-public-2
|
||||
set_real_ip_from 10.203.10.3; # IPv6 from valkyrie
|
||||
set_real_ip_from 127.0.0.1;
|
||||
real_ip_header proxy_protocol;
|
||||
'';
|
||||
};
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@
|
|||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJEvM35w+UaSpDTuaG5pGPgfHcfwscr+wSZN9Z5Jle82 yuri@kiara"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDdk3FLQRoCWxdOxg4kHcPqAu3QQOs/rY9na2Al2ilGl yuri@violet"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICuhk+x7msByGFekRmS2SMeTT3sC4I0MtuEQXjN8MZXa fi@cherry"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPPi3G2JfDLJeLVtdF8fEQN9S6W1xfLNmzFm74f0jN6t fi@stardew"
|
||||
];
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@
|
|||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDdk3FLQRoCWxdOxg4kHcPqAu3QQOs/rY9na2Al2ilGl yuri@violet"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICuhk+x7msByGFekRmS2SMeTT3sC4I0MtuEQXjN8MZXa fi@cherry"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE95OjEez/yE+GIaeIoz3OwkXboLboPY4ss9nkt4FLyW fi@kiara"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPPi3G2JfDLJeLVtdF8fEQN9S6W1xfLNmzFm74f0jN6t fi@stardew"
|
||||
];
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJEvM35w+UaSpDTuaG5pGPgfHcfwscr+wSZN9Z5Jle82 yuri@kiara"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDdk3FLQRoCWxdOxg4kHcPqAu3QQOs/rY9na2Al2ilGl yuri@violet"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICuhk+x7msByGFekRmS2SMeTT3sC4I0MtuEQXjN8MZXa fi@cherry"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPPi3G2JfDLJeLVtdF8fEQN9S6W1xfLNmzFm74f0jN6t fi@stardew"
|
||||
];
|
||||
};
|
||||
}
|
||||
|
|
|
|||
48
flake.lock
generated
48
flake.lock
generated
|
|
@ -19,11 +19,11 @@
|
|||
"flake-compat": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1767039857,
|
||||
"narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=",
|
||||
"lastModified": 1761588595,
|
||||
"narHash": "sha256-XKUZz9zewJNUj46b4AJdiRZJAvSZ0Dqj2BNfXvFlJC4=",
|
||||
"owner": "edolstra",
|
||||
"repo": "flake-compat",
|
||||
"rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab",
|
||||
"rev": "f387cd2afec9419c8ee37694406ca490c3f34ee5",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
|
@ -45,11 +45,11 @@
|
|||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1772893680,
|
||||
"narHash": "sha256-JDqZMgxUTCq85ObSaFw0HhE+lvdOre1lx9iI6vYyOEs=",
|
||||
"lastModified": 1763319842,
|
||||
"narHash": "sha256-YG19IyrTdnVn0l3DvcUYm85u3PaqBt6tI6VvolcuHnA=",
|
||||
"owner": "cachix",
|
||||
"repo": "git-hooks.nix",
|
||||
"rev": "8baab586afc9c9b57645a734c820e4ac0a604af9",
|
||||
"rev": "7275fa67fbbb75891c16d9dee7d88e58aea2d761",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
|
@ -103,11 +103,11 @@
|
|||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1769813415,
|
||||
"narHash": "sha256-nnVmNNKBi1YiBNPhKclNYDORoHkuKipoz7EtVnXO50A=",
|
||||
"lastModified": 1764234087,
|
||||
"narHash": "sha256-NHF7QWa0ZPT8hsJrvijREW3+nifmF2rTXgS2v0tpcEA=",
|
||||
"owner": "nix-community",
|
||||
"repo": "nixos-generators",
|
||||
"rev": "8946737ff703382fda7623b9fab071d037e897d5",
|
||||
"rev": "032a1878682fafe829edfcf5fdfad635a2efe748",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
|
@ -118,11 +118,11 @@
|
|||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1775189162,
|
||||
"narHash": "sha256-fjEpcsJ0KDZ363xd+3OhOGq3AC1juI23Xas548ZPZEk=",
|
||||
"lastModified": 1765178948,
|
||||
"narHash": "sha256-Kb3mIrj4xLg2LeMvok0tpiGPis1VnrNJO0l4kW+0xmc=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "0aecba5a03727e1ac2d66378907d9a6e9c8266d0",
|
||||
"rev": "f376a52d0dc796aec60b5606a2676240ff1565b9",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
|
@ -134,11 +134,11 @@
|
|||
},
|
||||
"nixpkgs-master": {
|
||||
"locked": {
|
||||
"lastModified": 1775248990,
|
||||
"narHash": "sha256-H/G80K7f3ZrPP8PAmSCG/pJh59zMscPA6UaiWdKgTdg=",
|
||||
"lastModified": 1765227377,
|
||||
"narHash": "sha256-OeTF3YNuXZxN4TxluVEdCG32e5/0pYDb5exWe0RrQBY=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "942d1c86a6642bff0c4a440d30a7669a7a18a903",
|
||||
"rev": "a0ea537a4fc4c49fb1e226317829c8b32ed95d0e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
|
@ -150,11 +150,11 @@
|
|||
},
|
||||
"nixpkgs-unstable": {
|
||||
"locked": {
|
||||
"lastModified": 1775231746,
|
||||
"narHash": "sha256-EFaDQ0rnuSjKfC/DUKHS4toV4rEBuWhSgyX2Yy0kp00=",
|
||||
"lastModified": 1765183668,
|
||||
"narHash": "sha256-TBA7CE44IHYfvOPBWcyLncpVrrKEiXWPdOrF8CD6W84=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "0eac666efaa8a9afea2821f9efc7921b4ef39b4e",
|
||||
"rev": "fc2de1563f89f0843eba27f14576d261df0e3b80",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
|
@ -166,11 +166,11 @@
|
|||
},
|
||||
"nixpkgs_2": {
|
||||
"locked": {
|
||||
"lastModified": 1773831496,
|
||||
"narHash": "sha256-JW2/QPyCVzmouqEp1H9kNa8JXd7xEhlam9sy3TYfhDY=",
|
||||
"lastModified": 1764020296,
|
||||
"narHash": "sha256-6zddwDs2n+n01l+1TG6PlyokDdXzu/oBmEejcH5L5+A=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "826430a188181a750ffa5948daff334039c5d741",
|
||||
"rev": "a320ce8e6e2cc6b4397eef214d202a50a4583829",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
|
@ -197,11 +197,11 @@
|
|||
"nixpkgs": "nixpkgs_2"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1773912645,
|
||||
"narHash": "sha256-QHzRqq6gh+t3F/QU9DkP7X63dDDcuIQmaDz12p7ANTg=",
|
||||
"lastModified": 1764185122,
|
||||
"narHash": "sha256-+HUOwSIFLoyett2cvRjuFIbhobpHallfP9J2cia1apo=",
|
||||
"owner": "simple-nixos-mailserver",
|
||||
"repo": "nixos-mailserver",
|
||||
"rev": "25e6dbb8fca3b6e779c5a46fd03bd760b2165bb5",
|
||||
"rev": "a14fe3b293ec2720e5b7fc72ad136d22967e12ba",
|
||||
"type": "gitlab"
|
||||
},
|
||||
"original": {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue