Skip to content

Commit dce6130

Browse files
committed
Adicionar suporte a multi-arquitetura no Docker com QEMU e Buildx, atualizar workflows do GitHub Actions e melhorar a documentação
1 parent 2139212 commit dce6130

7 files changed

Lines changed: 199 additions & 64 deletions

File tree

.github/workflows/docker-image.yml

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,25 +24,43 @@ jobs:
2424
submodules: recursive # Equivalente ao GIT_SUBMODULE_STRATEGY
2525
token: ${{ secrets.GITHUB_TOKEN }}
2626

27+
- name: Set up QEMU
28+
uses: docker/setup-qemu-action@v3
29+
30+
- name: Set up Docker Buildx
31+
uses: docker/setup-buildx-action@v3
32+
2733
- name: Log in to GitHub Container Registry
28-
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
34+
uses: docker/login-action@v3
35+
with:
36+
registry: ghcr.io
37+
username: ${{ github.actor }}
38+
password: ${{ secrets.GITHUB_TOKEN }}
2939

3040
- name: Convert repository and tag name to lowercase
3141
id: lowercase_names
3242
run: |
3343
echo "repository_name=$(echo ${{ github.repository }} | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV
3444
echo "tag_name=$(echo ${{ github.ref_name }} | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV
3545
36-
- name: Build Docker image
37-
run: docker build --build-arg APP_VERSION=${{ env.tag_name }} --build-arg GIT_COMMIT=$(git rev-parse --short HEAD) -t ghcr.io/${{ env.repository_name }}:${{ env.tag_name }} .
38-
39-
- name: Push Docker image
46+
- name: Compose image tags
47+
id: tags
4048
run: |
41-
docker push ghcr.io/${{ env.repository_name }}:${{ env.tag_name }}
49+
TAGS="ghcr.io/${{ env.repository_name }}:${{ env.tag_name }}"
4250
if [ "${{ github.event_name }}" = "release" ]; then
43-
docker tag ghcr.io/${{ env.repository_name }}:${{ env.tag_name }} ghcr.io/${{ env.repository_name }}:latest
44-
docker push ghcr.io/${{ env.repository_name }}:latest
51+
TAGS="$TAGS,ghcr.io/${{ env.repository_name }}:latest"
4552
fi
53+
echo "tags=$TAGS" >> $GITHUB_OUTPUT
54+
55+
- name: Build and push Docker image (multi-arch)
56+
uses: docker/build-push-action@v5
57+
with:
58+
context: .
59+
platforms: linux/amd64,linux/arm64
60+
push: true
61+
tags: ${{ steps.tags.outputs.tags }}
62+
cache-from: type=gha
63+
cache-to: type=gha,mode=max
4664

4765
update-services:
4866
runs-on: ubuntu-latest

