In this document the process is explained to install SoloDB using Docker. To run SoloDB the following services will be installed

Service Role
Docker To run SoloDB docker container and Traefik to handle incoming requests
Solr Search engine using SoloDB search configuration
MySQL Database server

Pre requirements

For this install a (virtual) server running Debian is required

  • Disk: minimal 64 GB
  • CPU: 4 Cores
  • Memory: 8192 MiB

Software installation

Install docker

sudo apt-get update && apt-get upgrade

sudo sudo apt-get install \
    ca-certificates \
    curl \
    gnupg2 \
    lsb-release
    
sudo mkdir -p /etc/apt/keyrings
 curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

We want to allow usage of Docker by normal users

sudo usermod -aG docker ${USER}

Login and log out to reload the permissions

Install MySQL, using the installation package of MySQL. Debian will install MariaDB as default database server when no extra sources are added. The latest version can be found on the APT pages of MySQL

wget https://dev.mysql.com/get/mysql-apt-config_0.8.23-1_all.deb
sudo apt install ./mysql-apt-config_0.8.23-1_all.deb

sudo apt-get update
sudo apt-get install mysql-server

sudo mysql_secure_installation

Create a dedicated user for SoloDB

CREATE USER 'solodb_admin'@'172.%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON `solodb_production`.* TO 'solodb_admin'@'172.%';
FLUSH PRIVILEGES;

Install SOLR (version number might be higher, can be checked on the Solr Download page)

sudo apt-get install default-jdk default-jre
wget https://www.apache.org/dyn/closer.lua/solr/solr/9.6.0/solr-9.6.0.tgz?action=download
mv solr-9.6.0.tgz?action=download solr-9.6.0.tgz
tar xzf solr-9.6.0.tgz solr-9.6.0/bin/install_solr_service.sh --strip-components=2
sudo ./install_solr_service.sh solr-9.6.0.tgz

Change SOLR so it listens to all interfaces (and not only to localhost)

sudo nano /etc/default/solr.in.sh

Change the following settings

# By default the start script uses "localhost"; override the hostname here
# for production SolrCloud environments to control the hostname exposed to cluster state
SOLR_HOST="0.0.0.0"

# Increase Java Heap as needed to support your indexing / query needs
SOLR_HEAP="4g"

# Sets the network interface the Solr binds to. To prevent administrators from
# accidentally exposing Solr more widely than intended, this defaults to 127.0.0.1.
# Administrators should think carefully about their deployment environment and
# set this value as narrowly as required before going to production. In
# environments where security is not a concern, 0.0.0.0 can be used to allow
# Solr to accept connections on all network interfaces.
SOLR_JETTY_HOST="0.0.0.0"

Clone SoloDB SOLR docker repository and reload SOLR (as solr user)

sudo su && su solr
ssh-keygen #Upload the key to Github to prevent API rate limits
git clone https://github.com/jield-webdev/solodb-solr /var/solr/data
exit
sudo service solr restart

Create database and import the basic database into the mysql-server

mysql -u root -p

Download a copy of an empty database

create database solodb_production;
use solodb_production;
source ./emtpy_solodb_database.sql;

Traefik Configuration

This setup uses Traefik to manage the incoming traffic and redirect it to the SoloDB app docker container. Create a folder where the docker compose config file can be stored

sudo mkdir /var/www
sudo chown debian:debian /var/www

Switch to user debian (or the user you created) and create docker-compose

cd /var/www
mkdir solodb
cd solodb
nano docker-compose.yml

There are 2 example configuration available

Changes can be made based on the used setup

Create a config file which has all variables for SoloDB, a sample can be found here

<?php

declare(strict_types=1);

use Doctrine\DBAL\Driver\PDO\MySQL\Driver;

return [
    'doctrine' => [
        'connection' => [
            'orm_default' => [
                'driverClass' => Driver::class,
                'params' => [
                    'host' => '172.17.0.1',
                    'port' => '3306',
                    'user' => 'solodb_admin',
                    'password' => 'PASSWORD',
                    'dbname' => 'solodb_production',
                    'driverOptions' => [
                        PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'",
                    ],
                ],
            ],
        ],
    ],
    'solr' => [
        'host' => '172.17.0.1',
    ],
    'cache' => [
        'options' => [
            'server' => [
                'host' => 'localhost',
                'port' => 6379,
           ],
           'database' => 1,
           'namespace' => 'solodb',
        ],
    ],
    'application_options' => [
        'serverUrl' => 'https://hostname.solodb.net',
    ],
    'admin_options' => [
        'clientId' => '1234', //Equipage GraphAPI version
        'clientSecret' => '5e67',
        'tenantId' => 'test',
    ],
    'lmc_cors' => [
        'allowed_origins' => [
            'https://hostname.solodb.net',
        ],
        'allowed_methods' => ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'PATCH'],
        'allowed_headers' => ['Authorization', 'Content-Type', 'Accept'],
    ],
];

Generate a Peronal Access Token (PAT) on GitHub and save it locally

img/github-create-personal-access-token-for-containers.png

Start the docker compose

export CR_PAT=YOUR_TOKEN
echo $CR_PAT | docker login ghcr.io -u USERNAME --password-stdin
docker network create web
docker compose up -d