init
This commit is contained in:
commit
f7d48d286a
16 changed files with 519 additions and 0 deletions
66
configuration.nix
Executable file
66
configuration.nix
Executable file
|
@ -0,0 +1,66 @@
|
|||
{pkgs, ...}: let
|
||||
ssh-pub-keys = import ./ssh-pub-keys.nix;
|
||||
in {
|
||||
imports = [
|
||||
./hardware-configuration.nix
|
||||
];
|
||||
|
||||
boot.tmp.cleanOnBoot = true;
|
||||
networking.hostName = "server";
|
||||
networking.domain = "";
|
||||
networking.firewall = {
|
||||
enable = true;
|
||||
allowedTCPPorts = [80 443];
|
||||
};
|
||||
boot.loader.grub.devices = ["nodev"];
|
||||
|
||||
services.openssh = {
|
||||
enable = true;
|
||||
allowSFTP = false;
|
||||
ports = [5522];
|
||||
settings = {
|
||||
PermitRootLogin = "no";
|
||||
PasswordAuthentication = false;
|
||||
KbdInteractiveAuthentication = true;
|
||||
};
|
||||
extraConfig = ''
|
||||
AllowTcpForwarding no
|
||||
AllowAgentForwarding no
|
||||
MaxAuthTries 3
|
||||
MaxSessions 4
|
||||
TCPKeepAlive no
|
||||
'';
|
||||
};
|
||||
|
||||
services.fail2ban = {
|
||||
enable = true;
|
||||
maxretry = 10;
|
||||
bantime-increment.enable = true;
|
||||
};
|
||||
|
||||
users.users.mtgmonkey = {
|
||||
isNormalUser = true;
|
||||
description = "mtgmonkey";
|
||||
extraGroups = ["wheel"];
|
||||
openssh.authorizedKeys.keys = ssh-pub-keys;
|
||||
};
|
||||
|
||||
users.users.git = {
|
||||
isSystemUser = true;
|
||||
group = "git";
|
||||
description = "git";
|
||||
home = "/var/lib/git-server";
|
||||
createHome = true;
|
||||
packages = [pkgs.git];
|
||||
shell = pkgs.bash;
|
||||
openssh.authorizedKeys.keys = ssh-pub-keys;
|
||||
};
|
||||
|
||||
users.groups.git = {};
|
||||
|
||||
system.stateVersion = "23.11";
|
||||
|
||||
nix.settings.experimental-features = ["nix-command" "flakes"];
|
||||
|
||||
nix.settings.allow-import-from-derivation = true;
|
||||
}
|
96
flake.lock
generated
Executable file
96
flake.lock
generated
Executable file
|
@ -0,0 +1,96 @@
|
|||
{
|
||||
"nodes": {
|
||||
"elmskell-blog": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1749377392,
|
||||
"narHash": "sha256-h9XPJ30WwPelj9U5lfwxePs8Mb408egKFszG635StGY=",
|
||||
"ref": "refs/heads/master",
|
||||
"rev": "255615b8389f480c4ea3ce647f9d2ed792916c08",
|
||||
"revCount": 6,
|
||||
"type": "git",
|
||||
"url": "file:///var/lib/git-server/blog.git"
|
||||
},
|
||||
"original": {
|
||||
"type": "git",
|
||||
"url": "file:///var/lib/git-server/blog.git"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1749143949,
|
||||
"narHash": "sha256-QuUtALJpVrPnPeozlUG/y+oIMSLdptHxb3GK6cpSVhA=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "d3d2d80a2191a73d1e86456a751b83aa13085d7d",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"id": "nixpkgs",
|
||||
"ref": "nixos-unstable",
|
||||
"type": "indirect"
|
||||
}
|
||||
},
|
||||
"nixpkgs_2": {
|
||||
"locked": {
|
||||
"lastModified": 1749373575,
|
||||
"narHash": "sha256-/3nvhGaUMG1A6zG185QHyTFR2fMiyffxU7VdMYk5qj0=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "6a8d437617048567166f83b32d07ba73aeb2d125",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "release-25.05",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs_3": {
|
||||
"locked": {
|
||||
"lastModified": 1714253743,
|
||||
"narHash": "sha256-mdTQw2XlariysyScCv2tTE45QSU9v/ezLcHJ22f0Nxc=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "58a1abdbae3217ca6b702f03d3b35125d88a2994",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"noshell": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs_3"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1717396029,
|
||||
"narHash": "sha256-NPIhvnTYkJZqTY+aabbZ6CAaMAgG6IISvh7GZo1MTfQ=",
|
||||
"owner": "viperML",
|
||||
"repo": "noshell",
|
||||
"rev": "4d194d838a50ea106cd0e47c024e47afc154ab42",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "viperML",
|
||||
"repo": "noshell",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"elmskell-blog": "elmskell-blog",
|
||||
"nixpkgs": "nixpkgs_2",
|
||||
"noshell": "noshell"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
38
flake.nix
Executable file
38
flake.nix
Executable file
|
@ -0,0 +1,38 @@
|
|||
{
|
||||
description = "server flake";
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs/release-25.05";
|
||||
noshell.url = "github:viperML/noshell";
|
||||
elmskell-blog.url = "git+file:///var/lib/git-server/blog.git";
|
||||
};
|
||||
|
||||
outputs = {
|
||||
self,
|
||||
nixpkgs,
|
||||
noshell,
|
||||
elmskell-blog,
|
||||
...
|
||||
}: let
|
||||
system = "x86_64-linux";
|
||||
in {
|
||||
nixosConfigurations."server" = nixpkgs.lib.nixosSystem {
|
||||
inherit system;
|
||||
specialArgs = {
|
||||
inherit self;
|
||||
inherit system;
|
||||
inherit elmskell-blog;
|
||||
};
|
||||
modules = [
|
||||
./services/elmskell.nix
|
||||
./services/ferron.nix
|
||||
./services/rgit.nix
|
||||
# ./services/mattermost.nix
|
||||
|
||||
noshell.nixosModules.default
|
||||
{programs.noshell.enable = true;}
|
||||
|
||||
./configuration.nix
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
36
hardware-configuration.nix
Executable file
36
hardware-configuration.nix
Executable file
|
@ -0,0 +1,36 @@
|
|||
# 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" "virtio_scsi" "sd_mod" "sr_mod" ];
|
||||
boot.initrd.kernelModules = [ ];
|
||||
boot.kernelModules = [ ];
|
||||
boot.extraModulePackages = [ ];
|
||||
|
||||
fileSystems."/" =
|
||||
{ device = "/dev/disk/by-uuid/6b481376-9716-4559-946b-62097c2380f1";
|
||||
fsType = "ext4";
|
||||
};
|
||||
|
||||
fileSystems."/efi" =
|
||||
{ device = "systemd-1";
|
||||
fsType = "autofs";
|
||||
};
|
||||
|
||||
swapDevices = [ ];
|
||||
|
||||
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
||||
# (the default) this is the recommended approach. When using systemd-networkd it's
|
||||
# still possible to use this option, but it's recommended to use it in conjunction
|
||||
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
|
||||
networking.useDHCP = lib.mkDefault true;
|
||||
# networking.interfaces.ens18.useDHCP = lib.mkDefault true;
|
||||
|
||||
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||
}
|
26
services/blog.nix
Executable file
26
services/blog.nix
Executable file
|
@ -0,0 +1,26 @@
|
|||
{
|
||||
elmskell-blog,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
ferron-conf-nix = {
|
||||
global = {
|
||||
secure = false;
|
||||
wwwroot = "${elmskell-blog.packages.x86_64-linux.default}/wwwroot";
|
||||
};
|
||||
};
|
||||
in {
|
||||
systemd.services.ferron = {
|
||||
serviceConfig = {
|
||||
Type = "simple";
|
||||
ExecStart = "${lib.getExe pkgs.ferron} --config=/etc/ferron.yaml";
|
||||
RemainAfterExit = true;
|
||||
};
|
||||
};
|
||||
|
||||
environment.etc."ferron.yaml" = {
|
||||
source = (pkgs.formats.yaml {}).generate "" ferron-conf-nix;
|
||||
mode = "644";
|
||||
};
|
||||
}
|
62
services/elmskell.nix
Executable file
62
services/elmskell.nix
Executable file
|
@ -0,0 +1,62 @@
|
|||
{pkgs, ...}: let
|
||||
botPolicies-nix = {
|
||||
dnsbl = false;
|
||||
status_codes = {
|
||||
CHALLENGE = 200;
|
||||
DENY = 200;
|
||||
};
|
||||
bots = [
|
||||
{
|
||||
name = "catch-everything";
|
||||
user_agent_regex = ".*";
|
||||
action = "CHALLENGE";
|
||||
}
|
||||
];
|
||||
};
|
||||
in {
|
||||
services.anubis = {
|
||||
instances.elmskell = {
|
||||
enable = true;
|
||||
settings = {
|
||||
BIND = "[::1]:9080";
|
||||
BIND_NETWORK = "tcp";
|
||||
DIFFICULTY = 4;
|
||||
METRICS_BIND = "[::1]:9081";
|
||||
METRICS_BIND_NETWORK = "tcp";
|
||||
POLICY_FNAME = "/etc/anubis/elmskell.botPolicies.yaml";
|
||||
TARGET = "http://localhost:8080";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
environment.etc."anubis/elmskell.botPolicies.yaml" = {
|
||||
source = (pkgs.formats.yaml {}).generate "" botPolicies-nix;
|
||||
mode = "644";
|
||||
};
|
||||
|
||||
systemd.services.elmskell = {
|
||||
serviceConfig = {
|
||||
Type = "simple";
|
||||
ExecStart = "/etc/nixos/services/elmskell/elmskell";
|
||||
RemainAfterExit = true;
|
||||
};
|
||||
};
|
||||
services.tor = {
|
||||
enable = true;
|
||||
enableGeoIP = false;
|
||||
relay.onionServices = {
|
||||
elmskell = {
|
||||
version = 3;
|
||||
map = [
|
||||
{
|
||||
port = 80;
|
||||
target = {
|
||||
addr = "127.0.0.1";
|
||||
port = 8080;
|
||||
};
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
BIN
services/elmskell/elmskell
Executable file
BIN
services/elmskell/elmskell
Executable file
Binary file not shown.
52
services/ferron.nix
Executable file
52
services/ferron.nix
Executable file
|
@ -0,0 +1,52 @@
|
|||
{
|
||||
elmskell-blog,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
ferron-conf-nix = {
|
||||
global = {
|
||||
secure = true;
|
||||
enableAutomaticTLS = true;
|
||||
automaticTLSContactCacheDirectory = "/etc/ferron/contactCacheDir";
|
||||
useAutomaticTLSHTTPChallenge = true;
|
||||
disableProxyCertificateVerification = true;
|
||||
loadModules = ["rproxy"];
|
||||
};
|
||||
hosts = [
|
||||
{
|
||||
domain = "mtgmonkey.net";
|
||||
proxyTo = "http://localhost:9080/";
|
||||
}
|
||||
{
|
||||
domain = "blog.mtgmonkey.net";
|
||||
proxyTo = "http://localhost:9181/";
|
||||
}
|
||||
{
|
||||
domain = "git.mtgmonkey.net";
|
||||
proxyTo = "http://localhost:8000/";
|
||||
}
|
||||
{
|
||||
domain = "chat.mtgmonkey.net";
|
||||
proxyTo = "http://localhost:9780/";
|
||||
}
|
||||
{
|
||||
domain = "www.mtgmonkey.net";
|
||||
proxyTo = "http://localhost:9080/";
|
||||
}
|
||||
];
|
||||
};
|
||||
in {
|
||||
systemd.services.ferron = {
|
||||
serviceConfig = {
|
||||
Type = "simple";
|
||||
ExecStart = "${lib.getExe pkgs.ferron} --config=/etc/ferron.yaml";
|
||||
RemainAfterExit = true;
|
||||
};
|
||||
};
|
||||
|
||||
environment.etc."ferron.yaml" = {
|
||||
source = (pkgs.formats.yaml {}).generate "" ferron-conf-nix;
|
||||
mode = "644";
|
||||
};
|
||||
}
|
73
services/ferron/wwwroot/css/style.css
Executable file
73
services/ferron/wwwroot/css/style.css
Executable file
|
@ -0,0 +1,73 @@
|
|||
html,
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
|
||||
background-color: #ffffff;
|
||||
color: #0f172a;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 2em auto;
|
||||
padding: 1em;
|
||||
box-sizing: border-box;
|
||||
width: 100%;
|
||||
max-width: 1280px;
|
||||
}
|
||||
|
||||
header {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.logo {
|
||||
display: inline-block;
|
||||
background-image: url(../img/logo.png);
|
||||
background-size: 100%;
|
||||
width: 160px;
|
||||
height: 53.875px;
|
||||
}
|
||||
|
||||
.column {
|
||||
width: 50%;
|
||||
padding: 0.75em;
|
||||
box-sizing: border-box;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.clearfix {
|
||||
display: table;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 2.5em;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #ff4400;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 512px) {
|
||||
h1 {
|
||||
font-size: 2em;
|
||||
}
|
||||
|
||||
.column {
|
||||
float: none;
|
||||
width: 100%;
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (prefers-color-scheme: dark) {
|
||||
|
||||
html,
|
||||
body {
|
||||
background-color: #0c0a09;
|
||||
color: #e1e7ef;
|
||||
}
|
||||
|
||||
.logo {
|
||||
background-image: url(../img/logo-dark.png);
|
||||
}
|
||||
}
|
BIN
services/ferron/wwwroot/favicon.ico
Executable file
BIN
services/ferron/wwwroot/favicon.ico
Executable file
Binary file not shown.
After Width: | Height: | Size: 110 KiB |
BIN
services/ferron/wwwroot/img/logo-dark.png
Executable file
BIN
services/ferron/wwwroot/img/logo-dark.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 32 KiB |
BIN
services/ferron/wwwroot/img/logo.png
Executable file
BIN
services/ferron/wwwroot/img/logo.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 30 KiB |
36
services/ferron/wwwroot/index.html
Executable file
36
services/ferron/wwwroot/index.html
Executable file
|
@ -0,0 +1,36 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
|
||||
<link rel="stylesheet" href="css/style.css">
|
||||
<title>Ferron is installed successfully! 🥳</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<header>
|
||||
<span class="logo"></span>
|
||||
<h1>Ferron is installed successfully! 🥳</h1>
|
||||
</header>
|
||||
<section class="column">
|
||||
<h2>If you're just visiting this website</h2>
|
||||
<p>Thank you for visiting my website! It is not running yet. Contact me on Matrix @mtgmonkey:calitabby.net for a shoutout!</p>
|
||||
<p><strong>Ferron probably has nothing to do with this website or its content, it just provides the
|
||||
software for the website to run.</strong> If you have issues with this website, contact the
|
||||
administrator of the website, not Ferron.</p>
|
||||
</section>
|
||||
<section class="column">
|
||||
<h2>If you're an administrator of this website</h2>
|
||||
<p>This page means that the web server's installation is successful. You can now add contents of the website to
|
||||
the webroot directory (<i>/var/www/ferron</i> if installed using Ferron installer for GNU/Linux or via
|
||||
Docker, or <i>%SystemDrive%\ferron\wwwroot</i> if installed using Ferron installer for Windows).</p>
|
||||
<p>You can configure your web server according to <a href="https://www.ferronweb.org/docs">Ferron's
|
||||
documentation.</a></p>
|
||||
<p><strong>Thank you for installing Ferron!</strong></p>
|
||||
</section>
|
||||
<div class="clearfix"></div>
|
||||
</body>
|
||||
|
||||
</html>
|
7
services/mattermost.nix
Executable file
7
services/mattermost.nix
Executable file
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
services.mattermost = {
|
||||
enable = true;
|
||||
siteUrl = "https://chat.mtgmonkey.net";
|
||||
port = 9780;
|
||||
};
|
||||
}
|
23
services/rgit.nix
Executable file
23
services/rgit.nix
Executable file
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
virtualisation.docker = {
|
||||
enable = true;
|
||||
};
|
||||
virtualisation.oci-containers.backend = "docker";
|
||||
virtualisation.oci-containers.containers.rgit = {
|
||||
image = "ghcr.io/w4/rgit:main";
|
||||
ports = [
|
||||
"8000:8000"
|
||||
];
|
||||
volumes = [
|
||||
"/var/lib/git-server:/git:ro"
|
||||
];
|
||||
cmd = [
|
||||
"[::]:8000"
|
||||
"/git"
|
||||
"-d /tmp/rgit-cache.db"
|
||||
];
|
||||
environment = {
|
||||
REFRESH_INTERVAL = "5m";
|
||||
};
|
||||
};
|
||||
}
|
4
ssh-pub-keys.nix
Normal file
4
ssh-pub-keys.nix
Normal file
|
@ -0,0 +1,4 @@
|
|||
[
|
||||
''ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC379hc2EHmqvpA1LF2tDAxTyR3GGPdnuFTSJ9zgFxHKgCbraOMgDVDNeRWdJ3JrvBk+qI5yBvPaTTgLTS5iN6HbdmyerILkoszBX62u21vTIW4YfIS0VlNSZ0c1HUPZQsdSQNAYTlHKFVRXK1LtY6PMmEBok2O9KdymyXQqUkcrUj3JiCF2pPPUV4TXSoaBmt7IiuVHP+mLKyYW7YojwwHxVRHM1tYRvYVVCLM7oOgKV5IXlSAM4n27LS1ynx3SzG4oq8jYApPkdjSO4FkyqSFiM+FXYarucsMC78y9vN4CVB20vznn2Rcnk8FLZB+BZb8EioNJ7Mhyk3Ooa5fqMGjPFCmxFGzFDcRkcqCNj2/GwfMcNWtiCgFpb2pa3WW/suW1PXd4YSYuBUzkuK0A8Qh16rSmGTBQoIKTVGiCB6hW9vtxECDgEBNfnNaHYNaKwSyBrOq9iXJR3PAHINNw01CbW5/Bn8bdcggAkQXdiEhVLo2+XqAtUfsWlo4L1ndMZ0= mtgmonkey@nixos''
|
||||
''ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCyhHmoEAQ+LMnt1h8hk/e6By5YC/ujJU1/p7mqvq4qvC/JcH231bJKPW4n8YPDxLMdQSD/qZlEgAMnBIz8GtRcJznI+VjM9Qfq3+oJ8vvgG+9ZA8nqdTInj8q+vSJ2SMUZCW6kBfeG7Jx2fTMN8OGylWvwv8qLyawxc1bFkkm9j6BptzP0DSR4EeJvDNccYvcASvINHhqDOtEdCGMtmJE5NQ47KdtS4qWnCNKc2fvPPIyJcMtr8/hihrB0iOfxTqeuPWyLsal1sEKraxAqORsapudqHip6rsaTizhG48ZVUP8XHiL8gUI7qhc8sb6PxWBhALllGteVKQK9kzSerqaM7P6goZ7kw+WfZW4eQbto0GJCK8pDgmErQP5Uk3IsJSptJKc9foW2qkcoXY+2ABjQXhCUUXGyS2Gq8rp7AZ/Oh1zP67SGeee2F266BN799/jAym5awYUo2GGhh2LFGuADcnDKKQ5et/zQ6l1+4UH97JdDxNdQLf0rcdQ7TqC2Zuc= mtgmonkey@server''
|
||||
]
|
Loading…
Add table
Add a link
Reference in a new issue