#!/usr/bin/env bash # ------------------------------------------------------------------------- # SyspanelLamp - Entrypoint (MySQL 8.0) # Author: Marco Costa & Syspanel (www.syspanel.com.br) # Creation date: 05/09/2026 # License: MIT # ------------------------------------------------------------------------- echo "==========================================" echo " SyspanelLamp - Starting services" echo "==========================================" echo " Database: MySQL 8.0" DB_ROOT_PASS="${DB_ROOT_PASS:-admin123}" # ------------------------------------------------------------------------- # Fix ownership and permissions of MySQL data directory # (handles auto-created bind mounts with wrong owner/mode) # ------------------------------------------------------------------------- if [ -d "/var/lib/mysql" ]; then chown -R mysql:mysql /var/lib/mysql chmod 755 /var/lib/mysql fi if [ -d "/var/lib/mysql/mysql" ]; then chmod 755 /var/lib/mysql/mysql fi # ------------------------------------------------------------------------- # Initialize MySQL data directory if needed # ------------------------------------------------------------------------- # Estratégia: # - Usa auto.cnf como indicador de inicialização completa do MySQL # - Se mysqld --initialize-insecure falhar, limpa e tenta de novo FIRST_BOOT=0 if [ ! -f "/var/lib/mysql/auto.cnf" ]; then # auto.cnf é criado apenas por mysqld --initialize-insecure if [ -n "$(ls -A /var/lib/mysql/ 2>/dev/null)" ]; then echo ">> WARNING: /var/lib/mysql contains files but no auto.cnf — cleaning and reinitializing..." rm -rf /var/lib/mysql/* chown -R mysql:mysql /var/lib/mysql fi echo ">> Initializing MySQL data directory..." if ! mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysql 2>/tmp/mysql-init.log; then echo ">> WARNING: mysqld --initialize-insecure failed — retrying after cleanup..." rm -rf /var/lib/mysql/* chown -R mysql:mysql /var/lib/mysql mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysql fi FIRST_BOOT=1 elif [ ! -d "/var/lib/mysql/mysql/system" ] || [ -z "$(ls -A /var/lib/mysql/mysql/ 2>/dev/null)" ]; then echo ">> WARNING: MySQL data directory appears corrupted. Reinitializing..." rm -rf /var/lib/mysql/* chown -R mysql:mysql /var/lib/mysql mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysql FIRST_BOOT=1 fi # ------------------------------------------------------------------------- # Start MySQL # ------------------------------------------------------------------------- echo ">> Starting MySQL..." mysqld --user=mysql --datadir=/var/lib/mysql --skip-networking=0 --bind-address=0.0.0.0 --port=3306 & MYSQL_PID=$! # Wait for MySQL to be ready for i in $(seq 1 60); do if mysqladmin ping --silent; then echo ">> MySQL is ready." break fi sleep 1 done # ------------------------------------------------------------------------- # First boot setup: set root password, create databases and users # ------------------------------------------------------------------------- if [ "${FIRST_BOOT:-0}" = "1" ]; then echo ">> Setting MySQL root password..." mysql -u root -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '${DB_ROOT_PASS}'; FLUSH PRIVILEGES;" echo ">> Creating databases and users..." mysql -u root -p"${DB_ROOT_PASS}" <<'EOSQL' CREATE DATABASE IF NOT EXISTS app CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE DATABASE IF NOT EXISTS wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE DATABASE IF NOT EXISTS laravel CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER IF NOT EXISTS 'app'@'%' IDENTIFIED BY 'app123'; GRANT ALL PRIVILEGES ON app.* TO 'app'@'%'; CREATE USER IF NOT EXISTS 'wordpress'@'%' IDENTIFIED BY 'wp123'; GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'%'; CREATE USER IF NOT EXISTS 'laravel'@'%' IDENTIFIED BY 'laravel123'; GRANT ALL PRIVILEGES ON laravel.* TO 'laravel'@'%'; FLUSH PRIVILEGES; EOSQL # Run additional init script if present if [ -f /docker-entrypoint-initdb.d/init.sql ]; then echo ">> Running init.sql..." mysql -u root -p"${DB_ROOT_PASS}" < /docker-entrypoint-initdb.d/init.sql 2>/dev/null || true fi echo ">> MySQL first boot setup complete." fi # ------------------------------------------------------------------------- # Start Redis # ------------------------------------------------------------------------- echo ">> Starting Redis..." redis-server --daemonize yes 2>/dev/null || true # ------------------------------------------------------------------------- # Ensure /app directory exists # ------------------------------------------------------------------------- mkdir -p /app /var/www/html/public chown -R www-data:www-data /app /var/www/html/public # ------------------------------------------------------------------------- # Start Apache in foreground (handled by CMD) # ------------------------------------------------------------------------- echo ">> Starting Apache..." echo ">> All services started successfully." exec "$@"