Drupal 10.1 On OpenBSD 7.3: Install with Composer

nabbisen - Sep 24 '23 - - Dev Community

Summary

Drupal is one of the content management systems aka CMS. It has long history and good stability, based on PHP and Symfony.

Symfony is one of the PHP web frameworks. It is clearly classified, functional and robust.

They are often good options to build web services.

  • Symfony offers primitive possibility of creating flexible data structure and user interface.
  • Drupal offers robust components to build service containing authentication, user roles and functional fields.

Besides, Drupal Association wrote about "Why We Use Symfony".

This post shows how to install Drupal with PHP on OpenBSD, the solid OS. Here, Composer, the PHP package manager, is used, which possibly makes later update easier.


Environment

Yes, Drupal 10 supports PHP 8 (as well as Drupal 9). Actually it does PHP 8.1 and later. (See: "PHP versions supported" in the official docs)

In addition, it's worthy of mention that Composer is given as bound to PHP 8.1 instead of 8.2. The detail will be written later.

Tutorial

🪄 Overview 💫

  1. Create MariaDB database for Drupal.
  2. Install PHP, its extensions and Composer. Other packages are optional.
  3. Create a Drupal project with Composer.
  4. Configure servers: PHP-FPM for app and OpenBSD httpd for web.
  5. Install Drupal via the web installer.

The description is below.


Create MariaDB database for Drupal

If you haven't installed MariaDB yet, this post will help.

Connect to your database server.

$ mysql -u root -p
Enter fullscreen mode Exit fullscreen mode

Create a database and the user for it.

CREATE DATABASE <database> \
    CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES \
    ON <database>.* TO <dbuser> \
    IDENTIFIED BY '<dbpassword>';

FLUSH PRIVILEGES;
Enter fullscreen mode Exit fullscreen mode

Install PHP, its extensions and Composer

PHP

We can get both PHP and PHP-FPM with the one-liner below thanks to the great Ports package system.

$ doas pkg_add php
$ # choose php-8.2
Enter fullscreen mode Exit fullscreen mode

PHP extensions

Get them via Ports, too:

$ doas pkg_add php-curl php-gd php-intl php-zip php-mysqli php-pdo_mysql # + php-[...] if necessary
$ # choose those of php-8.2
Enter fullscreen mode Exit fullscreen mode

Be sure to activate them:

