Nix test VM, migrations helper script

This commit is contained in:
Rory&
2026-01-19 11:57:22 +01:00
parent dd58e7509e
commit 1f42f4b888
9 changed files with 276 additions and 0 deletions
+1
View File
@@ -77,6 +77,7 @@ pkgs.buildNpmPackage {
do
makeWrapper ${pkgs.nodejs_24}/bin/node $out/bin/start-`dirname ''${i/dist\//}` --prefix NODE_PATH : $out/node_modules --add-flags --enable-source-maps --add-flags $out/$i
done
makeWrapper ${pkgs.nodejs_24}/bin/node $out/bin/apply-migrations --prefix NODE_PATH : $out/node_modules --add-flags --enable-source-maps --add-flags $out/dist/apply-migrations.js
# set +x
runHook postInstall
+1
View File
@@ -76,6 +76,7 @@
)
// {
nixosModules.default = import ./nix/modules/default self;
testVm = import ./nix/testVm/default.nix { inherit self nixpkgs; };
checks =
let
pkgs = import nixpkgs { system = "x86_64-linux"; };
+23
View File
@@ -221,8 +221,27 @@ in
# }
];
systemd.services.spacebar-apply-migrations = makeServerTsService {
description = "Spacebar Server - Apply DB migrations";
after = [ "network-online.target" "postgresql.service" ];
environment = builtins.mapAttrs (_: val: builtins.toString val) (
cfg.extraEnvironment
// {
# things we force...
CONFIG_PATH = configFile;
CONFIG_READONLY = 1;
}
);
serviceConfig = {
ExecStart = "${cfg.package}/bin/apply-migrations";
Type = "oneshot";
};
};
systemd.services.spacebar-api = makeServerTsService {
description = "Spacebar Server - API";
after = [ "spacebar-apply-migrations.service" ];
requires = [ "spacebar-apply-migrations.service" ];
environment = builtins.mapAttrs (_: val: builtins.toString val) (
{
# things we set by default...
@@ -245,6 +264,8 @@ in
systemd.services.spacebar-gateway = makeServerTsService {
description = "Spacebar Server - Gateway";
after = [ "spacebar-apply-migrations.service" ];
requires = [ "spacebar-apply-migrations.service" ];
environment = builtins.mapAttrs (_: val: builtins.toString val) (
{
# things we set by default...
@@ -267,6 +288,8 @@ in
systemd.services.spacebar-cdn = makeServerTsService {
description = "Spacebar Server - CDN";
after = [ "spacebar-apply-migrations.service" ];
requires = [ "spacebar-apply-migrations.service" ];
environment = builtins.mapAttrs (_: val: builtins.toString val) (
{
# things we set by default...
+45
View File
@@ -0,0 +1,45 @@
{ pkgs, lib, ... }:
{
networking.hostName = "sbtest";
services.spacebarchat-server =
let
cfg = {
enable = true;
apiEndpoint = { useSsl = false; host = "api.sb.localhost"; localPort = 3001; publicPort = 8080; };
gatewayEndpoint = { useSsl = false; host = "gw.sb.localhost"; localPort = 3002; publicPort = 8080; };
cdnEndpoint = { useSsl = false; host = "cdn.sb.localhost"; localPort = 3003; publicPort = 8080; };
nginx.enable = true;
serverName = "sb.localhost";
extraEnvironment = {
DATABASE = "postgres://postgres:postgres@127.0.0.1/spacebar";
#WEBRTC_PORT_RANGE=60000-61000;
#PUBLIC_IP=216.230.228.60;
LOG_REQUESTS = "-200,204,304";
LOG_VALIDATION_ERRORS = true;
#DB_LOGGING=true;
#LOG_GATEWAY_TRACES=true;
#LOG_PROTO_UPDATES=true;
#LOG_PROTO_FRECENCY_UPDATES=true;
#LOG_PROTO_SETTINGS_UPDATES=true;
#WRTC_PUBLIC_IP=webrtc.old.server.spacebar.chat;
WRTC_PUBLIC_IP = "216.230.228.19";
WRTC_PORT_MIN = 60000;
WRTC_PORT_MAX = 65000;
WRTC_LIBRARY = "@spacebarchat/medooze-webrtc";
#WRTC_LIBRARY=mediasoup-spacebar-wrtc;
};
};
in
lib.trace ("Testing with config: " + builtins.toJSON cfg) cfg;
services.nginx.enable = true;
users.users.root.initialPassword = "root";
services.getty.autologinUser = "root";
environment.systemPackages = with pkgs; [
btop
duf
lnav
];
}
+15
View File
@@ -0,0 +1,15 @@
{ self, nixpkgs }:
nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
self.nixosModules.default
./configuration.nix
./postgres.nix
./perlless.nix
./vm.nix
];
specialArgs = { inherit self nixpkgs; };
}
#DERIVATION=".#nixosConfigurations.${CONFIG}.config.system.build.toplevel"
+26
View File
@@ -0,0 +1,26 @@
{ pkgs, lib, ... }:
{
#perlless profile
# system.switch.enable = lib.mkForce false;
# Remove perl from activation
#system.etc.overlay.enable = lib.mkForce true;
#systemd.sysusers.enable = lib.mkForce true;
# Random perl remnants
programs.less.lessopen = lib.mkForce null;
programs.command-not-found.enable = lib.mkForce false;
environment.defaultPackages = lib.mkForce [ ];
documentation.info.enable = lib.mkForce false;
documentation.man.enable = false;
system = {
#activatable = false;
copySystemConfiguration = false;
includeBuildDependencies = false;
disableInstallerTools = lib.mkForce true;
build = {
separateActivationScript = true;
};
};
}
+82
View File
@@ -0,0 +1,82 @@
{ config, pkgs, ... }:
{
services.postgresql = {
enable = true;
package = pkgs.postgresql_18_jit;
initdbArgs = [
"--encoding=UTF8"
"--locale=C.UTF-8"
"--data-checksums"
"--allow-group-access"
];
enableTCPIP = true;
authentication = pkgs.lib.mkOverride 10 ''
# TYPE, DATABASE, USER, ADDRESS, METHOD
local all all trust
host all all 127.0.0.1/32 trust
host all all ::1/128 trust
host all all 0.0.0.0/0 md5
'';
initialScript = pkgs.writeText "backend-initScript" ''
CREATE ROLE spacebar WITH LOGIN PASSWORD 'spacebar' CREATEDB;
CREATE DATABASE spacebar;
GRANT ALL PRIVILEGES ON DATABASE spacebar TO spacebar;
'';
settings = {
# https://pgconfigurator.cybertec.at/
max_connections = 2500;
superuser_reserved_connections = 3;
shared_buffers = "128MB";
work_mem = "64MB";
maintenance_work_mem = "512MB";
huge_pages = "try";
effective_cache_size = "512MB";
effective_io_concurrency = 100;
random_page_cost = 1.1;
# can use this to view stats: SELECT query, total_time, calls, rows FROM pg_stat_statements ORDER BY total_time DESC LIMIT 10;
shared_preload_libraries = "pg_stat_statements";
track_io_timing = "on";
track_functions = "pl";
"pg_stat_statements.max" = "10000"; # additional
"pg_stat_statements.track" = "all"; # additional
wal_level = "replica";
max_wal_senders = 0;
synchronous_commit = "on"; # was ond3
checkpoint_timeout = "15min";
checkpoint_completion_target = "0.9";
max_wal_size = "2GB";
min_wal_size = "1GB";
wal_compression = "off";
wal_buffers = "-1";
wal_writer_delay = "500ms"; # was 100
wal_writer_flush_after = "32MB"; # was 1
#checkpoint_segments = "64"; # additional
default_statistics_target = "250"; # additional
bgwriter_delay = "200ms";
bgwriter_lru_maxpages = "100";
bgwriter_lru_multiplier = "2.0";
bgwriter_flush_after = "0";
max_worker_processes = "64"; # was 14
max_parallel_workers_per_gather = "32"; # was 7
max_parallel_maintenance_workers = "32"; # was 7
max_parallel_workers = "64"; # was 14
parallel_leader_participation = "on";
enable_partitionwise_join = "on";
enable_partitionwise_aggregate = "on";
jit = "on";
max_slot_wal_keep_size = "1GB";
track_wal_io_timing = "on";
maintenance_io_concurrency = "4";
wal_recycle = "on";
};
};
}
+68
View File
@@ -0,0 +1,68 @@
{
nixpkgs,
modulesPath,
pkgs,
lib,
...
}:
{
imports = [
# (modulesPath + "/virtualisation/qemu-vm.nix")
];
virtualisation.vmVariant = {
services.xserver.videoDrivers = [ "qxl" ];
services.spice-vdagentd.enable = true;
virtualisation.qemu.guestAgent.enable = true;
services.qemuGuest.enable = true;
virtualisation.qemu.options = [
"-vga qxl -device virtio-serial-pci -spice port=5930,disable-ticketing=on -device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0 -chardev spicevmc,id=spicechannel0,name=vdagent"
"-display gtk,zoom-to-fit=off,show-cursor=on"
"-device virtio-balloon"
];
virtualisation.memorySize = 4096;
virtualisation.cores = 6;
virtualisation.forwardPorts = [
# { hostPort = 2222; guestPort = 22; } # Probably shouldn't do this with root:root lol
{ from = "host"; host.port = 8080; guest.port = 80; }
];
networking.useDHCP = lib.mkForce true;
};
networking.firewall.enable = false;
boot = {
initrd = {
systemd.enable = true;
systemd.emergencyAccess = true;
};
kernelParams = [
"console=ttyS0,115200"
"systemd.gpt_auto=0"
#"console=tty1"
#"quiet"
];
loader.timeout = 1;
};
boot.supportedFilesystems = lib.mkForce [ ];
hardware.enableRedistributableFirmware = lib.mkForce false;
#environment.systemPackages = lib.mkForce [ ];
documentation.enable = lib.mkForce false;
documentation.nixos.enable = lib.mkForce false;
networking.wireless.enable = lib.mkForce false;
console = {
earlySetup = true;
font = "${pkgs.cozette}/share/consolefonts/cozette6x13.psfu";
packages = with pkgs; [ cozette ];
};
system = {
#activatable = false;
copySystemConfiguration = false;
includeBuildDependencies = false;
disableInstallerTools = lib.mkForce true;
build = {
separateActivationScript = true;
};
};
}
+15
View File
@@ -0,0 +1,15 @@
import moduleAlias from "module-alias";
moduleAlias(__dirname + "../../package.json");
process.on("uncaughtException", console.error);
process.on("unhandledRejection", console.error);
import { config } from "dotenv";
config({ quiet: true });
process.env.DB_LOGGING = "true";
import { closeDatabase, initDatabase } from "@spacebar/util";
initDatabase().then(() => {
closeDatabase().then((r) => {});
});