fix: Updated nix dev environment to be cleaner, faster, and easier to use

This commit is contained in:
KalebSchmidlkofer
2025-01-27 19:41:15 -08:00
parent 59c8c201bb
commit ec6d49bab5
4 changed files with 197 additions and 207 deletions

View File

@@ -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

34
flake.lock generated
View File

@@ -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",

146
flake.nix
View File

@@ -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;
}
);
}

View File

@@ -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