mirror of
https://github.com/Trollobot/Telemax.git
synced 2026-08-29 13:41:41 +00:00
- redactSecrets: маскируются password/trackId/phone и любые строки от 512 символов — пароль MAX больше не попадает в лог веб-панели открытым текстом - Веб-панель по умолчанию работает по HTTPS с самоподписанным сертификатом (генерируется при первом старте в .data/tls); старые http-ссылки получают 301-редирект на том же порту (polyglot по первому байту; resume строго в process.nextTick — иначе TLS-хендшейк зависает); /apikey даёт https-ссылку; PANEL_TLS=off для установки за своим reverse proxy - Сертификаты Минцифры больше не доверяются всему контейнеру через NODE_EXTRA_CA_CERTS — src/max/ca.ts скоупит их только на соединения с MAX (ca в tls.connect + undici-агент для CDN-загрузок); Telegram и GitHub проверяются только по стандартным корням Mozilla - Запросы одного опкода к MAX сериализуются (request() в client.ts) — два конкурентных MSG_SEND больше не перепутают messageId-связки редактирования и удаления - Починена гонка первого чтения в ChatMapStore: конкурентные обращения форкали кэш, и часть upsert'ов молча терялась на диске - Graceful shutdown по SIGTERM/SIGINT; в панели — реконнект WebSocket и периодическое обновление метрик; сравнение id в patchCachedChatLastMessage переведено на String() (BigInt-чаты не совпадали) - Удалён мёртвый код: эндпоинты /api/debug/*, getPollVoters, createTelegramBot, цепочка historySynced, getChats(marker) - React/Tailwind/lucide перенесены в devDependencies — рантайм-образ легче; vitest 4, npm audit: 0 уязвимостей; chmod 600 для .env в setup.sh/update.sh - Новые тесты: redactSecrets, сторы (эвикшн/нормализация/конкурентность), сериализация запросов — всего 41
40 lines
1.9 KiB
Docker
40 lines
1.9 KiB
Docker
FROM node:22-slim AS build
|
|
WORKDIR /app
|
|
COPY package.json package-lock.json ./
|
|
RUN npm ci
|
|
COPY . .
|
|
RUN npm run build
|
|
|
|
FROM node:22-slim AS runtime
|
|
WORKDIR /app
|
|
ENV NODE_ENV=production
|
|
# Baked in from the host's git checkout at build time (docker-compose.yml passes
|
|
# it through from $GIT_COMMIT) — the runtime image has no .git of its own
|
|
# (excluded via .dockerignore), so this is the only way /version can know what
|
|
# commit is actually running vs what's latest on GitHub.
|
|
ARG GIT_COMMIT=unknown
|
|
ENV GIT_COMMIT=$GIT_COMMIT
|
|
# chromium + ffmpeg: rendering Telegram's animated (.tgs/Lottie) stickers to a
|
|
# short WebM so they can go through the ordinary VIDEO_UPLOAD pipeline — MAX has
|
|
# no confirmed native sticker-upload opcode, but its own animated stickers arrive
|
|
# as autoplaying VIDEO attaches, so this gets the same "plays in the feed" result.
|
|
# Uses puppeteer-core (no bundled Chromium download) against this system package
|
|
# instead, keeping the image smaller.
|
|
# openssl: generates the web panel's self-signed TLS certificate on first start
|
|
# (see loadOrCreatePanelCert in src/server/app.ts).
|
|
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates chromium ffmpeg openssl && rm -rf /var/lib/apt/lists/*
|
|
ENV CHROMIUM_PATH=/usr/bin/chromium
|
|
# MAX's TLS chain goes through Russia's state CA (Минцифры "Russian Trusted
|
|
# Root/Sub CA"), which no standard trust store includes. Deliberately NOT
|
|
# installed system-wide (update-ca-certificates) or process-wide
|
|
# (NODE_EXTRA_CA_CERTS) anymore — that made every TLS connection from this
|
|
# container (Telegram Bot API, GitHub) trust the state CA too, i.e. exactly the
|
|
# MITM exposure such a CA enables. src/max/ca.ts scopes the trust to MAX
|
|
# connections only, reading these PEMs at runtime; see certs/README.md for how
|
|
# the chain was verified.
|
|
COPY certs ./certs
|
|
COPY package.json package-lock.json ./
|
|
RUN npm ci --omit=dev
|
|
COPY --from=build /app/dist ./dist
|
|
EXPOSE 3000
|
|
CMD ["node", "dist/server.mjs"]
|