HowtoForge

How to Install OctoberCMS on Debian 12

October CMS is a web application written in the Laravel web framework. It supports a variety of databases, such as MySQL/MariaDB, PostgreSQL, and SQLite. It can be run under Apache, Nginx, Lighthttpd, and Microsoft IIS.

This guide will walk you through the installation process of October CMS on Debian 12 with the LEMP Stack (Nginx, MySQL/MariaDB, and PHP-FPM), UFW, and Certbot.

Prerequisites

To proceed with this guide, gather the following:

Installing Dependencies

In this example, you will install October CMS on the Debian server with the LEMP Stack (Nginx, MySQL/MariaDB, and PHP-FPM). So, the first task you will do is install LAMP Stack with additional dependencies such as UFW (Uncomplicated Firewall) and Certbot.

Start this guide by updating your Debian repository using the following command.

sudo apt update

Then, install the LAMP Stack, UFW, and Certbot packages using the following command.

sudo apt install nginx mariadb-server php composer php-cli php-common php-imap php-redis php-snmp php-xml php-zip php-mbstring php-curl php-mysqli php-intl php-bcmath php-gd php-fpm ufw certbot python3-certbot-nginx

Type Y and press ENTER to confirm the installation.

Once the installation is finished, verify the LEMP Stack services to ensure that each service is running and enabled on your Debian server.

If the service is running, you should see an output active (running). When the service is enabled, it confirms that the service will be run automatically at boot.

Check the Nginx service using the following command.

sudo systemctl is-enabled nginx
sudo systemctl status nginx

Check the PHP-FPM service using the command below. In this case, you've installed PHP-FPM 8.2 from the Debian repository.

sudo systemctl is-enabled php8.2-fpm
sudo systemctl status php8.2-fpm

Lastly, check the MariaDB server using the command below.

sudo systemctl is-enabled mariadb
sudo systemctl status mariadb

Setting Up UFW

In this guide, you will secure your Debian server with UFW (Uncomplicated Firewall). So, in that case, you must open ports for SSH, HTTP, and HTTPS protocols.

Run the ufw command below to enable the OpenSSH and 'Nginx Full' profiles on UFW. The OpenSSH profile will open the default SSH port 22, while the 'Nginx Full' profile will open ports 80 and 443 for HTTP and HTTPS protocols.

sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'

Now run the command below to start and enable UFW. Type y and press ENTER to proceed.

sudo ufw enable

Once UFW is running, you should get an output 'Firewall is active and enabled on system startup'.

Now run the command below to verify the list-enabled profiles on UFW.

sudo ufw status

Ensure both OpenSSH and 'Nginx Full' profiles are enabled.

Configuring MariaDB Server

After you've configured UFW, you will now set up the MariaDB server via the mariadb-secure-installation utility, then you will create a new database and user for October CMS via the mariadb client.

Secure your MariaDB server installation by executing the following command.

sudo mariadb-secure-installation

During the process, you will be prompted with some security recommendations for the MariaDB server. Input Y to apply the recommendation, or n for No to reject it.

Now that you've configured the MariaDB server, type the command below to log in to the MariaDB server and create a new database and user for October CMS. Input your MariaDB root password when asked.

sudo mariadb -u root -p

Run the following queries to create a new database and user octobercms, with the password 'password'. Be sure to change the password with a new strong password.

CREATE USER 'octobercms'@'localhost' IDENTIFIED BY 'password';
CREATE DATABASE octobercms;
GRANT ALL PRIVILEGES ON octobercms.* TO 'octobercms'@'localhost';
FLUSH PRIVILEGES;

Next, run the following query to verify the privileges for user octobercms.

SHOW GRANTS FOR 'octobercms'@'localhost';

Ensure that user octobercms can access the database octobercms like the following.

Now type quit to exit from the MariaDB server.

Installing OctoberCMS Source Code

October CMS can be installed in many ways, via zip or via Composer. In this example, you will install October CMS via Composer.

Go to the /var/www/directory and download the October CMS source code using the wget command below. Once downloaded, you will see the file v3.5.0.zip.

cd /var/www/
wget https://github.com/octobercms/october/archive/refs/tags/v3.5.0.zip

Extract the v3.5.0.zip file using unzip to the directory octobercms. This means that your October CMS web root directory will be at /var/www/octobercms.

unzip v3.5.0.zip
sudo mv october-* octobercms

Next, run the following command to change the ownership of /var/www/octobercms to the user www-data and group www-data. Also, set up permission for directories to 0755 and files to 0644.

sudo chown -R www-data:www-data octobercms
find /var/www/octobercms -type d -exec chmod 755 {} \;
find /var/www/octobercms -type f -exec chmod 644 {} \;

Now, run the composer command below to install PHP dependencies for October CMS.

sudo -u www-data composer install

Start the October CMS installation using the following command.

sudo -u www-data php artisan october:install

During the process, you will be asked with the following:

Below is the screenshot of the October CMS installation.

Site configurations for October CMS.

Output during the October CMS installation.

Once the october CMS installation is finished, you will see the following output.

Lastly, run the command below to migrate the database.

sudo -u www-data php artisan october:migrate

Configuring Nginx Server Block

