diff --git a/Vagrantfile b/Vagrantfile index 266d8695a..699aa9692 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -10,6 +10,9 @@ Vagrant.configure("2") do |config| 3000, # app 3306, # database 8080, # alt-http + 8025, # mailpit web ui + 9000, # minio api + 9001, # minio console 25565, # test ports... 25566, 25567 diff --git a/vagrant/provision.sh b/vagrant/provision.sh index 5bcd75823..387c4425f 100755 --- a/vagrant/provision.sh +++ b/vagrant/provision.sh @@ -7,9 +7,15 @@ err() { echo -e "\n\033[1;31m!! $*\033[0m" >&2; } export DEBIAN_FRONTEND=noninteractive -log Updating OS packages -apt-get update -y -apt-get upgrade -y +log Checking and updating OS packages +if [ ! -f /var/lib/pterodactyl-provision/packages-updated ]; then + apt-get update -y + apt-get upgrade -y + mkdir -p /var/lib/pterodactyl-provision + touch /var/lib/pterodactyl-provision/packages-updated +else + log "OS packages already updated, skipping" +fi log Installing base utilities apt-get install -y \ @@ -23,6 +29,10 @@ ufw allow ssh ufw allow 3306/tcp ufw allow 3000/tcp ufw allow 8080/tcp +ufw allow 9000/tcp # MinIO API +ufw allow 9001/tcp # MinIO Console +ufw allow 8025/tcp # Mailpit Web UI +ufw allow 1025/tcp # Mailpit SMTP ufw allow 25500:25600/tcp ufw allow 25500:25600/udp @@ -31,8 +41,13 @@ apt-get install -y redis-server systemctl enable --now redis-server log Adding PHP 8.3 repository -add-apt-repository -y ppa:ondrej/php -apt-get update -y +if [ ! -f /var/lib/pterodactyl-provision/php-repo-added ]; then + add-apt-repository -y ppa:ondrej/php + apt-get update -y + touch /var/lib/pterodactyl-provision/php-repo-added +else + log "PHP repository already added, skipping" +fi log Installing PHP 8.3 + extensions apt-get install -y \ @@ -234,7 +249,6 @@ Group=vagrant WorkingDirectory=/var/www/pterodactyl Restart=always ExecStart=/usr/bin/php /var/www/pterodactyl/artisan queue:work --queue=high,standard,low --sleep=3 --tries=3 -StartLimitIntervalSec=180 StartLimitBurst=30 RestartSec=5s [Install] @@ -242,20 +256,32 @@ WantedBy=multi-user.target EOF log Installing Docker Engine -install -d -m 0755 /etc/apt/keyrings -curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg -echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \ - >/etc/apt/sources.list.d/docker.list -apt-get update -y -apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin -systemctl enable --now docker +if ! command -v docker >/dev/null 2>&1; then + install -d -m 0755 /etc/apt/keyrings + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg + echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \ + >/etc/apt/sources.list.d/docker.list + apt-get update -y + apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin + systemctl enable --now docker +else + log "Docker already installed, skipping" +fi log Installing Wings install -d -m 0755 /etc/pterodactyl -ARCH=$(uname -m); [[ $ARCH == x86_64 ]] && ARCH=amd64 || ARCH=arm64 -curl -fsSL -o /usr/local/bin/wings "https://github.com/pterodactyl/wings/releases/latest/download/wings_linux_${ARCH}" -chmod u+x /usr/local/bin/wings -sudo -u vagrant -H bash -lc 'cd /var/www/pterodactyl && php artisan p:node:configuration 1' >/etc/pterodactyl/config.yml || true +if [ ! -f /usr/local/bin/wings ]; then + ARCH=$(uname -m); [[ $ARCH == x86_64 ]] && ARCH=amd64 || ARCH=arm64 + curl -fsSL -o /usr/local/bin/wings "https://github.com/pterodactyl/wings/releases/latest/download/wings_linux_${ARCH}" + chmod u+x /usr/local/bin/wings +else + log "Wings already installed, skipping download" +fi +if [ ! -f /etc/pterodactyl/config.yml ]; then + sudo -u vagrant -H bash -lc 'cd /var/www/pterodactyl && php artisan p:node:configuration 1' >/etc/pterodactyl/config.yml || true +else + log "Wings config already exists, skipping" +fi cat >/etc/systemd/system/wings.service </dev/null 2>&1; then + ARCH=$(uname -m); [[ $ARCH == x86_64 ]] && ARCH=amd64 || ARCH=arm64 + curl -fsSL -o /usr/local/bin/minio "https://dl.min.io/server/minio/release/linux-${ARCH}/minio" + chmod +x /usr/local/bin/minio + + # Create minio user and directories + useradd -r minio-user || true + mkdir -p /opt/minio/data + mkdir -p /etc/minio + chown minio-user:minio-user /opt/minio/data + + # Create MinIO environment file + cat >/etc/minio/minio.conf </etc/systemd/system/minio.service </dev/null + if [ -f .env ]; then + # Set S3 backup configuration for MinIO + sed -i '/^APP_BACKUP_DRIVER=/c\APP_BACKUP_DRIVER=s3' .env + + # Configure AWS/S3 settings for MinIO + if grep -q "^AWS_ACCESS_KEY_ID=" .env; then + sed -i '/^AWS_ACCESS_KEY_ID=/c\AWS_ACCESS_KEY_ID=minioadmin' .env + else + echo 'AWS_ACCESS_KEY_ID=minioadmin' >> .env + fi + + if grep -q "^AWS_SECRET_ACCESS_KEY=" .env; then + sed -i '/^AWS_SECRET_ACCESS_KEY=/c\AWS_SECRET_ACCESS_KEY=minioadmin' .env + else + echo 'AWS_SECRET_ACCESS_KEY=minioadmin' >> .env + fi + + if grep -q "^AWS_DEFAULT_REGION=" .env; then + sed -i '/^AWS_DEFAULT_REGION=/c\AWS_DEFAULT_REGION=us-east-1' .env + else + echo 'AWS_DEFAULT_REGION=us-east-1' >> .env + fi + + if grep -q "^AWS_BACKUPS_BUCKET=" .env; then + sed -i '/^AWS_BACKUPS_BUCKET=/c\AWS_BACKUPS_BUCKET=pterodactyl-backups' .env + else + echo 'AWS_BACKUPS_BUCKET=pterodactyl-backups' >> .env + fi + + if grep -q "^AWS_ENDPOINT=" .env; then + sed -i '/^AWS_ENDPOINT=/c\AWS_ENDPOINT=http://localhost:9000' .env + else + echo 'AWS_ENDPOINT=http://localhost:9000' >> .env + fi + + if grep -q "^AWS_USE_PATH_STYLE_ENDPOINT=" .env; then + sed -i '/^AWS_USE_PATH_STYLE_ENDPOINT=/c\AWS_USE_PATH_STYLE_ENDPOINT=true' .env + else + echo 'AWS_USE_PATH_STYLE_ENDPOINT=true' >> .env + fi + fi + popd >/dev/null + + log "MinIO installed and configured successfully" + log "MinIO Console: http://localhost:9001 (minioadmin/minioadmin)" +else + log "MinIO already installed, skipping" +fi + +log Installing Mailpit +if ! command -v mailpit >/dev/null 2>&1; then + ARCH=$(uname -m); [[ $ARCH == x86_64 ]] && ARCH=linux-amd64 || ARCH=linux-arm64 + MAILPIT_VERSION=$(curl -s https://api.github.com/repos/axllent/mailpit/releases/latest | jq -r .tag_name) + curl -fsSL -o /tmp/mailpit.tar.gz "https://github.com/axllent/mailpit/releases/download/${MAILPIT_VERSION}/mailpit-${ARCH}.tar.gz" + tar -xzf /tmp/mailpit.tar.gz -C /tmp + mv /tmp/mailpit /usr/local/bin/ + chmod +x /usr/local/bin/mailpit + rm -f /tmp/mailpit.tar.gz + + # Create mailpit user + useradd -r mailpit-user || true + + # Create systemd service + cat >/etc/systemd/system/mailpit.service </dev/null + if [ -f .env ]; then + # Set mail configuration for Mailpit + if grep -q "^MAIL_MAILER=" .env; then + sed -i '/^MAIL_MAILER=/c\MAIL_MAILER=smtp' .env + else + echo 'MAIL_MAILER=smtp' >> .env + fi + + if grep -q "^MAIL_HOST=" .env; then + sed -i '/^MAIL_HOST=/c\MAIL_HOST=localhost' .env + else + echo 'MAIL_HOST=localhost' >> .env + fi + + if grep -q "^MAIL_PORT=" .env; then + sed -i '/^MAIL_PORT=/c\MAIL_PORT=1025' .env + else + echo 'MAIL_PORT=1025' >> .env + fi + + if grep -q "^MAIL_USERNAME=" .env; then + sed -i '/^MAIL_USERNAME=/c\MAIL_USERNAME=' .env + else + echo 'MAIL_USERNAME=' >> .env + fi + + if grep -q "^MAIL_PASSWORD=" .env; then + sed -i '/^MAIL_PASSWORD=/c\MAIL_PASSWORD=' .env + else + echo 'MAIL_PASSWORD=' >> .env + fi + + if grep -q "^MAIL_ENCRYPTION=" .env; then + sed -i '/^MAIL_ENCRYPTION=/c\MAIL_ENCRYPTION=' .env + else + echo 'MAIL_ENCRYPTION=' >> .env + fi + + if grep -q "^MAIL_FROM_ADDRESS=" .env; then + sed -i '/^MAIL_FROM_ADDRESS=/c\MAIL_FROM_ADDRESS=no-reply@localhost' .env + else + echo 'MAIL_FROM_ADDRESS=no-reply@localhost' >> .env + fi + fi + popd >/dev/null + + log "Mailpit installed and configured successfully" + log "Mailpit Web UI: http://localhost:8025" +else + log "Mailpit already installed, skipping" +fi + log Generating Application API Key pushd /var/www/pterodactyl >/dev/null API_KEY_RESULT=$(sudo -u vagrant -H bash -lc 'php artisan tinker --execute=" @@ -335,7 +571,8 @@ if [ -n "${API_KEY:-}" ]; then }, "feature_limits": { "databases": 0, - "allocations": 1 + "allocations": 1, + "backups": 0 }, "allocation": { "default": $ALLOCATION_ID @@ -353,30 +590,45 @@ if [ -n "${API_KEY:-}" ]; then } EOF - SERVER_RESPONSE=$(curl -s -X POST http://localhost:3000/api/application/servers \ - -H "Authorization: Bearer $API_KEY" \ - -H "Content-Type: application/json" \ - -H "Accept: Application/vnd.pterodactyl.v1+json" \ - -d @/tmp/server_create.json 2>/dev/null || echo '{"error":"curl_failed"}') - rm -f /tmp/server_create.json + # Check if a Minecraft server already exists + EXISTING_SERVER=$(mysql -u root -D panel -N -B -e "SELECT id FROM servers WHERE name='Minecraft Vanilla Dev Server' LIMIT 1;" 2>/dev/null || echo "") - if echo "$SERVER_RESPONSE" | grep -q '"object":"server"'; then - SERVER_ID=$(echo "$SERVER_RESPONSE" | jq -r '.attributes.id' 2>/dev/null || echo "") - SERVER_UUID=$(echo "$SERVER_RESPONSE" | jq -r '.attributes.uuid' 2>/dev/null || echo "") - if [ -n "$SERVER_ID" ] && [ "$SERVER_ID" != "null" ]; then - echo SERVER_ID=$SERVER_ID >> /home/vagrant/.bashrc - echo SERVER_UUID=$SERVER_UUID >> /home/vagrant/.bashrc - curl -s -X POST http://localhost:3000/api/application/servers/$SERVER_ID/reinstall \ - -H "Authorization: Bearer $API_KEY" \ - -H "Accept: Application/vnd.pterodactyl.v1+json" >/dev/null 2>&1 || true - log "Server created successfully with ID: $SERVER_ID" - else - warn "Server creation succeeded but failed to extract server ID" + if [ -n "$EXISTING_SERVER" ]; then + log "Minecraft server already exists with ID: $EXISTING_SERVER, skipping creation" + if ! grep -q "SERVER_ID=" /home/vagrant/.bashrc 2>/dev/null; then + echo SERVER_ID=$EXISTING_SERVER >> /home/vagrant/.bashrc + SERVER_UUID=$(mysql -u root -D panel -N -B -e "SELECT uuid FROM servers WHERE id=$EXISTING_SERVER;" 2>/dev/null || echo "") + if [ -n "$SERVER_UUID" ]; then + echo SERVER_UUID=$SERVER_UUID >> /home/vagrant/.bashrc + fi fi else - warn "Server creation failed or returned unexpected response" - # Don't show the full response as it might contain sensitive info, just log the attempt + SERVER_RESPONSE=$(curl -s -X POST http://localhost:3000/api/application/servers \ + -H "Authorization: Bearer $API_KEY" \ + -H "Content-Type: application/json" \ + -H "Accept: Application/vnd.pterodactyl.v1+json" \ + -d @/tmp/server_create.json 2>/dev/null || echo '{"error":"curl_failed"}') + rm -f /tmp/server_create.json + + if echo "$SERVER_RESPONSE" | grep -q '"object":"server"'; then + SERVER_ID=$(echo "$SERVER_RESPONSE" | jq -r '.attributes.id' 2>/dev/null || echo "") + SERVER_UUID=$(echo "$SERVER_RESPONSE" | jq -r '.attributes.uuid' 2>/dev/null || echo "") + if [ -n "$SERVER_ID" ] && [ "$SERVER_ID" != "null" ]; then + echo SERVER_ID=$SERVER_ID >> /home/vagrant/.bashrc + echo SERVER_UUID=$SERVER_UUID >> /home/vagrant/.bashrc + curl -s -X POST http://localhost:3000/api/application/servers/$SERVER_ID/reinstall \ + -H "Authorization: Bearer $API_KEY" \ + -H "Accept: Application/vnd.pterodactyl.v1+json" >/dev/null 2>&1 || true + log "Server created successfully with ID: $SERVER_ID" + else + warn "Server creation succeeded but failed to extract server ID" + fi + else + warn "Server creation failed or returned unexpected response" + # Don't show the full response as it might contain sensitive info, just log the attempt + fi fi + rm -f /tmp/server_create.json fi else log API key already exists, skipping creation @@ -385,8 +637,16 @@ fi systemctl restart php8.3-fpm systemctl reload nginx || systemctl restart nginx || true +echo "=======================================" +echo " Provisioning Complete" +echo "=======================================" +echo +echo "=== Development Services ===" +echo "Mailpit Web UI: http://localhost:8025" +echo "MinIO Console: http://localhost:9001" +echo "MinIO Credentials: minioadmin / minioadmin" +echo +echo "Panel: http://localhost:3000" +echo "Login: dev / dev" +echo "API Key: ${API_KEY:-}" echo -echo === Provisioning Complete === -echo Panel: http://localhost:3000 -echo Login: dev / dev -echo API Key: ${API_KEY:-}