ITCooky Recipes

Lets cooky it yammy things!

How to migrate a website with WordPress and a phpBB forum from CentOS to Ubuntu on Hetzner!

дата September 4, 2022

The unforeseen happened, the creators of the most popular Linux for making websites sent them all to hell and they did it some time ago, it’s just now that I felt it myself when I wanted to update something and neither repositories work. The problem with CentOS was its brotherhood with Red Hat – commercial Linux, they pulled the code from the community (returning to CentOS), but at some point vendors said “fuck everyone”, that was the end of CentOS. And another thing – Hetzner prices go up 10% from September for new customers, but for old ones only from 1 January… Everything, everything, everything is pro to migrate now, and there is only one Ubuntu option left!!!

(That’s not the full price t +€2.26 for 47 Gb!)

It is not my first migration, of course, and in Hetzner is the second, here is the first described Installing http2 site on cloude(VPS) hosting HETZNER in Germany! I won’t write in detail about how to create a VPS there, I created a VPS just the same and migrated everything in one day!

Ubuntu in Hetzner its brand new 22.04.1.

Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-46-generic x86_64)

They send me a password to the email and I enter the VPS with ssh

A common practice when root does not connect directly via ssh is to log in as a user and give it super rights.
useradd user1
passwd user1

we give this user the right to log in via ssh
vi /etc/ssh/sshd_config
add a line
AllowUsers user1
and forbid going as root, find this line and change it
PermitRootLogin no
restart ssh
service sshd restart
And now you can only login via ssh as user1

I had quite old versions of PHP and MySQL

PHP 7.4.11 (cli) (built: Sep 29 2020 10:17:06) ( NTS )
MySQL(i) 5.7.31

The version of PHP, and for MySQL i will install the new one, the eighth, with some problems, of course!

Install PHP
The most popular and used version of PHP is not in the standard Ubuntu package repository… well, it has its cockroaches too! So we put it from another place, everyone does it(from some guy)!

sudo apt -y install software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt -y install php7.4
sudo apt -y install php7.4-fpm php7.4-mysqlnd php7.4-xml php7.4-gd php7.4-mbstring

I need all these additional modules for the phpBB forum

Start php-fpm
sudo systemctl start php7.4-fpm

Edit config
vi /etc/php/7.4/fpm/pool.d/www.conf

It is quite difficult to understand how to configure php-fpm… you have to feel the load of server and avoid the high load…

user = nginx
group = nginx 

listen = /run/php/php7.4-fpm.sock

listen.owner = nginx = nginx
listen.mode = 0660

pm = dynamic
pm.max_children = 100
pm.start_servers = 5
pm.min_spare_servers = 1
pm.max_spare_servers = 10
pm.max_requests = 1500

sudo service php7.4-fpm restart

By the way, Ubuntu insists on putting the new version of php, but I remove it and set it to 7.4

PHP 7.4.30 (cli) (built: Aug  1 2022 15:06:35) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.30, Copyright (c), by Zend Technologies

Install MySQL
Al diablo the old version, install 8
sudo apt install mysql-server

Set admin password
sudo mysql

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Install Nginx with http2
In Ubuntu http2 is easier to configure than in CentOS. I get the latest version of nginx as instructed

vi /etc/apt/sources.list.d/nginx.list

deb jammy nginx
deb-src jammy nginx

and install
sudo apt install nginx
jammy is the nickname of Ubuntu version 22

Of course there is some kind of bug with key

If a W: GPG error: focal InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY $key is encountered during the NGINX repository update, execute the following:

apt-key add nginx_signing.key
sudo apt update
sudo apt install nginx

nginx -v

nginx version: nginx/1.22.0

Start nginx and have it start on server boot
sudo systemctl start nginx
sudo systemctl enable nginx

http2 needs OpenSSL version 1.0.2 or higher
openssl version
we have higher

OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022

That’s it, then in the nginx configurations you will only need to type one word in two places!

Transfer and start a site in WordPress

On the old host, we archive the entire folder with the site
tar -cvf itc.tar ./
We dump the MySQL database
mysqldump -user root -p wpit > ./wpit.sql

You have to conveniently download it to the new host with wget or scp

Unzip to a folder /usr/local/www/
tar -xvf it.tar.gz

Enter MySQL
mysql -u root -p
We create a user, a database, set a password – I have a name for all wpit

CREATE USER 'wpit'@'localhost' IDENTIFIED BY 'QWErty123!';
GRANT ALL PRIVILEGES ON wpit.* TO 'wpit'@'localhost';
ALTER USER 'wpit'@'localhost' IDENTIFIED WITH mysql_native_password BY 'QWErty123!';

We fill the base
mysql -u root -p wpit < wpit.sql

In ./wp-config.php we write a new database password if it is new

Create a configuration for this site
vi /etc/nginx/conf.d/it.conf


