#! /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 www-data \ --volume "${PREFIX}-app":/destination \ ubuntu \ mkdir --parents /destination/.vscode docker run \ --rm \ --user www-data \ --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}" = "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 <