Refatora infraestrutura de dados, build e provisionamento de streams
---
- Movido streams.json para /app/data/streams/streams.json; volume do compose mapeado especificamente em /app/data/streams, deixando logs fora do volume persistido;
- Adicionado scripts/reprovision.mjs que regenera stream.conf e tokens VNC a partir dos templates da imagem no startup, garantindo que updates de container não exijam recriar o volume;
- Removido autologin.template.sh por-stream; substituído por scripts/autologin.sh global na imagem, com variáveis passadas via environment= no supervisor conf (com valores entre aspas
para compatibilidade com valores vazios);
- Logs de processos por stream movidos de /app/data/streams/{id}/ para /app/data/logs/{id}/;
- Adicionada função recreateStream em supervisor.ts e rota POST /api/streams/[id]/recreate; botão "Recreate" adicionado ao menu do card para limpar chrome-profile e re-provisionar;
- Adicionado auto-disparo de captureThumb no GET /api/streams/[id]/thumb quando thumb.jpg não existe e nenhuma captura está em andamento;
- Dockerfile: adicionado --mount=type=cache para /var/cache/apt e /var/lib/apt/lists (não /var/lib/apt inteiro para evitar corrupção de estado); removido --no-cache do Makefile; remoção
de pacotes limitada a curl gnupg para evitar cascata em dependências do chromium/novnc;
- Migração automática de streams.json do caminho antigo adicionada ao entrypoint.sh;
---
This commit is contained in:
+11
-5
@@ -3,7 +3,8 @@ FROM node:22-alpine AS builder
|
||||
WORKDIR /build
|
||||
|
||||
COPY package.json package-lock.json ./
|
||||
RUN npm ci
|
||||
RUN --mount=type=cache,target=/root/.npm \
|
||||
npm ci
|
||||
|
||||
COPY src/ ./src/
|
||||
COPY public/ ./public/
|
||||
@@ -16,8 +17,13 @@ ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
ARG MEDIAMTX_VERSION=1.17.1
|
||||
|
||||
# Tudo em um único RUN para que o cleanup seja efetivo no tamanho final
|
||||
RUN apt-get update \
|
||||
# Cache mounts: .deb baixados e índice de pacotes ficam no cache do BuildKit (não entram na imagem)
|
||||
# /var/lib/apt/lists: índice apt (apt-get update) — seguro cachear
|
||||
# /var/cache/apt: .deb baixados — seguro cachear
|
||||
# /var/lib/apt inteiro NÃO é cacheado: extended_states rastreia auto/manual e corromperia o estado entre builds
|
||||
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
||||
--mount=type=cache,target=/var/lib/apt/lists,sharing=locked \
|
||||
apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
xvfb x11vnc novnc websockify \
|
||||
ffmpeg supervisor xdotool tzdata \
|
||||
@@ -34,11 +40,11 @@ RUN apt-get update \
|
||||
-o /tmp/mediamtx.tar.gz \
|
||||
&& tar -xzf /tmp/mediamtx.tar.gz -C /usr/local/bin mediamtx \
|
||||
\
|
||||
# Remove ferramentas usadas só no build
|
||||
# Remove apenas as ferramentas de build — qualquer remoção além disso causa cascata em deps do chromium/novnc
|
||||
&& apt-get remove -y curl gnupg \
|
||||
&& apt-get autoremove -y \
|
||||
&& apt-get clean \
|
||||
&& find /usr/lib/chromium/locales -name '*.pak' ! -name 'en-US.pak' -delete \
|
||||
&& find /usr/lib/chromium/locales -name '*.pak' ! -name 'en-US.pak' -delete 2>/dev/null || true \
|
||||
\
|
||||
# Chromium managed policy: disable password manager and autofill save prompts
|
||||
&& mkdir -p /etc/chromium/policies/managed \
|
||||
|
||||
+1
-1
@@ -9,7 +9,7 @@ build:
|
||||
echo "❌ TAG não definida. Use ./build.sh ou passe TAG=x.x.x"; \
|
||||
exit 1; \
|
||||
fi
|
||||
docker build --no-cache \
|
||||
docker build \
|
||||
-f Dockerfile \
|
||||
-t $(IMAGE):$(TAG) \
|
||||
..
|
||||
|
||||
@@ -14,7 +14,8 @@ services:
|
||||
- "8888:8888" # HLS (MediaMTX)
|
||||
- "6080:6080" # VNC (noVNC)
|
||||
volumes:
|
||||
- decap-stream:/app/data
|
||||
- streams:/app/data/streams # Persistent: streams.json, chrome profiles, thumbs
|
||||
# - logs:/app/data/logs # Optional
|
||||
|
||||
volumes:
|
||||
decap-stream:
|
||||
streams:
|
||||
+7
-11
@@ -5,17 +5,13 @@ mkdir -p /app/data/streams
|
||||
mkdir -p /app/data/logs
|
||||
mkdir -p /app/data/vnc-tokens
|
||||
|
||||
find /app/data/streams -name "*.sh" -exec chmod +x {} \;
|
||||
# Migrate streams.json from old location (/app/data/streams.json → /app/data/streams/streams.json)
|
||||
if [ -f /app/data/streams.json ] && [ ! -f /app/data/streams/streams.json ]; then
|
||||
mv /app/data/streams.json /app/data/streams/streams.json
|
||||
echo "[entrypoint] migrated streams.json to /app/data/streams/streams.json"
|
||||
fi
|
||||
|
||||
# #19 — restaura streams para o desiredState após restart do container
|
||||
NODE_PATH=/app/node_modules node -e "
|
||||
const fs = require('fs');
|
||||
const { execSync } = require('child_process');
|
||||
const streamsFile = '/app/data/streams.json';
|
||||
if (!fs.existsSync(streamsFile)) process.exit(0);
|
||||
const streams = JSON.parse(fs.readFileSync(streamsFile, 'utf-8'));
|
||||
// Apenas aguarda o supervisord estar pronto, o restore ocorre via script separado
|
||||
fs.writeFileSync('/app/data/.pending-restore', JSON.stringify(streams.map(s => ({ id: s.id, desiredState: s.desiredState }))));
|
||||
" 2>/dev/null || true
|
||||
# Regenerate stream configs from current image templates before supervisord reads them
|
||||
node /opt/scripts/reprovision.mjs
|
||||
|
||||
exec /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
|
||||
|
||||
Reference in New Issue
Block a user