Files
wp-docker-setup/create.sh
2026-04-17 08:54:25 +02:00

265 lines
8.7 KiB
Bash
Executable File

#! /bin/sh
#
if [ ! -f "${PWD}/.env" ]; then
echo "missing env file in ${PWD}"
exit 1
fi
set -a
. "${PWD}/.env"
. "${PWD}/env_files/certs.env"
. "${PWD}/env_files/project.env"
set +a
mkdir -p "/tmp/${PREFIX}"
echo "Setting up docker volumes"
docker volume create "${PREFIX}-db"
docker volume create "${PREFIX}-root"
docker volume create "${PREFIX}-traefik-certs"
docker volume create "${PREFIX}-traefik-dynamic"
docker volume create "${PREFIX}-traefik-logs"
docker volume create "${PREFIX}-traefik-static"
docker volume create "${PREFIX}-webroot"
docker volume create wp-cli-cache
docker volume create composer-cache
echo "Copying SSL certificates to traefik volume"
if [ ! -f "${SSL_CRT_LOCATION}/${SSL_CRT_NAME}" ] || [ ! -f "${SSL_KEY_LOCATION}/${SSL_KEY_NAME}" ]; then
echo "Missing SSL key or cert file"
exit 1
fi
docker run \
--rm \
--volume "${PREFIX}-traefik-certs":/certs \
--volume "${SSL_CRT_LOCATION}":/source \
ubuntu \
cp "/source/${SSL_CRT_NAME}" /certs
docker run \
--rm \
--volume "${PREFIX}-traefik-certs":/certs \
--volume "${SSL_KEY_LOCATION}":/source \
ubuntu \
cp "/source/${SSL_KEY_NAME}" /certs
echo "Generating traefik configuration files (ssl.yml and middlewares.yml)"
cat << EOF > /tmp/${PREFIX}/ssl.yml
---
tls:
stores:
default:
defaultCertificate:
certFile: /certs/${SSL_CRT_NAME}
keyFile: /certs/${SSL_KEY_NAME}
EOF
cat << EOF > /tmp/${PREFIX}/middlewares.yml
---
http:
middlewares:
https-redirect:
redirectscheme:
scheme: https
permanent: true
EOF
docker run \
--rm \
--volume "/tmp/${PREFIX}":/source \
--volume "${PREFIX}-traefik-dynamic":/destination \
ubuntu \
cp /source/ssl.yml /source/middlewares.yml /destination
echo "Generating traefik static configuration"
cat << EOF > /tmp/${PREFIX}/static.yml
---
api:
dashboard: true
entrypoints:
http:
address: :80
https:
address: :443
log:
filepath: /logs/traefik.log
level: debug
providers:
docker:
exposedbydefault: false
file:
directory: /etc/traefik/dynamic
watch: true
EOF
docker run \
--rm \
--volume "/tmp/${PREFIX}":/source \
--volume "${PREFIX}-traefik-static":/destination \
ubuntu \
cp /source/static.yml /destination/traefik.yml
docker compose up -d app
while ! docker ps -q -f name="${PREFIX}-app"; do
echo "Waiting for the web container to be up and running..."
sleep 1
done
docker compose up -d db
while ! docker ps -q -f name="${PREFIX}-db"; do
echo "Waiting for the db container to be up and running..."
sleep 1
done
while ! docker exec "${PREFIX}-app" /bin/sh -c "mysqladmin ping -h ${PREFIX}-db -P 3306 --protocol=tcp -u user -puser --silent"; do
echo "Waiting for the mysql server in the db container to be up and running and reachable from the app container..."
sleep 1
done
if [ "${PROJECT_TYPE}" = "laravel" ]; then
echo "Installing laravel"
docker exec --user www-data --workdir "/var/www/html" "${PREFIX}-app" /bin/sh -c "composer create-project --prefer-dist laravel/laravel /var/www/html '${LAREVEL_VERSION}'"
fi
if [ "${PROJECT_TYPE}" = "livewire" ]; then
echo "Installing livewire"
docker exec --user www-data --workdir "/var/www/html" "${PREFIX}-app" /bin/sh -c "composer create-project --prefer-dist laravel/laravel /var/www/html '${LARAVEL_VERSION}'"
docker exec --user www-data --workdir "/var/www/html" "${PREFIX}-app" /bin/sh -c "composer require livewire/livewire ${LIVEWIRE_VERSION}"
fi
if [ "${PROJECT_TYPE}" = "wintercms" ]; then
echo "Installing wintercms"
docker exec --user www-data --workdir "/var/www/html" "${PREFIX}-app" /bin/sh -c "composer create-project wintercms/winter /var/www/html"
docker exec --user www-data --workdir "/var/www/html" "${PREFIX}-app" /bin/sh -c "echo ASSET_URL=https://${APP_URL} >> /var/www/html/.env"
docker exec --user www-data --workdir "/var/www/html" "${PREFIX}-app" /bin/sh -c "echo DB_DATABASE=${DB_NAME} >> /var/www/html/.env"
docker exec --user www-data --workdir "/var/www/html" "${PREFIX}-app" /bin/sh -c "echo DB_USERNAME=${DB_USER} >> /var/www/html/.env"
docker exec --user www-data --workdir "/var/www/html" "${PREFIX}-app" /bin/sh -c "echo DB_PASSWORD=${DB_USER_PASSWORD} >> /var/www/html/.env"
docker exec --user www-data --workdir "/var/www/html" "${PREFIX}-app" /bin/sh -c "echo DB_HOST=${PREFIX}-db >> /var/www/html/.env"
docker exec --user root "${PREFIX}-app" /bin/sh -c "sed -i 's|/var/www/html/public|/var/www/html|g' /etc/apache2/sites-available/000-default.conf"
docker restart "${PREFIX}-app"
docker exec --user www-data --workdir "/var/www/html" -it "${PREFIX}-app" /bin/sh -c "php artisan winter:install"
fi
if [ "${PROJECT_TYPE}" = "laravel" ] || [ "${PROJECT_TYPE}" = "livewire" ] || [ "${PROJECT_TYPE}" = "php" ]; then
echo "Generating vscode launch.json file"
cat << EOF > /tmp/${PREFIX}/launch.json
{
"version": "0.2.0",
"configurations": [
{
"hostname": "${TRAEFIK_LISTENING_IP}",
"name": "Listen for Xdebug (${TRAEFIK_LISTENING_IP})",
"pathMappings": {
"/var/www/html/": "\${workspaceRoot}/",
},
"port": 9003,
"request": "launch",
"type": "php"
}
]
}
EOF
docker run \
--rm \
--user root \
--volume "${PREFIX}-app":/destination \
ubuntu \
mkdir --parents /destination/.vscode
docker run \
--rm \
--user root \
--volume "${PREFIX}-app":/destination \
ubuntu \
cp /source/launch.json /destination/.vscode
docker run \
--rm \
--user root \
--volume "${PREFIX}-app":/destination \
ubuntu \
chown www-data:www-data /destination/.vscode -r
fi
if [ "${PROJECT_TYPE}" = "collectiveaccess" ]; then
echo "Installing collective-access"
docker exec --user www-data "${PREFIX}-app" /bin/sh -c "
git clone \
--branch ${COLLECTIVEACCESS_VERSION} \
--single-branch \
https://github.com/collectiveaccess/providence.git \
/var/www/html
"
docker exec --user www-data "${PREFIX}-app" /bin/sh -c "
mkdir /var/www/html/media/collectiveaccess && \
chown 33:33 /var/www/html/media/collectiveaccess && \
chown 33:33 /var/www/html/media/collectiveaccess --recursive
"
cat << EOF > /tmp/${PREFIX}/setup.php
<?php
define("__CA_DB_HOST__", '${PREFIX}-db');
define("__CA_DB_USER__", '${DB_USER}');
define("__CA_DB_PASSWORD__", '${DB_USER_PASSWORD}');
define("__CA_DB_DATABASE__", '${DB_NAME}');
define("__CA_DEFAULT_LOCALE__", "fr_FR");
define("__CA_APP_DISPLAY_NAME__", "My First CollectiveAccess System");
define("__CA_ADMIN_EMAIL__", 'info@put-your-domain-here.com');
date_default_timezone_set('Europe/Paris');
define("__CA_QUEUE_ENABLED__", 0);
define("__CA_USE_CLEAN_URLS__", 0);
define("__CA_APP_NAME__", "collectiveaccess");
define("__CA_GOOGLE_MAPS_KEY__", "");
define('__CA_CACHE_BACKEND__', 'file');
define('__CA_ALLOW_INSTALLER_TO_OVERWRITE_EXISTING_INSTALLS__', false);
define('__CA_STACKTRACE_ON_EXCEPTION__', false);
require(__DIR__."/app/helpers/post-setup.php");
EOF
docker cp "/tmp/${PREFIX}/setup.php" "${PREFIX}-app":/var/www/html
docker exec --user root "${PREFIX}-app" /bin/sh -c "
chown 33:33 /var/www/html/setup.php
"
docker cp "/home/vanhalleje/CARHOP/Collective Access/mappings/default/profile.xml" "${PREFIX}-app":/var/www/html/install/profiles/xml/sample_profile.xml
fi
if [ "${PROJECT_TYPE}" = "wordpress" ]; then
echo "Installing wppb-cli"
composer global require tmeister/wppb-cli
echo "Downloading WordPress core"
docker exec --user www-data "${PREFIX}-app" /bin/sh -c "
wp core download \
--locale=${WP_LOCALE} \
--path=/var/www/html \
--version=${WP_VERSION}"
echo "Creating WordPress config"
docker exec --user www-data "${PREFIX}-app" /bin/sh -c '
wp config create \
--dbhost='"${PREFIX}-db"' \
--dbname='"${DB_NAME}"' \
--dbpass='"${DB_USER_PASSWORD}"' \
--dbuser='"${DB_USER}"' \
--force \
--path=/var/www/html \
--skip-check \
--extra-php <<EXTRA-PHP
if (isset(\$_SERVER["HTTP_X_FORWARDED_PROTO"]) && \$_SERVER["HTTP_X_FORWARDED_PROTO"] == "https") \$_SERVER["HTTPS"]="on";
EXTRA-PHP
'
echo "Installing WordPress core"
docker exec --user www-data "${PREFIX}-app" /bin/sh -c "
wp core install \
--admin_email=no@mail.com \
--admin_password=${WP_ADMIN_PASSWORD} \
--admin_user=${WP_ADMIN_USERNAME} \
--path=/var/www/html \
--skip-email \
--title=${PREFIX} \
--url=${WP_DEFAULT_PROTOCOL}://${APP_URL}"
echo "Installing WordPress "${WP_THEME}" theme"
docker exec --user www-data "${PREFIX}-app" /bin/sh -c "
wp theme install ${WP_THEME} \
--activate \
--path=/var/www/html"
fi
docker compose up -d adminer
docker compose up -d app
docker compose up -d traefik