From 006fe050b079b11a9b177e6d92e8072d6417204b Mon Sep 17 00:00:00 2001 From: marco Date: Sun, 6 Sep 2026 19:35:42 -0300 Subject: [PATCH] First Commit --- 2404/Dockerfile.mariadb | 138 ++++++++++++ 2404/Dockerfile.mysql8 | 145 ++++++++++++ LICENSE | 21 ++ README.md | 307 ++++++++++++++++++++++++++ RULES.md | 184 +++++++++++++++ configs/apache/apache_default | 45 ++++ configs/apache/apache_envvars.sh | 8 + configs/mysql/init.sql | 17 ++ configs/mysql/my.cnf | 19 ++ configs/php/php.ini | 17 ++ configs/scripts/entrypoint-mariadb.sh | 127 +++++++++++ configs/scripts/entrypoint-mysql.sh | 126 +++++++++++ configs/scripts/entrypoint.sh | 126 +++++++++++ 13 files changed, 1280 insertions(+) create mode 100755 2404/Dockerfile.mariadb create mode 100755 2404/Dockerfile.mysql8 create mode 100755 LICENSE create mode 100755 README.md create mode 100755 RULES.md create mode 100755 configs/apache/apache_default create mode 100755 configs/apache/apache_envvars.sh create mode 100755 configs/mysql/init.sql create mode 100755 configs/mysql/my.cnf create mode 100644 configs/php/php.ini create mode 100755 configs/scripts/entrypoint-mariadb.sh create mode 100755 configs/scripts/entrypoint-mysql.sh create mode 100755 configs/scripts/entrypoint.sh diff --git a/2404/Dockerfile.mariadb b/2404/Dockerfile.mariadb new file mode 100755 index 0000000..c0e5029 --- /dev/null +++ b/2404/Dockerfile.mariadb @@ -0,0 +1,138 @@ +# SyspanelLamp - Ubuntu 24.04 + Apache + PHP 8.3 + MariaDB + PHPMyAdmin + Adminer + Redis +# Author: Marco Costa & Syspanel (www.syspanel.com.br) +# Creation date: 05/09/2026 +# License: MIT + +ARG PHP_VERSION=8.3 +ARG DB_ROOT_PASS=admin123 + +FROM ubuntu:24.04 AS base + +SHELL ["/bin/bash", "-lc"] +ENV DEBIAN_FRONTEND=noninteractive \ + TZ=America/Sao_Paulo \ + APACHE_RUN_USER=www-data \ + APACHE_RUN_GROUP=www-data \ + APACHE_LOG_DIR=/var/log/apache2 \ + APACHE_LOCK_DIR=/var/lock/apache2 \ + APACHE_PID_FILE=/var/run/apache2/apache2.pid + +# ------------------------------------------------------------------------- +# Install base system packages +# ------------------------------------------------------------------------- +RUN apt-get update && apt-get install -y --no-install-recommends \ + apt-transport-https \ + ca-certificates \ + curl \ + wget \ + git \ + unzip \ + zip \ + gnupg2 \ + lsb-release \ + software-properties-common \ + locales \ + && locale-gen en_US.UTF-8 && locale-gen pt_BR.UTF-8 \ + && update-locale LANG=en_US.UTF-8 \ + && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \ + && echo $TZ > /etc/timezone \ + && rm -rf /var/lib/apt/lists/* + +ENV LANG=en_US.UTF-8 +ENV LC_ALL=en_US.UTF-8 + +# ------------------------------------------------------------------------- +# Install PHP 8.3 (Ubuntu 24.04 native) +# ------------------------------------------------------------------------- +RUN apt-get update && apt-get install -y --no-install-recommends \ + apache2 \ + php8.3 \ + php8.3-cli \ + php8.3-common \ + php8.3-curl \ + php8.3-mbstring \ + php8.3-mysql \ + php8.3-pdo \ + php8.3-pdo-mysql \ + php8.3-xml \ + php8.3-zip \ + php8.3-gd \ + php8.3-imagick \ + php8.3-intl \ + php8.3-bcmath \ + php8.3-soap \ + php8.3-redis \ + php8.3-opcache \ + php8.3-readline \ + php8.3-memcached \ + libapache2-mod-php8.3 \ + redis-server \ + && rm -rf /var/lib/apt/lists/* + +# Enable Apache PHP module and required modules +RUN a2enmod php8.3 && a2enmod rewrite && a2enmod headers + +# ------------------------------------------------------------------------- +# Environment variables to configure PHP +# ------------------------------------------------------------------------- +ENV TZ=America/Sao_Paulo +ENV PHP_UPLOAD_MAX_FILESIZE=2048M +ENV PHP_POST_MAX_SIZE=2048M + +# Configure PHP settings (apache2 + cli) — shared config +COPY configs/php/php.ini /etc/php/8.3/apache2/php.ini +COPY configs/php/php.ini /etc/php/8.3/cli/php.ini + +# ------------------------------------------------------------------------- +# Install MariaDB +# ------------------------------------------------------------------------- +ARG DB_ROOT_PASS +RUN apt-get update && apt-get install -y --no-install-recommends \ + mariadb-server \ + mariadb-client \ + && rm -rf /var/lib/apt/lists/* + +# Prepare MariaDB runtime directories +RUN mkdir -p /var/run/mysqld /var/lib/mysql /var/log/mysql && \ + chown -R mysql:mysql /var/run/mysqld /var/lib/mysql /var/log/mysql + +# Wipe any build-time MariaDB init so entrypoint always boots fresh +RUN rm -rf /var/lib/mysql/* + +# ------------------------------------------------------------------------- +# Install Adminer (latest stable - v6.0.1) +# ------------------------------------------------------------------------- +RUN mkdir -p /var/www/adminer && \ + curl -fsSL -o /var/www/adminer/index.php https://github.com/vrana/adminer/releases/download/v6.0.1/adminer-6.0.1.php + +# ------------------------------------------------------------------------- +# Install PHPMyAdmin (5.2.1) +# ------------------------------------------------------------------------- +RUN mkdir -p /var/www/phpmyadmin && \ + curl -fsSL -o /tmp/phpmyadmin.tar.gz https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.tar.gz && \ + tar -xzf /tmp/phpmyadmin.tar.gz -C /tmp && \ + cp -r /tmp/phpMyAdmin-5.2.1-all-languages/* /var/www/phpmyadmin/ && \ + rm -rf /tmp/phpmyadmin.tar.gz /tmp/phpMyAdmin-5.2.1-all-languages + +# ------------------------------------------------------------------------- +# Apache site configuration +# ------------------------------------------------------------------------- +COPY configs/apache/apache_default /etc/apache2/sites-available/000-default.conf +COPY configs/apache/apache_envvars.sh /etc/apache2/envvars + +# ------------------------------------------------------------------------- +# MariaDB configuration +# ------------------------------------------------------------------------- +COPY configs/mysql/my.cnf /etc/mysql/my.cnf +COPY configs/mysql/init.sql /docker-entrypoint-initdb.d/init.sql + +# ------------------------------------------------------------------------- +# Entrypoint script +# ------------------------------------------------------------------------- +COPY configs/scripts/entrypoint-mariadb.sh /usr/local/bin/entrypoint.sh +RUN chmod +x /usr/local/bin/entrypoint.sh + +EXPOSE 80 3306 6379 5050 + +ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] +CMD ["apache2ctl", "-D", "FOREGROUND"] diff --git a/2404/Dockerfile.mysql8 b/2404/Dockerfile.mysql8 new file mode 100755 index 0000000..af3c727 --- /dev/null +++ b/2404/Dockerfile.mysql8 @@ -0,0 +1,145 @@ +# SyspanelLamp - Ubuntu 24.04 + Apache + PHP 8.3 + MySQL 8.0 + PHPMyAdmin + Adminer + Redis +# Author: Marco Costa & Syspanel (www.syspanel.com.br) +# Creation date: 05/09/2026 +# License: MIT + +ARG PHP_VERSION=8.3 +ARG DB_ROOT_PASS=admin123 + +FROM ubuntu:24.04 AS base + +SHELL ["/bin/bash", "-lc"] +ENV DEBIAN_FRONTEND=noninteractive \ + TZ=America/Sao_Paulo \ + APACHE_RUN_USER=www-data \ + APACHE_RUN_GROUP=www-data \ + APACHE_LOG_DIR=/var/log/apache2 \ + APACHE_LOCK_DIR=/var/lock/apache2 \ + APACHE_PID_FILE=/var/run/apache2/apache2.pid + +# ------------------------------------------------------------------------- +# Install base system packages +# ------------------------------------------------------------------------- +RUN apt-get update && apt-get install -y --no-install-recommends \ + apt-transport-https \ + ca-certificates \ + curl \ + wget \ + git \ + unzip \ + zip \ + gnupg2 \ + lsb-release \ + software-properties-common \ + locales \ + && locale-gen en_US.UTF-8 && locale-gen pt_BR.UTF-8 \ + && update-locale LANG=en_US.UTF-8 \ + && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \ + && echo $TZ > /etc/timezone \ + && rm -rf /var/lib/apt/lists/* + +ENV LANG=en_US.UTF-8 +ENV LC_ALL=en_US.UTF-8 + +# ------------------------------------------------------------------------- +# Install PHP 8.3 (Ubuntu 24.04 native) +# ------------------------------------------------------------------------- +RUN apt-get update && apt-get install -y --no-install-recommends \ + apache2 \ + php8.3 \ + php8.3-cli \ + php8.3-common \ + php8.3-curl \ + php8.3-mbstring \ + php8.3-mysql \ + php8.3-pdo \ + php8.3-pdo-mysql \ + php8.3-xml \ + php8.3-zip \ + php8.3-gd \ + php8.3-imagick \ + php8.3-intl \ + php8.3-bcmath \ + php8.3-soap \ + php8.3-redis \ + php8.3-opcache \ + php8.3-readline \ + php8.3-memcached \ + libapache2-mod-php8.3 \ + redis-server \ + && rm -rf /var/lib/apt/lists/* + +# Enable Apache PHP module and required modules +RUN a2enmod php8.3 && a2enmod rewrite && a2enmod headers + +# ------------------------------------------------------------------------- +# Environment variables to configure PHP +# ------------------------------------------------------------------------- +ENV TZ=America/Sao_Paulo +ENV PHP_UPLOAD_MAX_FILESIZE=2048M +ENV PHP_POST_MAX_SIZE=2048M + +# Configure PHP settings (apache2 + cli) — shared config +COPY configs/php/php.ini /etc/php/8.3/apache2/php.ini +COPY configs/php/php.ini /etc/php/8.3/cli/php.ini + +# ------------------------------------------------------------------------- +# Install MySQL 8.0 +# ------------------------------------------------------------------------- +ARG DB_ROOT_PASS +RUN apt-get update && apt-get install -y --no-install-recommends \ + wget \ + gnupg \ + && mkdir -p /etc/apt/keyrings && \ + echo "deb [trusted=yes] http://repo.mysql.com/apt/ubuntu $(lsb_release -cs) mysql-8.0" > /etc/apt/sources.list.d/mysql.list && \ + echo "mysql-community-server mysql-community-server/root-pass password ${DB_ROOT_PASS}" | debconf-set-selections && \ + echo "mysql-community-server mysql-community-server/re-root-pass password ${DB_ROOT_PASS}" | debconf-set-selections && \ + apt-get update && apt-get install -y --no-install-recommends \ + mysql-community-client \ + mysql-community-server \ + && rm -rf /var/lib/apt/lists/* + +# Prepare MySQL runtime directories +RUN mkdir -p /var/run/mysqld /var/lib/mysql && \ + chown -R mysql:mysql /var/run/mysqld /var/lib/mysql + +# Wipe any build-time MySQL init so entrypoint always boots fresh +RUN rm -rf /var/lib/mysql/* + +# ------------------------------------------------------------------------- +# Install Adminer (latest stable - v6.0.1) +# ------------------------------------------------------------------------- +RUN mkdir -p /var/www/adminer && \ + curl -fsSL -o /var/www/adminer/index.php https://github.com/vrana/adminer/releases/download/v6.0.1/adminer-6.0.1.php + +# ------------------------------------------------------------------------- +# Install PHPMyAdmin (5.2.1) +# ------------------------------------------------------------------------- +RUN mkdir -p /var/www/phpmyadmin && \ + curl -fsSL -o /tmp/phpmyadmin.tar.gz https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.tar.gz && \ + tar -xzf /tmp/phpmyadmin.tar.gz -C /tmp && \ + cp -r /tmp/phpMyAdmin-5.2.1-all-languages/* /var/www/phpmyadmin/ && \ + rm -rf /tmp/phpmyadmin.tar.gz /tmp/phpMyAdmin-5.2.1-all-languages + +# ------------------------------------------------------------------------- +# Apache site configuration +# ------------------------------------------------------------------------- +COPY configs/apache/apache_default /etc/apache2/sites-available/000-default.conf +COPY configs/apache/apache_envvars.sh /etc/apache2/envvars + +# ------------------------------------------------------------------------- +# MySQL configuration +# ------------------------------------------------------------------------- +COPY configs/mysql/my.cnf /etc/mysql/my.cnf +COPY configs/mysql/init.sql /docker-entrypoint-initdb.d/init.sql + +# ------------------------------------------------------------------------- +# Entrypoint script +# ------------------------------------------------------------------------- +COPY configs/scripts/entrypoint-mysql.sh /usr/local/bin/entrypoint.sh +RUN chmod +x /usr/local/bin/entrypoint.sh + +EXPOSE 80 3306 6379 5050 + +ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] +CMD ["apache2ctl", "-D", "FOREGROUND"] diff --git a/LICENSE b/LICENSE new file mode 100755 index 0000000..7c59d4d --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Marco Costa & Syspanel (www.syspanel.com.br) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100755 index 0000000..d682d97 --- /dev/null +++ b/README.md @@ -0,0 +1,307 @@ +# SyspanelLamp + +> Um container Docker completo com **Ubuntu 24.04**, **Apache**, **PHP 8.3**, **PHPMyAdmin**, **Adminer**, **Redis** e escolha de banco: **MySQL 8.0** ou **MariaDB**. + +**Autor:** Marco Costa & Syspanel — [www.syspanel.com.br](https://www.syspanel.com.br) +**Data de criação:** 05/09/2026 +**Licença:** MIT + +--- + +## Índice + +- [Visão Geral](#visão-geral) +- [Requisitos](#requisitos) +- [Build](#build) +- [Executar](#executar) +- [Serviços e Portas](#serviços-e-portas) +- [Extensões PHP](#extensões-php) +- [Acesso](#acesso) +- [Volume de Dados](#volume-de-dados) +- [Primeiro Boot](#primeiro-boot) +- [Troubleshooting](#troubleshooting) + +--- + +## Visão Geral + +Imagem Docker completa para desenvolvimento local de aplicações PHP (WordPress, Laravel, CodeIgniter, etc.), com todos os serviços necessários já pré-configurados. Escolha entre **MySQL 8.0** ou **MariaDB** no momento do build. + +### O que já vem incluído + +| Componente | Versão | +|---|---| +| Ubuntu | 24.04 (Noble) | +| Apache | 2.4 | +| PHP | 8.3 (nativo do Ubuntu 24.04) | +| PHPMyAdmin | 5.2.1 | +| Adminer | 6.0.1 | +| Redis | 7.0.15 | + +### Variantes de Banco de Dados + +| Variante | Build Arg | Imagem Tag | +|---|---|---| +| MySQL 8.0 | `DATABASE=mysql8` | `latest-2404-php83-mysql` | +| MariaDB | `DATABASE=mariadb` | `latest-2404-php83-mariadb` | + +--- + +## Requisitos + +- Docker Engine 20.10+ + +--- + +## Build + +### MySQL 8.0 + +```bash +docker build --no-cache \ + --build-arg PHP_VERSION=8.3 \ + --build-arg DATABASE=mysql8 \ + --build-arg DB_ROOT_PASS=admin123 \ + -t syspanel/dockersyspanellamp:latest-2404-php83-mysql \ + -f ./2404/Dockerfile.mysql8 . +``` + +### MariaDB + +```bash +docker build --no-cache \ + --build-arg PHP_VERSION=8.3 \ + --build-arg DATABASE=mariadb \ + --build-arg DB_ROOT_PASS=admin123 \ + -t syspanel/dockersyspanellamp:latest-2404-php83-mariadb \ + -f ./2404/Dockerfile.mariadb . +``` + +### Argumentos de Build + +| Argumento | Padrão | Descrição | +|---|---|---| +| `PHP_VERSION` | `8.3` | Versão do PHP (Ubuntu 24.04 inclui 8.3 nativamente) | +| `DATABASE` | `mysql8` | Tipo de banco: `mysql8` ou `mariadb` | +| `DB_ROOT_PASS` | `admin123` | Senha do usuário root/administrador do banco | + +--- + +## Executar + +### MySQL 8.0 + +```bash +docker run --name "syspanelampp" \ + -p "16900:80" -p "16901:3306" -p "16902:6379" -p "16905:5050" \ + -v ${PWD}/app:/app \ + -v ${PWD}/mysql-mysql8:/var/lib/mysql \ + -e DATABASE=mysql8 \ + -e DB_ROOT_PASS=admin123 \ + syspanel/dockersyspanellamp:latest-2404-php83-mysql +``` + +### MariaDB + +```bash +docker run --name "syspanelampp" \ + -p "16900:80" -p "16901:3306" -p "16902:6379" -p "16905:5050" \ + -v ${PWD}/app:/app \ + -v ${PWD}/mysql-mariadb:/var/lib/mysql \ + -e DATABASE=mariadb \ + -e DB_ROOT_PASS=admin123 \ + syspanel/dockersyspanellamp:latest-2404-php83-mariadb +``` + +### Parâmetros do `docker run` + +| Parâmetro | Descrição | +|---|---| +| `-p 16900:80` | Porta HTTP do Apache (http://localhost:16900) | +| `-p 16901:3306` | Porta MySQL/MariaDB | +| `-p 16902:6379` | Porta do Redis | +| `-p 16905:5050` | Porta reservada | +| `-v ${PWD}/app:/app` | Volume com o código da aplicação | +| `-v ${PWD}/mysql-mysql8:/var/lib/mysql` | Volume MySQL 8.0 | +| `-v ${PWD}/mysql-mariadb:/var/lib/mysql` | Volume MariaDB | +| `-e DATABASE` | Tipo de banco de dados (`mysql8` ou `mariadb`) | +| `-e DB_ROOT_PASS` | Senha do root do banco | + +--- + +## Serviços e Portas + +### MySQL 8.0 / MariaDB + +| Serviço | URL Local | Credenciais | +|---|---|---| +| **Apache / App** | http://localhost:16900 | — | +| **PHPMyAdmin** | http://localhost:16900/phpmyadmin | root / admin123 | +| **Adminer** | http://localhost:16900/adminer | root / admin123 | +| **MySQL/MariaDB** | localhost:16901 | root / admin123 | +| **Redis** | localhost:16902 | sem senha | + +--- + +## Extensões PHP + +A imagem inclui todas as extensões necessárias para **WordPress**, **Laravel** e demais frameworks PHP: + +| Extensão | Uso | +|---|---| +| `curl` | Requisições HTTP | +| `mbstring` | Manipulação de strings multibyte | +| `mysqli` / `pdo_mysql` | Conexão com MySQL/MariaDB | +| `xml` | Manipulação de XML | +| `zip` | Compactação/descompactação | +| `gd` / `imagick` | Processamento de imagens | +| `intl` | Internacionalização | +| `bcmath` | Cálculos de precisão | +| `soap` | Web Services SOAP | +| `redis` | Cliente Redis | +| `opcache` | Cache de bytecode | +| `memcached` | Cache em memória | + +--- + +## Configuração do PHP + +O arquivo `configs/php/php.ini` centraliza as configurações do PHP 8.3 aplicadas tanto ao **Apache** quanto ao **CLI**: + +| Diretiva | Valor | +|---|---| +| `date.timezone` | `America/Sao_Paulo` | +| `memory_limit` | `2048M` | +| `upload_max_filesize` | `2048M` | +| `post_max_size` | `2048M` | +| `max_input_vars` | `2000` | +| `max_execution_time` | `300` | +| `max_input_time` | `300` | + +Para alterar qualquer configuração, basta editar `configs/php/php.ini` e reconstruir a imagem. + +--- + +## Acesso + +### MySQL 8.0 / MariaDB (linha de comando) + +```bash +docker exec -it syspanelampp mysql -u root -p +``` + +### Redis (CLI) + +```bash +docker exec -it syspanelampp redis-cli +``` + +### Ver versão do PHP + +```bash +docker exec -it syspanelampp php -v +``` + +### Ver extensões PHP instaladas + +```bash +docker exec -it syspanelampp php -m +``` + +--- + +## Volume de Dados + +### Código da Aplicação + +O diretório `${PWD}/app` no host é montado em `/app` dentro do container e também em `/var/www/html/public` (DocumentRoot do Apache). Qualquer arquivo `.htaccess` será respeitado. + +### Dados do Banco + +| Banco de Dados | Volume no Host | Caminho no Container | +|---|---|---| +| MySQL 8.0 | `${PWD}/mysql-mysql8` | `/var/lib/mysql` | +| MariaDB | `${PWD}/mysql-mariadb` | `/var/lib/mysql` | + +> **Importante:** Os arquivos de configuração (`my.cnf`, `init.sql`) estão no diretório `configs/mysql/` do projeto e são empacotados na imagem Docker. Eles **não** ficam no volume de dados — dessa forma, trocar de variante de banco não causa conflitos de arquivos residuais. + +### Bancos criados automaticamente + +Na primeira inicialização, os seguintes bancos são criados: + +| Banco | Usuário | Senha | +|---|---|---| +| `app` | `app` | `app123` | +| `wordpress` | `wordpress` | `wp123` | +| `laravel` | `laravel` | `laravel123` | + +O usuário `root` tem a senha definida por `DB_ROOT_PASS` (padrão: `admin123`). + +--- + +## Primeiro Boot + +O sistema detecta automaticamente se é o primeiro boot e realiza as configurações iniciais: + +- Define a senha do usuário `root` +- Cria os bancos de dados `app`, `wordpress` e `laravel` +- Cria os usuários correspondentes com permissões +- Executa o script de inicialização (`init.sql`) +- Inicia o Redis +- Cria os diretórios `/app` e `/var/www/html/public` + +--- + +## Troubleshooting + +### Troca de variante de banco de dados + +Os volumes `${PWD}/mysql-mysql8` e `${PWD}/mysql-mariadb` são **separados** — cada variante tem seu próprio volume. Isso evita conflitos de arquivos residuais ao trocar de banco. + +Se você usava o diretório `${PWD}/mysql` com MariaDB e quer usar MySQL 8.0, use o diretório `${PWD}/mysql-mysql8` ou limpe o volume antes: + +```bash +rm -rf ${PWD}/mysql/* +``` + +O sistema também detecta automaticamente dados incompletos (sem `auto.cnf` no MySQL) e reinicializa o volume com uma mensagem de aviso no log. + +### MySQL / MariaDB não inicia — permissões incorretas + +Se o diretório de dados foi criado com permissões incorretas: + +```bash +sudo chown -R 999:999 ${PWD}/mysql-mysql8 +sudo chown -R 999:999 ${PWD}/mysql-mariadb +``` + +### Permissão negada no Apache + +```bash +docker exec -it syspanelampp chown -R www-data:www-data /app /var/www/html/public +``` + +### Reconstruir a imagem do zero + +```bash +# MySQL 8.0 +docker build --no-cache \ + --build-arg PHP_VERSION=8.3 \ + --build-arg DATABASE=mysql8 \ + --build-arg DB_ROOT_PASS=admin123 \ + -t syspanel/dockersyspanellamp:latest-2404-php83-mysql \ + -f ./2404/Dockerfile.mysql8 . + +# MariaDB +docker build --no-cache \ + --build-arg PHP_VERSION=8.3 \ + --build-arg DATABASE=mariadb \ + --build-arg DB_ROOT_PASS=admin123 \ + -t syspanel/dockersyspanellamp:latest-2404-php83-mariadb \ + -f ./2404/Dockerfile.mariadb . +``` + +--- + +**Desenvolvido por Marco Costa & Syspanel — www.syspanel.com.br** +**Licença MIT** diff --git a/RULES.md b/RULES.md new file mode 100755 index 0000000..08fc3b1 --- /dev/null +++ b/RULES.md @@ -0,0 +1,184 @@ +# RULES.md — Regras de Desenvolvimento para AI Coder + +Este arquivo define as regras que todo agente de IA (Kilo, GPT, Claude, etc.) deve seguir ao desenvolver código neste projeto **SyspanelLamp**. + +--- + +## 1. Autor e Licença + +- **Autor:** Marco Costa & Syspanel — [www.syspanel.com.br](https://www.syspanel.com.br) +- **Data de criação:** 05/09/2026 +- **Licença:** MIT + +Todo arquivo criado ou modificado **deve** conter o cabeçalho de licença MIT com a atribuição ao autor quando aplicável. + +--- + +## 2. Estrutura de Diretórios + +``` +dockersyspanellamp/ +├── src/ +│ ├── 2404/ +│ │ ├── Dockerfile.mysql8 ← Imagem Docker MySQL 8.0 (Ubuntu 24.04) +│ │ └── Dockerfile.mariadb ← Imagem Docker MariaDB (Ubuntu 24.04) +│ ├── configs/ +│ │ ├── apache/ +│ │ │ ├── apache_default ← VirtualHost Apache +│ │ │ └── apache_envvars.sh ← Variáveis de ambiente do Apache +│ │ ├── mysql/ +│ │ │ ├── my.cnf ← Configurações do MySQL/MariaDB +│ │ │ └── init.sql ← Script de inicialização MySQL/MariaDB +│ │ ├── php/ +│ │ │ └── php.ini ← Configurações do PHP 8.3 +│ │ └── scripts/ +│ │ ├── entrypoint-mysql.sh ← Entrypoint MySQL 8.0 +│ │ ├── entrypoint-mariadb.sh ← Entrypoint MariaDB +│ │ └── entrypoint.sh ← Entrypoint genérico (auto-detecção) +│ ├── README.md +│ ├── LICENSE +│ └── RULES.md +│ +├── app/ ← Volume bind-mount do código da aplicação +├── mysql/ ← Volume bind-mount dos dados do MySQL/MariaDB +├── mysql-mysql8/ ← Volume bind-mount dos dados MySQL 8.0 +├── mysql-mariadb/ ← Volume bind-mount dos dados MariaDB +``` + +> **Nota:** Cada variante de banco tem seu próprio Dockerfile e entrypoint. A variável `DATABASE` é usada como build-arg e variável de ambiente para o entrypoint. Cada imagem já contém apenas o banco correspondente. +> Todos os arquivos de configuração (Apache, MySQL/MariaDB, PHP e scripts) estão centralizados em `src/configs/`. + +--- + +## 3. Regras do Dockerfile (todas as variantes) + +- **Base image:** Sempre usar `ubuntu:24.04`. +- **PHP version:** Deve ser controlada por `ARG PHP_VERSION`. Nunca hardcodear. +- **PHP source:** Ubuntu 24.04 (Noble) inclui PHP 8.3 nativamente. Não usar PPAs de terceiros. +- **MySQL 8.0:** Usar repositório oficial da Oracle (`repo.mysql.com`), versão 8.0. +- **MariaDB:** Usar repositório nativo do Ubuntu 24.04 (`mariadb-server`, `mariadb-client`). +- **Root password DB:** Controlada por `ARG DB_ROOT_PASS`. +- **MySQL data dir:** Deve ser limpo (`rm -rf /var/lib/mysql/*`) no final do Dockerfile para garantir que o entrypoint sempre detecta primeiro boot. +- **PHPMyAdmin:** Usar versão 5.2.1 oficial do phpmyadmin.net. +- **Adminer:** Usar versão 6.0.1 oficial do adminer.org (GitHub releases). +- **Nunca** incluir dados sensíveis hardcoded (senhas, chaves de API). +- O `CMD` final sempre deve ser `apache2ctl -D FOREGROUND`. +- Os Dockerfiles devem ser mantidos **idênticos** exceto pela seção de instalação do banco de dados, entrypoint e arquivos de configuração copiados. + +--- + +## 4. Regras do Apache + +- **DocumentRoot:** `/var/www/html/public` +- **AllowOverride All:** Sempre habilitado para funcionar com `.htaccess` (WordPress, Laravel, etc.) +- **Alias /phpmyadmin:** Aponta para `/var/www/phpmyadmin` +- **Alias /adminer:** Aponta para `/var/www/adminer` +- Módulos obrigatórios habilitados: `rewrite`, `headers`, `php8.3` + +--- + +## 5. Regras do MySQL / MariaDB + +- **Porta:** 3306 +- **Charset padrão:** `utf8mb4` com collation `utf8mb4_general_ci` +- **Socket:** `/var/run/mysqld/mysqld.sock` +- **Diretório de dados:** `/var/lib/mysql` +- **Detecção de primeiro boot:** Verificar se `/var/lib/mysql/mysql/system` existe antes de inicializar. +- **Init script:** `/docker-entrypoint-initdb.d/init.sql` — executado apenas na primeira inicialização +- Bancos criados automaticamente: `app`, `wordpress`, `laravel` +- Usuários criados automaticamente: `app`, `wordpress`, `laravel` + +--- + +## 6. Regras do Entrypoint + +### Comportamento Geral + +- O entrypoint deve iniciar o banco de dados antes do Apache. +- Deve aguardar o banco ficar disponível antes de prosseguir. +- Deve suportar a variável `DATABASE` para especificar o tipo de banco (`mysql8` ou `mariadb`). +- Se `DATABASE` não for fornecida, deve detectar automaticamente pelo diretório de dados. +- Deve definir a senha do root no primeiro boot. +- Deve executar o script `init.sql` apenas no primeiro boot. +- Deve iniciar o Redis (`redis-server --daemonize yes`). +- Deve criar `/app` e `/var/www/html/public` se não existirem. +- Deve usar `exec "$@"` no final para passar o sinal correto para o Apache. + +### MySQL 8.0 (`entrypoint-mysql.sh`) + +- Usar `mysqld --initialize-insecure` para inicializar o diretório de dados. +- Usar `mysqladmin ping` para verificar disponibilidade. +- Usar `ALTER USER 'root'@'localhost' IDENTIFIED BY` para definir a senha. + +### MariaDB (`entrypoint-mariadb.sh`) + +- Usar `mariadb-install-db` para inicializar o diretório de dados. +- Usar `mysqladmin ping` para verificar disponibilidade. +- Usar `ALTER USER 'root'@'localhost' IDENTIFIED BY` para definir a senha. + +### Entrypoint genérico (`entrypoint.sh`) + +- Suporta `mysql8` e `mariadb` como valores de `DATABASE`. + +--- + +## 7. Regras dos Arquivos de Configuração + +- Arquivos de configuração (`.cnf`, `.conf`, `.sh`) **não devem** conter comentários desnecessários. +- Usar tabulação ou 4 espaços para indentação — manter consistência com o estilo existente. +- Não remover funcionalidades existentes sem justificativa. +- Toda alteração deve ser compatível com versões anteriores sempre que possível. + +--- + +## 8. Regras de Extensões PHP + +As seguintes extensões são **obrigatórias** e nunca devem ser removidas: + +``` +curl, mbstring, mysql, pdo, pdo_mysql, +xml, zip, gd, imagick, intl, bcmath, soap, redis, +opcache, readline, memcached +``` + +Adições de novas extensões são permitidas, desde que justificadas. + +--- + +## 9. Regras de Portas Padrão + +| Porta Interna | Porta Externa Padrão | Serviço | +|---|---|---| +| 80 | 16900 | Apache / HTTP | +| 3306 | 16901 | MySQL / MariaDB | +| 6379 | 16902 | Redis | +| 5050 | 16905 | Adminer | + +--- + +## 10. Convenção de Commits (se usar Git) + +``` +(): + +Tipos: + feat: nova funcionalidade + fix: correção de bug + docs: alteração em documentação + build: alteração no Dockerfile / build system + refactor: refatoração sem mudança de comportamento + chore: tarefas de manutenção geral +``` + +Exemplo: `feat(docker): adiciona variante MariaDB` + +--- + +## 11. Regras Gerais + +- Nunca usar `sudo` dentro do Dockerfile — rodar como root é o padrão no build. +- Sempre usar `--no-install-recommends` no `apt-get install`. +- Sempre limpar `apt cache` após instalação (`rm -rf /var/lib/apt/lists/*`). +- Nunca expor senhas em logs ou mensagens de erro. +- O fuso horário padrão é `America/Sao_Paulo`. +- O idioma padrão é `en_US.UTF-8` com suporte a `pt_BR.UTF-8`. diff --git a/configs/apache/apache_default b/configs/apache/apache_default new file mode 100755 index 0000000..f26875f --- /dev/null +++ b/configs/apache/apache_default @@ -0,0 +1,45 @@ + + ServerAdmin webmaster@localhost + + DocumentRoot /var/www/html/public + + Options Indexes FollowSymLinks MultiViews + AllowOverride All + Require all granted + + + + AllowOverride All + Require all granted + + + Alias /phpmyadmin /var/www/phpmyadmin + + Options Indexes FollowSymLinks MultiViews + AllowOverride All + Require all granted + + + Alias /adminer /var/www/adminer + + Options Indexes FollowSymLinks MultiViews + AllowOverride All + Require all granted + + + ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ + + AllowOverride None + Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch + Require all granted + + + ErrorLog ${APACHE_LOG_DIR}/error.log + + LogLevel warn + + CustomLog ${APACHE_LOG_DIR}/access.log combined + + SetEnvIf x-forwarded-proto https HTTPS=on + + diff --git a/configs/apache/apache_envvars.sh b/configs/apache/apache_envvars.sh new file mode 100755 index 0000000..b2ecafa --- /dev/null +++ b/configs/apache/apache_envvars.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# Apache environment variables +export APACHE_RUN_USER=www-data +export APACHE_RUN_GROUP=www-data +export APACHE_PID_FILE=/var/run/apache2/apache2.pid +export APACHE_RUN_DIR=/var/run/apache2 +export APACHE_LOCK_DIR=/var/lock/apache2 +export APACHE_LOG_DIR=/var/log/apache2 diff --git a/configs/mysql/init.sql b/configs/mysql/init.sql new file mode 100755 index 0000000..e56fb57 --- /dev/null +++ b/configs/mysql/init.sql @@ -0,0 +1,17 @@ +-- Initial MySQL setup script +-- Creates default databases and a dedicated user for convenience + +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; diff --git a/configs/mysql/my.cnf b/configs/mysql/my.cnf new file mode 100755 index 0000000..3e80dfc --- /dev/null +++ b/configs/mysql/my.cnf @@ -0,0 +1,19 @@ +[mysqld] +bind-address = 0.0.0.0 +port = 3306 +character-set-server = utf8mb4 +collation-server = utf8mb4_general_ci +skip-networking = 0 +socket = /var/run/mysqld/mysqld.sock +# sql_mode = "" +innodb_file_per_table = 1 +innodb_default_row_format = DYNAMIC +# innodb_strict_mode = 0 + +[client] +port = 3306 +socket = /var/run/mysqld/mysqld.sock +default-character-set = utf8mb4 + +[mysql] +default-character-set = utf8mb4 diff --git a/configs/php/php.ini b/configs/php/php.ini new file mode 100644 index 0000000..842daa8 --- /dev/null +++ b/configs/php/php.ini @@ -0,0 +1,17 @@ +[PHP] +date.timezone = America/Sao_Paulo +memory_limit = 2048M +upload_max_filesize = 2048M +post_max_size = 2048M +max_input_vars = 2000 +max_execution_time = 300 +max_input_time = 300 +display_errors = On +log_errors = On +error_reporting = E_ALL +expose_php = Off +allow_url_fopen = On +default_socket_timeout = 60 +session.gc_maxlifetime = 1440 +realpath_cache_size = 4096K +realpath_cache_ttl = 600 diff --git a/configs/scripts/entrypoint-mariadb.sh b/configs/scripts/entrypoint-mariadb.sh new file mode 100755 index 0000000..40a230c --- /dev/null +++ b/configs/scripts/entrypoint-mariadb.sh @@ -0,0 +1,127 @@ +#!/usr/bin/env bash + +# ------------------------------------------------------------------------- +# SyspanelLamp - Entrypoint (MariaDB) +# Author: Marco Costa & Syspanel (www.syspanel.com.br) +# Creation date: 05/09/2026 +# License: MIT +# ------------------------------------------------------------------------- + +echo "==========================================" +echo " SyspanelLamp - Starting services" +echo "==========================================" +echo " Database: MariaDB" + +DB_ROOT_PASS="${DB_ROOT_PASS:-admin123}" + +# ------------------------------------------------------------------------- +# Fix ownership and permissions of MariaDB 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 +if [ -d "/var/log/mysql" ]; then + chown -R mysql:mysql /var/log/mysql +fi + +# ------------------------------------------------------------------------- +# Initialize MariaDB data directory if needed +# ------------------------------------------------------------------------- +# Lógica: +# 1. Verifica se /var/lib/mysql/mysql/user existe (indicador de init completa) +# 2. Se existe => MariaDB já inicializado, pula init mesmo com outros arquivos +# 3. Se NÃO existe => limpa tudo e inicializa (first boot ou dados corrompidos) +FIRST_BOOT=0 +mkdir -p /var/log/mysql +chown -R mysql:mysql /var/lib/mysql /var/log/mysql + +if [ ! -f "/var/lib/mysql/mysql/user.frm" ]; then + FIRST_BOOT=1 + # Limpa diretório antes de inicializar para evitar conflitos + if [ -n "$(ls -A /var/lib/mysql/ 2>/dev/null)" ]; then + echo ">> WARNING: Invalid or corrupted MariaDB data — cleaning /var/lib/mysql/..." + rm -rf /var/lib/mysql/* + chown -R mysql:mysql /var/lib/mysql + fi + echo ">> Initializing MariaDB data directory (first boot)..." + mariadb-install-db --user=mysql --datadir=/var/lib/mysql --auth-root-authentication-method=socket +else + echo ">> Existing MariaDB data detected — skipping initialization." +fi + +# ------------------------------------------------------------------------- +# Start MariaDB +# ------------------------------------------------------------------------- +echo ">> Starting MariaDB..." +mysqld --user=mysql --datadir=/var/lib/mysql --skip-networking=0 \ + --bind-address=0.0.0.0 --port=3306 \ + --log-bin=/var/log/mysql/mysql-bin.log \ + --pid-file=/var/run/mysqld/mysqld.pid \ + --socket=/var/run/mysqld/mysqld.sock & + +MYSQL_PID=$! +mkdir -p /var/run/mysqld +chown mysql:mysql /var/run/mysqld + +# Wait for MariaDB to be ready (up to 60s) +for i in $(seq 1 60); do + if mysqladmin ping --silent 2>/dev/null; then + echo ">> MariaDB 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 MariaDB root password..." + mariadb -u root -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '${DB_ROOT_PASS}'; FLUSH PRIVILEGES;" 2>/dev/null || true + + echo ">> Creating databases and users..." + mariadb -u root -p"${DB_ROOT_PASS}" 2>/dev/null <<'EOSQL' || \ +mariadb -u root 2>/dev/null <<'EOSQL_NO_PASS' || true +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 +EOSQL_NO_PASS + + echo ">> MariaDB 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 "$@" diff --git a/configs/scripts/entrypoint-mysql.sh b/configs/scripts/entrypoint-mysql.sh new file mode 100755 index 0000000..1a042ae --- /dev/null +++ b/configs/scripts/entrypoint-mysql.sh @@ -0,0 +1,126 @@ +#!/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 "$@" diff --git a/configs/scripts/entrypoint.sh b/configs/scripts/entrypoint.sh new file mode 100755 index 0000000..8aad63d --- /dev/null +++ b/configs/scripts/entrypoint.sh @@ -0,0 +1,126 @@ +#!/usr/bin/env bash + +# ------------------------------------------------------------------------- +# SyspanelLamp - Entrypoint +# Author: Marco Costa & Syspanel (www.syspanel.com.br) +# Creation date: 05/09/2026 +# License: MIT +# ------------------------------------------------------------------------- + +echo "==========================================" +echo " SyspanelLamp - Starting services" +echo "==========================================" +echo " Database: ${DATABASE:-mysql8}" + +DATABASE="${DATABASE:-}" + +# Auto-detect database type if DATABASE is not set +if [ -z "$DATABASE" ]; then + if [ -f "/var/lib/mysql/auto.cnf" ]; then + DATABASE="mysql8" + else + DATABASE="mysql8" + fi + echo " DATABASE auto-detected: $DATABASE" +fi + +DB_ROOT_PASS="${DB_ROOT_PASS:-admin123}" + +# ------------------------------------------------------------------------- +# Fix ownership and permissions of data directories (bind mount safety) +# ------------------------------------------------------------------------- +if [ "$DATABASE" = "mysql8" ] || [ "$DATABASE" = "mariadb" ]; then + 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 +fi + +# ------------------------------------------------------------------------- +# MySQL 8.0 / MariaDB startup +# ------------------------------------------------------------------------- +start_mysql() { + echo ">> Starting MySQL/MariaDB..." + mysqld --user=mysql --datadir=/var/lib/mysql --skip-networking=0 --bind-address=0.0.0.0 --port=3306 & + MYSQL_PID=$! + + for i in $(seq 1 60); do + if mysqladmin ping --silent 2>/dev/null; then + echo ">> MySQL/MariaDB is ready." + return 0 + fi + sleep 1 + done + echo ">> ERROR: MySQL/MariaDB failed to start." + return 1 +} + +init_mysql_first_boot() { + echo ">> [First boot] Setting root password and creating databases..." + mysql -u root -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '${DB_ROOT_PASS}'; FLUSH PRIVILEGES;" 2>/dev/null || \ + mysql -u root -e "SET PASSWORD FOR 'root'@'localhost' = PASSWORD('${DB_ROOT_PASS}');" 2>/dev/null || true + + 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 || \ + mysql -u root < /docker-entrypoint-initdb.d/init.sql 2>/dev/null || true + fi + echo ">> MySQL/MariaDB first boot setup complete." +} + +# ------------------------------------------------------------------------- +# Initialize and start database +# ------------------------------------------------------------------------- +FIRST_BOOT=0 + +if [ "$DATABASE" = "mysql8" ] || [ "$DATABASE" = "mariadb" ]; then + # Initialize data directory if not yet initialized or corrupted + if [ ! -f "/var/lib/mysql/auto.cnf" ]; then + 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/MariaDB data directory..." + mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysql + FIRST_BOOT=1 + elif [ ! -d "/var/lib/mysql/mysql/system" ] || [ -z "$(ls -A /var/lib/mysql/mysql/ 2>/dev/null)" ]; then + echo ">> WARNING: MySQL/MariaDB 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 + + if [ "$FIRST_BOOT" = "1" ]; then + init_mysql_first_boot + fi +else + echo ">> ERROR: Unknown DATABASE type: $DATABASE" + echo ">> Supported: mysql8, mariadb" + exit 1 +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 (DB: ${DATABASE})." +exec "$@"