forked from tangled.org/core
this repo has no description

nix: add spindle package, module and VM configuration

Signed-off-by: oppiliappan <me@oppi.li>

oppi.li bcf82fd3 08ab8698

verified
Changed files
+173 -12
nix
+3 -3
flake.lock
···
"htmx-ws-src": {
"flake": false,
"locked": {
-
"narHash": "sha256-XbUFiv94ZPB6VVULoTWOsje5Gq1I+IT72lMc4CpUYrY=",
"type": "file",
-
"url": "https://unpkg.com/htmx.org@2.0.4/dist/ext/ws.js"
},
"original": {
"type": "file",
-
"url": "https://unpkg.com/htmx.org@2.0.4/dist/ext/ws.js"
}
},
"ibm-plex-mono-src": {
···
"htmx-ws-src": {
"flake": false,
"locked": {
+
"narHash": "sha256-2fg6KyEJoO24q0fQqbz9RMaYNPQrMwpZh29tkSqdqGY=",
"type": "file",
+
"url": "https://cdn.jsdelivr.net/npm/htmx-ext-ws@2.0.2"
},
"original": {
"type": "file",
+
"url": "https://cdn.jsdelivr.net/npm/htmx-ext-ws@2.0.2"
}
},
"ibm-plex-mono-src": {
+12 -2
flake.nix
···
flake = false;
};
htmx-ws-src = {
-
url = "https://unpkg.com/htmx.org@2.0.4/dist/ext/ws.js";
flake = false;
};
lucide-src = {
···
inherit htmx-src htmx-ws-src lucide-src inter-fonts-src ibm-plex-mono-src goModHash gitignoreSource;
};
knotDeps = {
inherit goModHash gitignoreSource;
};
mkPackageSet = pkgs: {
lexgen = pkgs.callPackage ./nix/pkgs/lexgen.nix {inherit indigo;};
appview = pkgs.callPackage ./nix/pkgs/appview.nix appviewDeps;
knot = pkgs.callPackage ./nix/pkgs/knot.nix {};
knot-unwrapped = pkgs.callPackage ./nix/pkgs/knot-unwrapped.nix knotDeps;
sqlite-lib = pkgs.callPackage ./nix/pkgs/sqlite-lib.nix {
inherit (pkgs) gcc;
···
lexgen = pkgs.lexgen;
knot = pkgs.knot;
knot-unwrapped = pkgs.knot-unwrapped;
genjwks = pkgs.genjwks;
sqlite-lib = pkgs.sqlite-lib;
pkgsStatic-appview = staticPkgs.appview;
pkgsStatic-knot = staticPkgs.knot;
pkgsStatic-knot-unwrapped = staticPkgs.knot-unwrapped;
pkgsStatic-sqlite-lib = staticPkgs.sqlite-lib;
pkgsCross-gnu64-pkgsStatic-appview = crossPkgs.appview;
pkgsCross-gnu64-pkgsStatic-knot = crossPkgs.knot;
pkgsCross-gnu64-pkgsStatic-knot-unwrapped = crossPkgs.knot-unwrapped;
});
defaultPackage = forAllSystems (system: nixpkgsFor.${system}.appview);
formatter = forAllSystems (system: nixpkgsFor."${system}".alejandra);
···
nixosModules.appview = import ./nix/modules/appview.nix {inherit self;};
nixosModules.knot = import ./nix/modules/knot.nix {inherit self;};
-
nixosConfigurations.knotVM = import ./nix/vm.nix {inherit self nixpkgs;};
};
}
···
flake = false;
};
htmx-ws-src = {
+
# strange errors in consle that i can't really make out
+
# url = "https://unpkg.com/htmx.org@2.0.4/dist/ext/ws.js";
+
url = "https://cdn.jsdelivr.net/npm/htmx-ext-ws@2.0.2";
flake = false;
};
lucide-src = {
···
inherit htmx-src htmx-ws-src lucide-src inter-fonts-src ibm-plex-mono-src goModHash gitignoreSource;
};
knotDeps = {
+
inherit goModHash gitignoreSource;
+
};
+
spindleDeps = {
inherit goModHash gitignoreSource;
};
mkPackageSet = pkgs: {
lexgen = pkgs.callPackage ./nix/pkgs/lexgen.nix {inherit indigo;};
appview = pkgs.callPackage ./nix/pkgs/appview.nix appviewDeps;
knot = pkgs.callPackage ./nix/pkgs/knot.nix {};
+
spindle = pkgs.callPackage ./nix/pkgs/spindle.nix spindleDeps;
knot-unwrapped = pkgs.callPackage ./nix/pkgs/knot-unwrapped.nix knotDeps;
sqlite-lib = pkgs.callPackage ./nix/pkgs/sqlite-lib.nix {
inherit (pkgs) gcc;
···
lexgen = pkgs.lexgen;
knot = pkgs.knot;
knot-unwrapped = pkgs.knot-unwrapped;
+
spindle = pkgs.spindle;
genjwks = pkgs.genjwks;
sqlite-lib = pkgs.sqlite-lib;
pkgsStatic-appview = staticPkgs.appview;
pkgsStatic-knot = staticPkgs.knot;
pkgsStatic-knot-unwrapped = staticPkgs.knot-unwrapped;
+
pkgsStatic-spindle = staticPkgs.spindle;
pkgsStatic-sqlite-lib = staticPkgs.sqlite-lib;
pkgsCross-gnu64-pkgsStatic-appview = crossPkgs.appview;
pkgsCross-gnu64-pkgsStatic-knot = crossPkgs.knot;
pkgsCross-gnu64-pkgsStatic-knot-unwrapped = crossPkgs.knot-unwrapped;
+
pkgsCross-gnu64-pkgsStatic-spindle = crossPkgs.spindle;
});
defaultPackage = forAllSystems (system: nixpkgsFor.${system}.appview);
formatter = forAllSystems (system: nixpkgsFor."${system}".alejandra);
···
nixosModules.appview = import ./nix/modules/appview.nix {inherit self;};
nixosModules.knot = import ./nix/modules/knot.nix {inherit self;};
+
nixosModules.spindle = import ./nix/modules/spindle.nix {inherit self;};
+
nixosConfigurations.vm = import ./nix/vm.nix {inherit self nixpkgs;};
};
}
+2 -4
nix/modules/knot.nix
···
system.activationScripts.gitConfig = ''
mkdir -p "${cfg.repo.scanPath}"
-
chown -R ${cfg.gitUser}:${cfg.gitUser} \
-
"${cfg.repo.scanPath}"
mkdir -p "${cfg.stateDir}/.config/git"
cat > "${cfg.stateDir}/.config/git/config" << EOF
···
name = Git User
email = git@example.com
EOF
-
chown -R ${cfg.gitUser}:${cfg.gitUser} \
-
"${cfg.stateDir}"
'';
users.users.${cfg.gitUser} = {
···
system.activationScripts.gitConfig = ''
mkdir -p "${cfg.repo.scanPath}"
+
chown -R ${cfg.gitUser}:${cfg.gitUser} "${cfg.repo.scanPath}"
mkdir -p "${cfg.stateDir}/.config/git"
cat > "${cfg.stateDir}/.config/git/config" << EOF
···
name = Git User
email = git@example.com
EOF
+
chown -R ${cfg.gitUser}:${cfg.gitUser} "${cfg.stateDir}"
'';
users.users.${cfg.gitUser} = {
+99
nix/modules/spindle.nix
···
···
+
{self}: {
+
config,
+
pkgs,
+
lib,
+
...
+
}: let
+
cfg = config.services.tangled-spindle;
+
in
+
with lib; {
+
options = {
+
services.tangled-spindle = {
+
enable = mkOption {
+
type = types.bool;
+
default = false;
+
description = "Enable a tangled spindle";
+
};
+
+
server = {
+
listenAddr = mkOption {
+
type = types.str;
+
default = "0.0.0.0:6555";
+
description = "Address to listen on";
+
};
+
+
dbPath = mkOption {
+
type = types.path;
+
default = "/var/lib/spindle/spindle.db";
+
description = "Path to the database file";
+
};
+
+
hostname = mkOption {
+
type = types.str;
+
example = "spindle.tangled.sh";
+
description = "Hostname for the server (required)";
+
};
+
+
jetstreamEndpoint = mkOption {
+
type = types.str;
+
default = "wss://jetstream1.us-west.bsky.network/subscribe";
+
description = "Jetstream endpoint to subscribe to";
+
};
+
+
dev = mkOption {
+
type = types.bool;
+
default = false;
+
description = "Enable development mode (disables signature verification)";
+
};
+
+
owner = mkOption {
+
type = types.str;
+
example = "did:plc:qfpnj4og54vl56wngdriaxug";
+
description = "DID of owner (required)";
+
};
+
};
+
+
pipelines = {
+
nixery = mkOption {
+
type = types.str;
+
default = "nixery.tangled.sh";
+
description = "Nixery instance to use";
+
};
+
+
stepTimeout = mkOption {
+
type = types.str;
+
default = "5m";
+
description = "Timeout for each step of a pipeline";
+
};
+
};
+
};
+
};
+
+
config = mkIf cfg.enable {
+
virtualisation.docker.enable = true;
+
+
systemd.services.spindle = {
+
description = "spindle service";
+
after = ["network.target" "docker.service"];
+
wantedBy = ["multi-user.target"];
+
serviceConfig = {
+
LogsDirectory = "spindle";
+
StateDirectory = "spindle";
+
Environment = [
+
"SPINDLE_SERVER_LISTEN_ADDR=${cfg.server.listenAddr}"
+
"SPINDLE_SERVER_DB_PATH=${cfg.server.dbPath}"
+
"SPINDLE_SERVER_HOSTNAME=${cfg.server.hostname}"
+
"SPINDLE_SERVER_JETSTREAM=${cfg.server.jetstreamEndpoint}"
+
"SPINDLE_SERVER_DEV=${lib.boolToString cfg.server.dev}"
+
"SPINDLE_SERVER_OWNER=${cfg.server.owner}"
+
"SPINDLE_PIPELINES_NIXERY=${cfg.pipelines.nixery}"
+
"SPINDLE_PIPELINES_STEP_TIMEOUT=${cfg.pipelines.stepTimeout}"
+
];
+
ExecStart = "${self.packages.${pkgs.system}.spindle}/bin/spindle";
+
Restart = "always";
+
};
+
};
+
+
networking.firewall.allowedTCPPorts = mkIf cfg.openFirewall [22];
+
};
+
}
+22
nix/pkgs/spindle.nix
···
···
+
{
+
buildGoModule,
+
stdenv,
+
sqlite-lib,
+
goModHash,
+
gitignoreSource,
+
}:
+
buildGoModule {
+
pname = "spindle";
+
version = "0.1.0";
+
src = gitignoreSource ../..;
+
+
doCheck = false;
+
+
subPackages = ["cmd/spindle"];
+
vendorHash = goModHash;
+
tags = "libsqlite3";
+
+
env.CGO_CFLAGS = "-I ${sqlite-lib}/include ";
+
env.CGO_LDFLAGS = "-L ${sqlite-lib}/lib";
+
env.CGO_ENABLED = 1;
+
}
+35 -3
nix/vm.nix
···
system = "x86_64-linux";
modules = [
self.nixosModules.knot
({
config,
pkgs,
...
}: {
-
virtualisation.memorySize = 2048;
-
virtualisation.diskSize = 10 * 1024;
-
virtualisation.cores = 2;
services.getty.autologinUser = "root";
environment.systemPackages = with pkgs; [curl vim git];
systemd.tmpfiles.rules = let
···
secretFile = "/var/lib/knot/secret";
hostname = "localhost:6000";
listenAddr = "0.0.0.0:6000";
};
};
})
···
system = "x86_64-linux";
modules = [
self.nixosModules.knot
+
self.nixosModules.spindle
({
config,
pkgs,
...
}: {
+
virtualisation = {
+
memorySize = 2048;
+
diskSize = 10 * 1024;
+
cores = 2;
+
forwardPorts = [
+
# ssh
+
{
+
from = "host";
+
host.port = 2222;
+
guest.port = 22;
+
}
+
# knot
+
{
+
from = "host";
+
host.port = 6000;
+
guest.port = 6000;
+
}
+
# spindle
+
{
+
from = "host";
+
host.port = 6555;
+
guest.port = 6555;
+
}
+
];
+
};
services.getty.autologinUser = "root";
environment.systemPackages = with pkgs; [curl vim git];
systemd.tmpfiles.rules = let
···
secretFile = "/var/lib/knot/secret";
hostname = "localhost:6000";
listenAddr = "0.0.0.0:6000";
+
};
+
};
+
services.tangled-spindle = {
+
enable = true;
+
server = {
+
owner = "did:plc:qfpnj4og54vl56wngdriaxug";
+
hostname = "localhost:6555";
+
listenAddr = "0.0.0.0:6555";
+
dev = true;
};
};
})