Fix/rc 1 (#89)

* Revert "packages(apps/web): upgrade next@15.5.0"

This reverts commit 22e4f72ee6e36834672e44a25acf8a5797dcca8c.

* docker-compose: add volumes

* Update Dockerfiles to install specific version of turbo (2.3.2) for consistent dependency management

* .github\workflows\deploy.yml: remove REDIS_PASSWORD env variable

* Update deploy.yml to add REDIS_PASSWORD environment variable for improved configuration management

* Reapply "packages(apps/web): upgrade next@15.5.0"

This reverts commit bcb9be88dfd1b57d6ce6f47bedca4aa3e8db0eae.

* refactor(bot): remove Redis integration from bot configuration

- Eliminated Redis instance and related storage client from the bot's configuration, streamlining the setup and reducing dependencies.
- Updated bot middleware to enhance performance and maintainability.

* Revert "refactor(bot): remove Redis integration from bot configuration"

This reverts commit 4fbbccb0a2967af0c92ff19fe337467347d9a91a.

* docker compose: format

* bot: fix production run (logger problem)

* docker-compose: add app network to redis
This commit is contained in:
Vlad Chikalkin 2025-08-27 11:37:15 +03:00 committed by GitHub
parent 81fa32c3d2
commit 0934417aaf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 38 additions and 28 deletions

View File

@ -25,7 +25,7 @@ jobs:
echo "EMAIL_GRAPHQL=fake@example.com" >> .env echo "EMAIL_GRAPHQL=fake@example.com" >> .env
echo "NEXTAUTH_SECRET=fakesecret" >> .env echo "NEXTAUTH_SECRET=fakesecret" >> .env
echo "BOT_URL=http://localhost:3000" >> .env echo "BOT_URL=http://localhost:3000" >> .env
echo "REDIS_PASSWORD=fake" > .env echo "REDIS_PASSWORD=fake" >> .env
- name: Set image tags - name: Set image tags
id: vars id: vars

View File

@ -11,7 +11,7 @@ ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH" ENV PATH="$PNPM_HOME:$PATH"
RUN apk add --no-cache libc6-compat && \ RUN apk add --no-cache libc6-compat && \
corepack enable && \ corepack enable && \
pnpm install turbo dotenv-cli --global pnpm install turbo@2.3.2 dotenv-cli --global
FROM base AS pruner FROM base AS pruner
ARG PROJECT ARG PROJECT

View File

@ -1,4 +1,3 @@
import { type logger } from '@/utils/logger';
import { type AutoChatActionFlavor } from '@grammyjs/auto-chat-action'; import { type AutoChatActionFlavor } from '@grammyjs/auto-chat-action';
import { type CommandsFlavor } from '@grammyjs/commands'; import { type CommandsFlavor } from '@grammyjs/commands';
import { type ConversationFlavor } from '@grammyjs/conversations'; import { type ConversationFlavor } from '@grammyjs/conversations';
@ -8,13 +7,7 @@ import { type Context as DefaultContext, type SessionFlavor } from 'grammy';
export type Context = ConversationFlavor< export type Context = ConversationFlavor<
HydrateFlavor< HydrateFlavor<
AutoChatActionFlavor & AutoChatActionFlavor & CommandsFlavor & DefaultContext & I18nFlavor & SessionFlavor<SessionData>
CommandsFlavor &
DefaultContext &
I18nFlavor &
SessionFlavor<SessionData> & {
logger: typeof logger;
}
> >
>; >;

View File

@ -1,6 +1,7 @@
import { type Context } from '../context'; import { type Context } from '../context';
import { getUpdateInfo } from '../helpers/logging'; import { getUpdateInfo } from '../helpers/logging';
import { KEYBOARD_REMOVE } from '@/config/keyboards'; import { KEYBOARD_REMOVE } from '@/config/keyboards';
import { logger } from '@/utils/logger';
import { ERRORS } from '@repo/graphql/constants/errors'; import { ERRORS } from '@repo/graphql/constants/errors';
import { type ErrorHandler } from 'grammy'; import { type ErrorHandler } from 'grammy';
@ -11,7 +12,7 @@ export const errorHandler: ErrorHandler<Context> = async (error) => {
await ctx.reply(ctx.t(text), { ...KEYBOARD_REMOVE, parse_mode: 'HTML' }); await ctx.reply(ctx.t(text), { ...KEYBOARD_REMOVE, parse_mode: 'HTML' });
ctx.logger.error({ logger.error({
err: error.error, err: error.error,
update: getUpdateInfo(ctx), update: getUpdateInfo(ctx),
}); });

View File

@ -1,5 +1,6 @@
/* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable @typescript-eslint/no-unused-vars */
import { type Context } from '../context'; import { type Context } from '../context';
import { logger } from '@/utils/logger';
import { type Update } from '@grammyjs/types'; import { type Update } from '@grammyjs/types';
import { type Middleware } from 'grammy'; import { type Middleware } from 'grammy';
@ -11,7 +12,7 @@ export function getUpdateInfo(context: Context): Omit<Update, 'update_id'> {
export function logHandle(id: string): Middleware<Context> { export function logHandle(id: string): Middleware<Context> {
return (context, next) => { return (context, next) => {
context.logger.info({ logger.info({
msg: `Handle "${id}"`, msg: `Handle "${id}"`,
...(id.startsWith('unhandled') ? { update: getUpdateInfo(context) } : {}), ...(id.startsWith('unhandled') ? { update: getUpdateInfo(context) } : {}),
}); });

View File

@ -1,12 +1,13 @@
import { type Context } from '@/bot/context'; import { type Context } from '@/bot/context';
import { getUpdateInfo } from '@/bot/helpers/logging'; import { getUpdateInfo } from '@/bot/helpers/logging';
import { logger } from '@/utils/logger';
import { type Middleware } from 'grammy'; import { type Middleware } from 'grammy';
import { performance } from 'node:perf_hooks'; import { performance } from 'node:perf_hooks';
export function updateLogger(): Middleware<Context> { export function updateLogger(): Middleware<Context> {
return async (ctx, next) => { return async (ctx, next) => {
ctx.api.config.use((previous, method, payload, signal) => { ctx.api.config.use((previous, method, payload, signal) => {
ctx.logger.debug({ logger.debug({
method, method,
msg: 'Bot API call', msg: 'Bot API call',
payload, payload,
@ -15,7 +16,7 @@ export function updateLogger(): Middleware<Context> {
return previous(method, payload, signal); return previous(method, payload, signal);
}); });
ctx.logger.debug({ logger.debug({
msg: 'Update received', msg: 'Update received',
update: getUpdateInfo(ctx), update: getUpdateInfo(ctx),
}); });
@ -25,7 +26,7 @@ export function updateLogger(): Middleware<Context> {
return next(); return next();
} finally { } finally {
const endTime = performance.now(); const endTime = performance.now();
ctx.logger.debug({ logger.debug({
elapsed: endTime - startTime, elapsed: endTime - startTime,
msg: 'Update processed', msg: 'Update processed',
}); });

View File

@ -1,7 +1,7 @@
/* eslint-disable turbo/no-undeclared-env-vars */ /* eslint-disable turbo/no-undeclared-env-vars */
import pino from 'pino'; import pino from 'pino';
export const logger = pino({ const logger = pino({
transport: { transport: {
level: process.env.NODE_ENV === 'production' ? 'info' : 'debug', level: process.env.NODE_ENV === 'production' ? 'info' : 'debug',
options: { options: {
@ -11,3 +11,9 @@ export const logger = pino({
target: 'pino-pretty', target: 'pino-pretty',
}, },
}); });
logger.info = logger.info.bind(logger);
logger.debug = logger.debug.bind(logger);
logger.error = logger.error.bind(logger);
export { logger };

View File

@ -11,7 +11,7 @@ ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH" ENV PATH="$PNPM_HOME:$PATH"
RUN apk add --no-cache libc6-compat openssl && \ RUN apk add --no-cache libc6-compat openssl && \
corepack enable && \ corepack enable && \
pnpm install turbo dotenv-cli --global pnpm install turbo@2.3.2 dotenv-cli --global
FROM base AS pruner FROM base AS pruner
ARG PROJECT ARG PROJECT

View File

@ -34,3 +34,6 @@ services:
timeout: 10s timeout: 10s
retries: 3 retries: 3
start_period: 30s start_period: 30s
volumes:
redis-data:

View File

@ -5,7 +5,7 @@ services:
- .env - .env
restart: always restart: always
healthcheck: healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/"] test: ['CMD', 'curl', '-f', 'http://localhost:3000/']
interval: 10s interval: 10s
timeout: 3s timeout: 3s
retries: 5 retries: 5
@ -22,7 +22,7 @@ services:
- redis - redis
networks: networks:
- app - app
redis: redis:
image: redis:8-alpine image: redis:8-alpine
restart: always restart: always
@ -45,6 +45,11 @@ services:
timeout: 10s timeout: 10s
retries: 3 retries: 3
start_period: 30s start_period: 30s
networks:
- app
volumes:
redis-data:
networks: networks:
app: app:

18
pnpm-lock.yaml generated
View File

@ -23,7 +23,7 @@ catalogs:
version: 2.2.2 version: 2.2.2
autoprefixer: autoprefixer:
specifier: ^10.4.20 specifier: ^10.4.20
version: 10.4.21 version: 10.4.20
dayjs: dayjs:
specifier: ^1.11.3 specifier: ^1.11.3
version: 1.11.13 version: 1.11.13
@ -35,7 +35,7 @@ catalogs:
version: 9.21.0 version: 9.21.0
graphql: graphql:
specifier: ^16.9.0 specifier: ^16.9.0
version: 16.11.0 version: 16.9.0
husky: husky:
specifier: ^9.1.7 specifier: ^9.1.7
version: 9.1.7 version: 9.1.7
@ -44,13 +44,13 @@ catalogs:
version: 9.0.2 version: 9.0.2
lint-staged: lint-staged:
specifier: ^15.2.10 specifier: ^15.2.10
version: 15.5.2 version: 15.2.10
lucide-react: lucide-react:
specifier: ^0.462.0 specifier: ^0.462.0
version: 0.462.0 version: 0.462.0
postcss: postcss:
specifier: ^8.4.49 specifier: ^8.4.49
version: 8.5.6 version: 8.4.49
postcss-load-config: postcss-load-config:
specifier: ^6.0.1 specifier: ^6.0.1
version: 6.0.1 version: 6.0.1
@ -59,7 +59,7 @@ catalogs:
version: 3.6.2 version: 3.6.2
radashi: radashi:
specifier: ^12.5.1 specifier: ^12.5.1
version: 12.6.0 version: 12.5.1
react: react:
specifier: ^19.1.1 specifier: ^19.1.1
version: 19.1.1 version: 19.1.1
@ -68,19 +68,19 @@ catalogs:
version: 19.1.1 version: 19.1.1
tailwindcss: tailwindcss:
specifier: ^3.4.15 specifier: ^3.4.15
version: 3.4.17 version: 3.4.15
typescript: typescript:
specifier: ^5.7 specifier: ^5.7
version: 5.8.3 version: 5.7.2
vite-tsconfig-paths: vite-tsconfig-paths:
specifier: ^5.1.4 specifier: ^5.1.4
version: 5.1.4 version: 5.1.4
vitest: vitest:
specifier: ^2.1.8 specifier: ^2.1.8
version: 2.1.9 version: 2.1.8
zod: zod:
specifier: ^3.24.1 specifier: ^3.24.1
version: 3.25.71 version: 3.24.1
importers: importers: