First Commit

This commit is contained in:
marco
2026-09-06 19:35:42 -03:00
commit 006fe050b0
13 changed files with 1280 additions and 0 deletions
+138
View File
@@ -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"]
+145
View File
@@ -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"]
Executable
+21
View File
@@ -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.
Executable
+307
View File
@@ -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**
Executable
+184
View File
@@ -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)
```
<tipo>(<escopo>): <descrição>
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`.
+45
View File
@@ -0,0 +1,45 @@
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/public
<Directory />
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Require all granted
</Directory>
<Directory "/var/www/html">
AllowOverride All
Require all granted
</Directory>
Alias /phpmyadmin /var/www/phpmyadmin
<Directory /var/www/phpmyadmin>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Require all granted
</Directory>
Alias /adminer /var/www/adminer
<Directory /var/www/adminer>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Require all granted
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
SetEnvIf x-forwarded-proto https HTTPS=on
</VirtualHost>
+8
View File
@@ -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
+17
View File
@@ -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;
+19
View File
@@ -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
+17
View File
@@ -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
+127
View File
@@ -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 "$@"
+126
View File
@@ -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 "$@"
+126
View File
@@ -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 "$@"