{"id":35264575,"url":"https://github.com/allysonsilva/blog-docker","last_synced_at":"2026-04-11T15:40:24.550Z","repository":{"id":170514439,"uuid":"621983022","full_name":"allysonsilva/blog-docker","owner":"allysonsilva","description":"🐳 Docker utilizado no meu site / blog pessoal","archived":false,"fork":false,"pushed_at":"2024-08-18T19:32:14.000Z","size":1635,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-08-19T03:44:50.883Z","etag":null,"topics":["ci","continuous-delivery","deploy","docker","docker-compose","frankenphp","grafana","laravel","laravel-octane","mysql","php","redis","soketi","traefik"],"latest_commit_sha":null,"homepage":"http://alysonsilva.dev","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/allysonsilva.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2023-03-31T20:22:17.000Z","updated_at":"2024-08-18T19:32:17.000Z","dependencies_parsed_at":null,"dependency_job_id":"21f26ffa-ed28-4e79-896e-08ddbfc42b6a","html_url":"https://github.com/allysonsilva/blog-docker","commit_stats":null,"previous_names":["allysonsilva/blog-docker"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/allysonsilva/blog-docker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/allysonsilva%2Fblog-docker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/allysonsilva%2Fblog-docker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/allysonsilva%2Fblog-docker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/allysonsilva%2Fblog-docker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/allysonsilva","download_url":"https://codeload.github.com/allysonsilva/blog-docker/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/allysonsilva%2Fblog-docker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31686141,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-11T13:07:20.380Z","status":"ssl_error","status_checked_at":"2026-04-11T13:06:47.903Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5: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":["ci","continuous-delivery","deploy","docker","docker-compose","frankenphp","grafana","laravel","laravel-octane","mysql","php","redis","soketi","traefik"],"created_at":"2025-12-30T09:55:36.217Z","updated_at":"2026-04-11T15:40:24.543Z","avatar_url":"https://github.com/allysonsilva.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n    \u003cbr\u003e\n    \u003cimg src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Laravel.svg/1200px-Laravel.svg.png\" width=\"50\"/\u003e\n    \u003cimg src=\"https://cdn.jsdelivr.net/gh/devicons/devicon/icons/grafana/grafana-original.svg\" width=\"50\"/\u003e\n    \u003cimg src=\"https://cdn.jsdelivr.net/gh/devicons/devicon/icons/mongodb/mongodb-original.svg\" width=\"50\"/\u003e\n    \u003cimg src=\"https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/mysql/mysql-original-wordmark.svg\" width=\"50\"/\u003e\n    \u003cimg src=\"https://blog.netdata.cloud/img/logo600x600.png\" width=\"50\"/\u003e\n    \u003cimg src=\"https://cdn.jsdelivr.net/gh/devicons/devicon/icons/php/php-plain.svg\" width=\"50\"/\u003e\n    \u003cimg src=\"https://cdn.worldvectorlogo.com/logos/portainer.svg\" width=\"50\"/\u003e\n    \u003cimg src=\"https://cdn.jsdelivr.net/gh/devicons/devicon/icons/redis/redis-plain.svg\" width=\"50\"/\u003e\n    \u003cimg src=\"https://upload.wikimedia.org/wikipedia/commons/1/1b/Traefik.logo.png\" width=\"50\"/\u003e\n    \u003cimg src=\"https://raw.githubusercontent.com/louislam/uptime-kuma/master/public/icon.svg\" width=\"50\"/\u003e\n    \u003cbr/\u003e\n    Blog Laravel Dockerized\n\u003c/h1\u003e\n\n\u003cbr/\u003e\n\n\u003e 🐳 Docker utilizado na execução do meu site / blog pessoal.\n\nUma coleção de ferramentas, serviços e imagens executados em docker: **Laravel**, **Laravel Octane**, **FrankenPHP**,  **Grafana**, **MongoDB**, **MySQL**, **Netdata**, **Php**, **Portainer**, **Prometheus**, **Redis**, [**Soketi**](https://docs.soketi.app), **Traefik** e [**Uptime Kuma**](https://github.com/louislam/uptime-kuma).\n\n\u003cimg src=\"./assets/images/logos/laravel-octane.svg\" width=\"200\"/\u003e\n\n## Estrutura do Repositório\n\n```bash\ntree --sort=name --dirsfirst -a -I \".git|.DS_Store\"\n```\n\n```\n.\n├── grafana\n│   ├── datasources\n│   │   └── ds-prometheus.yml\n│   ├── .env.container\n│   └── docker-compose.yml\n├── mongodb\n│   ├── .env.container\n│   ├── docker-compose.yml\n│   └── mongod.conf\n├── mysql\n│   ├── scripts\n│   │   ├── init.sh\n│   │   └── init.sql\n│   ├── ssl\n│   │   └── .gitignore\n│   ├── .env.container\n│   ├── docker-compose.yml\n│   └── my.cnf\n├── netdata\n│   ├── configs\n│   │   ├── alarms\n│   │   │   ├── cgroups.conf\n│   │   │   ├── cpu.conf\n│   │   │   ├── mysql.conf\n│   │   │   └── ram.conf\n│   │   ├── modules\n│   │   │   └── go.d\n│   │   │       ├── mysql.conf\n│   │   │       ├── redis.conf\n│   │   │       └── traefik.conf\n│   │   ├── orchestrators\n│   │   │   └── go.d.conf\n│   │   ├── health.conf\n│   │   └── netdata.conf\n│   └── docker-compose.yml\n├── php\n│   ├── configs\n│   │   ├── conf.d\n│   │   │   └── opcache.ini\n│   │   ├── queue\n│   │   │   ├── templates\n│   │   │   │   ├── laravel-horizon.conf.tpl\n│   │   │   │   └── laravel-worker.conf.tpl\n│   │   │   └── supervisord.conf\n│   │   ├── php-local.ini\n│   │   └── php-production.ini\n│   ├── services\n│   │   ├── app\n│   │   │   ├── .env.container\n│   │   │   └── docker-compose.yml\n│   │   ├── queue\n│   │   │   ├── .env.container\n│   │   │   └── docker-compose.yml\n│   │   └── scheduler\n│   │       ├── .env.container\n│   │       └── docker-compose.yml\n│   ├── Dockerfile\n│   └── docker-entrypoint.sh\n├── portainer\n│   └── docker-compose.yml\n├── prometheus\n│   ├── configs\n│   │   └── prometheus.yaml\n│   └── docker-compose.yml\n├── redis\n│   ├── docker-compose.yml\n│   └── redis.conf\n├── scripts\n│   ├── cloudflare-ips-ufw.sh\n│   ├── deploy-new-version.sh\n│   └── self-signed-SSL.sh\n├── soketi\n│   ├── .env.container\n│   └── docker-compose.yml\n├── traefik\n│   ├── dynamic\n│   │   ├── 10-tls.yml\n│   │   ├── app-service.yml\n│   │   ├── dashboard.yml\n│   │   ├── middlewares.yml\n│   │   ├── routers.yml\n│   │   └── services.yml\n│   ├── letsencrypt\n│   │   └── .gitignore\n│   ├── .gitignore\n│   └── docker-compose.yml\n├── uptime\n│   └── docker-compose.yml\n├── .dockerignore\n├── .editorconfig\n├── .env.compose\n├── .gitignore\n├── LICENSE\n├── Makefile\n├── README.md\n├── blog-bockerized.service\n└── docker-compose.yml\n```\n\n## 🔧 Configuração Inicial\n\n### ⬇️ Clonar o repositório\n\nDentro do GIT de um projeto em _Laravel Octane_ no root do projeto, baixe esse mesmo repositório para uma pasta chamada `docker` com o seguinte comando:\n\n```\n$ git clone https://github.com/allysonsilva/blog-docker docker \u0026\u0026 cd docker\n```\n\n### 🗂️ Organização\n\n- A pasta de `docker` deve estar no root do projeto / aplicação em Laravel.\n    - O nome da pasta pode ser alterado na env de `DOCKER_FOLDER` no arquivo de `.env` dentro da pasta `docker`.\n\nDeve estar como da seguinte forma:\n\n```\n.\n└── /var/www/app\n                ├── app\n                ├── bootstrap\n                ├── config\n                ├── database\n                ├── docker \u003c-------\n                └── ...\n```\n\n### 🪡 Comandos / Instruções\n\n- Dentro da pasta de `docker`, execute `make docker/config-env docker_folder=./docker` para criar o arquivo `.env` com os valores corretamente.\n- Copie o arquivo de `.dockerignore` para a pasta root da aplicação com `cp .dockerignore ./../`.\n- Abrir o arquivo `docker/.env` e editar as variáveis de `APP_DOMAIN` e `APP_SECONDARY_DOMAIN` para o valor do domínio da aplicação para que os certificados da Let's Encrypt possam ser criados por meio do desafio DNS com Cloudflare.\n    - A renovação dos certificados acontecem de forma automática pelo Traefik.\n- Editar a variável `CF_DNS_API_TOKEN` seguindo a recomendação https://go-acme.github.io/lego/dns/cloudflare/#api-tokens.\n\n## 🐳 Execução dos Containers Docker\n\n_Obs: Todos os comandos a seguir devem ser executados de dentro da pasta de `docker`._\n\nExecute `docker compose up` para que possam ser criados networks do docker que serão usandos nos containers da stack.\n\n### 🏗️ Build da imagem da aplicação\n\n*Apenas na primeira execução do build*, deve-se adicionar o parâmetro de `no_cache_from=true`, nas demais build, esse parâmetro não é obrigatório / necessário.\n\nDentro da pasta `docker` execute os seguintes comandos:\n\n```bash\n# Build das multi-stage parts\nmake docker/app/vendor/build no_cache_from=true\nmake docker/app/frontend/build no_cache_from=true\nmake docker/app/dependencies/build no_cache_from=true\n\n# Build do APP\nmake docker/app/build\n```\n\n### Executando o container do **MySQL**\n\nExecuta o script para criar os certificados auto-assinados:\n\n```bash\n./docker/scripts/self-signed-SSL.sh --service=mysql --cert-server-host=mysql\n```\n\nAbrir o arquivo de `docker/mysql/.env` e editar os valores das credencias de login do MySQL.\n\nSubir o container com `make docker/database/up` e para fazer _healthcheck_ utilize `make docker/healthcheck container=app_mysql` onde `app_mysql` é o nome do container do MySQL.\n\n### Executando o container do **Redis**\n\nAbrir o arquivo de `docker/redis/redis.conf` e editar a diretiva de `requirepass` para o password de sua preferência.\n\nExecutar `make docker/redis/up` com health em `make docker/healthcheck container=app_redis`.\n\n### Executando o container do **Traefik**\n\nExecutar os seguintes comandos:\n\n```bash\nmake docker/service/up context=traefik services=\"traefik-whoami\"\nmake docker/traefik/up\n```\n\n### Executando o container do [Soketi](https://docs.soketi.app) 📡\n\n```bash\nmake docker/service/up context=soketi\n```\n\n### Executando o container do Portainer\n\n```bash\nmake docker/service/up context=portainer\n```\n\n### Executando o container do Prometheus e Grafana\n\n```bash\nmake docker/service/up context=prometheus\nmake docker/service/up context=grafana\n```\n\n### Executando o container do Netdata\n\n```bash\nVIRTUALIZATION=$(systemd-detect-virt -v) make docker/service/up context=netdata\n```\n\n### Executando o container do [Uptime Kuma](https://github.com/louislam/uptime-kuma)\n\n```bash\nmake docker/service/up context=uptime\n```\n\n### Executando o container do **APP** 🚀\n\n_Ver arquivo de `docker/php/services/app/.env` e editar as variáveis de ambiente conforme necessário._\n\nO container do aplicativo executa o **LARAVEL OCTANE** com **FrankenPHP**, produzindo o seguinte comando principal: `php artisan octane:frankenphp`.\n\nExecute com: `./scripts/deploy-new-version.sh`\n\n## Executando o container da **QUEUE** 🚦\n\nPara executar o _container de fila_, é o seguinte comando: `make docker/queue/up with_version=true`.\n\nO processo principal do container executará o comando `supervisord --nodaemon --configuration /etc/supervisor/supervisord.conf`.\n\n## Executando o container da **SCHEDULER** ⏲️\n\nPara executar o _container de agendamento_, é o seguinte comando: `make docker/scheduler/up with_version=true`.\n\nO processo principal do container executará o comando `crond -l 2 -f -L /var/log/cron.log`.\n\n## Screenshots de Algumas Ferramentas\n\n**Netdata**\n![Netdata](assets/images/screenshots/Netdata.png)\n\n**Grafana**\n![Grafana](assets/images/screenshots/Grafana.png)\n\n**Uptime Kuma**\n![Uptime Kuma](\u003cassets/images/screenshots/Uptime Kuma.png\u003e)\n\n**Traefik**\n![Traefik](assets/images/screenshots/Traefik.png)\n\n## 📝  Changelog\n\nPlease see [CHANGELOG](CHANGELOG.md) for more information about the changes on this package.\n\n## 🤝  Contributing\n\nPlease see [CONTRIBUTING](CONTRIBUTING.md) for details.\n\n## License\n\nThe MIT License (MIT). Please see [License File](LICENSE.md) for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fallysonsilva%2Fblog-docker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fallysonsilva%2Fblog-docker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fallysonsilva%2Fblog-docker/lists"}