Initial commit with script to generate a new PHPStarter-based website
This commit is contained in:
commit
ca51f944ea
|
|
@ -0,0 +1,64 @@
|
|||
# PHPStarter CLI
|
||||
|
||||
A lightweight command‑line tool for generating new PHP websites based on the [PHPStarter](https://gitea.ramoncaballero.dev/mon/PHPStarter.git) template.
|
||||
|
||||
You get a fully working PHP project in seconds.
|
||||
|
||||
## Requirements
|
||||
|
||||
- Linux environment
|
||||
- Apache2
|
||||
- Git
|
||||
- Bash
|
||||
- PHP
|
||||
- Composer
|
||||
- MariaDB
|
||||
|
||||
## Installation
|
||||
|
||||
Clone this repository:
|
||||
|
||||
```bash
|
||||
git clone https://gitea.ramoncaballero.dev/mon/phpstarter-cli.git
|
||||
cd phpstarter-cli
|
||||
```
|
||||
|
||||
Make the script executable:
|
||||
|
||||
```bash
|
||||
chmod +x phpstarter.sh
|
||||
```
|
||||
|
||||
<!-- (Optional) Install globally: -->
|
||||
<!-- -->
|
||||
<!-- ```bash -->
|
||||
<!-- sudo cp phpstarter.sh /usr/local/bin/phpstarter -->
|
||||
<!-- ``` -->
|
||||
|
||||
## Usage
|
||||
|
||||
Create a new PHP site:
|
||||
|
||||
```bash
|
||||
sudo ./phpstarter.sh <mysite>
|
||||
```
|
||||
|
||||
This will clone the [PHPStarter](https://gitea.ramoncaballero.dev/mon/PHPStarter.git) template, configure everything automatically, and set up a ready‑to‑use local development environment for your new site.
|
||||
|
||||
Your new site will be available at:
|
||||
|
||||
```bash
|
||||
http://mysite.local
|
||||
```
|
||||
|
||||
## Remove a Site
|
||||
|
||||
```bash
|
||||
sudo rm -rf /var/www/sites/mysite
|
||||
sudo a2dissite mysite.conf
|
||||
sudo rm /etc/apache2/sites-available/mysite.conf
|
||||
sudo systemctl reload apache2
|
||||
sudo sed -i '/mysite\.local/d' /etc/hosts
|
||||
```
|
||||
|
||||
You may also remove the database it manually if you no longer need it.
|
||||
|
|
@ -0,0 +1,230 @@
|
|||
#!/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 <website-name>"
|
||||
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
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
<VirtualHost *:80>
|
||||
ServerName PHPStarter.local
|
||||
DocumentRoot /var/www/sites/PHPStarter/public
|
||||
|
||||
<Directory /var/www/sites/PHPStarter/public>
|
||||
Options FollowSymLinks
|
||||
AllowOverride All
|
||||
Require all granted
|
||||
</Directory>
|
||||
|
||||
ErrorLog ${APACHE_LOG_DIR}/PHPStarter-error.log
|
||||
CustomLog ${APACHE_LOG_DIR}/PHPStarter-access.log combined
|
||||
</VirtualHost>
|
||||
Loading…
Reference in New Issue