fix(docker): imagem final sem privilégios (nginx-unprivileged, porta 8080)
Release / Plano (reaproveitar a imagem?) (push) Successful in 5s
CI / Tipos e testes (push) Successful in 1m1s
CI / Trivy (dependências e segredos) (push) Successful in 7s
CI / Imagem Docker (linux/arm64) (push) Failing after 7s
Release / ci (push) Failing after 1m20s
Release / Publica a imagem (linux/arm64) (push) Skipped
Release / Cria a release no Gitea (push) Skipped
Release / Plano (reaproveitar a imagem?) (push) Successful in 5s
CI / Tipos e testes (push) Successful in 1m1s
CI / Trivy (dependências e segredos) (push) Successful in 7s
CI / Imagem Docker (linux/arm64) (push) Failing after 7s
Release / ci (push) Failing after 1m20s
Release / Publica a imagem (linux/arm64) (push) Skipped
Release / Cria a release no Gitea (push) Skipped
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
f1ab23ab14
commit
450537ea7e
7 files changed
+15
-13
No files matched your search
@@ -103,7 +103,7 @@ jobs:
|
|||||||
- name: A imagem sobe e responde
|
- name: A imagem sobe e responde
|
||||||
if: ${{ steps.plano.outputs.reuse != 'true' }}
|
if: ${{ steps.plano.outputs.reuse != 'true' }}
|
||||||
run: |
|
run: |
|
||||||
docker run -d --name pss-ci -p 127.0.0.1:3998:80 pss:ci
|
docker run -d --name pss-ci -p 127.0.0.1:3998:8080 pss:ci
|
||||||
status=0
|
status=0
|
||||||
scripts/smoke-imagem.sh http://127.0.0.1:3998 || status=1
|
scripts/smoke-imagem.sh http://127.0.0.1:3998 || status=1
|
||||||
docker rm -f pss-ci >/dev/null
|
docker rm -f pss-ci >/dev/null
|
||||||
|
|||||||
+2
-1
@@ -14,7 +14,8 @@ Everything notable in PSS is recorded here. The format follows
|
|||||||
(`git.lucasrguerra.dev.br`). The deployment pulls the image from its registry.
|
(`git.lucasrguerra.dev.br`). The deployment pulls the image from its registry.
|
||||||
- The `Dockerfile` is multi-stage: it builds Vite from source inside the image instead
|
- The `Dockerfile` is multi-stage: it builds Vite from source inside the image instead
|
||||||
of unpacking a `dist.tar.gz` committed to the repository (removed, along with the
|
of unpacking a `dist.tar.gz` committed to the repository (removed, along with the
|
||||||
`build:release` script).
|
`build:release` script). The final stage is `nginx-unprivileged`: the container runs
|
||||||
|
as the `nginx` user and listens on port 8080 instead of 80 (Trivy DS-0002).
|
||||||
- New CI on Gitea runners (`.gitea/workflows`): types, 282 tests, Trivy on the repository
|
- New CI on Gitea runners (`.gitea/workflows`): types, 282 tests, Trivy on the repository
|
||||||
and on the image, and an image smoke test. The image is built once per content hash and
|
and on the image, and an image smoke test. The image is built once per content hash and
|
||||||
reused by the release, so a merge or a tag on an already validated commit rebuilds nothing.
|
reused by the release, so a merge or a tag on an already validated commit rebuilds nothing.
|
||||||
|
|||||||
+5
-4
@@ -8,13 +8,14 @@ RUN --mount=type=cache,target=/root/.npm npm ci
|
|||||||
COPY . .
|
COPY . .
|
||||||
RUN npm run build
|
RUN npm run build
|
||||||
|
|
||||||
# ── Imagem final: só o nginx e os arquivos estáticos ──
|
# ── Imagem final: nginx sem privilégios (usuário nginx, porta 8080) e os estáticos ──
|
||||||
FROM nginx:alpine
|
FROM nginxinc/nginx-unprivileged:alpine
|
||||||
COPY nginx.conf /etc/nginx/conf.d/default.conf
|
COPY nginx.conf /etc/nginx/conf.d/default.conf
|
||||||
COPY --from=build /app/dist /usr/share/nginx/html
|
COPY --from=build /app/dist /usr/share/nginx/html
|
||||||
|
|
||||||
EXPOSE 80
|
USER nginx
|
||||||
|
EXPOSE 8080
|
||||||
HEALTHCHECK --interval=30s --timeout=10s --start-period=15s --retries=3 \
|
HEALTHCHECK --interval=30s --timeout=10s --start-period=15s --retries=3 \
|
||||||
CMD wget -q --spider http://127.0.0.1:80/ || exit 1
|
CMD wget -q --spider http://127.0.0.1:8080/ || exit 1
|
||||||
|
|
||||||
CMD ["nginx", "-g", "daemon off;"]
|
CMD ["nginx", "-g", "daemon off;"]
|
||||||
+2
-2
@@ -61,14 +61,14 @@ docker compose up --build
|
|||||||
```
|
```
|
||||||
|
|
||||||
The `Dockerfile` builds Vite inside the image (Node 22) and serves the static files
|
The `Dockerfile` builds Vite inside the image (Node 22) and serves the static files
|
||||||
with nginx. There is no pre-built artifact in the repository.
|
with an unprivileged nginx (`nginx` user, port 8080). There is no pre-built artifact in the repository.
|
||||||
|
|
||||||
### Published image
|
### Published image
|
||||||
|
|
||||||
Every version is published to the Gitea container registry (linux/arm64):
|
Every version is published to the Gitea container registry (linux/arm64):
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker run -p 8080:80 git.lucasrguerra.dev.br/lucasrguerra/pss:latest
|
docker run -p 8080:8080 git.lucasrguerra.dev.br/lucasrguerra/pss:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
Tags: `latest`, `X.Y.Z`, `X.Y` and `sha-<commit>`. The public instance runs at
|
Tags: `latest`, `X.Y.Z`, `X.Y` and `sha-<commit>`. The public instance runs at
|
||||||
|
|||||||
@@ -59,14 +59,14 @@ docker compose up --build
|
|||||||
```
|
```
|
||||||
|
|
||||||
O `Dockerfile` compila o Vite dentro da própria imagem (Node 22) e entrega os
|
O `Dockerfile` compila o Vite dentro da própria imagem (Node 22) e entrega os
|
||||||
arquivos estáticos pelo nginx. Não há artefato pré-construído no repositório.
|
arquivos estáticos por um nginx sem privilégios (usuário `nginx`, porta 8080). Não há artefato pré-construído no repositório.
|
||||||
|
|
||||||
### Imagem publicada
|
### Imagem publicada
|
||||||
|
|
||||||
Cada versão é publicada no registro de contêineres do Gitea (linux/arm64):
|
Cada versão é publicada no registro de contêineres do Gitea (linux/arm64):
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker run -p 8080:80 git.lucasrguerra.dev.br/lucasrguerra/pss:latest
|
docker run -p 8080:8080 git.lucasrguerra.dev.br/lucasrguerra/pss:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
Tags: `latest`, `X.Y.Z`, `X.Y` e `sha-<commit>`. A instância pública roda em
|
Tags: `latest`, `X.Y.Z`, `X.Y` e `sha-<commit>`. A instância pública roda em
|
||||||
|
|||||||
+2
-2
@@ -2,10 +2,10 @@ services:
|
|||||||
pss:
|
pss:
|
||||||
build: .
|
build: .
|
||||||
ports:
|
ports:
|
||||||
- "${PORT:-3000}:80"
|
- "${PORT:-3000}:8080"
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: ["CMD-SHELL", "wget -q --spider http://127.0.0.1:80/ || exit 1"]
|
test: ["CMD-SHELL", "wget -q --spider http://127.0.0.1:8080/ || exit 1"]
|
||||||
interval: 30s
|
interval: 30s
|
||||||
timeout: 10s
|
timeout: 10s
|
||||||
retries: 3
|
retries: 3
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
server {
|
server {
|
||||||
listen 80;
|
listen 8080;
|
||||||
server_name _;
|
server_name _;
|
||||||
root /usr/share/nginx/html;
|
root /usr/share/nginx/html;
|
||||||
index index.html;
|
index index.html;
|
||||||
|
|||||||
Reference in new issue
Block a user