mirror of
https://github.com/pyrohost/pyrodactyl.git
synced 2026-04-05 19:51:59 +02:00
fix: Updated nix dev environment to be cleaner, faster, and easier to use
This commit is contained in:
2
.env.nix
2
.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
|
||||
|
||||
34
flake.lock
generated
34
flake.lock
generated
@@ -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
146
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;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user