{ 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 = { DATABASE_URI = "mysql://${dbUser}:${dbPassword}@localhost:${toString dbPort}/${dbName}"; START_DATE = "2026-12-27T14:00:00"; UPLOAD_PATH = "./.data/uploads"; ADMIN_USER = "admin"; ADMIN_PASSWORD = "admin"; BASE_PATH = "/"; SERVER_IP = "localhost"; ASTRO_TELEMETRY_DISABLED = "1"; }; 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; }; }; }; 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; }; }; }