feat: updated docker dev to support postgresql as it's default

This commit is contained in:
Naterfute
2025-12-02 15:04:58 -08:00
parent f0b8c41447
commit 1eb4a7ee28
3 changed files with 157 additions and 155 deletions

View File

@@ -4,7 +4,6 @@ cd /app
mkdir -p /var/log/panel/logs/ /var/log/supervisord/ /var/log/nginx/ /var/log/php7/ \
&& chmod 777 /var/log/panel/logs/ \
&& ln -s /app/storage/logs/ /var/log/panel/
# Ensure proper permissions for Laravel storage directories
mkdir -p /app/storage/logs /app/storage/framework/cache /app/storage/framework/sessions /app/storage/framework/views \
&& chmod -R 777 /app/storage/ \
@@ -111,37 +110,55 @@ fi
# Setup development environment if specified
(
source /app/.env
if [ "$PYRODACTYL_DOCKER_DEV" = "true" ] && [ "$DEV_SETUP" != "true" ]; then
echo -e "\e[42mDevelopment environment detected, setting up development resources...\e[0m"
export POSTGRES_PASSWORD=$(grep "POSTGRES_PASSWORD" docker-compose.yml | awk '{print $2}')
export POSTGRES_USER=$(grep "POSTGRES_USER" docker-compose.yml | awk '{print $2}')
php artisan p:user:make -n --email dev@pyro.host --username dev --name-first Developer --name-last User --password dev
# Create a developer user
php artisan p:user:make -n --email dev@pyro.host --username dev --name-first Developer --name-last User --password password
mariadb -u root -h database -p"$DB_ROOT_PASSWORD" --ssl=0 -e "USE panel; UPDATE users SET root_admin = 1;" # workaround because --admin is broken
if [ "$DB_CONNECTION" = "mysql" ] || [ "$DB_CONNECTION" = "mariadb" ]; then
mariadb -u root -h database -p"$DB_ROOT_PASSWORD" --ssl=0 -e "USE panel; UPDATE users SET root_admin = 1;"
fi
if [ "$DB_CONNECTION" = "pgsql" ]; then
PGPASSWORD=$POSTGRES_PASSWORD psql -U$POSTGRES_USER -dpanel -hpostgres -c"UPDATE users SET root_admin = 1;"
fi
# Make a location and node for the panel
php artisan p:location:make -n --short local --long Local
php artisan p:node:make -n --name local --description "Development Node" --locationId 1 --fqdn localhost --internal-fqdn $WINGS_INTERNAL_IP --public 1 --scheme http --proxy 0 --maxMemory 1024 --maxDisk 10240 --overallocateMemory 0 --overallocateDisk 0
php artisan p:node:make -n --name local --description "Development Node" --locationId 1 --fqdn localhost --internal-fqdn $ELYTRA_INTERNAL_IP --public 1 --scheme http --proxy 0 --maxMemory 1024 --maxDisk 10240 --overallocateMemory 0 --overallocateDisk 0
echo "Adding dummy allocations..."
mariadb -u root -h database -p"$DB_ROOT_PASSWORD" --ssl=0 -e "USE panel; INSERT INTO allocations (node_id, ip, port) VALUES (1, '0.0.0.0', 25565), (1, '0.0.0.0', 25566), (1, '0.0.0.0', 25567);"
if [ "$DB_CONNECTION" = "mysql" ] || [ "$DB_CONNECTION" = "mariadb" ]; then
mariadb -u root -h database -p"$DB_ROOT_PASSWORD" --ssl=0 -e "USE panel; INSERT INTO allocations (node_id, ip, port) VALUES (1, '0.0.0.0', 25565), (1, '0.0.0.0', 25566), (1, '0.0.0.0', 25567);"
fi
if [ "$DB_CONNECTION" = "pgsql" ]; then
PGPASSWORD=$POSTGRES_PASSWORD psql -U$POSTGRES_USER -dpanel -hpostgres -c"INSERT INTO allocations (node_id, ip, port) VALUES (1, '0.0.0.0', 25565), (1, '0.0.0.0', 25566), (1, '0.0.0.0', 25567);"
fi
echo "Creating database user..."
mariadb -u root -h database -p"$DB_ROOT_PASSWORD" --ssl=0 -e "CREATE USER 'pterodactyluser'@'%' IDENTIFIED BY 'somepassword'; GRANT ALL PRIVILEGES ON *.* TO 'pterodactyluser'@'%' WITH GRANT OPTION;"
if [ "$DB_CONNECTION" = "mysql" ] || [ "$DB_CONNECTION" = "mariadb" ]; then
mariadb -u root -h database -p"$DB_ROOT_PASSWORD" --ssl=0 -e "CREATE USER 'pterodactyluser'@'%' IDENTIFIED BY 'somepassword'; GRANT ALL PRIVILEGES ON *.* TO 'pterodactyluser'@'%' WITH GRANT OPTION;"
fi
if [ "$DB_CONNECTION" = "pgsql" ]; then
PGPASSWORD=$POSTGRES_PASSWORD psql -U$POSTGRES_USER -dpanel -hpostgres -c"CREATE USER pterodactyluser WITH PASSWORD 'somepassword' SUPERUSER;"
fi
# Configure node
export WINGS_CONFIG=/etc/pterodactyl/config.yml
mkdir -p $(dirname $WINGS_CONFIG)
echo "Fetching and modifying Wings configuration file..."
export ELYTRA_CONFIG=/etc/pterodactyl/config.yml
mkdir -p $(dirname $ELYTRA_CONFIG)
echo "Fetching and modifying Elytra configuration file..."
CONFIG=$(php artisan p:node:configuration 1)
# Allow all origins for CORS
CONFIG=$(printf "%s\nallowed_origins: ['*']" "$CONFIG")
# Update Wings configuration paths if WINGS_DIR is set
if [ -z "$WINGS_DIR" ]; then
echo "WINGS_DIR is not set, using default paths."
# Update Elytra configuration paths if ELYTRA_DIR is set
if [ -z "$ELYTRA_DIR" ]; then
echo "ELYTRA_DIR is not set, using default paths."
else
echo "Updating Wings configuration paths to '$WINGS_DIR'..."
echo "Updating ELYTRA configuration paths to '$ELYTRA_DIR'..."
# add system section if it doesn't exist
if ! echo "$CONFIG" | grep -q "^system:"; then
@@ -160,16 +177,16 @@ fi
fi
}
update_config "root_directory" "$WINGS_DIR/srv/wings/"
update_config "log_directory" "$WINGS_DIR/srv/wings/logs/"
update_config "data" "$WINGS_DIR/srv/wings/volumes"
update_config "archive_directory" "$WINGS_DIR/srv/wings/archives"
update_config "backup_directory" "$WINGS_DIR/srv/wings/backups"
update_config "tmp_directory" "$WINGS_DIR/srv/wings/tmp/"
update_config "root_directory" "$ELYTRA_DIR/srv/elytra/"
update_config "log_directory" "$ELYTRA_DIR/srv/elytra/logs/"
update_config "data" "$ELYTRA_DIR/srv/elytra/volumes"
update_config "archive_directory" "$ELYTRA_DIR/srv/elytra/archives"
update_config "backup_directory" "$ELYTRA_DIR/srv/elytra/backups"
update_config "tmp_directory" "$ELYTRA_DIR/srv/elytra/tmp/"
fi
echo "Saving Wings configuration file to '$WINGS_CONFIG'..."
echo "$CONFIG" > $WINGS_CONFIG
echo "Saving Elytra configuration file to '$ELYTRA_CONFIG'..."
echo "$CONFIG" > $ELYTRA_CONFIG
# Mark setup as complete
echo "DEV_SETUP=true" >> /app/.env