.github/workflows/release-and-build.yml

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -169,10 +169,10 @@ jobs:
169169
170170
**Run the container:**
171171
\`\`\`bash
172-
docker run -d -p 8080:3000 --env-file .env ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:$NEW_VERSION
172+
docker run -d -p 80:80 ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:$NEW_VERSION
173173
\`\`\`
174174
175-
**Platforms**: linux/amd64
175+
**Platforms**: linux/amd64, linux/arm64
176176
177177
### 📋 Release Info
178178
- **Type**: $VERSION_TYPE release
@@ -200,10 +200,13 @@ jobs:
200200
fetch-depth: 0
201201
token: ${{ secrets.GITHUB_TOKEN }}
202202

203+
- name: 🧰 Set up QEMU
204+
uses: docker/setup-qemu-action@v3
205+
203206
- name: 🏗️ Set up Docker Buildx
204207
uses: docker/setup-buildx-action@v3
205208
with:
206-
platforms: linux/amd64
209+
platforms: linux/amd64,linux/arm64
207210

208211
- name: 🔐 Login to Container Registry
209212
uses: docker/login-action@v3
@@ -236,9 +239,9 @@ jobs:
236239
type=raw,value=${{ steps.semantic_tags.outputs.major_version }}
237240
type=raw,value=latest,enable={{is_default_branch}}
238241
labels: |
239-
org.opencontainers.image.title=Fishboard
240-
org.opencontainers.image.description=Modern project management dashboard
241-
org.opencontainers.image.vendor=Abstrakt Agencia
242+
org.opencontainers.image.title=PHPNetMap
243+
org.opencontainers.image.description=Network device monitoring with SNMP
244+
org.opencontainers.image.vendor=Marcelo Matos
242245
org.opencontainers.image.licenses=MIT
243246
244247
- name: 🔍 Build and test Docker image
@@ -254,7 +257,7 @@ jobs:
254257
uses: docker/build-push-action@v5
255258
with:
256259
context: .
257-
platforms: linux/amd64
260+
platforms: linux/amd64,linux/arm64
258261
push: true
259262
tags: ${{ steps.meta.outputs.tags }}
260263
labels: ${{ steps.meta.outputs.labels }}
@@ -269,7 +272,7 @@ jobs:
269272
echo "## ✅ Release $NEW_VERSION Created and Published!" >> $GITHUB_STEP_SUMMARY
270273
echo "" >> $GITHUB_STEP_SUMMARY
271274
echo "**🏷️ Version**: $NEW_VERSION" >> $GITHUB_STEP_SUMMARY
272-
echo "**🌍 Platforms**: linux/amd64" >> $GITHUB_STEP_SUMMARY
275+
echo "**🌍 Platforms**: linux/amd64, linux/arm64" >> $GITHUB_STEP_SUMMARY
273276
echo "" >> $GITHUB_STEP_SUMMARY
274277
echo "### 🐳 Docker Tags Available" >> $GITHUB_STEP_SUMMARY
275278
echo "- \`${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:$NEW_VERSION\` (full version)" >> $GITHUB_STEP_SUMMARY

Dockerfile

Lines changed: 47 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,56 @@
1-
# A basic config. for phpnetmap
1+
# PHPNetMap — imagem self-contained equivalente ao tutum/php-apache.
2+
# Base oficial multi-arch (linux/amd64 + linux/arm64) com Apache + mod_php.
3+
FROM php:7.4-apache
24

3-
FROM tutum/apache-php
4-
5-
MAINTAINER Marcelo Matos <marcelo.matos@ufrr.br>
5+
LABEL maintainer="Marcelo Matos <marcelo.matos@ufrr.br>"
66

7+
# Dependências de runtime (SNMP CLI + daemon, SQLite, htpasswd) e as libs de
8+
# desenvolvimento usadas só para compilar as extensões PHP (purgadas em seguida).
79
RUN apt-get update \
8-
&& apt-get install -y snmp php5-snmp php5-sqlite sqlite3 snmpd git apache2-utils \
10+
&& apt-get install -y --no-install-recommends \
11+
snmp snmpd sqlite3 apache2-utils \
12+
libsnmp-dev libsqlite3-dev \
13+
&& docker-php-ext-install snmp pdo_sqlite \
14+
&& apt-get purge -y --auto-remove libsnmp-dev libsqlite3-dev \
915
&& apt-get clean \
1016
&& rm -rf /var/lib/apt/lists/*
1117

12-
# code
13-
RUN rm -rf /app && cd / && git clone https://github.com/marcelofmatos/phpnetmap.git app
18+
# Mesmo error_reporting do container original (suprime notices/deprecated).
19+
RUN { \
20+
echo 'error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE'; \
21+
echo 'disable_functions ='; \
22+
} > /usr/local/etc/php/conf.d/custom.ini
1423

15-
# volume for database and config
16-
VOLUME /app/protected/data
24+
# Apache: DocumentRoot em /app e AllowOverride All (rewrite e auth via .htaccess).
25+
RUN a2enmod rewrite \
26+
&& sed -ri 's!/var/www/html!/app!g; s!/var/www!/app!g' \
27+
/etc/apache2/sites-available/*.conf /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf \
28+
&& { \
29+
echo '<Directory /app>'; \
30+
echo ' AllowOverride All'; \
31+
echo ' Require all granted'; \
32+
echo '</Directory>'; \
33+
} > /etc/apache2/conf-available/phpnetmap.conf \
34+
&& a2enconf phpnetmap
1735

36+
# Libera a view do snmpd local (mesma intenção do Dockerfile original).
37+
RUN sed -i 's/-V systemonly//g' /etc/snmp/snmpd.conf
1838

19-
# container config
20-
ENV ALLOW_OVERRIDE true
21-
RUN a2enmod rewrite \
22-
&& sed -i 's/-V systemonly//g' /etc/snmp/snmpd.conf \
23-
&& echo 'error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE' > /etc/php5/mods-available/custom.ini \
24-
&& echo 'disable_functions = ' >> /etc/php5/mods-available/custom.ini \
25-
&& php5enmod custom \
26-
&& sed -i '2i service snmpd start' /run.sh \
27-
&& sed -i '2i /app/set_htpasswd.sh' /run.sh \
28-
&& chmod +x /app/set_htpasswd.sh
39+
# Script de startup substitui o /run.sh do tutum (sobe snmpd, gera htpasswd).
40+
COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
41+
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
42+
43+
# Código da aplicação a partir do checkout (respeita o .dockerignore).
44+
COPY . /app
45+
WORKDIR /app
46+
47+
# Diretórios que precisam de escrita pelo Apache (SQLite e runtime do Yii).
48+
RUN chmod +x /app/set_htpasswd.sh \
49+
&& mkdir -p /app/protected/data /app/protected/runtime /app/assets \
50+
&& chown -R www-data:www-data /app/protected/data /app/protected/runtime /app/assets
51+
52+
VOLUME /app/protected/data
53+
EXPOSE 80
54+
55+
ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]
56+
CMD ["apache2-foreground"]

README.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,30 @@ docker logs server1
7676
See more in https://docs.docker.com/engine/getstarted/
7777

7878

79+
## Building the image (multi-arch)
80+
81+
The image is built from the `Dockerfile` in this repository on top of the
82+
official `php:7.4-apache` base, so it runs on both **linux/amd64** and
83+
**linux/arm64** (Raspberry Pi, Apple Silicon, ARM servers).
84+
85+
To build it locally for both platforms and push to a registry:
86+
```
87+
docker buildx build --platform linux/amd64,linux/arm64 \
88+
-t ghcr.io/marcelofmatos/phpnetmap:dev --push .
89+
```
90+
91+
To build a single-arch image for the current host and load it locally:
92+
```
93+
docker build -t phpnetmap .
94+
docker run -p 80:80 phpnetmap
95+
```
96+
97+
Inspect the published manifest (lists `amd64` and `arm64`):
98+
```
99+
docker buildx imagetools inspect ghcr.io/marcelofmatos/phpnetmap:latest
100+
```
101+
102+
79103
## Using with docker-compose
80104

81105
Use these comands to install docker-compose

docker-entrypoint.sh

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#!/bin/bash
2+
set -e
3+
4+
# Sobe o daemon SNMP local e gera o htpasswd antes de entregar ao Apache.
5+
service snmpd start || true
6+
/app/set_htpasswd.sh
7+
8+
exec "$@"

set_htpasswd.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#!/bin/bash
12

23
if [ -z "$ADMIN_USER" ]; then
34
ADMIN_USER=admin

specs/006-docker-arm64.md

Lines changed: 82 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
- **Issue:** [#6 — arm64](https://github.com/marcelofmatos/phpnetmap/issues/6)
44
- **Tipo:** Feature
5-
- **Status:** Proposta (contém decisões em aberto — validar antes de implementar)
5+
- **Status:** Aprovada — decisões resolvidas (ver seção 5); pronta para implementação
66

77
## 1. Requisito
88

@@ -51,36 +51,89 @@ funcione tanto em amd64 quanto em arm64 (o Docker seleciona o manifest da
5151
plataforma automaticamente), **mantendo o comportamento funcional atual**
5252
(SNMP, SQLite, Apache + rewrite, `set_htpasswd.sh`, volume de dados).
5353

54-
## 4. Abordagem proposta
55-
56-
1. **Trocar a base** por uma imagem oficial multi-arch, p.ex.
57-
`php:7.4-apache` ou `php:8.x-apache` (ambas publicam amd64 + arm64).
58-
2. **Reescrever as dependências**: instalar `snmp`, `snmpd`, `sqlite3`,
59-
`apache2-utils` via apt; habilitar extensões PHP (`snmp`, `pdo_sqlite`)
60-
com `docker-php-ext-install` / pacotes da distro.
61-
3. **`COPY . /app`** em vez de `git clone` (build a partir do checkout).
62-
4. **Multi-arch no CI**: adicionar `docker/setup-qemu-action` +
63-
`docker/setup-buildx-action` e definir
64-
`platforms: linux/amd64,linux/arm64` no `build-push-action`.
65-
5. **Documentar** no README o comando de build local multi-arch:
66-
```bash
67-
docker buildx build --platform linux/amd64,linux/arm64 \
68-
-t ghcr.io/marcelofmatos/phpnetmap:dev --push .
54+
## 4. Abordagem aprovada
55+
56+
Reescrita do `Dockerfile` para uma imagem **self-contained equivalente ao
57+
`tutum/php-apache`**, sem depender da base descontinuada.
58+
59+
### 4.1 Base e dependências
60+
61+
1. **Base:** `php:7.4-apache` (Debian, multi-arch amd64+arm64, Apache + mod_php
62+
já incluídos).
63+
2. **apt:** `snmp` (CLI + libsnmp), `snmpd` (daemon local, paridade funcional),
64+
`sqlite3`, `apache2-utils` (fornece `htpasswd`). `git` sai (usamos `COPY`).
65+
3. **Extensões PHP:** `snmp` e `pdo_sqlite` via `docker-php-ext-install`,
66+
usando `libsnmp-dev`/`libsqlite3-dev` como *build-deps* purgadas ao final
67+
para enxugar a imagem (libs de runtime `libsnmp*`/`libsqlite3-0`
68+
permanecem via os pacotes `snmp`/base).
69+
4. **`custom.ini`** em `/usr/local/etc/php/conf.d/custom.ini` reproduzindo o
70+
comportamento atual:
71+
```ini
72+
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE
73+
disable_functions =
6974
```
7075