$ doas ln -s /etc/php-8.2.sample/* /etc/php-8.2/
Enter fullscreen mode Exit fullscreen mode

Creating the symbolic links as above means the extensions are activated. You can confirm them:

$ ls -l /etc/php-8.2
total 0
lrwxr-xr-x  1 root  wheel  26 Sep 24 11:36 curl.ini@ -> ../php-8.2.sample/curl.ini
lrwxr-xr-x  1 root  wheel  24 Sep 24 11:36 gd.ini@ -> ../php-8.2.sample/gd.ini
lrwxr-xr-x  1 root  wheel  26 Sep 24 11:36 intl.ini@ -> ../php-8.2.sample/intl.ini
lrwxr-xr-x  1 root  wheel  28 Sep 24 11:36 mysqli.ini@ -> ../php-8.2.sample/mysqli.ini
lrwxr-xr-x  1 root  wheel  29 Sep 24 11:36 opcache.ini@ -> ../php-8.2.sample/opcache.ini
lrwxr-xr-x  1 root  wheel  31 Sep 24 11:36 pdo_mysql.ini@ -> ../php-8.2.sample/pdo_mysql.ini
lrwxr-xr-x  1 root  wheel  25 Sep 24 11:36 zip.ini@ -> ../php-8.2.sample/zip.ini
Enter fullscreen mode Exit fullscreen mode

Composer

You can get Composer with one-liner, too. Be careful, however, that it's bound to PHP 8.1 (and therefore PHP 8.1 will be installed together here).

$ doas pkg_add composer
Enter fullscreen mode Exit fullscreen mode

Other packages if necessary (Optional)

$ #doas pkg_add unzip git
Enter fullscreen mode Exit fullscreen mode

Create a Drupal project with Composer

Create a project

Let's see which PHP version Composer is behind:

$ composer -vvv about
Enter fullscreen mode Exit fullscreen mode

In my case, the result was:

Running 2.5.4 (2023-02-15 13:10:06) with PHP 8.1.23 on OpenBSD / 7.3
Failed to initialize global composer: Composer could not find the config file: /home/(...)/.composer/composer.json
To initialize a project, please create a composer.json file. See https://getcomposer.org/basic-usage
Composer - Dependency Manager for PHP - version 2.5.4
Composer is a dependency manager tracking local dependencies of your projects and libraries.
See https://getcomposer.org/ for more information.
Enter fullscreen mode Exit fullscreen mode

It showed "Running 2.5.4 (2023-02-15 13:10:06) with PHP 8.1.23 on OpenBSD / 7.3". When going to build Drupal site with PHP 8.1, there wasn't any problem. However, it was not the case.

Therefore I used a little trick to run composer to create a Drupal project.

$ php-8.2 /usr/local/libexec/composer.phar \
      create-project drupal/recommended-project <drupal-dir>
Enter fullscreen mode Exit fullscreen mode

Besides, in case that php 8.1 is used, the command line is simpler:

$ #composer \
      create-project drupal/recommended-project <drupal-dir>
Enter fullscreen mode Exit fullscreen mode

Well, the output around PHP 8.2 was:

Creating a "drupal/recommended-project" project at "./drupal_on_openbsd"
Installing drupal/recommended-project (10.1.4)
  - Installing drupal/recommended-project (10.1.4): Extracting archive
Created project in /var/www/sites/drupal_on_openbsd
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Package operations: 59 installs, 0 updates, 0 removals
  - Downloading composer/installers (v2.2.0)
  (...)
  - Downloading drupal/core (10.1.4)
  - Installing composer/installers (v2.2.0): Extracting archive
  - Installing drupal/core (10.1.4): Extracting archive
  - Installing drupal/core-recommended (10.1.4)
Generating autoload files
39 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
Scaffolding files for drupal/core:
  - Copy [project-root]/.editorconfig from assets/scaffold/files/editorconfig
  (...)
  - Copy [web-root]/sites/default/default.services.yml from assets/scaffold/files/default.services.yml
  - Copy [web-root]/sites/default/default.settings.php from assets/scaffold/files/default.settings.php
  - Copy [web-root]/modules/README.txt from assets/scaffold/files/modules.README.txt
  - Copy [web-root]/profiles/README.txt from assets/scaffold/files/profiles.README.txt
  - Copy [web-root]/themes/README.txt from assets/scaffold/files/themes.README.txt
  * Homepage: https://www.drupal.org/project/drupal
  * Support:
    * docs: https://www.drupal.org/docs/user_guide/en/index.html
    * chat: https://www.drupal.org/node/314178
No security vulnerability advisories found

  Congratulations, you’ve installed the Drupal codebase  
  from the drupal/recommended-project template!          


Next steps:
  * Install the site: https://www.drupal.org/docs/installing-drupal
  * Read the user guide: https://www.drupal.org/docs/user_guide/en/index.html
  * Get support: https://www.drupal.org/support
  * Get involved with the Drupal community:
      https://www.drupal.org/getting-involved
  * Remove the plugin that prints this message:
      composer remove drupal/core-project-message
  * Homepage: https://www.drupal.org/project/drupal
  * Support:
    * docs: https://www.drupal.org/docs/user_guide/en/index.html
    * chat: https://www.drupal.org/node/314178
Enter fullscreen mode Exit fullscreen mode

Configure directory and permissions

A bit more work is required.

$ cd <drupal-dir>

$ mkdir ./config

$ doas chown -R www: ./config
$ doas chown -R www: ./web/sites/default
Enter fullscreen mode Exit fullscreen mode

Done !! Now your project is waiting to be initialized and installed.

Configure servers

PHP-FPM for app

Activate php82_fpm daemon and then run it:

$ doas rcctl enable php82_fpm
$ doas rcctl start php82_fpm
Enter fullscreen mode Exit fullscreen mode

Besides, the more detail about PHP-FPM 8.2 server is written in my past post.

OpenBSD httpd for web

Configure web server(s) to enable the flow below:

Client --(request)--> Web: httpd --> Gateway: PHP-FPM --> App: Drupal
Enter fullscreen mode Exit fullscreen mode

Edit the configuration file of OpenBSD httpd:

$ doas nvim /etc/httpd.conf
Enter fullscreen mode Exit fullscreen mode

to add definitions like below:

server "<fqdn>" {
        listen on egress tls port https
        tls {
                certificate     "/etc/ssl/<fqdn>.pem"
                key             "/etc/ssl/private/<fqdn>.key"
        }
        # alternative to the above:
        #listen on egress port http

        log {
                access  "<fqdn>-access.log"
                error   "<fqdn>-error.log"
        }

        root "/<drupal-dir>/web" # (with chroot)
        directory index index.php

        location "/*.php" { 
                fastcgi socket "/run/php-fpm.sock"
        }
        location "/*.php[/?]*" { 
                fastcgi socket "/run/php-fpm.sock"
        } 
        location "*" {
                fastcgi socket "/run/php-fpm.sock"
                request rewrite "/index.php$REQUEST_URI"
        }
}
Enter fullscreen mode Exit fullscreen mode

Both <fqdn> (your domain etc.) and <drupal-dir> are, of course, up to your environment.

The root of the server above must point to:

  • not: the Drupal project root (aka /var/www/<drupal-dir>)
  • but: /web in it (aka /var/www/<drupal-dir>/web).

Besides, they are affected by chroot.

You don't have TLS certificates ? The notes below could help.

Well, when all are done, reload the daemon:

$ doas rcctl restart httpd
Enter fullscreen mode Exit fullscreen mode

TLS configuration files

It is able to get them via requests to Let's Encrypt with acme-client. (See: How to configure OpenBSD acme-client).

Alternatively, you can get them as self-signed certificates with command lines such as:

$ cd /etc/ssl

$ # [ consts ]
$ # case ksh:
$ export MY_DOMAIN="..."
$ export MY_COUNTRY_CODE="XX"
$ export MY_STATE="..."
$ export MY_ORGANIZATION="..."
$ # case fish:
$ # set -x MY_DOMAIN "..."; (...)

$ # [ generate ]
$ doas openssl req -newkey rsa:2048 -new -nodes -x509 -days 36500 -keyout private/$MY_DOMAIN.key -out $MY_DOMAIN.crt \
    -subj "/C=$MY_COUNTRY_CODE/ST=$MY_STATE/L=/O=$MY_ORGANIZATION/OU=/CN=$MY_DOMAIN"
$ doas chmod 400 private/$MY_DOMAIN.key

$ # return to your working directory
Enter fullscreen mode Exit fullscreen mode

Servers with and without TLS connection (Optional)

In addition, you can also redirect all http requests to https as needed:

# httpd.conf
server "<fqdn>" {
        listen on egress http
        # (...)
        block return 301 "https://$SERVER_NAME$REQUEST_URI"
}
server "<fqdn>" {
        listen on egress tls port https
        # (...)
}
Enter fullscreen mode Exit fullscreen mode

Install Drupal via the web installer

Connect to https://\<fqdn\> with your web browser. You will be redirected to https://\<fqdn\>/core/install.php.

When the web install is shown, follow their messages. The screenshots are below.

Language

drupal-101-on-openbsd-install-01

Installation profile

drupal-101-on-openbsd-install-02

Database configuration

drupal-101-on-openbsd-install-03
drupal-101-on-openbsd-install-04

Progress

drupal-101-on-openbsd-install-05

Site configuration

drupal-101-on-openbsd-install-06

drupal-101-on-openbsd-install-07

Completed

drupal-101-on-openbsd-completed-01

Yay 😁 Here comes Drupal with OpenBSD 🙌

Conclusion

Symfony is one of my favorite frameworks for web development. It's because:

  1. It has clean classes and powerful functionality.
  2. It is designed with security in mind. (It's also true on Drupal.)
  3. It becomes more powerful with useful helpers such as MakeBundle.
  4. It also provides great official documentation.
  5. The cache system helps performance and also development.

And, again, Drupal is based on it.

Besides, they may have steeper learning curve for beginners than WordPress and perhaps Laravel.

drupal-101-on-openbsd-completed-02

As above, Drupal is running on PHP working with OpenBSD httpd. All of them are hosted on OpenBSD 🐡

🌟 Happy serving 🌟

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .