#!/bin/bash set -e # read the lib/shared.sh and read the slug argument. DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" cd "$DIR" source "$DIR/lib/lib.sh" require_slug_argument # wait for sql to be awake wait_for_sql # check if the site exists if sql_bookkeep_exists "$SLUG"; then log_error "=> Site '$SLUG' already exists in bookeeping table. " echo "Refusing to work" exit 1; fi # Randomly generate the database name and user we will configure. # Use the 'randompw' alias for this. log_info " => Generating new MySQL password" MYSQL_PASSWORD="$(randompw)" # Initialize the SQL database with those credentials. log_info " => Intializing new SQL database '${MYSQL_DATABASE}' and user '$MYSQL_USER'. " dockerized_mysql -e "CREATE DATABASE \`${MYSQL_DATABASE}\`;" dockerized_mysql -e "CREATE USER \`${MYSQL_USER}\`@'%' IDENTIFIED BY '${MYSQL_PASSWORD}';" dockerized_mysql -e "GRANT ALL PRIVILEGES ON \`${MYSQL_DATABASE}\`.* TO \`${MYSQL_USER}\`@\`%\`;" dockerized_mysql -e "FLUSH PRIVILEGES;" # Create a new repository for GraphDB. # Use the template for this. log_info " => Generating new GraphDB repository '$GRAPHDB_REPO'" load_template "repository/graphdb-repo.ttl" "GRAPHDB_REPO" "${GRAPHDB_REPO}" "INSTANCE_DOMAIN" "${INSTANCE_DOMAIN}" | \ curl -X POST $GRAPHDB_AUTH_FLAGS \ http://127.0.0.1:7200/rest/repositories \ --header 'Content-Type: multipart/form-data' \ -F "config=@-" # Generate a random password for the GraphDB user log_info " => Generating a new GraphDB password" GRAPHDB_PASSWORD="$(randompw)" # Create the user and grant them access to the creatd database. log_info " => Creating GraphDB user '$GRAPHDB_USER'" load_template "repository/graphdb-user.json" "GRAPHDB_USER" "${GRAPHDB_USER}" "GRAPHDB_REPO" "${GRAPHDB_REPO}" | \ curl -X POST $GRAPHDB_AUTH_FLAGS \ "http://127.0.0.1:7200/rest/security/user/${GRAPHDB_USER}" \ --header 'Content-Type: application/json' \ --header 'Accept: text/plain' \ --header "X-GraphDB-Password: $GRAPHDB_PASSWORD" \ -d @- log_info " => Creating local directory structure at '$INSTANCE_BASE_DIR'" mkdir -p "$INSTANCE_BASE_DIR" mkdir -p "$INSTANCE_DATA_DIR" mkdir -p "$INSTANCE_DATA_DIR/.composer" mkdir -p "$INSTANCE_DATA_DIR/data" touch "$INSTANCE_DATA_DIR/authorized_keys" chmod a+rw "$INSTANCE_DATA_DIR/authorized_keys" # Generate some more random credentials, this time for drupal. # We again make use of the randompw alias. log_info " => Generating new drupal credentials" DRUPAL_USER="admin" DRUPAL_PASS="$(randompw)" # TODO: copy over docker-compose into the right directory log_info " => Creating instance directory" install_resource_dir "compose/barrel" "$INSTANCE_BASE_DIR" # Log all the details into the bookeeping database log_info "=> Storing configuration in bookkeeping table" sql_bookkeep_insert \ "slug,filesystem_base,sql_database,sql_user,sql_password,graphdb_repository,graphdb_user,graphdb_password" \ "\"${SLUG}\",\"${INSTANCE_BASE_DIR}\",\"${MYSQL_DATABASE}\",\"${MYSQL_USER}\",\"${MYSQL_PASSWORD}\",\"${GRAPHDB_REPO}\",\"${GRAPHDB_USER}\",\"${GRAPHDB_PASSWORD}\"" log_info " => Writing configuration file" load_template "docker-env/barrel" \ "REAL_PATH" "${INSTANCE_DATA_DIR}" \ "GLOBAL_AUTHORIZED_KEYS_FILE" "${GLOBAL_AUTHORIZED_KEYS_FILE}" \ "VIRTUAL_HOST" "${INSTANCE_DOMAIN}" \ "SLUG" "${SLUG}" \ "LETSENCRYPT_HOST" "${LETSENCRYPT_HOST}" \ "LETSENCRYPT_EMAIL" "${LETSENCRYPT_EMAIL}" \ "DISTILLERY_DIR" "${DIR}" \ > "$INSTANCE_BASE_DIR/.env" log_info " => Running and building image" cd "$INSTANCE_BASE_DIR" docker-compose build --pull docker-compose pull log_info " => Running provision script" docker-compose run --rm barrel /bin/bash -c "sudo PATH=\$PATH -u www-data /bin/bash /provision_container.sh \ \"${INSTANCE_DOMAIN}\" \ \"${MYSQL_DATABASE}\" \"${MYSQL_USER}\" \"${MYSQL_PASSWORD}\" \ \"${GRAPHDB_REPO}\" \"${GRAPHDB_USER}\" \"${GRAPHDB_PASSWORD}\" \ \"${DRUPAL_USER}\" \"${DRUPAL_PASS}\" \ \"${DRUPAL_VERSION}\" \"${WISSKI_VERSION}\"" log_info " => Starting container" docker-compose up -d