Blog Software

Setting up a WordPress staging system with docker

I wanted a WordPress staging system to play around with new plugins, new WordPress versions, and PHP versions.

The primary goals of my mini-project were:

  • Have a staging system for WordPress available for testing new WordPress versions and Plugins
  • Enhance the Performance of the actual WordPress Blog

How can we do it?

Here is a network diagram of the current system setup.

OK, the ideas were quite clear. Now we need a migration plan. And this looks like that:

  1. Install Raspian on the RPi5 SSD, with the Raspberry Pi imager
  2. Install docker and Portainer on the RPi5, based on the Heise description
  3. Install the following docker containers via „docker compose“
    1. Nginx Reverse Proxy
    2. Maria DB for WordPress Staging 
    3. WordPress Staging
    4. Maria DB for WordPress Production
    5. WordPress Production
    6. (Setting up Home Assistant also as a docker container is not a good idea as we lose the functionality of Add-Ons)
  4. With the current live system I’m doing a regular backup via Updraft, so let’s import these backups into the two WordPress instances
  5. At the DNS provider define the new subdomains and route them also to the Dynamic DNS provider
  6. Configure the NPM (Nginx Proxy Manager) with these domains and define the forwarding to the different instances
    1. Setup SSL via Let’s encrypt 
    2. Add also the local Home Assistant server/Port as the target
  7. Reconfigure the port forwarding of the router to the NPM
  8. Shutdown the old RPi4

So, let’s dive a little bit deeper into the different steps.

Configure the new RPi5 hardware and software

OK, let’s get the first new hardware, which means the new high-performance RPi5.

It took some time to be available on the market and the announced performance numbers looked promising.

As the power supply is quite strong I attached directly a SSD drive to the USB3 port.

So no need anymore for a USB hub!

Installing the latest Rasbian operating system on the SSD was pretty easy using the Raspian Imager.

I also configured the SSH access for it, of course.

So, how are we going further?

Install docker on the RPi5

As I wanted to run a WordPress life system and a WordPress staging system in my local network, I thought it would be a good idea to go with:

  • Docker to run multiple images/containers
  • Nginx Reverse Proxy to manage/route the traffic to/from these containers to the outside world

Install the docker containers

  • Setup a docker network manually
docker network create dockerwp 
  • Create a directory for wp_prod, wp_staging, nginx
  • Define a file for common parameters used as anonymized volumes in the docker containers
  • Create docker-compose.yml for the Nginx Proxy
    image: 'jc21/nginx-proxy-manager:latest'
    container_name: nginx-proxy
    restart: unless-stopped
      # These ports are in format <host-port>:<container-port>
      - '80:80' # Public HTTP Port
      - '443:443' # Public HTTPS Port
      - '81:81' # Admin Web Port
      # Add any other Stream port you want to expose
      # - '21:21' # FTP

    # Uncomment the next line if you uncomment anything in the section
    # environment:
      # Uncomment this if you want to change the location of
      # the SQLite DB file within the container
      # DB_SQLITE_FILE: "/data/database.sqlite"

      # Uncomment this if IPv6 is not enabled on your host
      # DISABLE_IPV6: 'true'

      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

    external: true
  • Create docker-compose.yml for the MariaDB and the WordPress container (one for the staging and one for the production system)
    image: mariadb:11.3.2
    container_name: prod_db
      MARIADB_DATABASE: "wordpress"
      MARIADB_USER: "wordpress"
      MARIADB_PASSWORD: "secret"
      - 'mysqldb0:/var/lib/mysql'
    restart: always
      -  mysqldb0

    image: wordpress:6.5.3
    container_name: prod_wp
      WORDPRESS_DB_HOST: "mysqldb0"
      WORDPRESS_DB_USER: "wordpress"
      WORDPRESS_DB_NAME: "wordpress"
        define('AUTOMATIC_UPDATER_DISABLED', true);

      - 'wordpress0:/var/www/html/wp-content'
      - '../uploads.ini:/usr/local/etc/php/conf.d/uploads.ini'
    restart: always
      - "8001:80"
      - mysqldb0
      - mysqldb0
      - dockerwp


    internal: true
    external: true