View File

@@ -40,7 +40,7 @@ RUN apk add --no-cache --virtual .build-deps \
# Runtime packages
RUN apk add --no-cache \
ca-certificates curl git supervisor nginx dcron \
tar unzip certbot certbot-nginx mysql-client \
tar unzip certbot certbot-nginx mysql-client postgresql17-client \
&& ln -s /bin/ash /bin/bash
# Copy frontend build

View File

@@ -4,7 +4,7 @@ use Illuminate\Support\Str;
use Pterodactyl\Helpers\Time;
return [
/*
/*
|--------------------------------------------------------------------------
| Default Database Connection Name
|--------------------------------------------------------------------------
@@ -16,9 +16,9 @@ return [
|
*/
'default' => env('DB_CONNECTION', 'mysql'),
'default' => env('DB_CONNECTION', 'mysql'),
/*
/*
|--------------------------------------------------------------------------
| Database Connections
|--------------------------------------------------------------------------
@@ -34,89 +34,75 @@ return [
|
*/
'connections' => [
'mysql' => [
'driver' => 'mysql',
'url' => env('DB_URL', env('DATABASE_URL')),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'panel'),
'username' => env('DB_USERNAME', 'pterodactyl'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => env('DB_CHARSET', 'utf8mb4'),
'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),
'prefix' => env('DB_PREFIX', ''),
'prefix_indexes' => true,
'strict' => env('DB_STRICT_MODE', false), // TODO: fix various errors with strict mode enabled
'engine' => null,
'timezone' => env('DB_TIMEZONE', Time::getMySQLTimezoneOffset(env('APP_TIMEZONE', 'UTC'))),
'sslmode' => env('DB_SSLMODE', 'prefer'),
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
PDO::MYSQL_ATTR_SSL_CERT => env('MYSQL_ATTR_SSL_CERT'),
PDO::MYSQL_ATTR_SSL_KEY => env('MYSQL_ATTR_SSL_KEY'),
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => env('MYSQL_ATTR_SSL_VERIFY_SERVER_CERT', true),
]) : [],
'connections' => [
'mysql' => [
'driver' => 'mysql',
'url' => env('DB_URL', env('DATABASE_URL')),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'panel'),
'username' => env('DB_USERNAME', 'pterodactyl'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => env('DB_CHARSET', 'utf8mb4'),
'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),
'prefix' => env('DB_PREFIX', ''),
'prefix_indexes' => true,
'strict' => env('DB_STRICT_MODE', false), // TODO: fix various errors with strict mode enabled
'engine' => null,
'timezone' => env('DB_TIMEZONE', Time::getMySQLTimezoneOffset(env('APP_TIMEZONE', 'UTC'))),
'sslmode' => env('DB_SSLMODE', 'prefer'),
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
PDO::MYSQL_ATTR_SSL_CERT => env('MYSQL_ATTR_SSL_CERT'),
PDO::MYSQL_ATTR_SSL_KEY => env('MYSQL_ATTR_SSL_KEY'),
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => env('MYSQL_ATTR_SSL_VERIFY_SERVER_CERT', true),
]) : [],
],
'mariadb' => [
'driver' => 'mariadb',
'url' => env('DB_URL', env('DATABASE_URL')),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'panel'),
'username' => env('DB_USERNAME', 'pterodactyl'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => env('DB_CHARSET', 'utf8mb4'),
'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),
'prefix' => env('DB_PREFIX', ''),
'prefix_indexes' => true,
'strict' => env('DB_STRICT_MODE', false), // TODO: fix various errors with strict mode enabled
'engine' => null,
'timezone' => env('DB_TIMEZONE', Time::getMySQLTimezoneOffset(env('APP_TIMEZONE', 'UTC'))),
'sslmode' => env('DB_SSLMODE', 'prefer'),
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
PDO::MYSQL_ATTR_SSL_CERT => env('MYSQL_ATTR_SSL_CERT'),
PDO::MYSQL_ATTR_SSL_KEY => env('MYSQL_ATTR_SSL_KEY'),
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => env('MYSQL_ATTR_SSL_VERIFY_SERVER_CERT', true),
]) : [],
],
'pgsql' => [
'driver' => 'pgsql',
'url' => env('DB_URL', env('DATABASE_URL')),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '5432'),
'database' => env('DB_DATABASE', 'panel'),
'username' => env('DB_USERNAME', 'pterodactyl'),
'password' => env('DB_PASSWORD', ''),
'charset' => env('DB_CHARSET', 'utf8'),
'prefix' => env('DB_PREFIX', ''),
'prefix_indexes' => true,
'schema' => env('DB_SCHEMA', 'public'),
'sslmode' => env('DB_SSLMODE', 'prefer'),
],
],
'mariadb' => [
'driver' => 'mariadb',
'url' => env('DB_URL', env('DATABASE_URL')),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'panel'),
'username' => env('DB_USERNAME', 'pterodactyl'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => env('DB_CHARSET', 'utf8mb4'),
'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),
'prefix' => env('DB_PREFIX', ''),
'prefix_indexes' => true,
'strict' => env('DB_STRICT_MODE', false), // TODO: fix various errors with strict mode enabled
'engine' => null,
'timezone' => env('DB_TIMEZONE', Time::getMySQLTimezoneOffset(env('APP_TIMEZONE', 'UTC'))),
'sslmode' => env('DB_SSLMODE', 'prefer'),
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
PDO::MYSQL_ATTR_SSL_CERT => env('MYSQL_ATTR_SSL_CERT'),
PDO::MYSQL_ATTR_SSL_KEY => env('MYSQL_ATTR_SSL_KEY'),
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => env('MYSQL_ATTR_SSL_VERIFY_SERVER_CERT', true),
]) : [],
],
'pgsql' => [
'driver' => 'pgsql',
'url' => env('DB_URL', env('DATABASE_URL')),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '5432'),
'database' => env('DB_DATABASE', 'panel'),
'username' => env('DB_USERNAME', 'pterodactyl'),
'password' => env('DB_PASSWORD', ''),
'charset' => env('DB_CHARSET', 'utf8'),
'prefix' => env('DB_PREFIX', ''),
'prefix_indexes' => true,
'schema' => env('DB_SCHEMA', 'public'),
'sslmode' => env('DB_SSLMODE', 'prefer'),
],
'postgresql' => [
'driver' => 'pgsql',
'url' => env('DB_URL', env('DATABASE_URL')),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '5432'),
'database' => env('DB_DATABASE', 'panel'),
'username' => env('DB_USERNAME', 'pterodactyl'),
'password' => env('DB_PASSWORD', ''),
'charset' => env('DB_CHARSET', 'utf8'),
'prefix' => env('DB_PREFIX', ''),
'prefix_indexes' => true,
'schema' => env('DB_SCHEMA', 'public'),
'sslmode' => env('DB_SSLMODE', 'prefer'),
],
],
/*
/*
|--------------------------------------------------------------------------
| Migration Repository Table
|--------------------------------------------------------------------------
@@ -127,12 +113,12 @@ return [
|
*/
'migrations' => [
'table' => 'migrations',
'update_date_on_publish' => true,
],
'migrations' => [
'table' => 'migrations',
'update_date_on_publish' => true,
],
/*
/*
|--------------------------------------------------------------------------
| Redis Databases
|--------------------------------------------------------------------------
@@ -143,51 +129,50 @@ return [
|
*/
'redis' => [
'client' => env('REDIS_CLIENT', 'predis'),
'redis' => [
'client' => env('REDIS_CLIENT', 'predis'),
'options' => [
'cluster' => env('REDIS_CLUSTER', 'redis'),
'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'pterodactyl'), '_') . '_database_'),
],
'options' => [
'cluster' => env('REDIS_CLUSTER', 'redis'),
'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'pterodactyl'), '_') . '_database_'),
],
'default' => [
'scheme' => env('REDIS_SCHEME', 'tcp'),
'path' => env('REDIS_PATH', '/run/redis/redis.sock'),
'host' => env('REDIS_HOST', 'localhost'),
'username' => env('REDIS_USERNAME'),
'password' => env('REDIS_PASSWORD'),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_DATABASE', 0),
'context' => extension_loaded('redis') && env('REDIS_CLIENT') === 'phpredis' ? [
'stream' => array_filter([
'verify_peer' => env('REDIS_VERIFY_PEER', true),
'verify_peer_name' => env('REDIS_VERIFY_PEER_NAME', true),
'cafile' => env('REDIS_CAFILE'),
'local_cert' => env('REDIS_LOCAL_CERT'),
'local_pk' => env('REDIS_LOCAL_PK'),
]),
] : [],
],
'default' => [
'scheme' => env('REDIS_SCHEME', 'tcp'),
'path' => env('REDIS_PATH', '/run/redis/redis.sock'),
'host' => env('REDIS_HOST', 'localhost'),
'username' => env('REDIS_USERNAME'),
'password' => env('REDIS_PASSWORD'),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_DATABASE', 0),
'context' => extension_loaded('redis') && env('REDIS_CLIENT') === 'phpredis' ? [
'stream' => array_filter([
'verify_peer' => env('REDIS_VERIFY_PEER', true),
'verify_peer_name' => env('REDIS_VERIFY_PEER_NAME', true),
'cafile' => env('REDIS_CAFILE'),
'local_cert' => env('REDIS_LOCAL_CERT'),
'local_pk' => env('REDIS_LOCAL_PK'),
]),
] : [],
],
'sessions' => [
'scheme' => env('REDIS_SCHEME', 'tcp'),
'path' => env('REDIS_PATH', '/run/redis/redis.sock'),
'host' => env('REDIS_HOST', 'localhost'),
'username' => env('REDIS_USERNAME'),
'password' => env('REDIS_PASSWORD'),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_DATABASE_SESSIONS', 1),
'context' => extension_loaded('redis') && env('REDIS_CLIENT') === 'phpredis' ? [
'stream' => array_filter([
'verify_peer' => env('REDIS_VERIFY_PEER', true),
'verify_peer_name' => env('REDIS_VERIFY_PEER_NAME', true),
'cafile' => env('REDIS_CAFILE'),
'local_cert' => env('REDIS_LOCAL_CERT'),
'local_pk' => env('REDIS_LOCAL_PK'),
]),
] : [],
'sessions' => [
'scheme' => env('REDIS_SCHEME', 'tcp'),
'path' => env('REDIS_PATH', '/run/redis/redis.sock'),
'host' => env('REDIS_HOST', 'localhost'),
'username' => env('REDIS_USERNAME'),
'password' => env('REDIS_PASSWORD'),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_DATABASE_SESSIONS', 1),
'context' => extension_loaded('redis') && env('REDIS_CLIENT') === 'phpredis' ? [
'stream' => array_filter([
'verify_peer' => env('REDIS_VERIFY_PEER', true),
'verify_peer_name' => env('REDIS_VERIFY_PEER_NAME', true),
'cafile' => env('REDIS_CAFILE'),
'local_cert' => env('REDIS_LOCAL_CERT'),
'local_pk' => env('REDIS_LOCAL_PK'),
]),
] : [],
],
],
],
];