Detailed guide for the main PUQcloud installation script on Debian/Ubuntu systems.
The install.sh script automates complete PUQcloud installation with all necessary components:
- Web server (Nginx)
- PHP 8.2 + extensions
- MariaDB
- Redis
- Laravel Horizon
- SSL certificates
- Cron job configuration
sudo ./install.shThe script will prompt for all required parameters.
sudo ./install.sh example.com admin@example.com password123 "Admin Name"sudo ./install.sh
# Choose "update" when promptedflowchart TD
A["Run install.sh"] --> B{"Working mode?"}
B -->|"install"| C["Check root privileges"]
B -->|"update"| U["Update mode"]
C --> D["Load previous settings"]
D --> E["Input parameters"]
E --> F["Save settings"]
F --> G["Update system"]
G --> H["Install base packages"]
H --> I["Install Node.js"]
I --> J["Install PHP 8.2"]
J --> K["Install Redis"]
K --> L["Configure MariaDB"]
L --> M["Install Composer"]
M --> N["Clone PUQcloud"]
N --> O["Install dependencies"]
O --> P["Compile frontend"]
P --> Q["Configure .env"]
Q --> R["Run migrations"]
R --> S["Create admin"]
S --> T["Configure Nginx"]
T --> V{"Domain = hostname?"}
V -->|"Yes"| W["Configure for all IPs"]
V -->|"No"| X["Configure for domain"]
W --> Y["Self-signed SSL"]
X --> Z["Let's Encrypt SSL"]
Y --> AA["Configure Supervisor"]
Z --> AA
AA --> BB["Configure vsftpd"]
BB --> CC["Configure cron"]
CC --> DD["Check Horizon"]
DD --> EE["Installation complete"]
U --> UU["Stop Horizon"]
UU --> VV["Stop cron"]
VV --> WW{"Hard update?"}
WW -->|"Yes"| XX["Rollback migrations"]
WW -->|"No"| YY["Update code"]
XX --> YY
YY --> ZZ["Update dependencies"]
ZZ --> AAA["Run migrations"]
AAA --> BBB["Restart services"]
BBB --> CCC["Update complete"]
# Base packages
nginx mariadb-server git curl unzip lsb-release ca-certificates sendmail
# PHP and extensions
php8.2 php8.2-fpm php8.2-mysql php8.2-xml php8.2-mbstring
php8.2-curl php8.2-zip php8.2-bcmath php8.2-redis
# Additional
redis-server nodejs supervisor vsftpd certbot python3-certbot-nginx- DB Name:
puqcloud_db_[random string] - User:
puqcloud_user_[random string] - Password: automatically generated (12 characters)
The script automatically configures the following parameters:
APP_NAME=PUQcloud
APP_ENV=production
APP_DEBUG=true
APP_TIMEZONE=Europe/Warsaw
APP_URL=http://your-domain.com
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=puqcloud_db_xxxxxxxx
DB_USERNAME=puqcloud_user_xxxxxxxx
DB_PASSWORD=xxxxxxxxxxxx
REDIS_CLIENT=phpredis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379server {
listen 80 default_server;
listen [::]:80 default_server;
listen 443 ssl default_server;
root /var/www/puqcloud/public;
# SSL configuration with self-signed certificate
include snippets/self-signed.conf;
include snippets/ssl-params.conf;
}server {
listen 80;
server_name your-domain.com;
root /var/www/puqcloud/public;
# Let's Encrypt SSL automatically added
}
# Block IP access
server {
listen 80 default_server;
return 444;
}After installation, the following structure is created:
/var/www/puqcloud/
βββ app/ # Laravel application
βββ config/ # Configuration
βββ database/ # Migrations and seeds
βββ public/ # Public files
βββ storage/ # Logs and cache
βββ .env # Environment configuration
βββ artisan # Laravel CLI
/etc/nginx/sites-available/
βββ default # Nginx configuration
βββ your-domain.com # Domain configuration
/etc/supervisor/conf.d/
βββ horizon.conf # Horizon configuration
/var/log/
βββ nginx/ # Nginx logs
βββ php_errors.log # PHP logs
βββ mail.log # Mail logs
The script automatically creates an administrator user:
php artisan puqcloud:seed --email="admin@example.com" \
--password="password123" \
--name="Admin Name"# Added for www-data user
* * * * * cd /var/www/puqcloud/ && /usr/bin/php artisan schedule:run >> /dev/null 2>&1[program:horizon]
process_name=%(program_name)s
command=php /var/www/puqcloud/artisan horizon
autostart=true
autorestart=true
user=www-data
redirect_stderr=true
stdout_logfile=/var/www/puqcloud/storage/logs/horizon.log# Owner of all files
chown -R www-data:www-data /var/www/puqcloud
# Permissions for storage and cache directories
chmod -R 775 /var/www/puqcloud/storage
chmod -R 775 /var/www/puqcloud/bootstrap/cache- For hostname: Self-signed certificate
- For domain: Let's Encrypt certificate
# Random string for DB name
tr -dc 'a-zA-Z0-9' </dev/urandom | head -c 8
# Random password for DB
tr -dc 'a-zA-Z0-9' </dev/urandom | head -c 12The script checks and configures sendmail:
- Check sendmail installation
- Check PHP configuration (sendmail_path)
- Send test email
- Check logs for errors
- Stop Horizon and cron
- Update code from Git
- Update dependencies
- Compile frontend
- Run DB migrations
- Restart services
- Rollback all migrations
- Update code
- Update dependencies
- Re-run migrations
- Recreate administrator
When choosing to create an FTP user:
# Create user
useradd -m $ftp_username
# Add to www-data group
usermod -aG www-data $ftp_username
# Set permissions
chown -R www-data:www-data /var/www/puqcloud
chmod -R 775 /var/www/puqcloudanonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
allow_writeable_chroot=YES
listen=YES
local_root=/var/www/puqcloudAfter completion, check:
- Web interface:
http://your-domain.com - Horizon status:
php artisan horizon:status - Service status:
systemctl status nginx systemctl status php8.2-fpm systemctl status mariadb systemctl status redis-server supervisorctl status horizon
# Installation logs
tail -f /var/log/nginx/error.log
tail -f /var/log/php_errors.log
tail -f /var/www/puqcloud/storage/logs/laravel.log
# Horizon logs
tail -f /var/www/puqcloud/storage/logs/horizon.log- File permissions:
sudo chown -R www-data:www-data /var/www/puqcloud - PHP extensions:
php -m | grep xml - Database:
mysql -u root -p -e "SHOW DATABASES;" - Redis:
redis-cli ping
The script saves settings for reuse:
HOSTNAME=example.com
ADMIN_EMAIL=admin@example.com
ADMIN_PASSWORD=password123
ADMIN_NAME=Admin NameThis file is used during subsequent runs to suggest previous values.