first commit
This commit is contained in:
commit
21737592da
27 changed files with 744 additions and 0 deletions
1
debug.sh
Normal file
1
debug.sh
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
nix repl --extra-experimental-features 'flakes' .
|
||||||
38
flake.nix
Normal file
38
flake.nix
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
{
|
||||||
|
description = "Project-A flake!";
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "nixpkgs/nixos-25.05";
|
||||||
|
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||||
|
secret.url = "git+ssh://forgejo@git.project-a.space/Project-A/project-secret.git";
|
||||||
|
project-a-software.url = "git+ssh://forgejo@git.project-a.space/Project-A/project-software.git";
|
||||||
|
|
||||||
|
home-manager = {
|
||||||
|
url = "github:nix-community/home-manager/release-25.05";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = { self, nixpkgs, nixpkgs-unstable, project-a-software, home-manager, secret, ... }:
|
||||||
|
let
|
||||||
|
linux64 = "x86_64-linux";
|
||||||
|
nixosServer = { name, system ? linux64, modules ? [] }:
|
||||||
|
nixpkgs.lib.nixosSystem {
|
||||||
|
system = system;
|
||||||
|
specialArgs.pkgs-unstable = nixpkgs-unstable.legacyPackages.${system};
|
||||||
|
specialArgs.secret = secret.${name};
|
||||||
|
specialArgs.common-secret = secret.common;
|
||||||
|
modules = [
|
||||||
|
./servers/common/main.nix
|
||||||
|
./servers/${name}/main.nix
|
||||||
|
] ++ modules;
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
nixosConfigurations = {
|
||||||
|
artemisia = nixosServer { name = "artemisia"; modules = [ project-a-software.marzban ]; };
|
||||||
|
reine = nixosServer { name = "reine"; };
|
||||||
|
mio = nixosServer { name = "mio"; modules = [ project-a-software.marzban ]; };
|
||||||
|
vanessa = nixosServer { name = "vanessa"; modules = [ project-a-software.marzban ]; };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
45
secret.nix
Normal file
45
secret.nix
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
{ lib, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
marzban-config = {
|
||||||
|
port = mkOption { type = types.int; default = 8000; };
|
||||||
|
sudo-username = mkOption { type = types.str; default = "admin"; };
|
||||||
|
sudo-password = mkOption { type = types.str; default = "admin"; };
|
||||||
|
vless-port = mkOption { type = types.int; default = 1080; };
|
||||||
|
dest = mkOption { type = types.str; default = "yahoo.com:443"; };
|
||||||
|
privateKey = mkOption { type = types.str; default = ""; };
|
||||||
|
shortId = mkOption { type = types.str; default = ""; };
|
||||||
|
spiderX = mkOption { type = types.str; default = "/"; };
|
||||||
|
};
|
||||||
|
affine-config = with lib; {
|
||||||
|
env = {
|
||||||
|
PORT = mkOption { type = int; default = 3010; };
|
||||||
|
DB_USERNAME = mkOption { type = str; default = "affine"; };
|
||||||
|
DB_PASSWORD = mkOption { type = str; default = "affine"; };
|
||||||
|
DB_DATABASE = mkOption { type = str; default = "affine"; };
|
||||||
|
};
|
||||||
|
revision = mkOption { type = str; default = "stable"; };
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
options = with lib; {
|
||||||
|
secret = {
|
||||||
|
artemisia = {
|
||||||
|
marzban = marzban-config;
|
||||||
|
};
|
||||||
|
mio = {
|
||||||
|
marzban = marzban-config;
|
||||||
|
};
|
||||||
|
vanessa = {
|
||||||
|
marzban = marzban-config;
|
||||||
|
};
|
||||||
|
reine = {
|
||||||
|
yggdrasil.PrivateKey = mkOption { type = str; default = ""; };
|
||||||
|
};
|
||||||
|
common = {
|
||||||
|
yggdrasil = {
|
||||||
|
reine = mkOption { type = str; default = ""; };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
40
servers/artemisia/forgejo.nix
Normal file
40
servers/artemisia/forgejo.nix
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
{ lib, pkgs, config, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
domain = "git.project-a.space";
|
||||||
|
ssh_port = 22;
|
||||||
|
http_port = 3000;
|
||||||
|
in {
|
||||||
|
services.forgejo = {
|
||||||
|
enable = true;
|
||||||
|
lfs.enable = true;
|
||||||
|
database.type = "postgres";
|
||||||
|
settings = {
|
||||||
|
server = {
|
||||||
|
DOMAIN = domain;
|
||||||
|
ROOT_URL = "https://${domain}/";
|
||||||
|
START_SSH_SERVER = true;
|
||||||
|
SSH_DOMAIN = domain;
|
||||||
|
SSH_PORT = ssh_port;
|
||||||
|
SSH_LISTEN_PORT = ssh_port;
|
||||||
|
SSH_LISTEN_HOST = "0.0.0.0";
|
||||||
|
HTTP_PORT = http_port;
|
||||||
|
};
|
||||||
|
actions = {
|
||||||
|
ENABLED = true;
|
||||||
|
DEFAULT_ACTIONS_URL = "github";
|
||||||
|
};
|
||||||
|
federation.ENABLED = true;
|
||||||
|
service.DISABLE_REGISTRATION = false;
|
||||||
|
ui.SHOW_USER_EMAIL = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.sockets.forgejo = {
|
||||||
|
requiredBy = [ "forgejo.service" ];
|
||||||
|
wantedBy = [ "sockets.target" ];
|
||||||
|
listenStreams = [ (toString ssh_port) ];
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.firewall.allowedTCPPorts = [ ssh_port ];
|
||||||
|
}
|
||||||
17
servers/artemisia/hardware-configuration.nix
Normal file
17
servers/artemisia/hardware-configuration.nix
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
{ modulesPath, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [ (modulesPath + "/profiles/qemu-guest.nix") ];
|
||||||
|
|
||||||
|
boot = {
|
||||||
|
loader.grub.device = "/dev/vda";
|
||||||
|
initrd = {
|
||||||
|
kernelModules = [ "nvme" ];
|
||||||
|
availableKernelModules = [ "ata_piix" "uhci_hcd" "xen_blkfront" "vmw_pvscsi" ];
|
||||||
|
};
|
||||||
|
tmp.cleanOnBoot = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/" = { device = "/dev/mapper/debian12--vg-root"; fsType = "ext4"; };
|
||||||
|
swapDevices = [ { device = "/dev/dm-1"; } ];
|
||||||
|
}
|
||||||
34
servers/artemisia/main.nix
Normal file
34
servers/artemisia/main.nix
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
{ config, pkgs, secret, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./hardware-configuration.nix
|
||||||
|
./nginx.nix
|
||||||
|
./forgejo.nix
|
||||||
|
];
|
||||||
|
networking.hostName = "artemisia";
|
||||||
|
system.stateVersion = "25.05";
|
||||||
|
|
||||||
|
services.yggdrasil.persistentKeys = true;
|
||||||
|
marzban = {
|
||||||
|
env = {
|
||||||
|
UVICORN_HOST = "artemisia.project-a.space";
|
||||||
|
UVICORN_PORT = secret.marzban.port;
|
||||||
|
SUDO_USERNAME = secret.marzban.sudo-username;
|
||||||
|
SUDO_PASSWORD = secret.marzban.sudo-password;
|
||||||
|
DOCS = true;
|
||||||
|
};
|
||||||
|
cert = true;
|
||||||
|
domain = "artemisia.project-a.space";
|
||||||
|
xray = import ../common/xray.nix {
|
||||||
|
server-domain = "artemisia.project-a.space";
|
||||||
|
port = secret.marzban.vless-port;
|
||||||
|
dest = secret.marzban.dest;
|
||||||
|
privateKey = secret.marzban.privateKey;
|
||||||
|
shortId = secret.marzban.shortId;
|
||||||
|
spiderX = secret.marzban.spiderX;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.firewall.allowedTCPPorts = [ secret.marzban.port ];
|
||||||
|
}
|
||||||
48
servers/artemisia/nginx.nix
Normal file
48
servers/artemisia/nginx.nix
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
security.acme.defaults.email = "porject-a@project-a.space";
|
||||||
|
security.acme.acceptTerms = true;
|
||||||
|
|
||||||
|
services.nginx = {
|
||||||
|
enable = true;
|
||||||
|
recommendedTlsSettings = true;
|
||||||
|
recommendedOptimisation = true;
|
||||||
|
defaultSSLListenPort = 444;
|
||||||
|
|
||||||
|
virtualHosts = {
|
||||||
|
"git.project-a.space" = {
|
||||||
|
forceSSL = true;
|
||||||
|
enableACME = true;
|
||||||
|
locations."/" = {
|
||||||
|
proxyPass = "http://localhost:3000";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
streamConfig = ''
|
||||||
|
map $ssl_preread_server_name $name {
|
||||||
|
git.project-a.space git;
|
||||||
|
default marzban;
|
||||||
|
}
|
||||||
|
|
||||||
|
upstream git {
|
||||||
|
server 127.0.0.1:444;
|
||||||
|
}
|
||||||
|
|
||||||
|
upstream marzban {
|
||||||
|
server 127.0.0.1:1080;
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 0.0.0.0:443;
|
||||||
|
listen [::0]:443;
|
||||||
|
proxy_pass $name;
|
||||||
|
ssl_preread on;
|
||||||
|
proxy_connect_timeout 1s;
|
||||||
|
proxy_timeout 1h;
|
||||||
|
proxy_buffer_size 16k;
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
||||||
9
servers/common/firewall.nix
Normal file
9
servers/common/firewall.nix
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
networking.firewall = {
|
||||||
|
enable = true;
|
||||||
|
allowedTCPPorts = [ 80 443 1004 666 ];
|
||||||
|
allowedUDPPorts = [ 80 443 1004 666 ];
|
||||||
|
};
|
||||||
|
}
|
||||||
16
servers/common/main.nix
Normal file
16
servers/common/main.nix
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
{ config, pkgs, pkgs-unstable, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./ssh.nix
|
||||||
|
./users.nix
|
||||||
|
./yggdrasil.nix
|
||||||
|
./firewall.nix
|
||||||
|
./sudo.nix
|
||||||
|
./packages.nix
|
||||||
|
];
|
||||||
|
programs.fish.enable = true;
|
||||||
|
|
||||||
|
nix.settings.experimental-features = [ "nix-command" "flakes" ];
|
||||||
|
nix.settings.trusted-users = [ "root" "@wheel" ];
|
||||||
|
}
|
||||||
13
servers/common/packages.nix
Normal file
13
servers/common/packages.nix
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
{ config, pkgs, pkgs-unstable, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
environment.systemPackages =
|
||||||
|
(with pkgs; [ # STABLE PACKAGES
|
||||||
|
btop
|
||||||
|
screen
|
||||||
|
])
|
||||||
|
++
|
||||||
|
(with pkgs-unstable; [ # UNSTABLE PACKAGES
|
||||||
|
bun
|
||||||
|
]);
|
||||||
|
}
|
||||||
12
servers/common/ssh.nix
Normal file
12
servers/common/ssh.nix
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
services.openssh = {
|
||||||
|
enable = true;
|
||||||
|
ports = [ 1004 ];
|
||||||
|
settings = {
|
||||||
|
AllowGroups = [ "remote" ];
|
||||||
|
PasswordAuthentication = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
10
servers/common/sudo.nix
Normal file
10
servers/common/sudo.nix
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
security.sudo.extraRules = [
|
||||||
|
{
|
||||||
|
groups = [ "wheel" ];
|
||||||
|
commands = [ { command = "ALL"; options = [ "NOPASSWD" ]; } ];
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
21
servers/common/users.nix
Normal file
21
servers/common/users.nix
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
users = {
|
||||||
|
groups = {
|
||||||
|
remote = {};
|
||||||
|
};
|
||||||
|
users = {
|
||||||
|
in5ar = {
|
||||||
|
isNormalUser = true;
|
||||||
|
description = "IN5-AR";
|
||||||
|
extraGroups = [ "wheel" "docker" "remote"];
|
||||||
|
shell = pkgs.fish;
|
||||||
|
openssh.authorizedKeys.keys = [
|
||||||
|
''ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPg2GEI2xcR0E1LzJWDvF5eHNt93TcYy7W/qEI3XoVWr almiriqi@aqore-nix''
|
||||||
|
];
|
||||||
|
initialPassword = "ra5ni";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
62
servers/common/xray.nix
Normal file
62
servers/common/xray.nix
Normal file
|
|
@ -0,0 +1,62 @@
|
||||||
|
{ server-domain, port, dest, privateKey, shortId, spiderX }:
|
||||||
|
|
||||||
|
{
|
||||||
|
log.loglevel = "warning";
|
||||||
|
dns = {
|
||||||
|
servers = [ "1.1.1.1" ];
|
||||||
|
queryStrategy = "UseIPv4";
|
||||||
|
};
|
||||||
|
routing = {
|
||||||
|
rules = [
|
||||||
|
{
|
||||||
|
ip = [ "geoip:private" ];
|
||||||
|
outboundTag = "BLOCK";
|
||||||
|
type = "field";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
inbounds = [
|
||||||
|
{
|
||||||
|
tag = "VLESS TCP REALITY";
|
||||||
|
listen = "0.0.0.0";
|
||||||
|
port = port;
|
||||||
|
protocol = "vless";
|
||||||
|
settings = {
|
||||||
|
clients = [];
|
||||||
|
decryption = "none";
|
||||||
|
};
|
||||||
|
streamSettings = {
|
||||||
|
network = "tcp";
|
||||||
|
tcpSettings = {};
|
||||||
|
security = "reality";
|
||||||
|
realitySettings = {
|
||||||
|
show = false;
|
||||||
|
dest = dest;
|
||||||
|
xver = 0;
|
||||||
|
serverNames = [
|
||||||
|
server-domain
|
||||||
|
];
|
||||||
|
privateKey = privateKey;
|
||||||
|
SpiderX = spiderX;
|
||||||
|
shortIds = [
|
||||||
|
shortId
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
sniffing = {
|
||||||
|
enabled = true;
|
||||||
|
destOverride = [ "http" "tls" "quic" ];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
outbounds = [
|
||||||
|
{
|
||||||
|
protocol = "freedom";
|
||||||
|
tag = "DIRECT";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
protocol = "blackhole";
|
||||||
|
tag = "BLOCK";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
18
servers/common/yggdrasil.nix
Normal file
18
servers/common/yggdrasil.nix
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
services.yggdrasil = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
Peers = [
|
||||||
|
"tls://kuber.project-a.space:666"
|
||||||
|
"tls://arti.project-a.space:666"
|
||||||
|
"tls://reine.project-a.space:666"
|
||||||
|
];
|
||||||
|
Listen = [
|
||||||
|
"tls://0.0.0.0:666"
|
||||||
|
];
|
||||||
|
IfName = "ygg0";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
8
servers/mio/hardware-configuration.nix
Normal file
8
servers/mio/hardware-configuration.nix
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
{ modulesPath, ... }:
|
||||||
|
{
|
||||||
|
imports = [ (modulesPath + "/profiles/qemu-guest.nix") ];
|
||||||
|
boot.loader.grub.device = "/dev/sda";
|
||||||
|
boot.initrd.availableKernelModules = [ "ata_piix" "uhci_hcd" "xen_blkfront" "vmw_pvscsi" ];
|
||||||
|
boot.initrd.kernelModules = [ "nvme" ];
|
||||||
|
fileSystems."/" = { device = "/dev/sda1"; fsType = "ext4"; };
|
||||||
|
}
|
||||||
49
servers/mio/main.nix
Normal file
49
servers/mio/main.nix
Normal file
|
|
@ -0,0 +1,49 @@
|
||||||
|
{ config, pkgs, secret, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./hardware-configuration.nix
|
||||||
|
./nginx.nix
|
||||||
|
];
|
||||||
|
networking = {
|
||||||
|
hostName = "mio";
|
||||||
|
interfaces.ens18 = {
|
||||||
|
useDHCP = false;
|
||||||
|
ipv4.addresses = [{
|
||||||
|
address = "66.78.40.227";
|
||||||
|
prefixLength = 24;
|
||||||
|
}];
|
||||||
|
};
|
||||||
|
defaultGateway = "66.78.40.1";
|
||||||
|
nameservers = ["1.1.1.1"];
|
||||||
|
};
|
||||||
|
|
||||||
|
services.openssh.enable = true;
|
||||||
|
boot.tmp.cleanOnBoot = true;
|
||||||
|
zramSwap.enable = true;
|
||||||
|
|
||||||
|
system.stateVersion = "25.05";
|
||||||
|
services.yggdrasil.persistentKeys = true;
|
||||||
|
|
||||||
|
marzban = {
|
||||||
|
env = {
|
||||||
|
UVICORN_HOST = "mio.project-a.space";
|
||||||
|
UVICORN_PORT = secret.marzban.port;
|
||||||
|
SUDO_USERNAME = secret.marzban.sudo-username;
|
||||||
|
SUDO_PASSWORD = secret.marzban.sudo-password;
|
||||||
|
DOCS = true;
|
||||||
|
};
|
||||||
|
cert = true;
|
||||||
|
domain = "mio.project-a.space";
|
||||||
|
xray = import ../common/xray.nix {
|
||||||
|
server-domain = "mio.project-a.space";
|
||||||
|
port = secret.marzban.vless-port;
|
||||||
|
dest = secret.marzban.dest;
|
||||||
|
privateKey = secret.marzban.privateKey;
|
||||||
|
shortId = secret.marzban.shortId;
|
||||||
|
spiderX = secret.marzban.spiderX;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.firewall.allowedTCPPorts = [ secret.marzban.port secret.marzban.vless-port ];
|
||||||
|
}
|
||||||
37
servers/mio/nginx.nix
Normal file
37
servers/mio/nginx.nix
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
security.acme.defaults.email = "porject-a@project-a.space";
|
||||||
|
security.acme.acceptTerms = true;
|
||||||
|
|
||||||
|
services.nginx = {
|
||||||
|
enable = true;
|
||||||
|
recommendedTlsSettings = true;
|
||||||
|
recommendedOptimisation = true;
|
||||||
|
defaultSSLListenPort = 444;
|
||||||
|
|
||||||
|
streamConfig = ''
|
||||||
|
map $ssl_preread_server_name $name {
|
||||||
|
default marzban;
|
||||||
|
}
|
||||||
|
|
||||||
|
upstream git {
|
||||||
|
server 127.0.0.1:444;
|
||||||
|
}
|
||||||
|
|
||||||
|
upstream marzban {
|
||||||
|
server 127.0.0.1:1080;
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 0.0.0.0:443;
|
||||||
|
listen [::0]:443;
|
||||||
|
proxy_pass $name;
|
||||||
|
ssl_preread on;
|
||||||
|
proxy_connect_timeout 1s;
|
||||||
|
proxy_timeout 1h;
|
||||||
|
proxy_buffer_size 16k;
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
||||||
5
servers/reine/firewall.nix
Normal file
5
servers/reine/firewall.nix
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
{config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
networking.firewall.allowedTCPPorts = [ 8080 ];
|
||||||
|
}
|
||||||
55
servers/reine/hardware-configuration.nix
Normal file
55
servers/reine/hardware-configuration.nix
Normal file
|
|
@ -0,0 +1,55 @@
|
||||||
|
{ config, lib, pkgs, modulesPath, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [ (modulesPath + "/installer/scan/not-detected.nix") ];
|
||||||
|
|
||||||
|
boot = {
|
||||||
|
initrd = {
|
||||||
|
kernelModules = [ "amdgpu" ];
|
||||||
|
availableKernelModules = [ "xhci_pci" "ahci" "usb_storage" "sd_mod" "rtsx_pci_sdmmc" ];
|
||||||
|
};
|
||||||
|
loader = {
|
||||||
|
efi = {
|
||||||
|
canTouchEfiVariables = true;
|
||||||
|
efiSysMountPoint = "/boot/efi";
|
||||||
|
};
|
||||||
|
grub = {
|
||||||
|
enable = true;
|
||||||
|
device = "nodev";
|
||||||
|
efiSupport = true;
|
||||||
|
configurationLimit = 16;
|
||||||
|
gfxmodeEfi = "1920x1080";
|
||||||
|
extraEntries = ''
|
||||||
|
menuentry "UEFI Firmware Setup" {
|
||||||
|
fwsetup
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
kernelModules = [ "kvm-amd" ];
|
||||||
|
extraModulePackages = [ ];
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/" = {
|
||||||
|
device = "/dev/disk/by-uuid/39d941ed-a87d-4341-85b8-5343f502fdaa";
|
||||||
|
fsType = "btrfs";
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/boot/efi" = {
|
||||||
|
device = "/dev/disk/by-uuid/1E12-07EE";
|
||||||
|
fsType = "vfat";
|
||||||
|
options = [ "fmask=0077" "dmask=0077" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/home" = {
|
||||||
|
device = "/dev/disk/by-uuid/842c5f4e-88a4-41f5-ad9d-6a13aad1f3e6";
|
||||||
|
fsType = "btrfs";
|
||||||
|
};
|
||||||
|
|
||||||
|
swapDevices = [ ];
|
||||||
|
|
||||||
|
networking.useDHCP = lib.mkDefault true;
|
||||||
|
|
||||||
|
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||||
|
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||||
|
}
|
||||||
17
servers/reine/jellyfin.nix
Normal file
17
servers/reine/jellyfin.nix
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
{config, pkgs, pkgs-unstable, ...}:
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
services.jellyfin = {
|
||||||
|
enable = true;
|
||||||
|
openFirewall = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
services.jellyseerr = {
|
||||||
|
enable = true;
|
||||||
|
port = 5055;
|
||||||
|
openFirewall = true;
|
||||||
|
package = pkgs-unstable.jellyseerr; # Use the unstable package if stable is not up-to-date
|
||||||
|
};
|
||||||
|
}
|
||||||
15
servers/reine/main.nix
Normal file
15
servers/reine/main.nix
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
{ config, pkgs, secret, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./hardware-configuration.nix
|
||||||
|
./jellyfin.nix
|
||||||
|
./traefik.nix
|
||||||
|
./firewall.nix
|
||||||
|
];
|
||||||
|
networking.hostName = "reine";
|
||||||
|
services.yggdrasil.settings.PrivateKey = secret.yggdrasil.PrivateKey;
|
||||||
|
services.yggdrasil.persistentKeys = false;
|
||||||
|
hardware.amdgpu.opencl.enable = true;
|
||||||
|
system.stateVersion = "25.05";
|
||||||
|
}
|
||||||
66
servers/reine/traefik.nix
Normal file
66
servers/reine/traefik.nix
Normal file
|
|
@ -0,0 +1,66 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
services.traefik = {
|
||||||
|
enable = true;
|
||||||
|
staticConfigOptions = {
|
||||||
|
entryPoints = {
|
||||||
|
web = {
|
||||||
|
address = ":80";
|
||||||
|
http.redirections.entryPoint = {
|
||||||
|
to = "websecure";
|
||||||
|
scheme = "https";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
websecure = {
|
||||||
|
address = ":443";
|
||||||
|
http.tls = {
|
||||||
|
certResolver = "letsencrypt";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
api = {
|
||||||
|
dashboard = false;
|
||||||
|
insecure = false; # Включить только для отладки, лучше использовать безопасный доступ
|
||||||
|
};
|
||||||
|
|
||||||
|
certificatesResolvers.letsencrypt.acme = {
|
||||||
|
email = "luc_ren@blnt-cult.ru";
|
||||||
|
storage = "${config.services.traefik.dataDir}/acme.json";
|
||||||
|
httpChallenge.entryPoint = "web";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
dynamicConfigOptions = {
|
||||||
|
http = {
|
||||||
|
routers = {
|
||||||
|
jellyfin = {
|
||||||
|
rule = "Host(`jellyfin.project-a.space`)";
|
||||||
|
service = "jellyfin";
|
||||||
|
entryPoints = ["websecure"];
|
||||||
|
tls = {
|
||||||
|
certResolver = "letsencrypt";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
jellyseerr = {
|
||||||
|
rule = "Host(`jellyseerr.project-a.space`)";
|
||||||
|
service = "jellyseerr";
|
||||||
|
entryPoints = ["websecure"];
|
||||||
|
tls = {
|
||||||
|
certResolver = "letsencrypt";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
services = {
|
||||||
|
jellyfin.loadBalancer.servers = [
|
||||||
|
{ url = "http://127.0.0.1:8096"; }
|
||||||
|
];
|
||||||
|
jellyseerr.loadBalancer.servers = [
|
||||||
|
{ url = "http://127.0.0.1:5055"; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
31
servers/vanessa/hardware-configuration.nix
Normal file
31
servers/vanessa/hardware-configuration.nix
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
{ modulesPath, ... }:
|
||||||
|
{
|
||||||
|
imports = [ (modulesPath + "/profiles/qemu-guest.nix") ];
|
||||||
|
boot.loader.grub.device = "/dev/vda";
|
||||||
|
boot.initrd.availableKernelModules = [ "ata_piix" "uhci_hcd" "xen_blkfront" "vmw_pvscsi" ];
|
||||||
|
boot.initrd.kernelModules = [ "nvme" ];
|
||||||
|
fileSystems."/" = { device = "/dev/vda2"; fsType = "ext4"; };
|
||||||
|
|
||||||
|
networking = {
|
||||||
|
hostName = "vanessa";
|
||||||
|
interfaces.ens3 = {
|
||||||
|
useDHCP = false;
|
||||||
|
ipv4 = {
|
||||||
|
addresses = [{
|
||||||
|
address = "138.124.112.127";
|
||||||
|
prefixLength = 32;
|
||||||
|
}];
|
||||||
|
routes = [{
|
||||||
|
address = "10.0.0.1";
|
||||||
|
prefixLength = 32;
|
||||||
|
}];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
defaultGateway = "10.0.0.1";
|
||||||
|
nameservers = ["1.1.1.1"];
|
||||||
|
};
|
||||||
|
|
||||||
|
boot.tmp.cleanOnBoot = true;
|
||||||
|
zramSwap.enable = true;
|
||||||
|
system.stateVersion = "25.05";
|
||||||
|
}
|
||||||
31
servers/vanessa/main.nix
Normal file
31
servers/vanessa/main.nix
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
{ config, pkgs, secret, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./hardware-configuration.nix
|
||||||
|
./nginx.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
services.yggdrasil.persistentKeys = true;
|
||||||
|
marzban = {
|
||||||
|
env = {
|
||||||
|
UVICORN_HOST = "vanessa.project-a.space";
|
||||||
|
UVICORN_PORT = secret.marzban.port;
|
||||||
|
SUDO_USERNAME = secret.marzban.sudo-username;
|
||||||
|
SUDO_PASSWORD = secret.marzban.sudo-password;
|
||||||
|
DOCS = true;
|
||||||
|
};
|
||||||
|
cert = true;
|
||||||
|
domain = "vanessa.project-a.space";
|
||||||
|
xray = import ../common/xray.nix {
|
||||||
|
server-domain = "vanessa.project-a.space";
|
||||||
|
port = secret.marzban.vless-port;
|
||||||
|
dest = secret.marzban.dest;
|
||||||
|
privateKey = secret.marzban.privateKey;
|
||||||
|
shortId = secret.marzban.shortId;
|
||||||
|
spiderX = secret.marzban.spiderX;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.firewall.allowedTCPPorts = [ secret.marzban.port secret.marzban.vless-port ];
|
||||||
|
}
|
||||||
37
servers/vanessa/nginx.nix
Normal file
37
servers/vanessa/nginx.nix
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
security.acme.defaults.email = "porject-a@project-a.space";
|
||||||
|
security.acme.acceptTerms = true;
|
||||||
|
|
||||||
|
services.nginx = {
|
||||||
|
enable = true;
|
||||||
|
recommendedTlsSettings = true;
|
||||||
|
recommendedOptimisation = true;
|
||||||
|
defaultSSLListenPort = 444;
|
||||||
|
|
||||||
|
streamConfig = ''
|
||||||
|
map $ssl_preread_server_name $name {
|
||||||
|
default marzban;
|
||||||
|
}
|
||||||
|
|
||||||
|
upstream git {
|
||||||
|
server 127.0.0.1:444;
|
||||||
|
}
|
||||||
|
|
||||||
|
upstream marzban {
|
||||||
|
server 127.0.0.1:1080;
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 0.0.0.0:443;
|
||||||
|
listen [::0]:443;
|
||||||
|
proxy_pass $name;
|
||||||
|
ssl_preread on;
|
||||||
|
proxy_connect_timeout 1s;
|
||||||
|
proxy_timeout 1h;
|
||||||
|
proxy_buffer_size 16k;
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
||||||
9
update.sh
Executable file
9
update.sh
Executable file
|
|
@ -0,0 +1,9 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
nix flake check
|
||||||
|
|
||||||
|
nixos-rebuild switch --target-host reine --flake . --use-remote-sudo
|
||||||
|
nixos-rebuild switch --target-host kuber --flake . --use-remote-sudo
|
||||||
|
nixos-rebuild switch --target-host artemisia --flake . --use-remote-sudo
|
||||||
|
nixos-rebuild switch --target-host mio --flake . --use-remote-sudo
|
||||||
|
nixos-rebuild switch --target-host vanessa --flake . --use-remote-sudo
|
||||||
Loading…
Add table
Add a link
Reference in a new issue