Skip to content
AquadactylAquadactyl
Panel

Webserver Configuration

Configure NGINX, Apache, or Caddy to serve the Panel.

Introduction

The web server passes requests to PHP and serves /var/www/aquadactyl/public. Pick your web server and enter your Panel's domain or IP address; the configuration below fills them in.

SSL configurations need a certificate for your domain first, or the web server will not start. Caddy with automatic SSL creates its own.

Your setup

Commands and configuration files on this site update to match. Saved in this browser only.

PHP
Web server
SSL
Panel domain

Remove the default NGINX site:

rm /etc/nginx/sites-enabled/default

Create /etc/nginx/sites-available/aquadactyl.conf:

aquadactyl.conf
# Ubuntu / Debian: /etc/nginx/sites-available/
# CentOS / RHEL:   /etc/nginx/conf.d/
server {
    listen 80;
    server_name <domain>;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name <domain>;

    root /var/www/aquadactyl/public;
    index index.php;

    access_log /var/log/nginx/aquadactyl.app-access.log;
    error_log  /var/log/nginx/aquadactyl.app-error.log error;

    # allow larger file uploads and longer script runtimes
    client_max_body_size 100m;
    client_body_timeout 120s;

    sendfile on;

    location ^~ /build/assets/ {
        try_files $uri =404;
        expires 1y;
        add_header Cache-Control "public, immutable";
        # Location headers replace the server headers, so preserve them here.
        add_header Strict-Transport-Security "max-age=15768000; preload;";
        add_header X-Content-Type-Options nosniff;
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Robots-Tag none;
        add_header Content-Security-Policy "frame-ancestors 'self'";
        gzip on;
        gzip_vary on;
        gzip_min_length 1024;
        gzip_types text/css application/javascript image/svg+xml;
    }

    # strengthen ssl security
    ssl_certificate /etc/letsencrypt/live/<domain>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<domain>/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";

    # See the link below for more SSL information:
    #     https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html
    #
    # ssl_dhparam /etc/ssl/certs/dhparam.pem;

    # Add headers to serve security related headers
    add_header Strict-Transport-Security "max-age=15768000; preload;";
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header Content-Security-Policy "frame-ancestors 'self'";

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { rewrite ^ /index.php last; }
    location ~ ^/favicons/(favicon\.ico|manifest\.json|browserconfig\.xml)$ { rewrite ^ /index.php last; }

    location ^~ /storage/avatars/ {
        try_files $uri =404;
    }

    location ^~ /storage/branding/ {
        try_files $uri =404;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        # On CentOS / RHEL using TCP socket, use: fastcgi_pass 127.0.0.1:9000;
        fastcgi_pass unix:/run/php/php8.5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param PHP_VALUE "upload_max_filesize = 100M \n post_max_size=100M";
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTP_PROXY "";
        fastcgi_intercept_errors off;
        fastcgi_buffer_size 16k;
        fastcgi_buffers 4 16k;
        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
    }

    location ~ /\.ht {
        deny all;
    }
}

Enable the site and restart NGINX:

ln -s /etc/nginx/sites-available/aquadactyl.conf /etc/nginx/sites-enabled/aquadactyl.conf
systemctl restart nginx

After Configuring Your Web Server

Open your Panel's address and sign in with the user you created. If you switched from HTTP to HTTPS, make sure APP_URL in /var/www/aquadactyl/.env starts with https://, then run:

Refresh configuration cache
cd /var/www/aquadactyl
php artisan config:clear
php artisan cache:clear