After downloading October CMS and configuring its web root directory, you will create a new Nginx server block configuration that will be used to run October CMS. Be sure that you've your domain name ready.

Run the nano editor command below to create a new file /etc/nginx/sites-available/octobercms.conf.

sudo nano /etc/nginx/sites-available/octobercms.conf

Insert the following configuration and be sure to change the domain name howtoforge.local with your domain.

server {
    listen 80;

    server_name howtoforge.local;

    index index.php index.html;
    root /var/www/octobercms;

    location / {
        # Let October CMS handle everything by default.
        # The path not resolved by the October CMS router will return October CMS's 404 page.
        # Everything that does not match with the allowlist below will fall into this.
        rewrite ^/.*$ /index.php last;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        fastcgi_read_timeout 120s;
    }


    # Allowlist
    location ~ ^/favicon\.ico { try_files $uri /index.php; }
    location ~ ^/sitemap\.xml { try_files $uri /index.php; }
    location ~ ^/robots\.txt { try_files $uri /index.php; }
    location ~ ^/humans\.txt { try_files $uri /index.php; }

    # Block all .dotfiles except well-known
    location ~ /\.(?!well-known).* { deny all; }

    ## Let nginx return 404 if static file not exists
    location ~ ^/storage/app/uploads/public { try_files $uri 404; }
    location ~ ^/storage/app/media { try_files $uri 404; }
    location ~ ^/storage/app/resources { try_files $uri 404; }
    location ~ ^/storage/temp/public { try_files $uri 404; }

    location ~ ^/modules/.*/assets { try_files $uri 404; }
    location ~ ^/modules/.*/resources { try_files $uri 404; }
    location ~ ^/modules/.*/behaviors/.*/assets { try_files $uri 404; }
    location ~ ^/modules/.*/behaviors/.*/resources { try_files $uri 404; }
    location ~ ^/modules/.*/widgets/.*/assets { try_files $uri 404; }
    location ~ ^/modules/.*/widgets/.*/resources { try_files $uri 404; }
    location ~ ^/modules/.*/formwidgets/.*/assets { try_files $uri 404; }
    location ~ ^/modules/.*/formwidgets/.*/resources { try_files $uri 404; }
    location ~ ^/modules/.*/reportwidgets/.*/assets { try_files $uri 404; }
    location ~ ^/modules/.*/reportwidgets/.*/resources { try_files $uri 404; }

    location ~ ^/plugins/.*/.*/assets { try_files $uri 404; }
    location ~ ^/plugins/.*/.*/resources { try_files $uri 404; }
    location ~ ^/plugins/.*/.*/behaviors/.*/assets { try_files $uri 404; }
    location ~ ^/plugins/.*/.*/behaviors/.*/resources { try_files $uri 404; }
    location ~ ^/plugins/.*/.*/reportwidgets/.*/assets { try_files $uri 404; }
    location ~ ^/plugins/.*/.*/reportwidgets/.*/resources { try_files $uri 404; }
    location ~ ^/plugins/.*/.*/formwidgets/.*/assets { try_files $uri 404; }
    location ~ ^/plugins/.*/.*/formwidgets/.*/resources { try_files $uri 404; }
    location ~ ^/plugins/.*/.*/widgets/.*/assets { try_files $uri 404; }
    location ~ ^/plugins/.*/.*/widgets/.*/resources { try_files $uri 404; }

    location ~ ^/themes/.*/assets { try_files $uri 404; }
    location ~ ^/themes/.*/resources { try_files $uri 404; }

}

Save and close the file when finished.

Next, run the command below to activate the server block file octobercms.conf and verify the Nginx syntax.

sudo ln -s /etc/nginx/sites-available/octobercms.conf /etc/nginx/sites-enabled/
sudo nginx -t

If you've proper syntax, you should an output such as 'syntax is ok - test is successful'.

Lastly, apply your changes to Nginx by restarting the Nginx service using the command below.

sudo systemctl restart nginx

Securing OctoberCMS with SSL/TLS Certificates

At this point, your October CMS is running and accessible. But to ensure that your installation is secure, you will implement HTTPS by generating SSL/TLS certificates from letsencrypt.

Execute the command below to generate SSl/TLS certificates for your October CMS installation. Be sure to change the email address and domain name with your info.

sudo certbot --nginx --agree-tos --redirect --hsts --staple-ocsp --email alice@howtoforge.local -d howtoforge.local

Once the process is finished, your domain name will automatically configured with HTTPS. And your SSL/TLS certificates will be available in the /etc/letsencrypt/live/yourdomain.com directory.

Accessing OctoberCMS

Visit the the domain name of your October CMS installation, for example, https://howtoforge.local/ using your favorite web browser.

If your installation is successful, you should get the default homepage of OctoberCMS like the following.

Click on the 'Backend Area' button to access the October CMS admin page.

Input the details of the new admin user, name, email address, and password. Click Create Account to confirm.

When finished, you should get the October CMS administrator dashboard like the following.

Conclusion

Congratulations! You've now completed the installation of October CMS on the Debian 12 server. You've installed October CMS with LEMP Stack (Nginx, MariaDB, and PHP-FPM). You've also secured your installation with UFW (Uncomplicated Firewall) and SSL/TLS via Letsencrypt.

How to Install OctoberCMS on Debian 12