71-
## 5. Decisões em aberto (precisam de validação do usuário)
72-
73-
1. **Migração de PHP 5 → 7/8**: é a parte de maior risco. A migração da base é
74-
praticamente obrigatória (não existe `tutum/apache-php` arm64 nem `php5-*`
75-
nas distros atuais). É aceitável migrar para PHP 7.4/8.x? Isso pode exigir
76-
ajustes no código legado (Yii 1.x roda em PHP 7.x; em PHP 8 há mais atritos).
77-
2. **Escopo**: entregar **imagem multi-arch publicada** (mexe na base + CI) ou
78-
apenas **instruções de build** documentadas no README (escopo menor)?
79-
3. **Versão do PHP alvo** (7.4 vs 8.1+), considerando compatibilidade do Yii
80-
1.1.x usado pelo projeto.
81-
4. **Reorganização do CI**: os workflows em `.github/` ainda contêm metadados de
82-
outro projeto ("Fishboard", "Abstrakt Agencia") e não estão versionados.
83-
Faz parte deste escopo limpá-los/versioná-los?
76+
### 4.2 Apache
77+
78+
5. `a2enmod rewrite`; `DocumentRoot``/app`; bloco
79+
`<Directory /app> AllowOverride All; Require all granted </Directory>`.
80+
A aplicação **sempre** exige `AllowOverride All` (rewrite + auth do
81+
`.htaccess`), então isso fica fixo — a env `ALLOW_OVERRIDE` (feature genérica
82+
do tutum, não usada de fato pela app) é **removida**.
83+
84+
### 4.3 Código, dados e permissões
85+
86+
6. **`COPY . /app`** em vez de `git clone` (respeita o `.dockerignore`).
87+
7. `chown www-data` em `/app/protected/data`, `/app/protected/runtime` e
88+
`/app/assets` (SQLite e Yii precisam escrever).
89+
8. `VOLUME /app/protected/data`; `EXPOSE 80`.
90+
91+
### 4.4 Startup (substitui o `/run.sh` do tutum)
92+
93+
9. Novo `docker-entrypoint.sh`:
94+
```bash
95+
#!/bin/bash
96+
set -e
97+
service snmpd start || true
98+
/app/set_htpasswd.sh
99+
exec "$@"
100+
```
101+
`ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]` +
102+
`CMD ["apache2-foreground"]`. Mantém o `sed` no `snmpd.conf` para liberar a
103+
view (`-V systemonly`).
104+
10. **`set_htpasswd.sh`:** adicionar shebang `#!/bin/bash` (hoje não tem; era
105+
chamado de dentro do `/run.sh` do tutum).
106+
107+
### 4.5 CI multi-arch
108+
109+
11. **`docker-image.yml`:** converter de `docker build`/`docker push` cru para
110+
`docker/setup-qemu-action` + `docker/setup-buildx-action` +
111+
`docker/build-push-action` com `platforms: linux/amd64,linux/arm64`.
112+
12. **`release-and-build.yml`:** adicionar `setup-qemu-action`; definir
113+
`platforms: linux/amd64,linux/arm64` no passo de push (o passo de
114+
"build + test" com `load: true` permanece single-arch amd64, pois `load`
115+
não aceita multi-arch). De passagem, corrigir os labels herdados de outro
116+
projeto (`Fishboard`/`Abstrakt Agencia`) e o comando de run inválido
117+
(`8080:3000``80:80`).
118+
119+
### 4.6 README
120+
121+
13. Adicionar seção curta de build local multi-arch:
122+
```bash
123+
docker buildx build --platform linux/amd64,linux/arm64 \
124+
-t ghcr.io/marcelofmatos/phpnetmap:dev --push .
125+
```
126+
127+
## 5. Decisões resolvidas
128+
129+
1. **Migração de PHP 5 → 7/8:** ✅ migrar para **PHP 7.4** (`php:7.4-apache`).
130+
Melhor equilíbrio: extensões `snmp`/`pdo_sqlite` disponíveis, Yii 1.1.x roda
131+
bem, e habilita arm64. PHP 8 traria mais atrito com o Yii 1.1.16 legado.
132+
2. **Escopo:****completo** — Dockerfile + CI multi-arch + README.
133+
3. **Versão do PHP alvo:****7.4**.
134+
4. **Reorganização do CI:** ✅ correções pontuais de multi-arch e dos
135+
metadados/labels claramente errados (de outro projeto). Sem reorganização
136+
ampla além disso.
84137

85138
## 6. Critérios de aceite (para a abordagem completa)
86139

0 commit comments

Comments
 (0)