{"id":24152363,"url":"https://github.com/antonio-phpfullstack/skeleton-webserver-apache-php-mysql","last_synced_at":"2026-02-22T09:39:02.199Z","repository":{"id":260558087,"uuid":"881654456","full_name":"antonio-phpfullstack/skeleton-webserver-apache-php-mysql","owner":"antonio-phpfullstack","description":null,"archived":false,"fork":false,"pushed_at":"2025-01-08T04:16:54.000Z","size":67,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-28T23:49:38.430Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://phpfullstack.com.br","language":"Dockerfile","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/antonio-phpfullstack.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-11-01T01:20:28.000Z","updated_at":"2025-01-08T04:14:03.000Z","dependencies_parsed_at":"2025-01-07T13:37:47.666Z","dependency_job_id":"61ce8d08-1634-4246-827d-b69f06e9f8aa","html_url":"https://github.com/antonio-phpfullstack/skeleton-webserver-apache-php-mysql","commit_stats":null,"previous_names":["antonio-phpfullstack/esqueleto-webserver-apache-php","antonio-phpfullstack/esqueleto-webserver-apache-php-mysql","antonio-phpfullstack/skeleton-webserver-apache-php-mysql"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/antonio-phpfullstack/skeleton-webserver-apache-php-mysql","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/antonio-phpfullstack%2Fskeleton-webserver-apache-php-mysql","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/antonio-phpfullstack%2Fskeleton-webserver-apache-php-mysql/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/antonio-phpfullstack%2Fskeleton-webserver-apache-php-mysql/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/antonio-phpfullstack%2Fskeleton-webserver-apache-php-mysql/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/antonio-phpfullstack","download_url":"https://codeload.github.com/antonio-phpfullstack/skeleton-webserver-apache-php-mysql/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/antonio-phpfullstack%2Fskeleton-webserver-apache-php-mysql/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29708360,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-22T05:59:28.568Z","status":"ssl_error","status_checked_at":"2026-02-22T05:58:46.208Z","response_time":110,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-01-12T10:15:47.276Z","updated_at":"2026-02-22T09:39:02.170Z","avatar_url":"https://github.com/antonio-phpfullstack.png","language":"Dockerfile","readme":"# Esqueleto Gratuito Apache/PHP/MySQL/PHPMyAdmin\n\n## Ao final do projeto você terá um ambiente:\n- PHP 8.4, versão mais estável\n- Apache, versão mais estável\n- MySQL 8.1, versão mais estável\n- PHPMyAdmin, versão mais estável\n- Node.js, versão 20 mais estável\n- Redis, versão 8.0-M02\n\n## Diversos branches no repositório\n- Cada branch neste repositório corresponde a uma versão específica do PHP, configurada com as mesmas extensões e dependências\n- A branch principal contém a última versão estável do PHP, atualmente PHP 8.4\n\n**Links Úteis:**\n\n- :tada: [Site: https://phpfullstack.com.br](https://phpfullstack.com.br/)\n\n\n## Passo a passo para executar o projeto\n**Clone o projeto**\n```sh\ngit clone https://github.com/antonio-phpfullstack/esqueleto-webserver-apache-php-mysql esqueleto-webserver-apache-php-mysql\n```\n```sh\ncd esqueleto-webserver-apache-php-mysql/\n```\n\n\n**No arquivo .env, do diretório raiz, altere o nome do usuário e grupo para os valores correspondente do host que será \nutilizado, ex: `USUARIO=antonio...`**\n\n```sh\nUSUARIO=seu_usuario_linux\nGRUPO=seu_grupo_linux\nUID=1000\nGID=1000\n```\n\n**Suba os contêineres do projeto**\n```sh\ndocker-compose up -d\n```\n\nOU\n\n```sh\ndocker compose up -d\n```\n\n\n## Acesse o projeto php back-end\n- :rocket: [http://localhost:8000](http://localhost:8000)\n\n## Acesse o projeto front-end\n- :rocket: [http://localhost:8001](http://localhost:8001)\n\n\n## Acesse a plataforma do PhpMyAdmin\n- :brain: ***Host***: [http://localhost:8002](http://localhost:8002)\n- :man: ***Usuário***: noreply@phpfullstack.com.br\n- :key: ***Senha***: admin\n\n\n## Observações importantes\n- Depois que os contêineres estiverem em execução você terá um ambiente front-end e um ambiente back-end\n- O nome do serviço do ambiente back-end, no arquivo `docker-compose.yml`, é `backend`\n- O nome do serviço do ambiente front-end, no arquivo `docker-compose.yml`, é `frontend`\n- Depois que os contêineres estiverem em execução, acesse o ambiente back-end com o seguinte comando:\n```sh\ndocker-compose exec backend bash\n```\nOU\n```sh\ndocker compose exec backend bash\n```\n- Depois que os contêineres estiverem em execução acesse o ambiente front-end com o seguinte comando:\n```sh\ndocker-compose exec frontend bash\n```\nOU\n```sh\ndocker compose exec front bash\n```\n- Caso você tenha seguido corretamente essa documentação, você terá um usuário e seu respectivo grupo no ambiente back-end com o mesmo nome de usuário e grupo da sua máquina\n- Caso você tenha seguido corretamente essa documentação, você terá um usuário e seu respectivo grupo no ambiente front-end com o mesmo nome de usuário e grupo da sua máquina\n- Mesmo que você tenha seguido corretamente essa documentação, ao acessar o ambiente front-end você entrará logado com o usuário `root`\n- Caso queira executar algum comando que envolva alteração de arquivos ou diretórios no contêiner relativo ao serviço `frontend`, após acessar o ambiente front-end, troque o usuário `root` para o usuário da sua máquina antes de executar qualquer comando\n```sh\nsu - seu_usuario_linux\n```\n- Você acessará internamente o contêiner do ambiente back-end para executar o comando `composer` do php, por exemplo\n- Você acessará internamente o contêiner do ambiente front-end para executar o comando `npm`, por exemplo\n- Em ambos os casos serão criados arquivos e/ou diretórios, por isso da importância do nome do usuário do contêiner ser o mesmo da sua máquina\n- Para voltar ao usuário `root`, no ambiente front-end, ou sair do terminal do contêiner, tanto no ambiente front-end quanto no ambiente back-end execute o comando abaixo:\n```sh\nexit\n```\n- Dentro do contêiner back-end, os comandos serão executados por padrão, no diretório `/var/www/`\n- Dentro do contêiner back-end, o diretório padrão do apache está configurado para o diretório `/var/www/public/`\n- Dentro do contêiner back-end, essa diferenciação do diretório de execução dos comandos para o diretório padrão do apache foi realizada devido à diferentes plataformas requisitarem diferentes diretórios padrão web\n- Plataformas usam caminhos de diretórios diferentes de execução para o WebServer(ex.: Laravel que usa o `public`)\n- Dentro do contêiner back-end a configuração do diretório padrão do Apache pode ser alterada no arquivo `Dockerfile`. Esse arquivo está localizado no diretório: `/docker/services/backend/Dockerfile`. Encontre a linha que contém o comando abaixo\n```sh\nENV APACHE_DOCUMENT_ROOT=/var/www/public\n```\n## Recomendações sobre Xdebug\nA configuração recomendada para o Xdebug encontra-se no arquivo `/docker/service/backend/settings/php/custom.ini`\n```sh\nxdebug.mode=debug\nxdebug.discover_client_host=false\nxdebug.client_host=172.20.0.1\nxdebug.client_port=9003\n```\nVamos entender o código acima. Foi colocado o Xdebug no modo `debug`. Após essa configuração devemos informar ao Xdebug,\natravés da diretiva `xdebug.discover_client_host`, para não tentar descobrir a máquina client. Mas o porquê disso? O \nXdebug tentará estabelecer uma conexão local(no localhost) na porta `9003`, e apenas desabilitaremos essa tentativa de \nconexão nesse endereço/porta. Vamos raciocinar um pouco. Com quem o Xdebug vai se conectar? Com a IDE de trabalho. Onde \na IDE está? Na máquina host local, que N-Â-O é acessada pelo endereço localhost de dentro do contêiner. Então, estando \nno contêiner, qual o endereço do host local? O endereço é a interface de rede virtual criado pelo\nDocker, que é utilizada basicamente na comunicação entre os contêineres e entre um contêiner e a máquina host. Para uma\nboa configuração você deverá alterar o IP contido no arquivo `/docker/service/backend/settings/php/custom.ini`\n(`172.20.0.1`). Certamente no seu ambiente será outro valor. Qual? Continue lendo esse mini-tutorial.\n\nPrecisamos ter cuidado caso o host seja um Windows ou Mac. Podemos configurar `xdebug.client_host` com o \nseguinte valor:\n```sh\nxdebug.client_host=host.docker.internal\n```\nNo entanto, `host.docker.internal` não funciona no sistema operacional Linux em versões desatualizadas do kernel, ou com o Docker\ndesatualizado. Ainda assim, mesmo que o Kernel do Linux e o Docker estejam atualizados, possa ser que não funcione.\n\nPara contornar essa limitação do Linux, você pode encontrar na internet alguns tutoriais com procedência duvidosa. Esses \ntutoriais pedem para realizar uma alteração específica no `docker-compose.yml` com o seguinte código:\n```sh\nextra_hosts:\n- \"host.docker.internal:host-gateway\"\n```\nApós a alteração no arquivo `docker-compose.yml`, o tutorial vai solicitar que você altere o arquivo php.ini, representado\nnesse projeto pelo arquivo `/docker/service/backend/settings/php/custom.ini`:\n```sh\nxdebug.client_host=host.docker.internal\n```\nE dessa forma você teria uma única configuração para Windows/Linux/Mac. Só que isso não me agradou 100%. Sinceramente é \numa gambiarra. Vamos entender... \n\nO `docker0` é a interface de rede interna virtual padrão do Docker. Ela que resolve num\ncontêiner quando você acessa outro contêiner pelo seu nome de serviço definido no `docker-compose.yml`. Como assim? Em um \ncenário como o nosso, foi definido dois serviços no `docker-compose.yml`: `frontend` e `backend`. Vamos dizer que não \ntivéssemos criado nenhuma rede interna, no caso criamos(criamos a rede `apache-php`, mas vamos dizer que não a tivéssemos \ncriado). Caso estejamos dentro do contêiner relativo ao serviço `frontend`, e queiramos ver a resposta do servidor contido \nno serviço `backend` poderíamos digitar o seguinte comando dentro do contêiner relativo ao serviço `frontend`:\n```sh\ncurl backend\n```\nEntão o servidor contido no contêiner associado ao serviço `backend` entregará uma resposta. Quem foi o responsável\npor efetivar a comunicação de rede entre os contêineres? A interface de rede interna. Caso não tivéssemos criado nenhuma \nrede, no arquivo `docker-compose.yml`, o responsável por essa comunicação seria o docker0. Geralmente o `docker0` tem o\nendereço `172.17.0.1`\n\nQuando configuramos um novo network no Docker, que não é o padrão `bridge`, geralmente não é utilizada a interface \n`docker0`. Então é criada uma nova interface de rede interna para esse novo network. No nosso projeto, no arquivo \n`docker-compose.yml` criamos um novo network chamado `apache-php`. Logo será usada uma nova interface de rede interna para \ncomunicação entre os contêineres e entre um contêiner e o host local. Como temos agora uma nova interface de rede virtual, \nentão será associado um novo IP a essa interface de rede.\n\nPara saber qual IP o Docker associou para a nova interface de rede virtual, use o comando abaixo:\n```sh\ndocker container inspect nome-do-contêiner\n```\nE procure por `Gateway`. Esse é o IP que você deve utilizar no arquivo `/docker/service/backend/settings/php/custom.ini`. Mas por que o código que foi mostrado\nanteriormente no `docker-compose.yml`, e vemos em diversos tutoriais, é uma gambiarra? Vamos analisar o código novamente:\n```sh\nextra_hosts:\n- \"host.docker.internal:host-gateway\"\n```\nEsse código define um IP ao endereço `host.docker.internal`. O valor `host-gateway` é atribuído ao `host.docker.internal` informando o IP do `docker0`. O IP que é \nassociado ao `host.docker.internal` é o mesmo IP do `docker0`.\nMas perceba que não utilizamos como rede padrão a `bridge`. Utilizamos uma nova que foi definido no arquivo\n`docker-compose.yml`. Logo devemos utilizar o IP da interface de rede virtual do network criado pelo `docker-compose.yml`.\nNo caso criamos a rede `apache-php`.\"Não vejo com bons olhos\" utilizar o IP do `docker0`.\n\nEntão basta você inspecionar o contêiner `backend`.\n```sh\ndocker container inspect nome-do-contêiner\n```\ne procurar por `Gateway`:\n```sh\n\"Gateway\": \"172.20.0.1\"\n```\nNesse caso o IP da interface virtual é `172.20.0.1`. Mas pode variar. É esse IP que você deve colocar no custom.ini\n```sh\nxdebug.client_host=127.20.0.1\n```\nDepois de realizada a alteração no `/docker/service/backend/settings/php/custom.ini` você deverá reconstruir a imagem do serviço `backend` através do comando abaixo:\n```sh\ndocker compose build --no-cache backend\n```\nE depois digitar o comando abaixo para substituir o novo contêiner\n```sh\ndocker compose up --force-recreate -d backend\n```\nAo invés de procurar manualmente, e passar por todo o processo de criação de um novo contêiner, esse processo pode ser \nfeito com um script. Mas foge do escopo da finalidade desse repositório. Caso opte por utilizar a interface da rede \n`docker0` até pode funcionar, mas não estará completamente correto. Não foi encontrado nenhuma diretiva Docker que traga\no IP da interface de rede utilizada pelo contêiner.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fantonio-phpfullstack%2Fskeleton-webserver-apache-php-mysql","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fantonio-phpfullstack%2Fskeleton-webserver-apache-php-mysql","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fantonio-phpfullstack%2Fskeleton-webserver-apache-php-mysql/lists"}