From ec6d49bab505d35bbcf330cb10f622ff6b8fe317 Mon Sep 17 00:00:00 2001 From: KalebSchmidlkofer Date: Mon, 27 Jan 2025 19:41:15 -0800 Subject: [PATCH] fix: Updated nix dev environment to be cleaner, faster, and easier to use --- .env.nix | 2 +- flake.lock | 34 +++++++ flake.nix | 146 ++++++++---------------------- nix/buildsteps.sh | 222 ++++++++++++++++++++++++++-------------------- 4 files changed, 197 insertions(+), 207 deletions(-) diff --git a/.env.nix b/.env.nix index 254e95bd2..1d9167cc5 100644 --- a/.env.nix +++ b/.env.nix @@ -1,5 +1,5 @@ APP_ENV=production -APP_DEBUG=false +APP_DEBUG=true APP_KEY=base64:70nPUP+VYp/0HXxmnXbM2BJO6E1+JizA1XhAf72bAG8= APP_THEME=pterodactyl APP_TIMEZONE=UTC diff --git a/flake.lock b/flake.lock index d98d6b864..5ba6ab84e 100644 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,23 @@ { "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, "nixpkgs": { "locked": { "lastModified": 1732014248, @@ -18,8 +36,24 @@ }, "root": { "inputs": { + "flake-utils": "flake-utils", "nixpkgs": "nixpkgs" } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } } }, "root": "root", diff --git a/flake.nix b/flake.nix index 0774f1257..b41b29980 100644 --- a/flake.nix +++ b/flake.nix @@ -1,119 +1,49 @@ { - description = "Laravel application with artisan serve behind a proxy"; + description = "Pterodactyl development environment"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; }; - outputs = { self, nixpkgs }: let - pkgs = import nixpkgs { system = "x86_64-linux"; }; - in { - # Define the default package - defaultPackage.x86_64-linux = pkgs.writeShellScriptBin "laravel-server" '' - #!/usr/bin/env bash - export LC_ALL=C.UTF-8 - export LANG=C.UTF-8 + outputs = { self, nixpkgs, flake-utils }: + flake-utils.lib.eachDefaultSystem (system: + let + pkgs = import nixpkgs { inherit system; }; - export PATH=${pkgs.php}/bin:$PATH - export PATH=${pkgs.redis}/bin:$PATH - export PATH=${pkgs.git}/bin:$PATH - export PATH=${pkgs.mariadb}/bin:$PATH - export PATH=${pkgs.docker}/bin:$PATH - export PATH=${pkgs.docker-compose}/bin:$PATH - export PATH=${pkgs.caddy}/bin:$PATH + # Setup script + setupScript = pkgs.writeShellScriptBin "pterodactyl-setup" '' + ${builtins.readFile ./nix/buildsteps.sh} + ''; + in { + # Development shell + devShell = pkgs.mkShell { + buildInputs = with pkgs; [ + php82 + php82Packages.composer + nodejs_20 + redis + mariadb + caddy + git + docker + docker-compose + tmux + setupScript + ]; + LC_ALL = "C.UTF-8"; + LANG = "C.UTF-8"; + shellHook = '' + redis-server --daemonize yes - redis-server --daemonize yes - redis-cli ping - sleep 5 - #mariadb-install-server - #php artisan serve --host=127.0.0.1 --port=8000 + echo "Pterodactyl development environment ready." + echo "Run 'pterodactyl-setup' to initialize development environment" + ''; + }; - # Clean up and create directories for MariaDB data - echo "Deleting MariaDB data directory" - rm -rf $(pwd)/nix/docker/maria/mariadb_data - - echo "Creating MariaDB data directory" - mkdir -p $(pwd)/nix/docker/maria/mariadb_data - - bash ./nix/buildsteps.sh - redis-cli shutdown - ''; - - # Development shell - devShell.x86_64-linux = pkgs.mkShell { - nativeBuildInputs = [ - pkgs.php - pkgs.phpPackages.composer - pkgs.caddy - pkgs.nodejs_20 - pkgs.tmux - pkgs.redis - pkgs.mariadb - pkgs.docker - pkgs.docker-compose - ]; - - shellHook = '' - export LC_ALL=C.UTF-8 - export LANG=C.UTF-8 - echo "Laravel environment loaded." - # Start Redis server as a background process - redis-server --daemonize yes - echo "Resetting MariaDB Data" - - # Clean up and create directories for MariaDB data - echo "Deleting MariaDB data directory" - rm -rf $(pwd)/nix/docker/maria/mariadb_data - - echo "Creating MariaDB data directory" - mkdir -p $(pwd)/nix/docker/maria/mariadb_data - - - - echo "Run 'php artisan serve' to start the application." - ''; - }; - - - # Systemd services - nixosConfigurations.default = pkgs.lib.nixosSystem { - system = "x86_64-linux"; - modules = [ - { - systemd.services.laravel = { - enabled=true; - description = "Laravel PHP Artisan Service"; - wantedBy = [ "multi-user.target" ]; - serviceConfig = { - ExecStart = "${self.defaultPackage.x86_64-linux}"; - Restart = "always"; - WorkingDirectory = ./app; - }; - }; - - systemd.services.nginx-proxy = { - enabled=true; - description = "NGINX Proxy for Laravel"; - wantedBy = [ "multi-user.target" ]; - serviceConfig = { - ExecStart = "${pkgs.nginx}/bin/nginx -c ${self.nginxConfig}"; - Restart = "always"; - }; - - services.mariadb = { - enable = true; - package = nixpkgs.pkgs.mariadb; # Ensure you have the correct version of MariaDB - dataDir = "/var/lib/mysql"; - socket = "/var/run/mysqld/mysqld.sock"; - port = 3306; - # Additional configuration settings - rootPassword = "your_secure_password"; # Set the root password - }; - }; - } - ]; - }; - }; + # Default package (runs setup) + defaultPackage = setupScript; + } + ); } - diff --git a/nix/buildsteps.sh b/nix/buildsteps.sh index 8c9bcb0af..8fed27684 100755 --- a/nix/buildsteps.sh +++ b/nix/buildsteps.sh @@ -1,114 +1,140 @@ #!/bin/bash -mysqlrootpass="password" -mysqluser="root" - +# Configuration Variables +MYSQL_ROOT_PASS="password" +MYSQL_USER="pyro" CONTAINER_NAME="mariadb" +PANEL_DIR="./" # Adjust to your panel directory +WINGS_DIR="./wings" # Adjust to your wings directory +# Function to create and configure panel node +setup_panel_node() { + # Create location + php artisan p:location:make -n --short local --long "Local Development" -docker-compose --project-directory ./nix/docker/maria/ up -d --force-recreate + # Create wings node with dynamic configuration + NODE_CONFIG=$(php artisan p:node:make -n \ + --name "local-dev" \ + --description "Local Development Node" \ + --locationId 1 \ + --fqdn "localhost:8080" \ + --public 1 \ + --scheme http \ + --proxy 1 \ + --maxMemory 8192 \ + --maxDisk 51200 \ + --overallocateMemory 0 \ + --overallocateDisk 0) -echo "Waiting for MariaDB container to be healthy..." -until [ "$(docker inspect --format='{{.State.Health.Status}}' $CONTAINER_NAME)" == "healthy" ]; do - sleep 1 -done + # Extract node ID (adjust parsing as needed) + # NODE_ID=$(echo "$NODE_CONFIG" | grep -oP 'Node ID: \K\d+') + NODE_ID=1 -echo "MariaDB container is healthy. Proceeding with the script." - -# Create the database for the panel -mysql -u "$mysqluser" -p"$mysqlrootpass" -h 127.0.0.1 -e " - CREATE DATABASE IF NOT EXISTS panel; - CREATE USER IF NOT EXISTS 'pyrodactyl'@'%' IDENTIFIED BY 'password'; - GRANT ALL PRIVILEGES ON panel.* TO 'pyrodactyl'@'%' WITH GRANT OPTION; - FLUSH PRIVILEGES; -" - - -# Create the database host user -mysql -u "$mysqluser" -p"$mysqlrootpass" -h 127.0.0.1 -e " - CREATE USER IF NOT EXISTS 'pyrodactyluser'@'%' IDENTIFIED BY 'pyrodactyl'; - GRANT ALL PRIVILEGES ON panel.* TO 'pyrodactyluser'@'%' WITH GRANT OPTION; - FLUSH PRIVILEGES; -" - -# Initialize the Pterodactyl panel - -# This cp command breaks my configuration, that is why it's commented -# cp .env.example .env -composer install --no-dev --optimize-autoloader - -# PHP Artisan commands -echo "Generating keys" -php artisan key:generate --force --no-interaction -echo "Configuring panel" -php artisan p:environment:setup -n --author dev@pyro.host --url http://localhost --cache redis --session redis --queue redis -echo "Setting up database" -php artisan p:environment:database -n --host 127.0.0.1 --port 3306 --database panel --username pyrodactyluser --password pyrodactyl -echo "Seeding migrations" -php artisan migrate --seed --force - -# Create a developer user -# Adding --admin tag just in case it ever gets fixed -echo "Creating User" -php artisan p:user:make -n --email dev@pyro.host --username dev --name-first Developer --name-last User --password password --admin -# --admin probably won't be fixed due to security concerns -echo "Setting user to admin" -mysql -u $mysqluser -p$mysqlrootpass -h 127.0.0.1 -e "USE panel; UPDATE users SET root_admin = 1;" # workaround because --admin is broken - -# Make a location and node for the panel -php artisan p:location:make -n --short local --long Local -echo "Creating wings node" -php artisan p:node:make -n --name local --description "Development Node" --locationId 1 --fqdn wings.localhost --public 1 --scheme http --proxy 1 --maxMemory 1024 --maxDisk 10240 --overallocateMemory 0 --overallocateDisk 0 - -# Add some dummy allocations to the node -echo "Added allocations to wings" -mysql -u "$mysqluser" -p"$mysqlrootpass" -h 127.0.0.1 -e "USE panel; INSERT INTO allocations (node_id, ip, port) VALUES (1, 'localhost', 25565), (1, 'localhost', 25566), (1, 'localhost', 25567);" - - -# Disable Recaptcha -echo "Disabling recaptcha" - -mysql -u $mysqluser -p$mysqlrootpass -h 127.0.0.1 -e "USE panel; INSERT INTO settings (\`key\`, value) VALUES ('settings::recaptcha:enabled', 'false');" - -mysql -u $mysqluser -p$mysqlrootpass -h 127.0.0.1 -e "USE panel; UPDATE settings SET \`key\`='settings::recaptcha:enabled', value='false' WHERE id=1;" - -mysql -u $mysqluser -p$mysqlrootpass -h 127.0.0.1 -e "INSERT INTO panel.servers (id, external_id, uuid, uuidShort, node_id, name, description, status, skip_scripts, owner_id, memory, swap, disk, io, cpu, threads, oom_disabled, allocation_id, nest_id, egg_id, startup, image, allocation_limit, database_limit, backup_limit, created_at, updated_at, installed_at) VALUES(1, NULL, '7f38298b-d3be-4096-bde0-ee612d2d8257', '7f38298b', 1, 'Dev-Server', '', NULL, 0, 1, 14336, -1, 51200, 500, 0, NULL, 1, 1, 1, 1, 'java -Xms128M -Xmx{{SERVER_MEMORY}}M -jar {{SERVER_JARFILE}}', 'ghcr.io/pterodactyl/yolks:java_21', 0, 10, 100, '2024-11-17 00:22:44.000', '2024-11-18 10:30:49.000', '2024-11-18 10:29:39.000');" - -# Setup wings -#curl -L -o /usr/local/bin/wings "https://github.com/pterodactyl/wings/releases/latest/download/wings_linux_$([[ "$(uname -m)" == "x86_64" ]] && echo "amd64" || echo "arm64")" -#chmod u+x /usr/local/bin/wings - -# Delete Wings folders -rm -fR $(pwd)/nix/docker/wings/etc -rm -fR $(pwd)/nix/docker/wings/var -rm -fR $(pwd)/nix/docker/wings/tmp - - -# create Wings folders -mkdir $(pwd)/nix/docker/wings/etc -mkdir $(pwd)/nix/docker/wings/var -mkdir $(pwd)/nix/docker/wings/tmp - - -php artisan p:node:configuration 1 >$(pwd)/nix/docker/wings/etc/config.yml - -docker-compose --project-directory ./nix/docker/wings up -d --force-recreate + # Download Wings binary + mkdir $WINGS_DIR + curl -L -o "$WINGS_DIR/wings" "https://github.com/pterodactyl/wings/releases/latest/download/wings_linux_$([[ "$(uname -m)" == "x86_64" ]] && echo "amd64" || echo "arm64")" + chmod u+x "$WINGS_DIR/wings" -tmux new-session -s pyrodevelopment -d -tmux send-keys -t pyrodevelopment 'npm run dev' C-m -#tmux new-window -t pyrodevelopment -#tmux send-keys -t pyrodevelopment 'caddy run --config ./nix/caddyfile' C-m + # Add dummy allocations + mysql -u "$MYSQL_USER" -p"$MYSQL_ROOT_PASS" -h 127.0.0.1 -e " + USE panel; + INSERT INTO allocations (node_id, ip, port) VALUES + ($NODE_ID, 'localhost', 25565), + ($NODE_ID, 'localhost', 25566), + ($NODE_ID, 'localhost', 25567); + " -tmux new-window -t pyrodevelopment -tmux send-keys -t pyrodevelopment 'php artisan serve' C-m + mysql -u $MYSQL_USER -p$MYSQL_ROOT_PASS -h 127.0.0.1 -e "INSERT INTO panel.servers (id, external_id, uuid, uuidShort, node_id, name, description, status, skip_scripts, owner_id, memory, swap, disk, io, cpu, threads, oom_disabled, allocation_id, nest_id, egg_id, startup, image, allocation_limit, database_limit, backup_limit, created_at, updated_at, installed_at) VALUES(1, NULL, '7f38298b-d3be-4096-bde0-ee612d2d8257', '7f38298b', 1, 'Dev-Server', '', NULL, 0, 1, 14336, -1, 51200, 500, 0, NULL, 1, 1, 1, 1, 'java -Xms128M -Xmx{{SERVER_MEMORY}}M -jar {{SERVER_JARFILE}}', 'ghcr.io/pterodactyl/yolks:java_21', 0, 10, 100, '2024-11-17 00:22:44.000', '2024-11-18 10:30:49.000', '2024-11-18 10:29:39.000');" -tmux attach-session -t pyrodevelopment + echo "Node created with ID: $NODE_ID" -tmux kill-session -t pyrodevelopment -docker-compose --project-directory ./nix/docker/wings down -docker-compose --project-directory ./nix/docker/maria/ down + # Generate Wings configuration + php artisan p:node:configuration "$NODE_ID" > "$WINGS_DIR/config.yml" +} +# Main execution +main() { + + read -p "Do you want to delete MariaDB? (yes/no) [default: no]: " user_response + + # Set default response to "no" if input is empty + user_response=${user_response:-no} + + case "$user_response" in + [Yy]* ) + echo "Deleting MariaDB..." + rm -fR ./nix/docker/maria/mariadb_data + mkdir ./nix/docker/maria/mariadb_data + ;; + [Nn]* ) + echo "MariaDB will not be deleted." + ;; + * ) + echo "Invalid input. Please answer yes or no." + ;; + esac + + + # Start MariaDB container + docker-compose --project-directory ./nix/docker/maria/ up -d --force-recreate + + # Wait for MariaDB to be ready + until [ "$(docker inspect --format='{{.State.Health.Status}}' "$CONTAINER_NAME")" == "healthy" ]; do + sleep 1 + done + + # Navigate to panel directory + cd "$PANEL_DIR" || exit + + + # Setup panel environment + composer install --no-dev --optimize-autoloader + php artisan key:generate --force + php artisan p:environment:setup -n + php artisan migrate --seed --force -n + + + case "$user_response" in + [Yy]* ) + # Create dev user + php artisan p:user:make -n \ + --email dev@pyro.host \ + --username dev \ + --name-first dev \ + --name-last dev \ + --password password \ + --admin + + mysql -u $MYSQL_USER -p$MYSQL_ROOT_PASS -h 127.0.0.1 -e "USE panel; UPDATE users SET root_admin = 1;" # workaround because --admin is broken + # Create Test Server + ;; + [Nn]* ) + ;; + esac + + + + # Setup panel node + setup_panel_node + + # Optional: Start development services + tmux new-session -s pterodactyl-dev -d + tmux send-keys -t pterodactyl-dev 'npm run dev' C-m + tmux new-window -t pterodactyl-dev + tmux send-keys -t pterodactyl-dev 'php artisan serve' C-m + tmux new-window -t pterodactyl-dev + tmux send-keys -t pterodactyl-dev: "$WINGS_DIR/wings --config $WINGS_DIR/config.yml" C-m + + + tmux attach-session -t pterodactyl-dev + + tmux kill-session -t pterodactyl-dev + docker-compose --project-directory ./nix/docker/maria/ down +} + +# Run main function +main