Files
website/flake.nix
T
2026-10-29 14:11:25 +01:00

143 lines
4.0 KiB
Nix

{
description = "CraftAttack website development environment";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-parts.url = "github:hercules-ci/flake-parts";
process-compose-flake.url = "github:Platonic-Systems/process-compose-flake";
services-flake.url = "github:juspay/services-flake";
};
outputs =
inputs:
inputs.flake-parts.lib.mkFlake { inherit inputs; } {
systems = [ "x86_64-linux" ];
imports = [ inputs.process-compose-flake.flakeModule ];
perSystem =
{
self',
pkgs,
lib,
...
}:
let
dbPort = 3306;
webPort = 4321;
dbName = "website";
dbUser = "website";
dbPassword = "website";
devEnv = {
START_DATE = "2026-12-27T14:00:00";
DATABASE_URI = "mysql://${dbUser}:${dbPassword}@localhost:${toString dbPort}/${dbName}";
ADMIN_USER = "admin";
ADMIN_PASSWORD = "admin";
ADMIN_COOKIE = "muelleel";
UPLOAD_PATH = "./.data/uploads";
TEAMSPEAK_LINK = "http://example.com";
DISCORD_LINK = "http://example.com";
PAYPAL_LINK = "http://example.com";
SERVER_IP = "example.com";
BASE_PATH = "/craftattack";
};
webRun = pkgs.writeShellApplication {
name = "web-run";
runtimeInputs = [
pkgs.nodejs_26
pkgs.curl
];
text = ''
if [ ! -d node_modules ] || [ package-lock.json -nt node_modules/.package-lock.json ]; then
npm ci
fi
exec npm run dev
'';
};
in
{
process-compose.dev = {
imports = [ inputs.services-flake.processComposeModules.default ];
cli.preHook = "mkdir -p .data/uploads .data/logs";
defaults.processSettings = { name, ... }: {
availability.restart = lib.mkDefault "on_failure";
availability.max_restarts = lib.mkDefault 5;
log_location = lib.mkDefault ".data/logs/${name}.log";
};
settings.environment = devEnv;
services.mysql.db = {
enable = true;
package = pkgs.mariadb;
dataDir = "./.data/mariadb";
settings.mysqld = {
port = dbPort;
"bind-address" = "127.0.0.1";
};
initialDatabases = [
{
name = dbName;
schema = ./src/db/database.sql;
}
];
ensureUsers = [
{
name = dbUser;
password = dbPassword;
ensurePermissions = {
"${dbName}.*" = "ALL PRIVILEGES";
};
}
];
};
settings.processes.web = {
description = "CraftAttack website (Astro dev server)";
command = webRun;
depends_on."db-configure".condition = "process_completed_successfully";
readiness_probe.http_get = {
host = "127.0.0.1";
port = webPort;
path = devEnv.BASE_PATH;
};
};
};
devShells.default = pkgs.mkShell {
packages = [
pkgs.nodejs_26
pkgs.mariadb
pkgs.curl
self'.packages.dev
pkgs.nixfmt
];
env = devEnv;
shellHook = ''
mkdir -p .data/uploads
echo "CraftAttack dev shell: run \`dev\` (or \`nix run .#dev\`) to start MariaDB + Astro." >&2
echo "MariaDB: mysql://${dbUser}:${dbPassword}@localhost:${toString dbPort}/${dbName}" >&2
echo "Reset database: rm -rf .data" >&2
'';
};
formatter = pkgs.nixfmt;
};
};
}