Last Updated on December 12, 2021.

Github: RBPi-OrAny-Multiwordpress

Requirements:

  • A linux-based server
  • Hostnames (DNSs) to solve your server’s ip address
  • Not having anything else (program or container) listening to ports 80 and 443 as these will be used by nginx-proxy
  • Docker installed
  • Docker compose installed
  • Curiosity 🙂

Directories tree

/RBPi-OrAny-Multiwordpress
.
└── docker
    ├── nginx-proxy
    ├── portainer   
    └── wordpress
        ├── website1
        ├── website2
        └── websiteN

Download this repository with

git clone https://github.com/marcofariasmx/RBPi-OrAny-Multiwordpress.git

and get easily going with docker-compose in the nginx-proxy directory and then with each wordpress website.

Open the nginx-proxy directory and modify the docker-compose.yml file with

sudo nano nginx-proxy-multiwordpress/docker/nginx-proxy/docker-compose.yml

to add your email in DEFAULT_EMAIL=your@email.com to get Let’s Encrypt notifications in

version: "3"
services:
  nginx-proxy:
    image: nginxproxy/nginx-proxy
    container_name: nginx-proxy
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./config/my_proxy.conf:/etc/nginx/conf.d/my_proxy.conf:ro
      - certs:/etc/nginx/certs
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
  nginx-proxy-acme:
    image: nginxproxy/acme-companion
    container_name: nginx-proxy-acme
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - certs:/etc/nginx/certs
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - acme:/etc/acme.sh
    environment:
      - DEFAULT_EMAIL=your@email.com
      - NGINX_PROXY_CONTAINER=nginx-proxy

networks:
  nginx-proxy:
    name: nginx-proxy

volumes:
  certs:
  vhost:
  html:
  acme:

go to the nginx-proxy directory

cd nginx-proxy-multiwordpress/docker/nginx-proxy

and launch the docker container

sudo docker-compose up -d

once done, proceed to modify the docker-compose file with

cd ../
sudo nano nginx-proxy-multiwordpress/docker/wordpress/website1/docker-compose.yml

for each website with your domain name, website name and mysql/mariadb credentials

Example website1 docker-compose.yml file

version: "3"

services:
  db_node_domain_website1:
    #image: mariadb:latest
    image: mariadb:10.5.11
    volumes:
      - db_data:/var/lib/mysql
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: yourPASSWORD
      MYSQL_DATABASE: website1-wp-db
      MYSQL_USER: website1-wp-db-user
      MYSQL_PASSWORD: yourPASSWORD
    container_name: website1-wordpress-db
    networks:
      - nginx-proxy_default

  wordpress_website1:
    depends_on:
      - db_node_domain_website1
    #image: arm64v8/wordpress:latest
    #image: arm32v7/wordpress:latest
    #image: wordpress:latest
    image: arm64v8/wordpress:php7.4
    volumes:
      - wp_data:/var/www/html
    expose:
      - 8001
    ports:
      - "8001:80"
    networks:
      - nginx-proxy_default
    restart: unless-stopped
    environment:
      VIRTUAL_HOST: website1.com, www.website1.com
      LETSENCRYPT_HOST: website1.com, www.website1.com
      WORDPRESS_DB_HOST: db_node_domain_website1:3306
      WORDPRESS_DB_USER: website1-wp-db-user
      WORDPRESS_DB_PASSWORD: yourPASSWORD
      WORDPRESS_DB_NAME: website1-wp-db
    container_name: website1-wordpress
volumes:
  db_data:
  wp_data:

networks:
  nginx-proxy_default:
    external: true
    name: nginx-proxy_default

Make sure to have replaced all the "websiteN" with your website name!

Tip 1: Use DietPi

If you will be doing this on a Raspberry Pi, I highly suggest you use DietPi. It is a really solid and powerful yet minimal and efficient linux image which gets the most out of your RBPi. For context, I can currently run 2 – 3 simultaneous websites on a RBPi 3B+ (1GB RAM) which experience really low traffic before actually maxing out the RAM. So for small personal projects / blogs it is okay. A RBPi 4 with 4 – 8 GB RAM memory should perform much better.

Tip 2: Modifying docker-compose.yml files

If you need to perform any changes to any of your docker-compose.yml files, modify it and then rebuild it and launch it with:

sudo docker-compose up -d --build --force-recreate --no-deps --remove-orphans

Tip 3: Other architectures

To launch multiple wordpress websites in a non Raspberry Pi 64 bit (arm64v8) system, modify the docker-compose file for each website uncommenting the desired system in:

#image: arm64v8/wordpress:latest
#image: arm32v7/wordpress:latest
#image: wordpress:latest

Tip 4: Moving containers and volumes

Last but not least, installing wordpress this way makes it very easy for you to migrate your wordpress websites to another host/machine. Simply copy the files (stop the containers before) from the current install usually located in "/var/lib/docker" (you can verify with Portainer) to the same directory on the new host machine and then proceed to repeat the steps above. If everything went well you should have your wordpress sites with everything as you left them.


Extra:

Install Portainer to manage your docker containers and volumes, easily debug and visualize cointainers running.

You simply have to go to portainer’s directory and run

sudo docker-compose up -d

Once installed, it will become available to access and configure on port 9002 so you can access it like this: http://yourRBPIsIP:9002/

Example: http://192.168.0.20:9002/


Credits:

Big thanks to to the creators of all the libraries used in this project, they are the MVPs.

And also special thanks to Oleg Ishenko since this tutorial is mostly based on his tutorial Use Nginx-Proxy and LetsEncrypt Companion to Host Multiple Websites

Leave a Reply

Your email address will not be published.