wip: Add mariadb primary/secondary cluster

Signed-off-by: Julius Härtl <jus@bitgrid.net>
This commit is contained in:
Julius Härtl
2023-11-02 16:57:55 +01:00
parent 564251f56e
commit 5049660b77
7 changed files with 210 additions and 87 deletions
+21 -3
View File
@@ -81,6 +81,26 @@ jobs:
ghcr.io/juliushaertl/nextcloud-dev-${{ matrix.container }}:${{ github.sha }}
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache-new
- name: Start containers with docker compose
run: |
./bootstrap.sh
PHP_VERSION=$(echo ${{ matrix.container }} | sed -e 's/^php//')
echo "PHP_VERSION=${PHP_VERSION}" >> .env
# exit if php version is not numeric or below 80
if ! [[ $PHP_VERSION =~ ^[0-9]+$ ]] || [[ $PHP_VERSION -lt 80 ]]; then
exit 0
fi
docker-compose up -d nextcloud
# wait for nextcloud to be up
# wait up to 5 minutes
for i in {1..300}; do
if curl -s http://nextcloud.local/index.php/login | grep -q 'Login'; then
break
fi
sleep 1
done
curl http://nextcloud.local/status.php
docker-compose exec nextcloud occ status
- name: Push container image
uses: docker/build-push-action@v5
if: github.ref == 'refs/heads/master' || github.event_name == 'release'
@@ -97,6 +117,4 @@ jobs:
- name: Move cache
run: |
rm -rf /tmp/.buildx-cache
mv /tmp/.buildx-cache-new /tmp/.buildx-cache
mv /tmp/.buildx-cache-new /tmp/.buildx-cache
-1
View File
@@ -126,7 +126,6 @@ PORTBASE=821
PHP_XDEBUG_MODE=develop
# SQL variant to use, possible values: sqlite, mysql, pgsql
SQL=mysql
DB_SERVICE=database-mysql
# other values: "database-postgres"
EOT
fi
+92 -40
View File
@@ -69,7 +69,7 @@ services:
image: ghcr.io/juliushaertl/nextcloud-dev-php${PHP_VERSION:-81}:latest
environment:
SQL: ${SQL:-mysql}
NEXTCLOUD_AUTOINSTALL: "YES"
NEXTCLOUD_AUTOINSTALL: ${NEXTCLOUD_AUTOINSTALL:-YES}
NEXTCLOUD_AUTOINSTALL_APPS:
WITH_REDIS: "YES"
VIRTUAL_HOST: "nextcloud${DOMAIN_SUFFIX}"
@@ -90,10 +90,10 @@ services:
- ./data/additional.config.php:/var/www/html/config/additional.config.php:ro
- ./data/shared:/shared
depends_on:
- ${DB_SERVICE:-database-mysql}
- database-${SQL}
- redis
- mail
- proxy
- ${PROXY_SERVICE:-proxy}
extra_hosts:
- host.docker.internal:host-gateway
@@ -111,10 +111,10 @@ services:
ports:
- "${PORTBASE:-800}1:80"
depends_on:
- database-mysql
- database-${SQL}
- redis
- mail
- proxy
- ${PROXY_SERVICE:-proxy}
extra_hosts:
- host.docker.internal:host-gateway
@@ -131,10 +131,10 @@ services:
- ./docker/configs/config.php:/var/www/html/config/writable.config.php:ro
- ./data/additional.config.php:/var/www/html/config/additional.config.php:ro
depends_on:
- database-mysql
- database-${SQL}
- redis
- mail
- proxy
- ${PROXY_SERVICE:-proxy}
extra_hosts:
- host.docker.internal:host-gateway
@@ -160,10 +160,10 @@ services:
- ./data/additional.config.php:/var/www/html/config/additional.config.php:ro
- ./data/shared:/shared
depends_on:
- ${DB_SERVICE:-database-mysql}
- database-${SQL}
- redis
- mail
- proxy
- ${PROXY_SERVICE:-proxy}
extra_hosts:
- host.docker.internal:host-gateway
@@ -189,10 +189,10 @@ services:
- ./data/additional.config.php:/var/www/html/config/additional.config.php:ro
- ./data/shared:/shared
depends_on:
- ${DB_SERVICE:-database-mysql}
- database-${SQL}
- redis
- mail
- proxy
- ${PROXY_SERVICE:-proxy}
extra_hosts:
- host.docker.internal:host-gateway
@@ -218,10 +218,10 @@ services:
- ./data/additional.config.php:/var/www/html/config/additional.config.php:ro
- ./data/shared:/shared
depends_on:
- ${DB_SERVICE:-database-mysql}
- database-${SQL}
- redis
- mail
- proxy
- ${PROXY_SERVICE:-proxy}
extra_hosts:
- host.docker.internal:host-gateway
@@ -247,10 +247,10 @@ services:
- ./data/additional.config.php:/var/www/html/config/additional.config.php:ro
- ./data/shared:/shared
depends_on:
- ${DB_SERVICE:-database-mysql}
- database-${SQL}
- redis
- mail
- proxy
- ${PROXY_SERVICE:-proxy}
extra_hosts:
- host.docker.internal:host-gateway
@@ -276,10 +276,10 @@ services:
- ./data/additional.config.php:/var/www/html/config/additional.config.php:ro
- ./data/shared:/shared
depends_on:
- ${DB_SERVICE:-database-mysql}
- database-${SQL}
- redis
- mail
- proxy
- ${PROXY_SERVICE:-proxy}
extra_hosts:
- host.docker.internal:host-gateway
@@ -306,10 +306,10 @@ services:
- ./data/additional.config.php:/var/www/html/config/additional.config.php:ro
- ./data/shared:/shared
depends_on:
- ${DB_SERVICE:-database-mysql}
- database-${SQL}
- redis
- mail
- proxy
- ${PROXY_SERVICE:-proxy}
extra_hosts:
- host.docker.internal:host-gateway
@@ -336,10 +336,10 @@ services:
- ./data/additional.config.php:/var/www/html/config/additional.config.php:ro
- ./data/shared:/shared
depends_on:
- ${DB_SERVICE:-database-mysql}
- database-${SQL}
- redis
- mail
- proxy
- ${PROXY_SERVICE:-proxy}
extra_hosts:
- host.docker.internal:host-gateway
@@ -366,10 +366,10 @@ services:
- ./data/additional.config.php:/var/www/html/config/additional.config.php:ro
- ./data/shared:/shared
depends_on:
- ${DB_SERVICE:-database-mysql}
- database-${SQL}
- redis
- mail
- proxy
- ${PROXY_SERVICE:-proxy}
extra_hosts:
- host.docker.internal:host-gateway
@@ -396,10 +396,10 @@ services:
- ./data/additional.config.php:/var/www/html/config/additional.config.php:ro
- ./data/shared:/shared
depends_on:
- ${DB_SERVICE:-database-mysql}
- database-${SQL}
- redis
- mail
- proxy
- ${PROXY_SERVICE:-proxy}
extra_hosts:
- host.docker.internal:host-gateway
@@ -426,10 +426,10 @@ services:
- ./data/additional.config.php:/var/www/html/config/additional.config.php:ro
- ./data/shared:/shared
depends_on:
- ${DB_SERVICE:-database-mysql}
- database-${SQL}
- redis
- mail
- proxy
- ${PROXY_SERVICE:-proxy}
extra_hosts:
- host.docker.internal:host-gateway
@@ -456,10 +456,10 @@ services:
- ./data/additional.config.php:/var/www/html/config/additional.config.php:ro
- ./data/shared:/shared
depends_on:
- ${DB_SERVICE:-database-mysql}
- database-${SQL}
- redis
- mail
- proxy
- ${PROXY_SERVICE:-proxy}
extra_hosts:
- host.docker.internal:host-gateway
@@ -486,10 +486,10 @@ services:
- ./data/additional.config.php:/var/www/html/config/additional.config.php:ro
- ./data/shared:/shared
depends_on:
- ${DB_SERVICE:-database-mysql}
- database-${SQL}
- redis
- mail
- proxy
- ${PROXY_SERVICE:-proxy}
extra_hosts:
- host.docker.internal:host-gateway
@@ -516,10 +516,10 @@ services:
- ./data/additional.config.php:/var/www/html/config/additional.config.php:ro
- ./data/shared:/shared
depends_on:
- ${DB_SERVICE:-database-mysql}
- database-${SQL}
- redis
- mail
- proxy
- ${PROXY_SERVICE:-proxy}
extra_hosts:
- host.docker.internal:host-gateway
@@ -541,6 +541,47 @@ services:
volumes:
- mysql:/var/lib/mysql
database-mariadb-primary:
image: docker.io/bitnami/mariadb:10.6
ports:
- '3306'
volumes:
- 'mariadb_primary_data:/bitnami/mariadb'
environment:
- MARIADB_REPLICATION_MODE=master
- MARIADB_REPLICATION_USER=repl_user
- MARIADB_REPLICATION_PASSWORD=repl_password
- MARIADB_ROOT_PASSWORD=nextcloud
- MARIADB_USER=nextcloud
- MARIADB_PASSWORD=nextcloud
- MARIADB_DATABASE=nextcloud
database-mariadb-replica:
image: docker.io/bitnami/mariadb:10.6
ports:
- '3306'
depends_on:
- database-mariadb-primary
environment:
- MARIADB_REPLICATION_MODE=slave
- MARIADB_REPLICATION_USER=repl_user
- MARIADB_REPLICATION_PASSWORD=repl_password
- MARIADB_MASTER_HOST=database-mariadb-primary
- MARIADB_MASTER_PORT_NUMBER=3306
- MARIADB_MASTER_ROOT_PASSWORD=nextcloud
# This can be useful for testing but should be enabled only after a setup is completed
# - MARIADB_MASTER_DELAY=10
database-maxscale:
image: mariadb/maxscale:latest
depends_on:
- database-mariadb-primary
- database-mariadb-replica
volumes:
- './docker/maxscale/my-maxscale.cnf:/etc/maxscale.cnf.d/my-maxscale.cnf'
ports:
- '3306'
database-postgres:
image: postgres:latest
environment:
@@ -551,6 +592,16 @@ services:
volumes:
- postgres:/var/lib/postgresql
database-oci:
image: ghcr.io/gvenzl/oracle-xe:18
environment:
ORACLE_PASSWORD: nextcloud
APP_USER: nextcloud
APP_USER_PASSWORD: nextcloud
ORACLE_DATABASE: nextcloud
ports:
- 1521:1521/tcp
pgadmin:
container_name: pgadmin_container
image: dpage/pgadmin4
@@ -564,7 +615,7 @@ services:
volumes:
- "./data/pgadmin/config:/pgadmin4/config"
depends_on:
- proxy
- ${PROXY_SERVICE:-proxy}
redis:
image: redis:7
@@ -789,8 +840,8 @@ services:
- ./data/skeleton/:/skeleton
- ./data/additional.config.php:/var/www/html/config/additional.config.php:ro
depends_on:
- proxy
- database-mysql
- ${PROXY_SERVICE:-proxy}
- database-${SQL}
- lookup
- redis
- mail
@@ -811,9 +862,9 @@ services:
- ./data/skeleton/:/skeleton
- ./data/additional.config.php:/var/www/html/config/additional.config.php:ro
depends_on:
- proxy
- ${PROXY_SERVICE:-proxy}
- portal
- database-mysql
- database-${SQL}
- lookup
- redis
- mail
@@ -834,9 +885,9 @@ services:
- ./data/skeleton/:/skeleton
- ./data/additional.config.php:/var/www/html/config/additional.config.php:ro
depends_on:
- proxy
- ${PROXY_SERVICE:-proxy}
- portal
- database-mysql
- database-${SQL}
- lookup
- redis
- mail
@@ -890,6 +941,7 @@ volumes:
smbhomes:
elasticsearch_data:
clam:
mariadb_primary_data:
networks:
default:
+2
View File
@@ -92,6 +92,8 @@ ENV WITH_REDIS NO
ENV WEBROOT /var/www/html
WORKDIR /var/www/html
RUN apt update && apt-get install -y mariadb-client
ENTRYPOINT ["/usr/local/bin/bootstrap.sh"]
CMD ["apache2-foreground"]
+63 -41
View File
@@ -28,6 +28,13 @@ output() {
echo "$@" >> /var/www/html/installing.html
}
fatal() {
output "======================================================================================="
output "$@"
output "======================================================================================="
exit 1
}
OCC() {
output "occ" "$@"
# shellcheck disable=SC2068
@@ -58,19 +65,42 @@ configure_xdebug_mode() {
wait_for_other_containers() {
output "⌛ Waiting for other containers"
if [ "$SQL" = "mysql" ]
then
output " - MySQL"
while ! timeout 1 bash -c "(echo > /dev/tcp/database-mysql/3306) 2>/dev/null"; do sleep 2; done
[ $? -ne 0 ] && echo "⚠ Unable to connect to the MySQL server"
sleep 2
fi
if [ "$SQL" = "pgsql" ]
then
while ! timeout 1 bash -c "(echo > /dev/tcp/database-postgres/5432) 2>/dev/null"; do sleep 2; done
[ $? -ne 0 ] && echo "⚠ Unable to connect to the PostgreSQL server"
sleep 2
fi
retry_with_timeout() {
local cmd=$1
local timeout=$2
local error_message=$3
local START_TIME=$SECONDS
while ! bash -c "$cmd"; do
if [ "$((SECONDS - START_TIME))" -ge "$timeout" ]; then
fatal "$error_message"
fi
sleep 2
done
}
case "$SQL" in
"mysql" | "mariadb-replica")
output " - MySQL"
retry_with_timeout "(echo > /dev/tcp/database-$SQL/3306) 2>/dev/null" 30 "⚠ Unable to connect to the MySQL server"
sleep 2
;;
"pgsql")
retry_with_timeout "(echo > /dev/tcp/database-postgres/5432) 2>/dev/null" 30 "⚠ Unable to connect to the PostgreSQL server"
sleep 2
;;
"maxscale")
for node in database-mariadb-primary database-mariadb-replica; do
echo " - Waiting for $node"
retry_with_timeout "(echo > /dev/tcp/$node/3306) 2>/dev/null" 30 "⚠ Unable to reach to the $node"
retry_with_timeout "mysql -u root -pnextcloud -h $node -e 'SELECT 1' 2>/dev/null" 30 "⚠ Unable to connect to the $node"
echo "✅"
done
;;
*)
fatal 'Not implemented'
;;
esac
[ $? -eq 0 ] && output "✅ Database server ready"
}
@@ -185,36 +215,9 @@ configure_add_user() {
install() {
DBNAME=$(echo "$VIRTUAL_HOST" | cut -d '.' -f1)
SQLHOST="database-$SQL"
echo "database name will be $DBNAME"
if [ "$SQL" = "mysql" ]
then
cp /root/autoconfig_mysql.php "$WEBROOT"/config/autoconfig.php
sed -i "s/dbname' => 'nextcloud'/dbname' => '$DBNAME'/" "$WEBROOT/config/autoconfig.php"
SQLHOST=database-mysql
fi
if [ "$SQL" = "pgsql" ]
then
cp /root/autoconfig_pgsql.php "$WEBROOT"/config/autoconfig.php
sed -i "s/dbname' => 'nextcloud'/dbname' => '$DBNAME'/" "$WEBROOT/config/autoconfig.php"
SQLHOST=database-postgres
fi
if [ "$SQL" = "oci" ]
then
cp /root/autoconfig_oci.php "$WEBROOT"/config/autoconfig.php
fi
# We copy the default config to the container
cp /root/default.config.php "$WEBROOT"/config/config.php
chown -R www-data:www-data "$WEBROOT"/config/config.php
mkdir -p "$WEBROOT/apps-extra"
mkdir -p "$WEBROOT/apps-shared"
update_permission
USER="admin"
PASSWORD="admin"
@@ -227,6 +230,14 @@ install() {
OCC maintenance:install --admin-user=$USER --admin-pass=$PASSWORD --database="$SQL" --database-name="$DBNAME" --database-host="$SQLHOST" --database-user=postgres --database-pass=postgres
elif [ "$SQL" = "mysql" ]; then
OCC maintenance:install --admin-user=$USER --admin-pass=$PASSWORD --database="$SQL" --database-name="$DBNAME" --database-host="$SQLHOST" --database-user=root --database-pass=nextcloud
elif [ "$SQL" = "mariadb-replica" ]; then
OCC maintenance:install --admin-user=$USER --admin-pass=$PASSWORD --database="mysql" --database-name="$DBNAME" --database-host="database-mariadb-primary" --database-user=root --database-pass=nextcloud
elif [ "$SQL" = "maxscale" ]; then
sleep 10
# FIXME only works for main container as maxscale does not pass root along
OCC maintenance:install --admin-user=$USER --admin-pass=$PASSWORD --database="mysql" --database-name="$DBNAME" --database-host="database-mariadb-primary" --database-user=nextcloud --database-pass=nextcloud
OCC config:system:set dbhost --value="database-maxscale"
OCC config:system:set dbuser --value="nextcloud"
else
OCC maintenance:install --admin-user=$USER --admin-pass=$PASSWORD --database="$SQL"
fi;
@@ -343,10 +354,21 @@ setup() {
# configuration that should be applied on each start
configure_ssl_proxy
else
# We copy the default config to the container
cp /root/default.config.php "$WEBROOT"/config/config.php
chown -R www-data:www-data "$WEBROOT"/config/config.php
mkdir -p "$WEBROOT/apps-extra"
mkdir -p "$WEBROOT/apps-shared"
update_permission
if [ "$NEXTCLOUD_AUTOINSTALL" != "NO" ]
then
add_hosts
install
else
touch "${WEBROOT}/config/CAN_INSTALL"
fi
fi
}
+31
View File
@@ -0,0 +1,31 @@
[primary]
type=server
address=database-mariadb-primary
port=3306
protocol=MariaDBBackend
[replica1]
type=server
address=database-mariadb-replica
port=3306
protocol=MariaDBBackend
[MariaDB-Monitor]
type=monitor
module=mariadbmon
servers=primary,replica1
user=root
password=nextcloud
[RW-Split-Router]
type=service
router=readwritesplit
servers=primary,replica1
user=root
password=nextcloud
[RW-Split-Listener]
type=listener
service=RW-Split-Router
protocol=MariaDBClient
port=3306
+1 -2
View File
@@ -43,9 +43,8 @@ DOMAIN_SUFFIX=.local
# PHP_VERSION=80
# PHP_VERSION=81
# May be used to choose database. Both SQL and DB_SERVICE have to be set if used. Defaults to mysql.
# May be used to choose database (sqlite, pgsql, mysql)
# SQL=pgsql
# DB_SERVICE=database-postgres
# The mode of the xdebuger extention. This can be a comma separated list of
# the entries none, develop, debug, trace, and profile.