Setup the WordPress content

As I backed up the WordPress blog site with updraft, we are restoring the backup to the new WordPress staging and WordPress production system, respectively.

Configure the Sub-Domains

Go to your DNS provider and configure the new Sub-domains with a CNAME entry.

If you have a dynamic IP address, route the Sub-Domain entries to the same Dynamic DNS entry of your DynDNS Provider.

Configure the NPM

Define the target of the routing for all the Sub-Domains, e.g. the Ports of your WordPress containers.

Let the Sub-Domain for the Home Assistant point to the separate HA RPi3.

Add the SSL certificates from Let’s Encrypt.

Additional configuration for the Home Assistant

We must add the following configuration steps to make the Home Assistant run with an external Sub Domain, based on ademalidurmus.

1.) At the NPM, enter the following entry in the advanced config for the Home Assistant Host.

location / {
        proxy_pass    ;
        proxy_set_header        Host            $host;
        proxy_redirect          http://         https://;
        proxy_set_header        Authorization   $http_authorization;
        proxy_pass_header       Authorization;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection “upgrade”;

In the Home Assistant configuration.yml file add:

    - https://public.domain.tld # my public domain
  use_x_forwarded_for: true
    - # nginx proxy manager internal IP adress

At the „Home Assistant URL“ page enter:

Internet: [External Domain]
Local network: [Internal IP]:8123

Reconfigure the Port forwarding at your router

The Ports 80 for HTTP and 443 for HTTPS must now be reconfigured to forward the traffic from these two ports to the NPM.

Here is the network diagram of the new setup.

WordPress staging system with docker

Let’s now check our goals from the beginning. Did we reach them?

  • Have a staging system for WordPress available for testing new versions and Plugins: Available
  • Enhance Performance of the actual WordPress Blog: Super fast!
Blog Instagram Software

Move to the Fediverse

I think, now it’s time to move to the Fediverse. Most of us know that all the proprietary, closed-profit applications are f***ed up.

They are feeding us content that we mostly don’t want, and their only purpose they have is, generating money for them. And for this purpose, they are using our data, that we are giving them voluntarily.

They are bombarding us with advertisements and locking us into their systems. This is the same for Facebook, Instagram, Twitter,…

Twitter crashing

And thanks to Elon Musk – a guy that I admire as a businessman, but hate for his racist opinions – who bought Twitter some time ago, triggered a lot of people – including me – to move to the Fediverse.

I think, Musk is very good at managing technical industry companies but will fail IMHO managing a social internet company.

The Fediverse is per definition focussing on non-profit and is interoperable between different applications.

Multiple changes happened recently which is why I think now it’s the right time to move.

WordPress supports the ActivityPub protocol

Now there is a new plugin for any self-hosted WordPress installation available supporting the ActivityPub protocol. As soon as you configure the plugin anybody in the Fediverse can follow either a specific author of your WordPress blog or the complete blog.

Move to the Fediverse

Pixelfed can import from Instagram

You can now import your posts from Instagram into Pixelfed, preserving all the content you have produced in the past.

Mastodon supports search

A quite new and long-awaited feature searching just for text in the toots is now available.

You wanna follow me?

To follow this blog here (and this author) please use @gerhardy2408 or the complete blog with @blog.gerhard-vogt.de

My Mastodon user is @gerhardy2408

My Pixelfed user is @gerhardy2408

More to read


Blog Software

How to upgrade WordPress to PHP7.4

My WordPress admin center was complaining for a long time that I should upgrade WordPress to PHP7.4.

And from experience, I knew that this will typically not go without any hiccups. Be aware of any risks performing this upgrade and consider at least having a backup available, better even using a staging environment e.g. with UpdraftClone.

So here are the steps I have performed to make WordPress run again on that (not really) new PHP version 7.4.

upgrade WordPress to PHP7.4

My WordPress was running on a Raspberry Pi4, with Raspberry Pi OS 10 (buster) Version, mariaDB 10.3.39, PHP 7.3, and Apache 2

First, you should check, if there are any indications that your WordPress plugins and theme is not working with the new PHP version.

Then bring your OS to the latest version.

# sudo apt update
# sudo apt upgrade -y

Then install the certificate and add the repository.

# sudo apt -y install lsb-release apt-transport-https ca-certificates
# sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
# echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php.list

Install the following packages.

# sudo apt update
# sudo apt install php7.4 php7.4-fpm php7.4-mysqli
# sudo apt-get install php7.4-{bcmath,bz2,intl,gd,mbstring,mysql,zip,curl,dom,imagick,mbstring,intl}

You can check if the command line interface (cli) for PHP is running the new version with:

# php -v
PHP 7.4.33 (cli) (built: Jun 9 2023 07:38:14) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.33, Copyright (c), by Zend Technologies

As we are running the Apache web server with PHP we have to configure it now with the new version.

For switching between different PHP versions on a command line interface use the following commands:

# sudo update-alternatives --set php /usr/bin/php7.4 
# sudo update-alternatives --set phar /usr/bin/phar7.4 
# sudo update-alternatives --set phar.phar /usr/bin/phar.phar7.4

You can also have multiple PHP versions on your system and switch with the following configurations between them for the Apache web server and WordPress.

# sudo a2disconf php7.3-fpm
# sudo a2dismod php7.3
# sudo a2enmod php7.4
# sudo a2enconf php7.4-fpm

We also have to replace the proxy entries in all the sites from the virtual hosts you are running with Apache (folder „sites-available“). Look for the lines:

        <FilesMatch \.php$>
                # 2.4.10+ can proxy to unix socket
                SetHandler "proxy:unix:/run/php/php7.3-fpm.sock|fcgi://localhost"

And set the version to php7.4-fpm.

Now it’s time to restart the Apache web server.

#  sudo service apache2 restart

Check with phpinfo() if the php configuration for Apache is working correctly. The new version 7.4 with a mysqli section should be shown.

Checkout the following references:

Blog Software

KI ist vor allem ein Marketing Hype

Die neue Signal Chefin Meredith Whittaker sagt, „KI ist vor allem ein Marketing Hype“, und liegt meiner Meinung nach damit richtig. Der Begriff „Künstliche Intelligenz“ wird total missverständlich verwendet, und erweckt viel zu große Erwartungen, die aktuell definitiv nicht erfüllt werden können.

Es wäre es aus meiner Sicht viel ehrlicher, die Begriffe „maschinelles Lernen, basierend auf Big Data“ zu verwenden.

In dem Artikel geht es auch um die Macht der Großkonzerne, die in manchen Bereichen wirklich an die Macht von Regierungen heranreichen. Das jüngste Beispiel dafür ist Twitter.

Ja, wir geben den Konzernen mit der Benutzung der Applikationen die Daten und die Macht. Auf der anderen Seite ist es natürlich sehr verlockend, auf das meist kostenlose Angebot wie von Google etc. einzugehen.

KI ist vor allem ein Marketing Hype
Konzentrierte Macht

Ich habe vor einiger Zeit versucht, als es die Datenschutz Diskussion bei WhatsApp gab, meine Freunde und Bekannten auf die Signal Plattform zu bekommen. Aber nur ein sehr geringer Anteil sind mir gefolgt und das Experiment ist gescheitert. Ich muss weiterhin mit WhatsApp arbeiten, weil die Leute viel zu bequem sind, sich mit etwas neuem zu beschäftigen. Das Alte funktioniert ja. Und dass man sich damit in die Abhängigkeit von Konzernen gibt („Google tracked sowieso schon“), wird stillschweigend akzeptiert.

Keep on signalling 🙂

Und vielleicht bald tröten auf Mastodon.


Blog Software

Max hours of creative work per day

The claim of Dave Winer is that there is a max hours of creative work that you can perform per day. And I think he’s right.

If your work involves creativity, you’re not doing more than five hours of work a day no matter how many hours you pretend.

max hours of creative work
Photo by Pixabay on Pexels.com

You can also discuss how many days per week it makes sense to work. As we are getting more tired and I’m also quite sure that the productivity is dropping.