From f871c8c8c8496d869f2a81e31e4be81201fe1440 Mon Sep 17 00:00:00 2001 From: bytedream Date: Thu, 29 Oct 2026 13:52:20 +0100 Subject: [PATCH] add nix dev env --- .envrc | 1 + .gitignore | 5 ++ flake.lock | 93 +++++++++++++++++++++++++++++++++++++ flake.nix | 133 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 232 insertions(+) create mode 100644 .envrc create mode 100644 flake.lock create mode 100644 flake.nix diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..3550a30 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake diff --git a/.gitignore b/.gitignore index 153c2a2..52d9e86 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,8 @@ pnpm-debug.log* # jetbrains setting folder .idea/ + +# nix/dev environment +.direnv/ +.data/ +result diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..4e18704 --- /dev/null +++ b/flake.lock @@ -0,0 +1,93 @@ +{ + "nodes": { + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1790898470, + "narHash": "sha256-zTwuwezD0w3hpga6a6P8emidzAZFyWqlNeRBlpWOOl8=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "024633cd702b10285db5cb19b40ad48d2399ba60", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1793110635, + "narHash": "sha256-dhoW6VgFWlaodSY5jrBn+CF2FLmaUvDVgM7+C7T2+NM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31ecbaca1bdefa45dffc409f0250bd8039ea0010", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "lastModified": 1790477367, + "narHash": "sha256-oujbxmVKDhci2E4EM3KyAbRUgp5/IsCoiA/LfEF7OOk=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "f7cd230690d9fc982d06129f9189b101fddcfa3b", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" + } + }, + "process-compose-flake": { + "locked": { + "lastModified": 1791992503, + "narHash": "sha256-ak6baHPCy6SUTskWRfxdlgF5mtEfFx9kIMskKVPpaMY=", + "owner": "Platonic-Systems", + "repo": "process-compose-flake", + "rev": "8e27bc993c0156b5e033ad5889094d65fd27f623", + "type": "github" + }, + "original": { + "owner": "Platonic-Systems", + "repo": "process-compose-flake", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-parts": "flake-parts", + "nixpkgs": "nixpkgs", + "process-compose-flake": "process-compose-flake", + "services-flake": "services-flake" + } + }, + "services-flake": { + "locked": { + "lastModified": 1792894486, + "narHash": "sha256-YJI+dPZ4x2gOxKljG8EANJ+HfSH8tPwLLcCKgM31XtA=", + "owner": "juspay", + "repo": "services-flake", + "rev": "e3ea146da042e8055c4ee51cda64097ccf27c32b", + "type": "github" + }, + "original": { + "owner": "juspay", + "repo": "services-flake", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..14e3b97 --- /dev/null +++ b/flake.nix @@ -0,0 +1,133 @@ +{ + 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; + }; + }; +}