server {
listen        80;
listen [::]:80;

access_log  off;

root   /usr/local/www/;

location / {
        index  index.php;

error_page 404 /404.html;
error_page 500 /500.html;
error_page 502 /502.html;
error_page 503 /503.html;
error_page 504 /504.html; 

location ~ \.php$ {
        fastcgi_pass   unix:/run/php/php7.4-fpm.sock; 
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;

location ~ .(gif|png|jpeg|jpg|svg)$ {
     valid_referers none blocked *;
     if ($invalid_referer) {
        return   403;

location ~ /\.ht {
        deny  all;

Here you have to write in fastcgi_pass what we write in the php-fpm configuration

And here it is without ssl without http2, too soon yet

Reload nginx
service nginx reload

We change in our DNS registrar the IP4 and IP6 to new ones for this site and wait until they update!

The site appeared on http, but on https it gives an error, everything is correct, you need to update the Lets Encrypt certificates

We install
sudo apt install certbot python3-certbot-nginx

And we make the certificates
sudo certbot --nginx -d -d

The mustache worked and Lets Encrypt entered what was needed in the nginx config for this site, but only at the end, I dragged it to the top!

server {
  listen [::]:443 ssl http2; # managed by Certbot
  listen 443 ssl http2; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
access_log  off;
root   /usr/local/www/;

location / {
    index index.php;

error_page 404 /404.html;
error_page 500 /500.html;
error_page 502 /502.html;
error_page 503 /503.html;
error_page 504 /504.html; 

location ~ \.php$ {
        fastcgi_pass   unix:/run/php/php7.4-fpm.sock; 
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;

location ~ .(gif|png|jpeg|jpg|svg)$ {
     valid_referers none blocked *;
     if ($invalid_referer) {
        return   403;

location ~ /\.ht {
        deny  all;


In the listen lines, put http2 and change 80 to 443.

I also add one more config so that everything is pulled from port 80 to 443

server {
    if ($host = {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    if ($host = {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;
    listen [::]:80;
    return 301$request_uri;

access_log  off;

Here, by the way, the sertbot also breaks in and writes its own thing

I restart nginx and see that it works and passes the test on http2!

Transfer of phpBB
The forum turned out to be too big to archive and download, so I downloaded it directly via scp
sudo scp -r root@ ./
- for this I opened the access root through ssh
- everything is downloaded even what is in symbolic links
- after downloading, all you need to do is chow to nginx:nginx

We repeat the steps of creating and filling the MySQL bas, the passqrod goes to ./forum/config.php

I'm trying to visit phpBB but it won't work, error GROUP BY DSC LIMITS

Turns out this is a well known joke, one of my php addons is very old (Anvar update "Images from posts", oh I checked your site and it doesn't exist anymore)
MySQL versions greater than 5.7. they don't like the word GROUP it wants ORDER

There are tips to add in my.cnf


MySQL restarted with no effect

Then I changed GROUP to ORDER in those two places where it says the error and it worked! Now it works so well that I can't reproduce the error anymore!

By the way, MySQL itself tells how to fix this problem...
WL#8693: Remove the syntax for GROUP BY ASC and DESC THEY have created that error, THEY explain how to fix it and WE have to do all the work of changing the word because they don't like it anymore!

Installation of Sphinx for effective search in phpBB
It is simple and the same old version 2.2 is installed
sudo apt-get install sphinxsearch

We create and chown'amos the necessary directories.
mkdir {/usr/local/www/sphinx2/,/usr/www/local/sphinx2/log}
chown -R sphinx:sphinx /usr/www/local/sphinx2

We take the configuration of the forum from the administration panel where the search for sphinx is, we put it here /usr/local/www/sphinx2/

And start indexing for the first time
indexer --config /usr/local/www/sphinx2/sphinx2.conf index_phpbb_87ye287ye823ye82_main
indexer --config /usr/local/www/sphinx2/sphinx2.conf index_phpbb_phpbb_87ye287ye823ye82_delta
indexer --rotate --config /usr/local/www/sphinx2/sphinx2.conf index_phpbb_87ye287ye823ye82_delta

that phrase is created by the forum 87ye287ye823ye82

searchd --config /usr/local/www/sphinx2/sphinx2.conf

And it looks like he's listening
netstat -tunlp;

tcp        0      0*               LISTEN      4961/searchd

To make it start after a reboot, you need to add to
crontab -e

@reboot /usr/bin/sleep 10;/usr/bin/searchd --config  /usr/local/www/sphinx2/sphinx2.conf

won't start without sleep, probably too early

En el mismo lugar, añadimos un indexador una vez por la noche, uno grande y uno pequeño cada cinco minutos.

*/5 * * * * indexer --rotate --config /usr/local/www/sphinx2/sphinx2.conf index_phpbb_87ye287ye823ye82_delta >> /usr/local/www/sphinx2/log/indexer.log 2>&1 &
13 3 * * * indexer --rotate --config /usr/local/www/sphinx12/sphinx2.conf index_phpbb_87ye287ye823ye82_main >> /usr/local/www/sphinx2/log/indexer.log 2>&1 &

Everything ready for phpBB

Database backup
We also add to
crontab -e

5 1 * * * /usr/bin/mysqldump -u backupuser -pf34f\%34f34fKGG wpit > /usr/local/www/archive/wpit_dayly.sql

nota aquí que % comentado \% a lo natural % un comando con ese simbolo no funcionara aca

backupuser we create it like this

GRANT SELECT, PROCESS, LOCK TABLES ON *.* TO 'backupuser'@'%' IDENTIFIED BY 'f34f\%34f34fKGG';

before there was no need to add PROCESS

and one more to the cron

35 1 7 * * /bin/cp /usr/local/www/archive/wpit.sql  /usr/local/www/archive/wpit.sql

A copy will be saved every 7th of the month until the following 7th

Increase of space in VPS
In Hertzner it's easy, there are Volumes, you can add it at any time and then increase it if necessary

There I throw the folder with the photos, and I put a symbolic link to them. In the folder where there was a folder with images, I run
ln -s /mnt/HC_Volume_123123123/foto1 ./foto1

Leave a Reply

Your email address will not be published. Required fields are marked *