#!/usr/bin/env bash set -euo pipefail # ------------------------------------- # CONFIGURATION # ------------------------------------- TEMPLATE_REPO="https://gitea.ramoncaballero.dev/mon/PHPStarter.git" SITES_DIR="/var/www/sites" APACHE_SITES_AVAILABLE="/etc/apache2/sites-available" APACHE_SERVICE="apache2" SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" VHOST_TEMPLATE="$SCRIPT_DIR/vhost-template.conf" # ------------------------------------- # FUNCTIONS # ------------------------------------- error() { echo "ERROR: $*" >&2 exit 1 } require_cmd() { command -v "$1" >/dev/null 2>&1 || error "Required command '$1' not found" } # ------------------------------------- # PRECHECKS # ------------------------------------- require_cmd git require_cmd sed require_cmd mariadb require_cmd openssl require_cmd a2ensite require_cmd systemctl require_cmd logname require_cmd composer [ -f "$VHOST_TEMPLATE" ] || error "Virtual host template not found at $VHOST_TEMPLATE" [ -d "$SITES_DIR" ] || error "Sites directory not found at $SITES_DIR" # ------------------------------------- # INPUT # ------------------------------------- if [ $# -lt 1 ]; then echo "Usage: sudo $0 " exit 1 fi WEBSITE_NAME="$1" WEBSITE_DIR="$SITES_DIR/$WEBSITE_NAME" VHOST_CONF="$APACHE_SITES_AVAILABLE/$WEBSITE_NAME.conf" if [ -d "$WEBSITE_DIR" ]; then error "Directory $WEBSITE_DIR already exists" fi if [ -f "$VHOST_CONF" ]; then error "VHost $VHOST_CONF already exists" fi REAL_USER="$(logname)" # ------------------------------------- # CLONE TEMPLATE # ------------------------------------- echo "Creating website directory at $WEBSITE_DIR..." mkdir -p "$WEBSITE_DIR" echo "Cloning PHPStarter template..." git clone "$TEMPLATE_REPO" "$WEBSITE_DIR" echo "Removing template Git history..." rm -rf "$WEBSITE_DIR/.git" # ------------------------------------- # COPY ENV EXAMPLE BEFORE PLACEHOLDER REPLACEMENT # ------------------------------------- EXAMPLE_ENV_PHPSTARTER="$WEBSITE_DIR/config/PHPStarter.env.example" EXAMPLE_ENV_WEBSITE="$WEBSITE_DIR/config/${WEBSITE_NAME}.env.example" if [ -f "$EXAMPLE_ENV_WEBSITE" ]; then EXAMPLE_ENV="$EXAMPLE_ENV_WEBSITE" elif [ -f "$EXAMPLE_ENV_PHPSTARTER" ]; then EXAMPLE_ENV="$EXAMPLE_ENV_PHPSTARTER" else EXAMPLE_ENV="" fi ENV_FILE="$WEBSITE_DIR/config/${WEBSITE_NAME}.env" if [ -n "$EXAMPLE_ENV" ]; then echo "Creating env file from example: $EXAMPLE_ENV -> $ENV_FILE" cp "$EXAMPLE_ENV" "$ENV_FILE" else echo "No env example found, skipping env copy." fi # ------------------------------------- # REPLACE PLACEHOLDERS (CONTENT ONLY) # ------------------------------------- echo "Replacing PHPStarter placeholders with $WEBSITE_NAME..." grep -rIl "PHPStarter" "$WEBSITE_DIR" \ | grep -v "\.example$" \ | while read -r file; do sed -i "s/PHPStarter/$WEBSITE_NAME/g" "$file" done # ------------------------------------- # RENAME CSS/JS FILES # ------------------------------------- CSS_OLD="$WEBSITE_DIR/public/css/PHPStarter.css" CSS_NEW="$WEBSITE_DIR/public/css/${WEBSITE_NAME}.css" JS_OLD="$WEBSITE_DIR/public/js/PHPStarter.js" JS_NEW="$WEBSITE_DIR/public/js/${WEBSITE_NAME}.js" [ -f "$CSS_OLD" ] && mv "$CSS_OLD" "$CSS_NEW" [ -f "$JS_OLD" ] && mv "$JS_OLD" "$JS_NEW" # ------------------------------------- # PERMISSIONS BEFORE COMPOSER # ------------------------------------- echo "Setting permissions so Composer can write vendor/..." chown -R "$REAL_USER:www-data" "$WEBSITE_DIR" find "$WEBSITE_DIR" -type d -exec chmod 775 {} \; find "$WEBSITE_DIR" -type f -exec chmod 664 {} \; # ------------------------------------- # COMPOSER INSTALL (RUN AS REAL USER) # ------------------------------------- echo "Running composer install as $REAL_USER..." sudo -u "$REAL_USER" composer install --no-dev --optimize-autoloader --working-dir="$WEBSITE_DIR" # ------------------------------------- # DATABASE SETUP # ------------------------------------- DB_USER="${WEBSITE_NAME}_user" DB_NAME="$WEBSITE_NAME" DB_PASS="$(openssl rand -base64 16)" DB_SQL="$WEBSITE_DIR/config/database.sql" if [ ! -f "$DB_SQL" ]; then echo "No database.sql found, skipping DB creation." else echo "Injecting generated DB password into SQL file..." sed -i "s/IDENTIFIED BY ''/IDENTIFIED BY '$DB_PASS'/" "$DB_SQL" echo "Enter MariaDB root password to create database..." read -rsp "MariaDB root password: " MYSQL_ROOT_PASSWORD echo echo "Running SQL file..." if ! mariadb -u root -p"$MYSQL_ROOT_PASSWORD" < "$DB_SQL"; then error "Failed to apply database.sql" fi fi # ------------------------------------- # UPDATE ENV FILE # ------------------------------------- if [ -f "$ENV_FILE" ]; then echo "Updating environment file..." sed -i "s/^DB_USER=.*/DB_USER=$DB_USER/" "$ENV_FILE" || true sed -i "s/^DB_PASS=.*/DB_PASS=$DB_PASS/" "$ENV_FILE" || true sed -i "s/^DB_NAME=.*/DB_NAME=$DB_NAME/" "$ENV_FILE" || true fi # ------------------------------------- # VIRTUAL HOST # ------------------------------------- echo "Creating virtual host..." cp "$VHOST_TEMPLATE" "$VHOST_CONF" sed -i "s/PHPStarter/$WEBSITE_NAME/g" "$VHOST_CONF" echo "Enabling site..." a2ensite "$WEBSITE_NAME.conf" echo "Reloading Apache..." systemctl reload "$APACHE_SERVICE" # ------------------------------------- # FINAL PERMISSIONS # ------------------------------------- echo "Re-applying ownership and permissions..." chown -R "$REAL_USER:www-data" "$WEBSITE_DIR" find "$WEBSITE_DIR" -type d -exec chmod 775 {} \; find "$WEBSITE_DIR" -type f -exec chmod 664 {} \; # ------------------------------------- # HOSTS FILE ENTRY # ------------------------------------- HOST_ENTRY="127.0.0.1 ${WEBSITE_NAME}.local" echo "Adding hosts entry for ${WEBSITE_NAME}.local..." if ! grep -q "${WEBSITE_NAME}.local" /etc/hosts; then echo "$HOST_ENTRY" | sudo tee -a /etc/hosts >/dev/null echo "Added hosts entry: $HOST_ENTRY" else echo "Hosts entry already exists, skipping." fi # ------------------------------------- # DONE # ------------------------------------- echo echo "Website created successfully!" echo "Path: $WEBSITE_DIR" echo "URL: http://${WEBSITE_NAME}.local" echo "DB user: $DB_USER" echo "DB name: $DB_NAME" echo "DB pass: $DB_PASS" echo