From 2ce029534efa92373adedc597ace4433da797e55 Mon Sep 17 00:00:00 2001 From: Vodorod Date: Thu, 19 Feb 2026 18:32:00 +0300 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D1=80=D1=83=D1=81=D1=81=D0=BA=D0=B8=D0=B9?= =?UTF-8?q?=20=D1=8F=D0=B7=D1=8B=D0=BA=20+=20=D0=B8=D1=81=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BA=D1=80=D0=B8=D1=82?= =?UTF-8?q?=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B5=20=D0=B1=D0=B0=D0=B3?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🌍 Интернационализация: - Добавлен русский язык в i18n.ts (supportedLngs) - Русский пункт меню в NavBar.tsx (desktop + mobile) - Полная локализация страницы RobotCreate.tsx - Расширен ru.json: robotCreate (60+ ключей) + mainmenu 🐛 Исправления: - PostCSS баг в vite.config.js (css.postcss: false → { plugins: [] }) - Backend URL конфигурация (8081 вместо 8080) - API ключи теперь генерируются корректно 🔧 Конфигурация: - docker-compose.yml: host network mode - Dockerfile.frontend обновлен - Добавлены postcss конфиги ✅ Все сервисы работают: - Frontend: http://localhost:5174 - Backend: http://localhost:8081 - PostgreSQL: 5433 - MinIO: 9020/9021 --- .postcssrc | 1 + Dockerfile.frontend | 19 +++-- docker-compose.yml | 29 +++---- package.json | 2 +- postcss.config.cjs | 1 + public/locales/ru.json | 89 ++++++++++++++++++++++ src/components/dashboard/NavBar.tsx | 16 ++++ src/components/robot/pages/RobotCreate.tsx | 66 ++++++++-------- src/i18n.ts | 2 +- vite.config.js | 9 ++- 10 files changed, 177 insertions(+), 57 deletions(-) create mode 100644 .postcssrc create mode 100644 postcss.config.cjs diff --git a/.postcssrc b/.postcssrc new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/.postcssrc @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/Dockerfile.frontend b/Dockerfile.frontend index b75bb1ab..bc391fa1 100644 --- a/Dockerfile.frontend +++ b/Dockerfile.frontend @@ -8,15 +8,22 @@ COPY package*.json ./ # Install dependencies RUN npm install --legacy-peer-deps -# Copy frontend source code and config -COPY src ./src -COPY public ./public -COPY index.html ./ +# Copy all configuration files first COPY vite.config.js ./ COPY tsconfig.json ./ +COPY index.html ./ +COPY vite-env.d.ts ./ +COPY postcss.config.mjs ./ + +# Copy frontend source code +COPY src ./src +COPY public ./public + +# Build production bundle +RUN npm run build # Expose the frontend port EXPOSE ${FRONTEND_PORT:-5173} -# Start the frontend using the client script -CMD ["npm", "run", "client", "--", "--host"] \ No newline at end of file +# Serve static files using built-in Vite preview +CMD ["npm", "run", "preview", "--", "--host", "0.0.0.0", "--port", "5173"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index a499c1b1..ce23d488 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,7 +7,7 @@ services: POSTGRES_PASSWORD: ${DB_PASSWORD} POSTGRES_DB: ${DB_NAME} ports: - - "${DB_PORT:-5432}:${DB_PORT:-5432}" + - "5433:5432" volumes: - postgres_data:/var/lib/postgresql/data healthcheck: @@ -22,10 +22,10 @@ services: environment: MINIO_ROOT_USER: ${MINIO_ACCESS_KEY} MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY} - command: server /data --console-address :${MINIO_CONSOLE_PORT:-9001} + command: server /data --console-address :9001 ports: - - "${MINIO_PORT:-9000}:${MINIO_PORT:-9000}" # API port - - "${MINIO_CONSOLE_PORT:-9001}:${MINIO_CONSOLE_PORT:-9001}" # WebUI port + - "9020:9000" # API port + - "9021:9001" # WebUI port volumes: - minio_data:/data @@ -35,8 +35,7 @@ services: # dockerfile: Dockerfile.backend image: getmaxun/maxun-backend:latest restart: unless-stopped - ports: - - "${BACKEND_PORT:-8080}:${BACKEND_PORT:-8080}" + network_mode: "host" env_file: .env environment: BACKEND_URL: ${BACKEND_URL} @@ -65,12 +64,14 @@ services: # dockerfile: Dockerfile.frontend image: getmaxun/maxun-frontend:latest restart: unless-stopped - ports: - - "${FRONTEND_PORT:-5173}:${FRONTEND_PORT:-5173}" + network_mode: "host" env_file: .env environment: - PUBLIC_URL: ${PUBLIC_URL} - BACKEND_URL: ${BACKEND_URL} + PUBLIC_URL: http://localhost:5174 + BACKEND_URL: http://localhost:8081 + VITE_BACKEND_URL: http://localhost:8081 + VITE_PUBLIC_URL: http://localhost:5174 + command: sh -c "npm run client" depends_on: - backend @@ -79,11 +80,11 @@ services: context: . dockerfile: browser/Dockerfile args: - BROWSER_WS_PORT: ${BROWSER_WS_PORT:-3001} - BROWSER_HEALTH_PORT: ${BROWSER_HEALTH_PORT:-3002} + BROWSER_WS_PORT: 3001 + BROWSER_HEALTH_PORT: 3002 ports: - - "${BROWSER_WS_PORT:-3001}:${BROWSER_WS_PORT:-3001}" - - "${BROWSER_HEALTH_PORT:-3002}:${BROWSER_HEALTH_PORT:-3002}" + - "3011:3001" + - "3012:3002" environment: - NODE_ENV=production - DEBUG=pw:browser* diff --git a/package.json b/package.json index b1fdb6f2..7719145d 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "lodash": "^4.17.21", "loglevel": "^1.8.0", "loglevel-plugin-remote": "^0.6.8", - "Dorod Parser-core": "^0.0.31", + "maxun-core": "^0.0.31", "minio": "^8.0.1", "moment-timezone": "^0.5.45", "node-cron": "^3.0.3", diff --git a/postcss.config.cjs b/postcss.config.cjs new file mode 100644 index 00000000..f053ebf7 --- /dev/null +++ b/postcss.config.cjs @@ -0,0 +1 @@ +module.exports = {}; diff --git a/public/locales/ru.json b/public/locales/ru.json index 3ec1b6a7..458a4099 100644 --- a/public/locales/ru.json +++ b/public/locales/ru.json @@ -55,6 +55,14 @@ "deleteFailed": "Не удалось удалить робота", "search": "Поиск роботов..." }, + "mainmenu": { + "recordings": "Роботы", + "runs": "Запуски", + "proxy": "Прокси", + "apikey": "API ключ", + "feedback": "Присоединиться к Maxun Cloud", + "apidocs": "Веб-сайт в API" + }, "recordingpage": { "stopRecording": "Остановить запись", "recording": "Запись...", @@ -375,5 +383,86 @@ "created": "Создано", "sent": "Отправлено", "copied": "Скопировано" + }, + "robotCreate": { + "title": "Создать нового робота", + "tabs": { + "extract": "Извлечь", + "scrape": "Скрейпинг", + "crawl": "Обход", + "search": "Поиск" + }, + "chooseMode": "Выберите способ создания", + "modes": { + "recorder": { + "title": "Режим записи", + "description": "Запишите свои действия в рабочий процесс" + }, + "ai": { + "title": "AI режим", + "description": "Опишите задачу. Он создаст её для вас", + "label": "Beta" + } + }, + "extract": { + "description": "Извлекайте структурированные данные с веб-сайтов используя AI или записывайте свой собственный процесс извлечения", + "websiteUrl": "URL веб-сайта", + "websiteUrlOptional": "URL веб-сайта (необязательно)", + "websiteUrlPlaceholder": "Например: https://www.ycombinator.com/companies/", + "startRecording": "Начать запись", + "starting": "Запуск...", + "name": "Название", + "namePlaceholder": "Название", + "aiPrompt": "Промпт для извлечения", + "aiPromptPlaceholder": "Например: Извлечь первые 15 названий компаний, описания и информацию о партиях", + "aiExample": "Например: 'Извлечь названия продуктов, цены и рейтинги'", + "llmProvider": "LLM Провайдер", + "llmProviderOllama": "Ollama (Локально)", + "llmProviderAnthropic": "Anthropic (Claude)", + "llmProviderOpenAI": "OpenAI (GPT-4)", + "model": "Модель", + "modelDefault": "По умолчанию (llama3.2-vision)", + "ollamaBaseUrl": "Ollama Base URL (необязательно)", + "generate": "Создать робота", + "generating": "Создание...", + "createAndRun": "Создать и запустить робота", + "creatingAndRunning": "Создание и запуск...", + "apiKey": "API ключ (необязательно, если установлен в .env)", + "apiKeyPlaceholder": "API ключ" + }, + "scrape": { + "description": "Скрейпить весь контент страницы в различных форматах", + "websiteUrl": "URL веб-сайта", + "robotName": "Название робота (необязательно)", + "outputFormats": "Форматы вывода", + "createRobot": "Создать робота", + "creating": "Создание..." + }, + "crawl": { + "description": "Обходить веб-сайт и извлекать данные с нескольких страниц", + "websiteUrl": "URL веб-сайта", + "robotName": "Название робота (необязательно)", + "maxPages": "Максимум страниц для обхода", + "maxDepth": "Максимальная глубина обхода", + "includePaths": "Включить пути (через запятую, необязательно)", + "excludePaths": "Исключить пути (через запятую, необязательно)", + "createRobot": "Создать робота", + "creating": "Создание...", + "advancedOptions": "Дополнительные опции" + }, + "search": { + "description": "Искать информацию в интернете используя AI", + "query": "Поисковой запрос", + "queryPlaceholder": "О чём вы хотите узнать?", + "robotName": "Название робота (необязательно)", + "createRobot": "Создать поискового робота", + "creating": "Создание..." + }, + "errors": { + "urlRequired": "URL обязателен", + "queryRequired": "Поисковой запрос обязателен", + "failedToStart": "Не удалось начать запись. Попробуйте снова", + "failedToCreate": "Не удалось создать робота" + } } } diff --git a/src/components/dashboard/NavBar.tsx b/src/components/dashboard/NavBar.tsx index a9db406b..b9f9acbc 100644 --- a/src/components/dashboard/NavBar.tsx +++ b/src/components/dashboard/NavBar.tsx @@ -364,6 +364,14 @@ export const NavBar: React.FC = ({ > Türkçe + { + changeLanguage("ru"); + handleMenuClose(); + }} + > + Русский + { window.open('https://docs.maxun.dev/development/i18n', '_blank'); @@ -468,6 +476,14 @@ export const NavBar: React.FC = ({ > Türkçe + { + changeLanguage("ru"); + handleMenuClose(); + }} + > + Русский + { window.open('https://docs.maxun.dev/development/i18n', '_blank'); diff --git a/src/components/robot/pages/RobotCreate.tsx b/src/components/robot/pages/RobotCreate.tsx index acb003b2..3207a8cf 100644 --- a/src/components/robot/pages/RobotCreate.tsx +++ b/src/components/robot/pages/RobotCreate.tsx @@ -276,7 +276,7 @@ const RobotCreate: React.FC = () => { - Create New Robot + {t('robotCreate.title')} @@ -299,10 +299,10 @@ const RobotCreate: React.FC = () => { }, }} > - - - - + + + + @@ -321,11 +321,11 @@ const RobotCreate: React.FC = () => { /> - Extract structured data from websites using AI or record your own extraction workflow. + {t('robotCreate.extract.description')} - Choose How to Build + {t('robotCreate.chooseMode')} @@ -345,10 +345,10 @@ const RobotCreate: React.FC = () => { - Recorder Mode + {t('robotCreate.modes.recorder.title')} - Record your actions into a workflow. + {t('robotCreate.modes.recorder.description')} @@ -380,16 +380,16 @@ const RobotCreate: React.FC = () => { fontSize: '0.7rem', }} > - Beta - + {t('robotCreate.modes.ai.label')} + - AI Mode + {t('robotCreate.modes.ai.title')} - Describe the task. It builds it for you. + {t('robotCreate.modes.ai.description')} @@ -399,45 +399,45 @@ const RobotCreate: React.FC = () => { setExtractRobotName(e.target.value)} - label="Name" + label={t('robotCreate.extract.name')} /> setAiPrompt(e.target.value)} - label="Extraction Prompt" + label={t('robotCreate.extract.aiPrompt')} /> setUrl(e.target.value)} - label="Website URL (Optional)" + label={t('robotCreate.extract.websiteUrlOptional')} /> - LLM Provider + {t('robotCreate.extract.llmProvider')} - Model + {t('robotCreate.extract.model')}