├── README.md ├── article_2 ├── app │ ├── chroma_db │ │ ├── 8f7d9537-e6d7-43d6-93cd-61bafb0edaf3 │ │ │ ├── link_lists.bin │ │ │ ├── header.bin │ │ │ └── length.bin │ │ └── chroma.sqlite3 │ ├── api │ │ ├── schemas.py │ │ ├── utils.py │ │ └── router.py │ ├── main.py │ ├── static │ │ ├── form_script.js │ │ ├── form_style.css │ │ └── script.js │ ├── config.py │ ├── pages │ │ └── router.py │ ├── templates │ │ ├── login.html │ │ └── index.html │ └── chroma_client │ │ ├── ai_store.py │ │ └── chroma_store.py └── requirements.txt ├── article_1 ├── amvera_data │ ├── chroma_db │ │ ├── 8f7d9537-e6d7-43d6-93cd-61bafb0edaf3 │ │ │ ├── link_lists.bin │ │ │ ├── header.bin │ │ │ └── length.bin │ │ └── chroma.sqlite3 │ ├── parsed_json │ │ ├── python-django.json │ │ ├── memcached.json │ │ ├── Ruby-SQLite.json │ │ ├── UTC-time.json │ │ ├── java-springboot.json │ │ ├── tarifs.json │ │ ├── backups.json │ │ ├── notifications.json │ │ ├── payments.json │ │ ├── rabbitmq.json │ │ ├── redash.json │ │ ├── k8sprobe.json │ │ ├── disposion.json │ │ ├── data-saving.json │ │ ├── update.json │ │ ├── main-origin.json │ │ ├── enverror.json │ │ ├── variables.json │ │ ├── not-found-file.json │ │ ├── webhooks.json │ │ ├── golang-go.json │ │ ├── csharp-mono.json │ │ ├── ruby-bundle.json │ │ ├── sla.json │ │ ├── README.json │ │ ├── price.json │ │ ├── csharp-dotnet.json │ │ ├── tgbot.json │ │ ├── nodejs-browser.json │ │ ├── config-file.json │ │ ├── scaling.json │ │ ├── selenium-chromedriver.json │ │ ├── build.json │ │ ├── topup.json │ │ ├── secondary-origin.json │ │ ├── jvm-gradle.json │ │ ├── ffmpeg-pip.json │ │ ├── run.json │ │ ├── redis.json │ │ ├── infinite-build-run.json │ │ ├── sqlite.json │ │ ├── nodejs-server.json │ │ ├── 502-503-error.json │ │ ├── jvm-maven.json │ │ ├── cli.json │ │ ├── mysql.json │ │ ├── freq-errors.json │ │ ├── quick-start.json │ │ ├── mongodb.json │ │ ├── docker.json │ │ ├── network.json │ │ ├── mysql-beta.json │ │ └── python-flask.json │ ├── generated_amvera_db.py │ └── generate_json_files.py ├── examples │ ├── shop_chroma_db │ │ ├── bde937fa-5a00-4c59-aa70-ed6be129b2c8 │ │ │ ├── link_lists.bin │ │ │ ├── header.bin │ │ │ └── length.bin │ │ └── chroma.sqlite3 │ ├── read_chroma_db_example.py │ └── create_chroma_db_example.py ├── requirements.txt ├── config.py └── chat_with_ai.py └── .gitignore /README.md: -------------------------------------------------------------------------------- 1 | # Описание проекта -------------------------------------------------------------------------------- /article_2/app/chroma_db/8f7d9537-e6d7-43d6-93cd-61bafb0edaf3/link_lists.bin: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /article_1/amvera_data/chroma_db/8f7d9537-e6d7-43d6-93cd-61bafb0edaf3/link_lists.bin: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /article_1/examples/shop_chroma_db/bde937fa-5a00-4c59-aa70-ed6be129b2c8/link_lists.bin: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /article_2/app/chroma_db/chroma.sqlite3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yakvenalex/ChromaDBGPTDeepSeek/HEAD/article_2/app/chroma_db/chroma.sqlite3 -------------------------------------------------------------------------------- /article_1/amvera_data/chroma_db/chroma.sqlite3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yakvenalex/ChromaDBGPTDeepSeek/HEAD/article_1/amvera_data/chroma_db/chroma.sqlite3 -------------------------------------------------------------------------------- /article_1/examples/shop_chroma_db/chroma.sqlite3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yakvenalex/ChromaDBGPTDeepSeek/HEAD/article_1/examples/shop_chroma_db/chroma.sqlite3 -------------------------------------------------------------------------------- /article_2/app/chroma_db/8f7d9537-e6d7-43d6-93cd-61bafb0edaf3/header.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yakvenalex/ChromaDBGPTDeepSeek/HEAD/article_2/app/chroma_db/8f7d9537-e6d7-43d6-93cd-61bafb0edaf3/header.bin -------------------------------------------------------------------------------- /article_1/amvera_data/chroma_db/8f7d9537-e6d7-43d6-93cd-61bafb0edaf3/header.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yakvenalex/ChromaDBGPTDeepSeek/HEAD/article_1/amvera_data/chroma_db/8f7d9537-e6d7-43d6-93cd-61bafb0edaf3/header.bin -------------------------------------------------------------------------------- /article_1/examples/shop_chroma_db/bde937fa-5a00-4c59-aa70-ed6be129b2c8/header.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yakvenalex/ChromaDBGPTDeepSeek/HEAD/article_1/examples/shop_chroma_db/bde937fa-5a00-4c59-aa70-ed6be129b2c8/header.bin -------------------------------------------------------------------------------- /article_2/requirements.txt: -------------------------------------------------------------------------------- 1 | langchain-huggingface==0.1.2 2 | torch==2.6.0 3 | loguru==0.7.3 4 | chromadb==0.6.3 5 | sentence-transformers==3.4.1 6 | langchain-chroma==0.2.2 7 | pydantic-settings==2.8.1 8 | fastapi==0.115.12 9 | uvicorn==0.34.0 10 | aiosqlite==0.21.0 11 | Jinja2==3.1.6 12 | aiofiles==24.1.0 13 | PyJWT==2.10.1 14 | -------------------------------------------------------------------------------- /article_1/requirements.txt: -------------------------------------------------------------------------------- 1 | langchain-huggingface==0.1.2 2 | torch==2.6.0 3 | python-dotenv==1.1.0 4 | loguru==0.7.3 5 | chromadb==0.6.3 6 | sentence-transformers==3.4.1 7 | langchain-chroma==0.2.2 8 | pydantic-settings==2.8.1 9 | langchain-text-splitters==0.3.7 10 | langchain-deepseek==0.1.3 11 | langchain-openai==0.3.11 12 | fastapi==0.115.12 13 | uvicorn==0.34.1 14 | jinja2==3.1.6 15 | -------------------------------------------------------------------------------- /article_2/app/api/schemas.py: -------------------------------------------------------------------------------- 1 | from typing import Literal 2 | 3 | from pydantic import BaseModel 4 | 5 | 6 | class AskResponse(BaseModel): 7 | response: str 8 | 9 | 10 | class AskWithAIResponse(BaseModel): 11 | response: str 12 | provider: Literal["deepseek", "chatgpt"] = "deepseek" 13 | 14 | 15 | class SUserAuth(BaseModel): 16 | login: str 17 | password: str 18 | -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/python-django.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "fullstack на django пример создания приложения на python с django можно найти тут https habr com ru articles 779544 если у вас не получается развернуть проект напишите наблюдаемую вами симптоматику на support amvera ru с указанием вашего имени пользователя и названия проекта мы постараемся вам помочь", 3 | "metadata": { 4 | "file_name": "python-django.md", 5 | "section_count": 2, 6 | "section_1": "Fullstack на Django", 7 | "section_2": "Если у вас не получается развернуть проект " 8 | } 9 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/memcached.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "memcached облако amvera поддерживает создание преднастроенного сервиса memcached создание memcached осуществляется в разделе «преднастроенные сервисы» и не требует ввода переменных подключение memcached пример подключения из приложения на python from pymemcache client import base client base client host 11211 вместо host следует указать внутреннее доменное имя проекта memcached которое можно найти во вкладке «домены»", 3 | "metadata": { 4 | "file_name": "memcached.md", 5 | "section_count": 2, 6 | "section_1": "Memcached", 7 | "section_2": "Подключение Memcached" 8 | } 9 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/Ruby-SQLite.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "ruby on rails c базой данных sqlite деплой ruby приложения с подключением к субд sqlite видеопример eval rst youtube kkheawmdqmm align center width 100 если у вас не получается развернуть проект напишите наблюдаемую вами симптоматику на support amvera ru с указанием вашего имени пользователя и названия проекта мы постараемся вам помочь", 3 | "metadata": { 4 | "file_name": "Ruby-SQLite.md", 5 | "section_count": 3, 6 | "section_1": "Ruby on Rails c базой данных SQLite", 7 | "section_2": "Видеопример", 8 | "section_3": "Если у вас не получается развернуть проект " 9 | } 10 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/UTC-time.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "используется другой часовой пояс на серверах utc возможные причины в коде приложения не учтено что на серверах amvera время utc это 3 часа от московского времени время на сервере utc 3 часа от москвы решение учтите в коде приложения что на серверах время utc 3 часа от мск и может не совпадать с временем в вашем регионе изменить время на сервере нельзя нужно учесть данный момент на стороне кода приложения", 3 | "metadata": { 4 | "file_name": "UTC-time.md", 5 | "section_count": 3, 6 | "section_1": "Используется другой часовой пояс (на серверах - UTC)", 7 | "section_2": "Возможные причины:", 8 | "section_3": "Решение:" 9 | } 10 | } -------------------------------------------------------------------------------- /article_2/app/main.py: -------------------------------------------------------------------------------- 1 | from contextlib import asynccontextmanager 2 | 3 | from fastapi import FastAPI 4 | from fastapi.staticfiles import StaticFiles 5 | 6 | from app.api.router import router as api_router 7 | from app.chroma_client.chroma_store import chroma_vectorstore 8 | from app.pages.router import router as page_router 9 | 10 | 11 | @asynccontextmanager 12 | async def lifespan(app: FastAPI): 13 | await chroma_vectorstore.init() 14 | app.include_router(api_router, prefix="/api", tags=["API"]) 15 | app.include_router(page_router, tags=["ФРОНТ"]) 16 | app.mount("/static", StaticFiles(directory="app/static"), name="static") 17 | yield 18 | await chroma_vectorstore.close() 19 | 20 | 21 | app = FastAPI(lifespan=lifespan) 22 | -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/java-springboot.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "spring boot с встраиваемой базой данных h2 и postgresql пример создания приложения на java с spring boot h2 и postgresql можно найти тут https habr com ru companies amvera articles 778682 видеопример из инструкции выше eval rst youtube kkhcglgmeha align center width 100 если у вас не получается развернуть проект напишите наблюдаемую вами симптоматику на support amvera ru с указанием вашего имени пользователя и названия проекта мы постараемся вам помочь", 3 | "metadata": { 4 | "file_name": "java-springboot.md", 5 | "section_count": 3, 6 | "section_1": "Spring Boot с встраиваемой базой данных H2 и PostgreSQL", 7 | "section_2": "Видеопример из инструкции выше", 8 | "section_3": "Если у вас не получается развернуть проект " 9 | } 10 | } -------------------------------------------------------------------------------- /article_2/app/static/form_script.js: -------------------------------------------------------------------------------- 1 | document.getElementById('loginForm').addEventListener('submit', async (e) => { 2 | e.preventDefault() 3 | 4 | const login = document.getElementById('login').value 5 | const password = document.getElementById('password').value 6 | 7 | try { 8 | const response = await fetch('/api/login', { 9 | method: 'POST', 10 | headers: { 11 | 'Content-Type': 'application/json', 12 | }, 13 | body: JSON.stringify({ login, password }), 14 | credentials: 'include', 15 | }) 16 | 17 | const data = await response.json() 18 | 19 | if (data.message === 'Logged in') { 20 | window.location.href = '/' 21 | } else { 22 | alert('Ошибка входа') 23 | } 24 | } catch (error) { 25 | console.error('Error:', error) 26 | alert('Произошла ошибка при входе') 27 | } 28 | }) 29 | -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/tarifs.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "смена тарифного плана в процессе развития проекта ранее выделенных ресурсов может не хватать чтобы увеличить выделяемое на контейнеры процессорное время озу и или хранилище можно сменить тарифный план сделать это можно на странице проекта на вкладке настройки tarifs img tarifs png выберите новый тарифный план и нажмите кнопку применить selected tariff img selected tariff png eval rst admonition важно class warning фактически выделение ресурсов для контейнеров будет изменено только после перезапуска если в данный момент контейнеры проекта не заняты задачами которые нельзя прерывать перезапустите контейнеры проекта чтобы применить изменение тарифа restart img restart png", 3 | "metadata": { 4 | "file_name": "tarifs.md", 5 | "section_count": 1, 6 | "section_1": "Смена тарифного плана" 7 | } 8 | } -------------------------------------------------------------------------------- /article_2/app/config.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from pydantic import SecretStr 4 | from pydantic_settings import BaseSettings, SettingsConfigDict 5 | 6 | 7 | class Config(BaseSettings): 8 | DEEPSEEK_API_KEY: SecretStr 9 | BASE_DIR: str = os.path.abspath(os.path.join(os.path.dirname(__file__))) 10 | SECRET_KEY: str 11 | USERS: str = os.path.join(BASE_DIR, "..", "users.json") 12 | ALGORITHM: str 13 | AMVERA_CHROMA_PATH: str = os.path.join(BASE_DIR, "chroma_db") 14 | AMVERA_COLLECTION_NAME: str = "amvera_docs" 15 | LM_MODEL_NAME: str = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2" 16 | DEEPSEEK_MODEL_NAME: str = "deepseek-chat" 17 | OPENAI_MODEL_NAME: str = "gpt-3.5-turbo" 18 | OPENAI_API_KEY: SecretStr 19 | model_config = SettingsConfigDict(env_file=f"{BASE_DIR}/../.env") 20 | 21 | 22 | settings = Config() # type: ignore 23 | -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/backups.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "бэкапы бэкапы data eval rst admonition важно class warning бэкапы доступны только для проектов с тарифным планом начальный плюс и выше сервис создает и хранит бэкапы папки data за последние два дня скачивание бэкапа происходит в два этапа 1 подготовка мы скачиваем и архивируем ваш бэкап 2 скачать после успешной подготовки кнопка скачать станет активной и вы можете скачать бэкап data backups img data backups png во время подготовки бэкапа могут произойти ошибки в этом случае иконка станет красной попробуйте подготовить бэкап еще раз после успешной подготовки бэкап будет доступен для скачивания в течении двух часов если вы не успели его скачать то переподготовьте его", 3 | "metadata": { 4 | "file_name": "backups.md", 5 | "section_count": 2, 6 | "section_1": "Бэкапы", 7 | "section_2": "Бэкапы /data" 8 | } 9 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/notifications.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "уведомления о сбоях управление уведомлениями о сбоях в работе ваших приложений доступно во вкладке настройки каждого из них функционал работает следующим образом если приложение корректно работает не менее 30 минут и после этого его статус меняется на ошибка работы на привязанную к аккаунту электронную почту поступит соответствующее уведомление сообщения отправляются если приложение находится в статусе ошибка работы более 3 минут в настройках возможно включить выключить отправку уведомлений и задать максимальное количество уведомлений в день и минимальный интервал отправки eval rst admonition важно class warning если функционал работает некорректно просим сообщить в поддержку support amvera ru", 3 | "metadata": { 4 | "file_name": "notifications.md", 5 | "section_count": 1, 6 | "section_1": "Уведомления о сбоях" 7 | } 8 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Игнорирование виртуальных окружений Python 2 | venv/ 3 | .venv/ 4 | env/ 5 | ENV/ 6 | 7 | # Игнорирование файлов с окружением 8 | .env 9 | .env.* 10 | 11 | # Игнорирование скомпилированных файлов Python 12 | __pycache__/ 13 | *.py[cod] 14 | *$py.class 15 | 16 | # Игнорирование кэша и артефактов SASS 17 | *.sass-cache/ 18 | .sass-cache/ 19 | **/.sass-cache/ 20 | 21 | # Игнорирование логов и временных файлов 22 | *.log 23 | *.tmp 24 | *.temp 25 | *.swp 26 | 27 | # Игнорирование настроек проекта для IDE 28 | .idea/ 29 | .vscode/ 30 | *.sublime-workspace 31 | *.sublime-project 32 | 33 | # Игнорирование файлов сборки 34 | build/ 35 | dist/ 36 | *.egg-info/ 37 | .eggs/ 38 | 39 | # Игнорирование кэша и артефактов системы 40 | .DS_Store 41 | Thumbs.db 42 | 43 | # Игнорирование специфичных для ОС файлов 44 | *.bak 45 | *~ 46 | 47 | article_2/.env 48 | article_1/.env 49 | article_1/amvera_data/docs_amvera 50 | users.json 51 | -------------------------------------------------------------------------------- /article_2/app/static/form_style.css: -------------------------------------------------------------------------------- 1 | body { 2 | background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%); 3 | min-height: 100vh; 4 | display: flex; 5 | align-items: center; 6 | justify-content: center; 7 | } 8 | .login-form { 9 | background: white; 10 | padding: 2.5rem; 11 | border-radius: 15px; 12 | box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1); 13 | width: 100%; 14 | max-width: 400px; 15 | } 16 | .form-control { 17 | border-radius: 8px; 18 | padding: 0.75rem 1rem; 19 | } 20 | .form-control:focus { 21 | box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.15); 22 | } 23 | .btn-primary { 24 | padding: 0.75rem; 25 | border-radius: 8px; 26 | font-weight: 500; 27 | background: linear-gradient(135deg, #0d6efd 0%, #0a58ca 100%); 28 | border: none; 29 | } 30 | .btn-primary:hover { 31 | background: linear-gradient(135deg, #0a58ca 0%, #084298 100%); 32 | } 33 | .form-floating { 34 | margin-bottom: 1.5rem; 35 | } 36 | -------------------------------------------------------------------------------- /article_1/config.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from pydantic import SecretStr 4 | from pydantic_settings import BaseSettings, SettingsConfigDict 5 | 6 | 7 | class Config(BaseSettings): 8 | DEEPSEEK_API_KEY: SecretStr 9 | BASE_DIR: str = os.path.abspath(os.path.join(os.path.dirname(__file__))) 10 | DOCS_AMVERA_PATH: str = os.path.join(BASE_DIR, "amvera_data", "docs_amvera") 11 | PARSED_JSON_PATH: str = os.path.join(BASE_DIR, "amvera_data", "parsed_json") 12 | AMVERA_CHROMA_PATH: str = os.path.join(BASE_DIR, "amvera_data", "chroma_db") 13 | AMVERA_COLLECTION_NAME: str = "amvera_docs" 14 | MAX_CHUNK_SIZE: int = 512 15 | CHUNK_OVERLAP: int = 50 16 | LM_MODEL_NAME: str = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2" 17 | DEEPSEEK_MODEL_NAME: str = "deepseek-chat" 18 | OPENAI_MODEL_NAME: str = "gpt-3.5-turbo" 19 | OPENAI_API_KEY: SecretStr 20 | model_config = SettingsConfigDict(env_file=f"{BASE_DIR}/.env") 21 | 22 | 23 | settings = Config() # type: ignore 24 | -------------------------------------------------------------------------------- /article_2/app/pages/router.py: -------------------------------------------------------------------------------- 1 | from fastapi import APIRouter, Depends, Request 2 | from fastapi.responses import HTMLResponse, RedirectResponse 3 | from fastapi.templating import Jinja2Templates 4 | 5 | from app.api.utils import get_optional_current_user 6 | 7 | router = APIRouter() 8 | templates = Jinja2Templates(directory="app/templates") 9 | 10 | 11 | @router.get("/", response_class=HTMLResponse) 12 | async def chat_page( 13 | request: Request, 14 | user_id: int = Depends(get_optional_current_user), 15 | ): 16 | if user_id: 17 | return templates.TemplateResponse("index.html", {"request": request}) 18 | else: 19 | return RedirectResponse(url="/login") 20 | 21 | 22 | @router.get("/login", response_class=HTMLResponse) 23 | async def login_page( 24 | request: Request, 25 | user_id: int = Depends(get_optional_current_user), 26 | ): 27 | if user_id: 28 | return RedirectResponse(url="/") 29 | else: 30 | return templates.TemplateResponse("login.html", {"request": request}) 31 | -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/payments.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "проблема с оплатой если вы из белоруссии казахстана армении или другой страны и используете карту банка выпущенную не в россии платеж может не проходить на данный момент поддерживается оплата иностранными картами mastercard eval rst admonition важно class warning минимальный платеж по иностранным mastercard 1000 руб наша платежная система обещает стабилизировать прием платежей по картам visa mastercard но повлиять на это мы не можем в таком случае рекомендуем воспользоваться одним из следующих способов 1 попробовать использовать карту mastercard 2 оплата через qiwi 3 оплата через unionpay да мы понимаем что скорее всего у вас нет этой карты 4 напишите в support amvera ru мы найдем индивидуальное решение eval rst admonition внимание class error если вы из россии и оплата не проходит пишите в support amvera ru просим сразу указывать имя пользователя и проекта", 3 | "metadata": { 4 | "file_name": "payments.md", 5 | "section_count": 1, 6 | "section_1": "Проблема с оплатой" 7 | } 8 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/rabbitmq.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "rabbitmq облако amvera поддерживает создание преднастроенного сервиса rabbitmq создание rabbitmq для создания rabbitmq его следует выбрать в разделе «преднастроенные сервисы» и задать следующие переменные rabbitmq default user имя пользователя по умолчанию guest rabbitmq default pass пароль по умолчанию guest rabbitmq default vhost виртуальный host по умолчанию vhost нужен чтобы подключаться к очереди rabbitmq server additional erl args переменная опциональна и устанавливает уровень логирования и т д подключение к rabbitmq для подключения к rabbitmq из приложения следует использовать следующий шаблон заменив соответствующие значения на ваши параметры вместо host указывается внутреннее доменное имя проекта c rabbitmq которое можно найти во вкладке «домены» amqp login password host 5672 vhost при возникновении вопросов пишите на почту support amvera ru", 3 | "metadata": { 4 | "file_name": "rabbitmq.md", 5 | "section_count": 3, 6 | "section_1": "RabbitMQ", 7 | "section_2": "Создание RabbitMQ", 8 | "section_3": "Подключение к RabbitMQ" 9 | } 10 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/redash.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "redash для использования redash нам потребуется отдельно создать postgres и redis redash1 img redash1 png redash2 img redash2 png redash3 img redash3 png redash4 img redash4 png redash5 img redash5 png redash6 img redash6 png redash7 img redash7 png redash8 img redash8 png redash9 img redash9 png redash10 img redash10 png redash11 img redash11 png redash12 img redash12 png теперь создаём redash redash13 img redash13 png redash14 img redash14 png заполнить переменные окружения redash database url url к postgresql в формате postgresql username password host 5432 db name redash redis url url к redis в формате redis username password host 6379 0 redash cookie secret любая последовательность букв и цифр redash cookie secret любая последовательность букв и цифр redash15 img redash15 png создать доменное имя redash16 img redash16 png redash17 img redash17 png перейти на него и заполнить поля redash18 img redash18 png для подключения postgres к redash перейдите во вкладку settings redash19 img redash19 png redash20 img redash20 png redash21 img redash21 png заполните соответсвующие поля redash22 img redash22 png redash23 img redash23 png", 3 | "metadata": { 4 | "file_name": "redash.md", 5 | "section_count": 1, 6 | "section_1": "Redash" 7 | } 8 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/k8sprobe.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "поддержка проб kubernetes как настраивать в форму нужно заполнять настройки в формате yaml нативно формату который используется самим k8s см здесь https kubernetes io docs tasks configure pod container configure liveness readiness startup probes конфигурационный файл подставляется в ваш deployment который загружается с ним в кластер это означает что если вы загрузили неработающую настройку или в неправильном формате ваш проект упадет на этапе сборки пример livenessprobe tcpsocket port 8080 initialdelayseconds 15 periodseconds 10 внимание то что указано в примере необязательно будет работать на вашем проекте на основе чего срабатывает уведомление пробы k8s не предполагают функционала для уведомления по какому либо критерию но наша система принимает решение на основе ивентов kubernetes уведомление отправляется в результате получения ивента с информацией о негативной пробе например если readiness probe оказалась негативной kubernetes дает ивент с сообщением которое начинается readiness probe failed", 3 | "metadata": { 4 | "file_name": "k8sprobe.md", 5 | "section_count": 4, 6 | "section_1": "Поддержка проб Kubernetes", 7 | "section_2": "Как настраивать?", 8 | "section_3": "Пример", 9 | "section_4": "На основе чего срабатывает уведомление" 10 | } 11 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/disposion.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "удаление ресурса если ресурс приложение или субд больше не нужен его можно удалить удаление ресурса приведет к остановке всех его контейнеров а также удалению всех данных этого проекта eval rst admonition внимание class attention после удаления восстановить данные ресурса нельзя внимательно проверьте что вы удаляете тот проект что хотите чтобы удалить ресурс на его странице во вкладке настройки нужно нажать кнопку удалить проект settings img settings png в открывшемся диалоговом окне для подтверждения введите строку удалить навсегда имя проекта проверка введенной строки осуществляется без учета регистра disposion img disposion png вставка в поле с проверочной фразой запрещена поэтому ее придется напечатать самостоятельно целиком это нужно в качестве последнего рубежа защиты от действий по ошибке details summary для тех кто запрет на копирование воспринимает как вызов 😊 summary вы можете отключить запрет на копирование любым известным вам способом после чего скопировать проверочную строку но даже если вы это сделаете мы достигнем нашей цели вы не кликните бездумно на кнопку да удалить а потом подумаете ой не тот проект что мне делать details удаление проекта может занять некоторое время когда работа будет закончена проект пропадет из вашего списка проектов", 3 | "metadata": { 4 | "file_name": "disposion.md", 5 | "section_count": 1, 6 | "section_1": "Удаление ресурса" 7 | } 8 | } -------------------------------------------------------------------------------- /article_2/app/templates/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Вход 7 | 11 | 12 | 13 | 14 |
15 |

Вход в систему

16 |
17 |
18 | 26 | 27 |
28 |
29 | 37 | 38 |
39 | 40 |
41 |
42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/data-saving.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "не сохраняются данные при перезапуске пересборке приложения базы данных если при перезапуске пересборке проекта ваши данные не сохраняются убедитесь что вы их сохраняете в каталог data данная директория специально создана нами для того чтобы при перезапусках проектов пересборке и т д все ваши данные были сохранны и доступны помимо этого данные хранимые в data мы сохраняем в трёх экземплярах на разных узлах кластера дополнительно делая регулярные бэкапы что снижает риск их безвозвратной потери если вам неудобно использовать каталог data обычно вы можете его изменить в файле amvera yaml например yaml часть amvera yml run persistencemount var myapp data eval rst admonition важно class warning папка data в корне проекта и директория data это разные директории проверить что сохранение идет в data можно зайдя в папку data на странице репозиторий для удобства тестирования вы можете создать директорию data на локальном компьютере при развертывании полностью с помощью amvera yaml мы не рекомендуем задавать значение run persistencemount равной app или его подпапке это может приводить к некорректному поведению если вы сохраняете в data базу данных sqlite ознакомьтесь с инструкцией databases sqlite md eval rst admonition подсказка class hint если не получается разобраться пишите в поддержку support amvera ru просим сразу указывать имя пользователя и проекта мы постараемся помочь", 3 | "metadata": { 4 | "file_name": "data-saving.md", 5 | "section_count": 2, 6 | "section_1": "Не сохраняются данные при перезапуске/пересборке приложения/базы данных", 7 | "section_2": "часть amvera.yml" 8 | } 9 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/update.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "не получается обновить проект возможные причины неверная последовательность команд git частой ошибкой является неверная последовательность команд git когда проект уже запущен и нужно его обновить симптомом является ответ команды git когда вы изменяли код и выполнили git push everything up to date вам поможет следующая последовательность команд shell git add git commit m описание сделанных изменений git push amvera master не забудьте про точку в первой команде она нужна при этом убедитесь что файлы содержащие конфиденциальную информацию по типу токенов такие как env находятся в gitignore переменные окружения лучше всего указывать именно во вкладке переменные проекта сборка развертывание перестала работать проект ранее успешно обновлялся но в этот раз сборка развертывание не работает рекомендуем заморозить приложение через интерфейс личного кабинета во вкладке настройки подождать пару минут и повторить push сборку в ряде случаев данная ошибка может быть вызвана старыми артефактами и их удаление может помочь если ни один из способов выше не помогает вы можете пересоздать проект с новым именем eval rst admonition внимание class error заморзка проекта остановит все текущие инстансы приложения без возможности их запуска без пересборки eval rst admonition подсказка class hint если не получается разобраться пишите в поддержку support amvera ru просим сразу указывать имя пользователя и проекта мы постараемся помочь", 3 | "metadata": { 4 | "file_name": "update.md", 5 | "section_count": 3, 6 | "section_1": "Не получается обновить проект", 7 | "section_2": "Неверная последовательность команд git", 8 | "section_3": "Сборка/развертывание перестала работать" 9 | } 10 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/main-origin.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "использование amvera как основной репозиторий если вы начинаете разработку своего приложения и хотите использовать amvera для хостинга вы можете использовать выделенный нами репозиторий git как основной eval rst admonition подсказка class hint для ознакомления с принципом работы с git рекомендуем эту статью https habr com ru articles 541258 которая упростит работу с нашим сервисом подключение репозитория адрес удаленного репозитория находится на странице репозиторий приложения python config img git main png чтобы склонировать пустой репозиторий shell git clone https git amvera ru имя пользователя транслитерированное имя проекта чтобы подключить удаленный репозиторий амвера к локальному репозиторию shell git remote add origin https git amvera ru имя пользователя транслитерированное имя проекта заполнение репозитория напишите код вашего приложения чтобы его можно было собрать и запустить необходимо наличие файла конфигурации amvera yaml configuration config file md и или dockerfile configuration docker md советуем так же ознакомится с процессом сборки build md и развертывания run md приложения развертывание проекта для инициализации процесса сборки и развертывания приложения достаточно отправить изменения в репозиторий амвера shell git push u origin master на запрос пользователя и пароля укажите имя пользователя и пароль вашей учетной записи amvera eval rst admonition подсказка class hint запущенные инстансы вашего проекта при ошибке сборки не останавливаются и продолжат работать если вы столкнулись с ошибкой или вам что то непонятно ознакомьтесь с разделом частые ошибки git freq errors md при работе с git", 3 | "metadata": { 4 | "file_name": "main-origin.md", 5 | "section_count": 5, 6 | "section_1": "Использование Amvera как основной репозиторий", 7 | "section_2": "Подключение репозитория", 8 | "section_3": "Заполнение репозитория", 9 | "section_4": "Развертывание проекта", 10 | "section_5": "Если вы столкнулись с ошибкой или вам что-то непонятно" 11 | } 12 | } -------------------------------------------------------------------------------- /article_2/app/api/utils.py: -------------------------------------------------------------------------------- 1 | import json 2 | from datetime import datetime, timedelta 3 | from typing import Optional 4 | 5 | import aiofiles 6 | import jwt 7 | from fastapi import Cookie, HTTPException 8 | 9 | from app.config import settings 10 | 11 | 12 | async def get_all_users(): 13 | async with aiofiles.open(settings.USERS) as f: 14 | content = await f.read() 15 | users = json.loads(content) 16 | return users 17 | 18 | 19 | async def authenticate_user(login: str, password: str): 20 | users = await get_all_users() 21 | for user in users: 22 | if user["login"] == login and user["password"] == password: 23 | return user 24 | return None 25 | 26 | 27 | async def create_jwt_token(user_id: int): 28 | expire = datetime.now() + timedelta(hours=1) 29 | payload = { 30 | "sub": str(user_id), 31 | "exp": expire.timestamp(), 32 | } 33 | token = jwt.encode(payload, settings.SECRET_KEY, algorithm=settings.ALGORITHM) 34 | return token 35 | 36 | 37 | async def verify_jwt_token(token: str): 38 | try: 39 | payload = jwt.decode( 40 | token, settings.SECRET_KEY, algorithms=[settings.ALGORITHM] 41 | ) 42 | return payload["sub"] 43 | except jwt.ExpiredSignatureError: 44 | raise HTTPException(status_code=401, detail="Token expired") 45 | except jwt.InvalidTokenError: 46 | raise HTTPException(status_code=401, detail="Invalid token") 47 | 48 | 49 | async def get_current_user( 50 | access_token: Optional[str] = Cookie(default=None), 51 | ): 52 | if not access_token: 53 | raise HTTPException(status_code=401, detail="Missing token") 54 | user_id = await verify_jwt_token(access_token) 55 | return user_id 56 | 57 | 58 | async def get_optional_current_user( 59 | access_token: Optional[str] = Cookie(default=None), 60 | ) -> Optional[int]: 61 | if not access_token: 62 | return None 63 | try: 64 | user_id = await verify_jwt_token(access_token) 65 | return user_id 66 | except Exception: 67 | return None 68 | -------------------------------------------------------------------------------- /article_2/app/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Amvera Cloud Chat 7 | 11 | 15 | 19 | 20 | 21 | 22 |
23 |
24 |

Amvera Cloud Chat

25 |
26 | 30 | 34 |
35 |
36 |
37 |
38 | 45 | 49 |
50 |
51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/enverror.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "ошибка venv в python при сборке или запуске приложения несоответствие версии библиотек версии окружения проблема с тем что pip если вы используете python находит не те версии библиотеки к примеру wavelink если оставить версию python дефолтной 3 8 то из за того что wavelink требует python 3 10 найдутся совершенно другие версии а узнать об этом можно только изучив в pypi org решение вы можете изменить версию python в конфигурационном файле либо версии зависимостей в файле requirements txt eval rst admonition подсказка class hint если не получается разобраться пишите в поддержку support amvera ru просим сразу указывать имя пользователя и проекта мы постараемся помочь не все файлы после заморозки проекта удалились если заморозить проект и сразу же пересобрать то папка venv в artifacts отвечающая за окружение python повреждается не успевая удалиться перед новой сборкой из за чего возникают ошибки вида error could not install packages due to an oserror errno 13 permission denied local app venv bin python3 no module named pip main pip is a package and cannot be directly executed error errno 13 permission denied app venv решить можно полной очисткой artifacts для этого нужно перейти в настройки и повторно заморозить проект но на этот раз дать больше времени около 20 секунд для того чтобы папка venv успевала удалиться и не вызывала конфликтов во время сборки вы случайно загрузили папку venv для python если вы используете python папку venv загружать не нужно зависимости следует устанавливать прописывая их в файле requirements txt вы можете составить его через pip freeze но мы рекомендуем прописать их руками так как pip freeze дает много лишних зависимостей что может приводить к конфликтам окружений", 3 | "metadata": { 4 | "file_name": "enverror.md", 5 | "section_count": 5, 6 | "section_1": "Ошибка venv в Python при сборке или запуске приложения", 7 | "section_2": "Несоответствие версии библиотек версии окружения:", 8 | "section_3": "Решение:", 9 | "section_4": "Не все файлы после заморозки проекта удалились:", 10 | "section_5": "Вы случайно загрузили папку Venv (для Python)" 11 | } 12 | } -------------------------------------------------------------------------------- /article_2/app/chroma_client/ai_store.py: -------------------------------------------------------------------------------- 1 | from typing import AsyncGenerator, Literal 2 | 3 | from langchain_core.messages import HumanMessage, SystemMessage 4 | from langchain_deepseek import ChatDeepSeek 5 | from langchain_openai import ChatOpenAI 6 | from loguru import logger 7 | 8 | from app.config import settings 9 | 10 | 11 | class ChatWithAI: 12 | def __init__(self, provider: Literal["deepseek", "chatgpt"] = "deepseek"): 13 | self.provider = provider 14 | if provider == "deepseek": 15 | self.llm = ChatDeepSeek( 16 | api_key=settings.DEEPSEEK_API_KEY, 17 | model=settings.DEEPSEEK_MODEL_NAME, 18 | temperature=0.7, 19 | ) 20 | elif provider == "chatgpt": 21 | self.llm = ChatOpenAI( 22 | api_key=settings.OPENAI_API_KEY, 23 | model=settings.OPENAI_MODEL_NAME, 24 | temperature=0.7, 25 | ) 26 | else: 27 | raise ValueError(f"Неподдерживаемый провайдер: {provider}") 28 | 29 | async def astream_response( 30 | self, formatted_context: str, query: str 31 | ) -> AsyncGenerator[str, None]: 32 | try: 33 | system_message = SystemMessage( 34 | content="""Ты — внутренний менеджер компании Amvera Cloud. Отвечаешь по делу без лишних вступлений. Свой ответ, в первую очередь, ориентируй на переданный контекст. Если информации недостаточно - пробуй получить ответы из своей базы знаний.""" 35 | ) 36 | human_message = HumanMessage( 37 | content=f"Вопрос: {query}\nКонтекст: {formatted_context}. Ответ форматируй в markdown!" 38 | ) 39 | logger.info(f"Начинаем стриминг ответа для запроса: {query}") 40 | async for chunk in self.llm.astream([system_message, human_message]): 41 | if chunk.content: # Пропускаем пустые куски 42 | logger.debug(f"Получен чанк: {chunk.content[:50]}...") 43 | yield chunk.content 44 | logger.info("Стриминг ответа завершен") 45 | except Exception as e: 46 | logger.error(f"Ошибка при стриминге ответа: {e}") 47 | yield "Произошла ошибка при стриминге ответа." 48 | -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/variables.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "переменные и секреты переменная окружения это текстовая переменная операционной системы в нашем случае контейнера хранящая какую либо информацию — например данные о настройках системы токены пароли и т д amvera cloud позволяет создавать и использовать переменные окружения и секреты eval rst admonition важно class warning чтобы переменные применились нужно перезапустить контейнеры на этапе сборки переменные окружения не доступны добавление переменной или секрета добавление происходит в разделе переменные python config img secrets vars png для добавления переменой секрета необходимо нажать на кнопку создать переменную и заполнить всплывающую форму создания python config img create env png где название имя создаваемой переменной секрета по которому он доступен в системе значение требуемое значение которое должна хранить эта перемеменная секрет доступ к переменным после добавления переменной окружения она будет доступна для чтения следующим образом пример для python python import os my var os environ my var вместо my var нужно подставить имя переменной окружения или секрета который был добавлен через веб интерфейс переменная amvera если приложению нужно различать в каком окружении оно работает amvera или например локально на компьютере разработчика можно использовать переменную окружения amvera в окружении amvera эта переменная задана и имеет значение 1 так чтобы в коде python понять запущена программа локально или в amvera достаточно выполнить python import os amvera var os environ amvera if amvera var 1 print работаю в облаке амвера else print работаю локально отличие секретов от переменных окружения отличие секретов от обычных переменных окружения в том что обычные переменные окружения хранятся открытым текстом в базе данных а секреты хранятся в отдельном хранилище секретов и в базе данных хранится только ссылка на этот секрет секреты подходят для храненения такой конфиденциальной информации как токены и пароли", 3 | "metadata": { 4 | "file_name": "variables.md", 5 | "section_count": 5, 6 | "section_1": "Переменные и секреты", 7 | "section_2": "Добавление переменной или секрета", 8 | "section_3": "Доступ к переменным", 9 | "section_4": "Переменная AMVERA", 10 | "section_5": "Отличие секретов от переменных окружения" 11 | } 12 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/not-found-file.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "не найден файл no such file or directory возможные причины в конфигурации указан не тот основной файл который у вас используется в коде проекта пример в amvera yml указан файл для запуска app py а в вашем проекте он называется bot py или вы опечатались и назвали файл bott py а не bot py файл имеет другой путь как пример он находится в одной директории а система или ваш код ищет его в другой пример ваш проект лежит в условной папке project или как у вас она называется в проекте в которой уже содержатся файлы app py amvera yaml и т д при этом вы в конфигурации просто указали файл запуска app py в данном случае система будет искать файл app py на одном уровне с папкой project и разумеется данный файл не найдет можно либо изменить путь в конфигурации либо вынести файлы в корень убрав папку project как работать с путями можно ознакомиться по ссылке https docs amvera ru applications storage html файл не загружен просмотреть список загруженных файлов можно в разделе репозиторий не установлено требуемое окружение пример ваш проект на python и вы устанавливаете зависимости с использованием файла requirements txt убедитесь что все зависимости прописаны некоторые зависимости такие как sqlite прописывать не надо они уже встроены в python и конфликтуют при их указании дополнительно не рекомендуем использовать pip freeze так как он создает много лишних зависимостей дополнительно следует убедиться что версия python поддерживает указанные версии библиотек для этого можно изменить версию python если вы используете node js убедитесь что вы случайно не загрузили node modules вы не указали несуществующий параметр в секции build и вы не устанавливали пропуск сборки решение внимательно проверить соответствие проекта с файлом конфигурации все пути и факт загрузки eval rst admonition подсказка class hint если вы уверены что все проверили и все верно попробуйте удалить все файлы из папки artifacts в интерфейсе лк подождать 30 секунд и пересобрать приложение eval rst admonition подсказка class hint если не получается разобраться пишите в поддержку support amvera ru просим сразу указывать имя пользователя и проекта мы постараемся помочь", 3 | "metadata": { 4 | "file_name": "not-found-file.md", 5 | "section_count": 3, 6 | "section_1": "Не найден файл (no such file or directory ...)", 7 | "section_2": "Возможные причины:", 8 | "section_3": "Решение:" 9 | } 10 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "подключить github gitlab bitbucket сервис amvera предоставляет возможность использовать сторонний git сервис как основной для этого вам потребуется настроить вебхук и подключить git сервис на вкладке репозиторий вашего проекта видеоинструкция по подключению eval rst youtube icqyjw mmn8 align center width 100 span style font size 1 5em font weight 700 рассмотрим процесс подключения на примере публичного github репозитория span перейдите на вкладку репозиторий вашего проекта выберите из списка ваш git сервис выберите ивент в случае успешного выполнения которого репозиторий amvera будет делать pull если будут выбраны оба ивента то репозиторий amvera будет реагировать на ci ивент придумайте и добавьте секрет обязательное поле после добавления его можно будет изменить но посмотреть значение не получится укажите целевую ветку удаленного репозитория скопируйте предлагаемый адрес нажмите применить img webhook add png eval rst admonition важно class warning ci для github worflow runs для gitlab pipeline events во время git pull используется merge strategy their после потребуется настроить вебхук в github добавьте новый вебхук вставьте скопированный адрес выберите content type application json добавьте секрет который добавили в amvera выберите ивент на который вы хотите начать сборку проекта push workflow runs на остальные ивенты amvera будет отвечать статусом 400 нажмите add webhook img webhook github png теперь можете делать git push в удаленный github репозиторий после все изменения будут применяться в amvera репозитории сборка начнется автоматически span style font size 1 5em font weight 700 подключение приватного github репозитория span процесс полностью идентичен за исключением необходимости сгенерировать и добавить access token перейдите в настройки вашего github аккаунта слева внизу выберите developer settings выберите tokens classic generate new token введите название установите expiration no expiration отметьте галочкой repo нажмите generate token скопируйте его значение перейдите на вкладку репозиторий вашего проекта в amvera и добавьте скопированный токен после того как изменения успешно применились вы можете делать git push в приватный репозиторий и все изменения будут применяться в репозитории amvera", 3 | "metadata": { 4 | "file_name": "webhooks.md", 5 | "section_count": 2, 6 | "section_1": "Подключить GitHub, GitLab, Bitbucket", 7 | "section_2": "Видеоинструкция по подключению" 8 | } 9 | } -------------------------------------------------------------------------------- /article_1/examples/read_chroma_db_example.py: -------------------------------------------------------------------------------- 1 | from langchain_huggingface import HuggingFaceEmbeddings 2 | import torch 3 | from loguru import logger 4 | from langchain_chroma import Chroma 5 | 6 | CHROMA_PATH = r"C:\Users\mrmno\CursorPythonProjects\chroma_project\article_1\examples\shop_chroma_db" 7 | COLLECTION_NAME = "shop_data" 8 | 9 | 10 | def connect_to_chroma(): 11 | """Подключение к существующей базе Chroma.""" 12 | try: 13 | logger.info("Загрузка модели эмбеддингов...") 14 | embeddings = HuggingFaceEmbeddings( 15 | model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2", 16 | model_kwargs={"device": "cuda" if torch.cuda.is_available() else "cpu"}, 17 | encode_kwargs={"normalize_embeddings": True}, 18 | ) 19 | 20 | chroma_db = Chroma( 21 | persist_directory=CHROMA_PATH, 22 | embedding_function=embeddings, 23 | collection_name=COLLECTION_NAME, 24 | ) 25 | 26 | logger.success("Успешное подключение к базе Chroma") 27 | return chroma_db 28 | except Exception as e: 29 | logger.error(f"Ошибка подключения к Chroma: {e}") 30 | raise 31 | 32 | 33 | def search_products(query: str, metadata_filter: dict = None, k: int = 4): 34 | """ 35 | Поиск продуктов по запросу и метаданным. 36 | 37 | Args: 38 | query (str): Текстовый запрос для поиска 39 | metadata_filter (dict): Опциональный фильтр по метаданным 40 | k (int): Количество результатов для возврата 41 | 42 | Returns: 43 | list: Список найденных продуктов с их метаданными 44 | """ 45 | try: 46 | chroma_db = connect_to_chroma() 47 | results = chroma_db.similarity_search_with_score( 48 | query, k=k, filter=metadata_filter 49 | ) 50 | 51 | logger.info(f"Найдено {len(results)} результатов для запроса: {query}") 52 | formatted_results = [] 53 | for doc, score in results: 54 | formatted_results.append( 55 | { 56 | "text": doc.page_content, 57 | "metadata": doc.metadata, 58 | "similarity_score": score, 59 | } 60 | ) 61 | return formatted_results 62 | except Exception as e: 63 | logger.error(f"Ошибка при поиске: {e}") 64 | raise 65 | 66 | 67 | for i in search_products(query="какой у вас самый крутой пылесос?"): 68 | print(i) 69 | -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/golang-go.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "go данная конфигурация подходит если проект сделан на go написать yaml файл можно как самостоятельно используя инструкцию ниже так и воспользоваться нашим генератором yaml перейдя по ссылке https manifest amvera ru либо заполнить в разделе конфигурация личного кабинета секция meta секция meta файла amvera yml будет выглядеть следующим образом yaml meta environment golang toolchain name go version 1 22 из параметров которые можно здесь менять это meta toolchain version логически это версия компилятора go который нужно использовать для сборки технически значение version подставляется в имя образа docker который будет использован вы можете использовать более высокую версию компилятора к примеру дома на компьютере вы используете 1 21 если вы попробуйте собрать ваш проект в амвере с образом 1 22 у вас все сработает для фазы сборки и запуска это golang meta toolchain version допустимые значения можно увидеть на странице докер хаба https hub docker com eval rst admonition важно class warning значение meta toolchain version должно быть допустимым как для фазы сборки так и для фазы запуска лучше всего подходит простой номер lts версии секция build в секции build могут быть указаны следующие параметры image параметр image позволяет использовать другой образ для сборки а не тот который предлагается amvera образ должен удовлетворять следующим требованиям исходный код для сборки ожидается в папке app или образу без разницы где будет находиться исходный код секция run в секции run могут быть использованы следующие параметры image persistencemount containerport параметр image позволяет использовать другой образ для сборки а не тот который предлагается amvera образ должен удовлетворять следующим требованиям результат сборки ожидается в папке app или образу без разницы где будет находиться результат сборки параметр persistencemount позволяет указать в какую директорию будет примонтирована папка с постоянным хранилищем storage md data по умолчанию имеет значение data параметр containerport позволяет указать какой порт слушает приложение по умолчанию имеет значение 80 рецепты минимальный файл amvera yml yaml meta environment golang toolchain name go version 1 22", 3 | "metadata": { 4 | "file_name": "golang-go.md", 5 | "section_count": 6, 6 | "section_1": "Go", 7 | "section_2": "Секция meta", 8 | "section_3": "Секция build", 9 | "section_4": "Секция run", 10 | "section_5": "Рецепты", 11 | "section_6": "Минимальный файл amvera.yml" 12 | } 13 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/csharp-mono.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "c mono данная конфигурация подходит если проект собирается и запускается при помощи mono в этом случае проект может быть написан на таких языках как c написать yaml файл можно как самостоятельно используя инструкцию ниже так и воспользоваться нашим генератором yaml перейдя по ссылке https manifest amvera ru либо заполнить в разделе конфигурация личного кабинета секция meta секция meta файла amvera yml будет выглядеть следующим образом yaml meta environment csharp toolchain name mono version latest из параметров которые можно здесь менять это meta toolchain version логически это версия образа mono который нужно использовать для сборки технически значение version подставляется в имя образа docker который будет использован для фазы сборки и запуска это mono meta toolchain version допустимые значения можно увидеть на странице докер хаба https hub docker com eval rst admonition важно class warning значение meta toolchain version должно быть допустимым как для фазы сборки так и для фазы запуска лучше всего подходит простой номер lts версии mono секция build в секции build могут быть указаны следующие параметры image mainfile параметр image позволяет использовать другой образ для сборки а не тот который предлагается amvera образ должен удовлетворять следующим требованиям исходный код для сборки ожидается в папке app или образу без разницы где будет находиться исходный код параметр mainfile является обязательным в него необходимо передать название файла с методом main c расширением пример yaml build mainfile program cs секция run в секции run могут быть использованы следующие параметры image persistencemount containerport параметр image позволяет использовать другой образ для сборки а не тот который предлагается amvera образ должен удовлетворять следующим требованиям результат сборки ожидается в папке app или образу без разницы где будет находиться результат сборки параметр persistencemount позволяет указать в какую директорию будет примонтирована папка с постоянным хранилищем storage md data по умолчанию имеет значение data параметр containerport позволяет указать какой порт слушает приложение по умолчанию имеет значение 80 рецепты минимальный файл amvera yml yaml meta environment csharp toolchain name mono version latest build mainfile program cs", 3 | "metadata": { 4 | "file_name": "csharp-mono.md", 5 | "section_count": 6, 6 | "section_1": "C# mono", 7 | "section_2": "Секция meta", 8 | "section_3": "Секция build", 9 | "section_4": "Секция run", 10 | "section_5": "Рецепты", 11 | "section_6": "Минимальный файл amvera.yml" 12 | } 13 | } -------------------------------------------------------------------------------- /article_2/app/chroma_client/chroma_store.py: -------------------------------------------------------------------------------- 1 | import torch 2 | from langchain_chroma import Chroma 3 | from langchain_huggingface import HuggingFaceEmbeddings 4 | from loguru import logger 5 | 6 | from app.config import settings 7 | 8 | 9 | class ChromaVectorStore: 10 | def __init__(self): 11 | self._store: Chroma | None = None 12 | 13 | async def init(self): 14 | logger.info("🧠 Инициализация ChromaVectorStore...") 15 | try: 16 | device = "cuda" if torch.cuda.is_available() else "cpu" 17 | logger.info(f"🚀 Используем устройство для эмбеддингов: {device}") 18 | 19 | embeddings = HuggingFaceEmbeddings( 20 | model_name=settings.LM_MODEL_NAME, 21 | model_kwargs={"device": device}, 22 | encode_kwargs={"normalize_embeddings": True}, 23 | ) 24 | 25 | self._store = Chroma( 26 | persist_directory=settings.AMVERA_CHROMA_PATH, 27 | embedding_function=embeddings, 28 | collection_name=settings.AMVERA_COLLECTION_NAME, 29 | ) 30 | 31 | logger.success( 32 | f"✅ ChromaVectorStore успешно подключен к коллекции " 33 | f"'{settings.AMVERA_COLLECTION_NAME}' в '{settings.AMVERA_CHROMA_PATH}'" 34 | ) 35 | except Exception as e: 36 | logger.exception(f"❌ Ошибка при инициализации ChromaVectorStore: {e}") 37 | raise 38 | 39 | async def asimilarity_search(self, query: str, with_score: bool, k: int = 3): 40 | if not self._store: 41 | raise RuntimeError("ChromaVectorStore is not initialized.") 42 | logger.info(f"🔍 Поиск похожих документов по запросу: «{query}», top_k={k}") 43 | try: 44 | if with_score: 45 | results = await self._store.asimilarity_search_with_score( 46 | query=query, k=k 47 | ) 48 | else: 49 | results = await self._store.asimilarity_search(query=query, k=k) 50 | logger.debug(f"📄 Найдено {len(results)} результатов.") 51 | return results 52 | except Exception as e: 53 | logger.exception(f"❌ Ошибка при поиске: {e}") 54 | raise 55 | 56 | async def close(self): 57 | # Пока Chroma не требует явного закрытия, но на будущее и для логирования 58 | logger.info("🔌 Отключение ChromaVectorStore...") 59 | pass 60 | 61 | 62 | # Глобальный инстанс 63 | chroma_vectorstore = ChromaVectorStore() 64 | 65 | 66 | def get_vectorstore() -> ChromaVectorStore: 67 | return chroma_vectorstore 68 | -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/ruby-bundle.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "ruby rails данная конфигурация подходит если проект собирается при помощи ruby написать yaml файл можно как самостоятельно используя инструкцию ниже так и воспользоваться нашим генератором yaml перейдя по ссылке https manifest amvera ru либо заполнить в разделе конфигурация личного кабинета секция meta секция meta файла amvera yml будет выглядеть следующим образом yaml meta environment ruby toolchain name bundle version 3 0 из параметров которые можно здесь менять это meta toolchain version логически это версия ruby которую нужно использовать для сборки технически значение version подставляется в имя образа docker который будет использован для фазы сборки и запуска это ruby meta toolchain version допустимые значения можно увидеть на странице докер хаба https hub docker com важно значение meta toolchain version должно быть допустимым как для фазы сборки так и для фазы запуска лучше всего подходит простой номер lts версии ruby секция build в секции build могут быть указаны следующие параметры image параметр image позволяет использовать другой образ для сборки а не тот который предлагается amvera образ должен удовлетворять следующим требованиям исходный код для сборки ожидается в папке app или образу без разницы где будет находиться исходный код секция run в секции run могут быть использованы следующие параметры image mainscript persistencemount containerport параметр image позволяет использовать другой образ для сборки а не тот который предлагается amvera образ должен удовлетворять следующим требованиям результат сборки ожидается в папке app или образу без разницы где будет находиться результат сборки параметр mainscript позволяет указать главный скрипт в проекте с расширением параметр persistencemount позволяет указать в какую директорию будет примонтирована папка с постоянным хранилищем storage md data по умолчанию имеет значение data параметр containerport позволяет указать какой порт слушает приложение по умолчанию имеет значение 80 важно если вы используете обычный ruby без каких либо фреймворков необходимо добавить файл в ваш проект gemfile в который добавить минимальную конфигурацию содержимое gemfile yaml source https rubygems org рецепты минимальный файл amvera yml yaml meta environment ruby toolchain name bundle version 3 0 run mainscript webservice rb", 3 | "metadata": { 4 | "file_name": "ruby-bundle.md", 5 | "section_count": 7, 6 | "section_1": "Ruby (Rails)", 7 | "section_2": "Секция meta", 8 | "section_3": "Секция build", 9 | "section_4": "Секция run", 10 | "section_5": "Важно", 11 | "section_6": "Рецепты", 12 | "section_7": "Минимальный файл amvera.yml" 13 | } 14 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/sla.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "sla sla безотказной работы amvera cloud дает гарантию по доступности инфраструктуры на уровне 99 5 uptime в календарный месяц компенсации в рамках sla по uptime при нарушении со стороны amvera установленного порога uptime пользователи вправе претендовать на компенсацию в размере 20 от потребления ресурса пострадавшими проектами за прошедший месяц при этом компенсация не может превышать сумму пополнений баланса пользователем в прошлых периодах компенсация начисляется исключительно в виде предоставления гранта или промокода на пополнение баланса amvera денежные возвраты не осуществляются правила расчета uptime uptime распространяется исключительно на время безотказной работы инфраструктуры amvera и не распространяется на отказы на стороне кода приложений пользователей и отказы вызванные установкой настроек пользователями примеры если на стороне amvera упала сеть и сервисы не работают вы можете претендовать на компенсацию если наблюдается недоступность managed сервисов вы можете претендовать на компенсацию но если вы накатили обновление и приложение сломалось это не зона ответственности amvera если ваше приложение перестало работать но мы не наблюдаем неполадок в системе мы исходим из того что проблема на стороне кода настроек приложения проведение плановых работ на сервере и обновлений системы не подпадает под действие sla uptime рассчитывается на основе информации об инцидентах размещенных на официальных ресурсах amvera cloud и обращений в поддержку по адресу support amvera ru uptime в 99 5 допускает до 4 часов недоступности в месяц sla по сохранности данных amvera cloud дает гарантию по сохранности данных в постоянном хранилище data и данных в managed postgresql компенсации в рамках sla сохранности данных при потере данных в постоянном хранилище data или данных в managed postgresql по вине amvera пользователи вправе претендовать на компенсацию в размере 50 от стоимости потребления ресурса пострадавшими проектами за прошедший месяц при этом компенсация не может превышать сумму пополнений баланса пользователем в прошлых периодах компенсация начисляется исключительно в виде предоставления гранта или промокода на пополнение баланса amvera денежные возвраты не осуществляются правила получения компенсации для получения компенсации необходимо направить заявку на почту support amvera ru содержащую подробную информацию об инциденте после проверки заявки компенсация производится в течение 10 рабочих дней", 3 | "metadata": { 4 | "file_name": "sla.md", 5 | "section_count": 7, 6 | "section_1": "SLA", 7 | "section_2": "SLA безотказной работы", 8 | "section_3": "Компенсации в рамках SLA по uptime", 9 | "section_4": "Правила расчета uptime", 10 | "section_5": "SLA по сохранности данных ", 11 | "section_6": "Компенсации в рамках SLA сохранности данных", 12 | "section_7": "Правила получения компенсации" 13 | } 14 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/README.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "документация для облака амвера для ведения документации используется www sphinx doc org с шаблоном furo cheatsheet https lpn doc sphinx primer readthedocs io en stable cheatsheet html example https foss heptapod net fluiddyn fluiddyn tree branch default doc ref type heads использование 1 установите нужные пакеты из requirements txt 2 в корневой папке запустите make html 3 в папке build html откройте index html 4 вы великолепны общие требования к оформлению 1 в качестве файлов документации следует использовать формат markdown или rst 2 оглавления оформляются внутри файлов rst 3 использование нотации заголовков допускается именно для заголовков нельзя использовать этот символ для выделения информации используйте специальные символы выделения bold 4 требуется соблюдать иерархию заголовков после заголовка первого уровня может идти только второго а не сразу третьего 5 избегаем обращения к аудитории и таких выражений как ваше приложение а чьё оно ещё наше можно а можно и нет в исключительных случаях такое можно оставить 6 называем файлы и папки понятными словами и сокращениями так как они фигурируют в url 7 ссылки на другие страницы документации указывать относительный без docs amvera ru используемые элементы conf py конфигурация доки python extensions myst nb sphinx ext intersphinx sphinxcontrib youtube templates path templates exclude patterns language ru source suffix rst restructuredtext md myst nb ipynb myst nb myst myst nb html theme furo html static path static html title html favicon img logo svg html theme options light logo logo light png dark logo logo dark png myst heading anchors 3 сколько уровней заголовков маркдаун учитывать в ссылках структура rst руководство amvera cloud amvera cloud сервис для развертывания it приложений субд и других программ в облаке toctree maxdepth 2 caption развертывание general examples applications quick start general faq видео ext sphinxcontrib youtube rst youtube qxaulhcedhm code of video from url align center width 100 markdown ext myst nb https myst nb readthedocs io en latest configuration html и для правильного отображения заголовков sphinx ext intersphinx вызов методов rst markdown eval rst youtube qxaulhcedhm align center width 100 markdown eval rst admonition важно class warning сборка приложения осуществляется в дополнительном контейнере тарифицирующемся так же как и само приложение из за чего текущее количество работающих инстансов может быть больше требуемого", 3 | "metadata": { 4 | "file_name": "README.md", 5 | "section_count": 9, 6 | "section_1": "Документация для облака Амвера", 7 | "section_2": "Использование:", 8 | "section_3": "Общие требования к оформлению:", 9 | "section_4": "Используемые элементы", 10 | "section_5": "conf.py:", 11 | "section_6": "Структура ", 12 | "section_7": "Видео", 13 | "section_8": "Markdown", 14 | "section_9": "Вызов методов rst" 15 | } 16 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/price.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "тарифные планы все тарифы amvera имеют поминутную тарификацию со списанием раз в час если ваш проект проработал 12 минут средства будут списаны только за эти 12 минут все тарифные планы кроме дополнительных дисков можно менять как в большую так и в меньшую сторону списания происходят только в случае потребления проектом ресурса если проект находится в статусе запущен запускается или работает с ошибкой биллинг будет тарифицировать данное время если проект в статусе остановлен или заморожен и объем файлов проекта не превышает заданный тариф списания не производятся допускается превышение тарифов по выделенному диску с тарификацией разницы потребления ваши проекты не остановятся если вы заполните хранилище в рамках тарифа тарифы для приложений пробный 0 1 цпу 100 мб озу 2 гб ssd 0 24 руб в час 170 руб 30 дней начальный 0 25 цпу 500 мб озу 5 гб ssd 0 4 руб в час 290 руб 30 дней дополнительно позволяет получить как и старшие тарифы гарантии в рамках sla начальный плюс 0 5 цпу 1 гб озу 7 гб ssd 0 68 руб в час 490 руб 30 дней тариф начальный плюс и старшие тарифы дополнительно позволяют получить доступ к бэкапам и расширенному мониторингу стандартный 1 цпу 2 5 гб озу 15 гб ssd 2 01 руб в час 1450 руб 30 дней тарифы стандартный и выше дополнительно позволяют получить доступ к приоритетной персонализированной поддержке ультра 2 цпу 6 гб озу 25 гб ssd 5 97 руб в час 4300 руб 30 дней ультра плюс 3 цпу 9 гб озу 35 гб ssd 10 76 руб в час 7750 руб 30 дней тарифы для субд и преднастроенных сервисов начальный 0 25 цпу 500 мб озу 5 гб ssd 0 4 руб в час 290 руб 30 дней начальный плюс 0 5 цпу 1 гб озу 7 гб ssd 0 68 руб в час 490 руб 30 дней стандартный 1 цпу 2 5 гб озу 15 гб ssd 2 01 руб в час 1450 руб 30 дней ультра 2 цпу 6 гб озу 25 гб ssd 5 97 руб в час 4300 руб 30 дней ультра плюс 3 цпу 9 гб озу 35 гб ssd 10 76 руб в час 7750 руб 30 дней тарифы для диска тарифицируется только превышение потребления лимита по тарифу тарифицируется фактическое превышение относительно тарифа стоимость каждого гб сверх тарифа составляет 35 руб за 720 часов 30 дней хранения в расчет потребления диска входят все файлы проекта из папок code artifacts data repo правила заморозки и удаления проектов при остановке проекта из за отрицательного баланса либо самостоятельной остановке проект автоматически будет заморожен удалены артефакт через 30 дней остановки проекта при этом если объем файлов проекта после его заморозки превышает выделенный лимит по выбранному тарифу проект может быть удален гарантированно избежать удаления проекта после 30 дней заморозки поможет поддержание баланса в положительной зоне", 3 | "metadata": { 4 | "file_name": "price.md", 5 | "section_count": 5, 6 | "section_1": "Тарифные планы", 7 | "section_2": "Тарифы для приложений", 8 | "section_3": "Тарифы для СУБД и преднастроенных сервисов", 9 | "section_4": "Тарифы для диска", 10 | "section_5": "Правила заморозки и удаления проектов" 11 | } 12 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/csharp-dotnet.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "с microsoft net данная конфигурация подходит если проект собирается при помощи maven и запускается на net в этом случае проект может быть написан на таких языках как c f и все поддерживаемые языки для net написать yaml файл можно как самостоятельно используя инструкцию ниже так и воспользоваться нашим генератором yaml перейдя по ссылке https manifest amvera ru либо заполнить в разделе конфигурация личного кабинета секция meta секция meta файла amvera yml будет выглядеть следующим образом yaml meta environment csharp toolchain name dotnet version 8 0 из параметров которые можно здесь менять это meta toolchain version логически это версия net который нужно использовать для сборки технически значение version подставляется в имя образа docker который будет использован для фазы сборки и запуска это mcr microsoft com dotnet sdk meta toolchain version допустимые значения можно увидеть на странице докер хаба https hub docker com eval rst admonition важно class warning значение meta toolchain version должно быть допустимым как для фазы сборки так и для фазы запуска лучше всего подходит простой номер lts версии net секция build в секции build могут быть указаны следующие параметры image args artifacts параметр image позволяет использовать другой образ для сборки а не тот который предлагается amvera образ должен удовлетворять следующим требованиям исходный код для сборки ожидается в папке app или образу без разницы где будет находиться исходный код секция run в секции run могут быть использованы следующие параметры image buildfilename persistencemount containerport параметр image позволяет использовать другой образ для сборки а не тот который предлагается amvera образ должен удовлетворять следующим требованиям результат сборки ожидается в папке app или образу без разницы где будет находиться результат сборки параметр buildfilename это название вашего проекта если вы не знаете откуда взять параметр buildfilename введите у себя на компьютере такую команду в папке с проектом dotnet build у вас появится папка bin debug net 0 buildfilename вам необходимо взять название файла exe без расширения пример можно найти в минимальном файле amvera yml параметр persistencemount позволяет указать в какую директорию будет примонтирована папка с постоянным хранилищем storage md data по умолчанию имеет значение data параметр containerport позволяет указать какой порт слушает приложение по умолчанию имеет значение 80 рецепты минимальный файл amvera yml yaml meta environment csharp toolchain name dotnet version 8 0 run buildfilename bin webapplication важно поле buildfilename должно быть в формате bin имя файла либо bin publish имя файла если вы делаете через публикацию", 3 | "metadata": { 4 | "file_name": "csharp-dotnet.md", 5 | "section_count": 6, 6 | "section_1": "С# Microsoft(.NET)", 7 | "section_2": "Секция meta", 8 | "section_3": "Секция build", 9 | "section_4": "Секция run", 10 | "section_5": "Рецепты", 11 | "section_6": "Минимальный файл amvera.yml" 12 | } 13 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/tgbot.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "не работает телеграм бот проверьте лог сборки и лог приложения с высокой вероятностью вы найдете там причину ошибки ниже приведены частые ошибки при развертывании ботов бот используется на 2 устройствах во время запуска перезапуска инстанс может работать в двух экземплярах около секунды что может вызывать такого плана ошибку ошибка выглядит следующим образом text aiogram utils exceptions terminatedbyothergetupdates terminated by other getupdates request make sure that only one bot instance is running попробуйте поставить delay 2 5 сек на создание объекта это должно помочь пример для бота на python с использованием telebot перед python bot telebot telebot token или подобной строкой прописать python import time time sleep 5 неверное название устанавливаемой библиотеки телебота в requirements txt телебот в requirements txt должен называться pytelegrambotapi а не telebot после замены telebot на pytelegrambotapi необходимо заморозить проект воспользовавшись соответсвующее кнопкой на вкладке настройки и только после этого пересобирать приложение заморозка необходима чтобы гарантировано очистить кэш в котором может сохраниться старая зависимость нет логов если статус приложения успешно запущено и проект использует язык python то для отображения вывода команды print надо выставить переменную окружения pythonunbuffered в 1 eval rst admonition подсказка class hint вы случайно загрузили папку venv для python если вы используете python папку venv загружать не нужно зависимости следует устанавливать через requirements txt вы можете составить его через pip freeze но мы рекомендуем прописать их руками так как pip freeze дает много лишних зависимостей что может приводить к конфликтам окружений если статус проекта приложение запущено но бот молчит чаще всего это связано с тем что приложение все таки не успело запуститься и нужно подождать если ожидание не помогает рекомендуется пересобрать проект или поднять тариф система не может найти файл no such file or directory ознакомьтесь с инструкцией not found file md у вас несоответствие версий python и зависимостей ознакомьтесь с инструкцией enverror md eval rst admonition подсказка class hint если не получается разобраться пишите в поддержку support amvera ru просим сразу указывать имя пользователя и проекта мы постараемся помочь", 3 | "metadata": { 4 | "file_name": "tgbot.md", 5 | "section_count": 9, 6 | "section_1": "Не работает телеграм-бот ", 7 | "section_2": "Бот используется на 2 устройствах", 8 | "section_3": "Пример для бота на Python с использованием telebot", 9 | "section_4": "Неверное название устанавливаемой библиотеки \"телебота\" в requirements.txt", 10 | "section_5": "Нет логов", 11 | "section_6": "Вы случайно загрузили папку Venv (для Python)", 12 | "section_7": "Если статус проекта \"Приложение запущено\", но бот молчит", 13 | "section_8": "Система не может найти файл (no such file or directory)", 14 | "section_9": "У вас несоответствие версий Python и зависимостей" 15 | } 16 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/nodejs-browser.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "node js browser данная конфигурация подходит если проект использует окружение node js и пакетный менеджер npm для сборки приложения для работы в браузере в этом случае проект может быть написан на таких языках как javascript или typescript данная конфигурация предназначена для браузерных приложений для серверных приложений см node js server https docs amvera ru books amvera page nodejs server написать yaml файл можно как самостоятельно используя инструкцию ниже так и воспользоваться нашим генератором yaml перейдя по ссылке https manifest amvera ru секция meta секция meta файла amvera yml будет выглядеть следующим образом yaml meta environment node toolchain name browser version 18 из параметров которые можно здесь менять это meta toolchain version логически это версия node js которую нужно использовать для работы технически значение version подставляется в имя образа docker который будет использован для фазы сборки используется образ node meta toolchain version так как для фазы запуска node js вообще не используется meta toolchain version может быть любым тегом этого образа на докер хабе https hub docker com node tags секция build секция build может содержать следующие необязательные параметры additionalcommands artifacts во время сборки скрипт выполняет команду npm install npm run build если будет задан параметр additionalcommands то будет выполнена команда npm install build additionalcommands это может пригодиться если в проекте команда сборки называется не build yaml build additionalcommands npm run amvera build параметр artifacts позволяет указать какие файлы должны попасть в итоговое приложение по умолчанию будут скопированы все файлы из папки build в корень папки приложения параметр artifacts в отличие от других параметров это не строка а словарь ключ в нем это маска файлов источника копирования а значение папка в которую будут скопированы файлы так значение artifacts по умолчанию yaml build artifacts build мы используем следующие правила копирования в качестве источника указываются только относительные пути без в начале если под маску попал файл файл будет скопирован в папку назначения без исходного пути если под маску попала папка она будет скопирована целиком в папку назначения вместе со всем содержимым секция run для запуска используется модифицированный образ nginx 1 23 2 для поддержки маршрутизации в spa приложениях в секции run нет настраиваемых параметров рецепты react yaml meta environment node toolchain name browser version 18 vue yaml meta environment node toolchain name browser version 18 build artifacts dist angular yaml meta environment node toolchain name browser version 18 build artifacts dist my app", 3 | "metadata": { 4 | "file_name": "nodejs-browser.md", 5 | "section_count": 8, 6 | "section_1": "Node.JS Browser", 7 | "section_2": "Секция meta", 8 | "section_3": "Секция build", 9 | "section_4": "Секция run", 10 | "section_5": "Рецепты", 11 | "section_6": "React", 12 | "section_7": "Vue", 13 | "section_8": "Angular" 14 | } 15 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/config-file.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "файл конфигурации для настройки сборки build md и запуска run md проекта можно создать файл amvera yml или amvera yaml в корне репозитория альтернативой является использование dockerfile docker создать amvera yaml лучше всего в интерфейсе приложения в разделе конфигурация так он автоматически добавится в корень проекта создав при этом новый коммит в гит репозиторий возможно так же воспользоваться нашим генератором yaml перейдя по ссылке https manifest amvera ru либо самостоятельно используя инструкции ниже если файл конфигурации отсутствует то amvera будет искать файл dockerfile docker если dockerfile будет найден он будет использоваться для сборки если dockerfile также не будет найден сборка завершится провалом в дальнейшем на файл amvera yml или amvera yaml для определенности будем ссылаться как amvera yaml структура конфигурационного файла файл amvera yaml состоит из трех секций meta секция meta определяет общую информацию о сборке такую как окружение и инструменты сборки со списком поддерживаемых окружений и подробным их описанием можно ознакомиться на этой странице supported env rst пример секции meta для jvm приложения собираемого при помощи maven yaml meta environment jvm toolchain name maven version 17 подробнее о сборке jvm приложений с помощью maven в сервисе amvera можно прочитать здесь environments jvm maven md build секция build определяет параметры необходимые для сборки приложения build md для разных окружений эти параметры разные про параметры для вашего окружения можно прочитать в соответствующем разделе данной документации если указывать параметры сборки не нужно то секцию build можно опустить в нашем примере сборки jvm приложения при помощи maven все параметры build являются необязательными однако если нужно указать дополнительные параметры компиляции сделать это можно следующим образом yaml build args dserver port 80 pproduction run секция run определяет параметры необходимые для запуска приложения run md аналогично сборке для разных окружения эти параметры разные и описаны в соответствующем разделе данной документации так параметр persistencemount задает то в какую папку будет примонтировано постоянное хранилище storage md data иными словами если там указано data то именно по этому пути следует сохранять важные файлы во время работы приложения если указывать параметры запуска не нужно то секцию run можно опустить в нашем примере сборки jvm приложения при помощи maven в секции run необходимо как минимум указать путь до jar файла относительно корня проекта yaml run jarname bag end jar пример так весь файл amvera yaml для нашего примера выглядит следующим образом yaml meta environment jvm toolchain name maven version 17 build args dserver port 80 pproduction run jarname bag end jar так как формат файла конфигурации yaml секции можно указывать в любом порядке", 3 | "metadata": { 4 | "file_name": "config-file.md", 5 | "section_count": 6, 6 | "section_1": "Файл конфигурации", 7 | "section_2": "Структура конфигурационного файла", 8 | "section_3": "meta", 9 | "section_4": "build", 10 | "section_5": "run", 11 | "section_6": "Пример" 12 | } 13 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/scaling.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "масштабирование ресурса можно запускать несколько инстансов контейнера одного ресурса приложения или субд это может быть нужно для повышения отказоустойчивости проекта и распределения нагрузки между инстансами eval rst admonition внимание class attention не каждый сайт бот или веб приложение может эффективно работать будучи запущенным в нескольких экземплярах ситуации требующие масштабирования приведем примеры того как можно переработать приложение чтобы поддерживать работу в нескольких экземплярах эти примеры упрощены и их стоит рассматривать только как отправную точку в проектировании масштабируемых приложений пример 1 телеграм бот работает в режиме опроса если запустить его в нескольких экземплярах то каждый из них будет получать одни и те же события от телеграма следовательно бот будет реагировать на событие столько раз сколько инстансов его запущено это чаще всего является ошибкой и примером приложения не поддерживающего горизонтальное масштабирование что можно сделать можно переключить бота из режима опроса в режим веб хуков в этом случае не бот будет запрашивать события телеграма а телеграм будет отправлять события боту эти события будет получать балансировщик нагрузки amvera и распределять их по экземлпярам бота так бот будет реагировать только один раз на одно событие следовательно ошибка будет устранена и приложение может поддерживать горизонтальное масштабирование пример 2 интернет магазин хранит корзину пользователя в оперативной памяти если такой интернет магазин запустить в двух экземплярах часть запросов будет приходить в один экземпляр а часть во второй так у пользователя может формироваться две разные корзины и между перезагрузками страницы пользователь будет видеть то одну то другую это является ошибкой и примером приложения не поддерживающего горизонтальное масштабирование что можно сделать можно подключить базу данных лучше всего или хотя бы хранение корзины пользователя в файлах доступных всем экземплярам приложения в этом случае в какой бы экземпляр интернет магазина ни пришел бы запрос работать он будет с одной и той же корзиной следовательно ошибка будет устранена и приложение может поддерживать горизонтальное масштабирование изменение количества реплик когда вы убедились что ваше приложение поддерживает горизонтальное масштабирование вы можете увеличить количество экземпляров на странице проекта после того как вы указали требуемое количество экземпляров нажмите на кнопку применить scaling img scaling png после масштабирования приложения отобразиться нужное количество инстансов если отображение не происходит перезагрузите страницу браузера scaled img scaled png после нажатия на кнопку будут запущены дополнительные контейнеры или остановлены лишние на запуск и остановку контейнеров требуется время поэтому текущее количество контейнеров изменится в течение нескольких минут если выставить количество контейнеров в 0 то проект будет полностью остановлен и за него не будут списываться средства", 3 | "metadata": { 4 | "file_name": "scaling.md", 5 | "section_count": 3, 6 | "section_1": "Масштабирование ресурса", 7 | "section_2": "Ситуации, требующие масштабирования", 8 | "section_3": "Изменение количества реплик" 9 | } 10 | } -------------------------------------------------------------------------------- /article_2/app/api/router.py: -------------------------------------------------------------------------------- 1 | from fastapi import APIRouter, Depends, HTTPException, Response 2 | from fastapi.responses import StreamingResponse 3 | 4 | from app.api.schemas import AskResponse, AskWithAIResponse, SUserAuth 5 | from app.api.utils import authenticate_user, create_jwt_token, get_current_user 6 | from app.chroma_client.ai_store import ChatWithAI 7 | from app.chroma_client.chroma_store import ChromaVectorStore, get_vectorstore 8 | 9 | router = APIRouter() 10 | 11 | 12 | @router.post("/ask") 13 | async def ask( 14 | query: AskResponse, 15 | vectorstore: ChromaVectorStore = Depends(get_vectorstore), 16 | user_id: int = Depends(get_current_user), 17 | ): 18 | results = await vectorstore.asimilarity_search( 19 | query=query.response, with_score=True, k=5 20 | ) 21 | formatted_results = [] 22 | for doc, score in results: 23 | formatted_results.append( 24 | { 25 | "text": doc.page_content, 26 | "metadata": doc.metadata, 27 | "similarity_score": score, 28 | } 29 | ) 30 | return {"results": formatted_results} 31 | 32 | 33 | @router.post("/ask_with_ai") 34 | async def ask_with_ai( 35 | query: AskWithAIResponse, 36 | vectorstore: ChromaVectorStore = Depends(get_vectorstore), 37 | user_id: int = Depends(get_current_user), 38 | ): 39 | results = await vectorstore.asimilarity_search( 40 | query=query.response, with_score=True, k=5 41 | ) 42 | if results: 43 | ai_context = "\n".join([doc.page_content for doc, _ in results]) 44 | ai_store = ChatWithAI(provider=query.provider) 45 | 46 | async def stream_response(): 47 | async for chunk in ai_store.astream_response(ai_context, query.response): 48 | yield chunk 49 | 50 | return StreamingResponse( 51 | stream_response(), 52 | media_type="text/plain", 53 | headers={ 54 | "Content-Type": "text/plain", 55 | "Transfer-Encoding": "chunked", 56 | "Cache-Control": "no-cache", 57 | "Connection": "keep-alive", 58 | }, 59 | ) 60 | else: 61 | return {"response": "Ничего не найдено"} 62 | 63 | 64 | @router.post("/login") 65 | async def login( 66 | response: Response, 67 | user_data: SUserAuth, 68 | ): 69 | user = await authenticate_user(user_data.login, user_data.password) 70 | if not user: 71 | raise HTTPException(status_code=401, detail="Invalid credentials") 72 | 73 | token = await create_jwt_token(user["user_id"]) 74 | response.set_cookie( 75 | key="access_token", 76 | value=token, 77 | httponly=True, 78 | secure=False, # Включи True в проде (HTTPS) 79 | samesite="lax", 80 | max_age=3600, 81 | path="/", 82 | ) 83 | return {"message": "Logged in"} 84 | 85 | 86 | @router.post("/logout") 87 | async def logout(response: Response, user_id: int = Depends(get_current_user)): 88 | response.delete_cookie("access_token") 89 | return {"message": "Logged out"} 90 | 91 | 92 | @router.get("/protected") 93 | async def protected_route(user_id: int = Depends(get_current_user)): 94 | return {"message": f"Hello, user {user_id}!"} 95 | -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/selenium-chromedriver.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "selenium и chromedriver облако амвера использует под капотом контейнеры чтобы было возможно использовать selenium в контейнере надо поставить необходимые библиотеки и указать порт дисплея в этом контейнере использование готового образа в этом образе https github com joyzoursky docker python chromedriver уже имеется нужный нам chromedriver и chrome шаги установки 1 создаем dockerfile в директории проекта 2 в dockerfile указываем образ c dockerfile from joyzoursky python chromedriver 3 9 3 назначаем workdir и указываем файлы приложения которые будут включены в итоговый образ все файлы в папке проекта dockerfile workdir app copy app 4 добавляем команду на установку зависимостей укажем их чуть позже dockerfile run pip install r requirements txt 5 задаём команду для запуска приложения dockerfile cmd python main py получившийся dockerfile dockerfile from joyzoursky python chromedriver 3 9 workdir app copy app run pip install r requirements txt cmd python main py eval rst admonition примечание class info вместо версии 3 9 можно указать другую версию python которая вам нужна и поддерживается автором образа создание своего образа с chromedriver в случае если требуемая версия python не поддерживается можно создать свой образ с нужной версией установив в него необходимые драйвера в приведенном примере за базовый образ взят образ python 3 8 https hub docker com python который можно заменить на подходящий dockerfile задаем базовый образ вместо 3 8 можно указать другую версию python from python 3 8 устанавливаем google chrome run wget q o https dl ssl google com linux linux signing key pub apt key add run sh c echo deb arch amd64 http dl google com linux chrome deb stable main etc apt sources list d google chrome list run apt get y update run apt get install y google chrome stable выставляем нужный порт дисплея env display 99 пример пример будет выводить title страницы www python org добавим в корень проекта следующеие файлы requirements txt text selenium 4 17 2 amvera yml yaml meta environment docker toolchain name docker version latest build dockerfile dockerfile skip false run persistencemount data containerport 80 dockerfile dockerfile from joyzoursky python chromedriver 3 9 workdir app copy app run pip install r requirements txt cmd python main py main py python from selenium import webdriver from selenium webdriver common keys import keys from selenium webdriver chrome options import options chrome options options chrome options add argument headless chrome options add argument no sandbox chrome options add argument disable dev shm usage driver webdriver chrome options chrome options driver get https www python org print driver title driver close в случае правильной работы программы в консоль выведется текст welcome to python org видеопример депдлоя python приложения с selenium eval rst youtube l afc5r3mgw align center width 100", 3 | "metadata": { 4 | "file_name": "selenium-chromedriver.md", 5 | "section_count": 8, 6 | "section_1": "Selenium и Chromedriver", 7 | "section_2": "Использование готового образа", 8 | "section_3": "Создание своего образа с ChromeDriver", 9 | "section_4": "задаем базовый образ (вместо 3.8 можно указать другую версию Python)", 10 | "section_5": "устанавливаем google-chrome", 11 | "section_6": "выставляем нужный порт дисплея", 12 | "section_7": "Пример", 13 | "section_8": "Видеопример депдлоя Python-приложения с Selenium" 14 | } 15 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/build.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "сборка получив команду на сборку облако amvera ищет в папке code конфигурационный файл configuration config file md amvera yaml возможны три ситуации 1 отсутствует amvera yaml но удается найти dockerfile начинается сборка образа используя dockerfile процесс описан в этом разделе configuration docker md 2 отсутствует и amvera yaml и dockerfile сборка завершается ошибкой 3 присутствует amvera yaml начинается сборка приложения процесс сборки с amvera yaml build proc img build proc png облако amvera считывает раздел meta из файла конфигурации amvera yaml и ищет подходящий инструмент для сборки в списке поддерживаемых окружений supported env rst под инструментом для сборки подразумевается готовый образ с установленным в него компилятором интерпретатором который используется для создания контейнера сборки при создании контейнера в него монтируются папки code и artifacts во время работы контейнера происходит запуск инструмента сборки для выбранного окружения с указанными в секции build параметрами запуск команды выполняется в папке code storage md code после чего файлы необходимые для работы приложения копируются в папку artifacts storage md artifacts в процессе сборки статус приложения будет выполняется сборка в случае если сборка выполнилась успешно статус сменится на проект развертывается и облако amvera автоматически инициализирует процесс запуска приложения если сборка завершилась с ошибкой то следует обратиться к логам сборки лог сборки eval rst admonition важно class warning сборка приложения осуществляется в дополнительном контейнере тарифицирующемся так же как и само приложение из за чего текущее количество работающих инстансов может быть больше требуемого инициализация сборки eval rst admonition важно class warning во время сборки уже запущенные реплики приложения продолжают работать что обеспечивает накатывание обновлений с минимальным dos автоматическая сборка сборка начинается автоматически если был совершен пуш в master ветку git репозитория git rst амвера так же сборка приложения автоматически начинается после завершения процесса создания приложения в том случае если была выбрана опция загрузки файлов через интерфейс ручная сборка в том случае если требуется вручную инициализировать процесс сборки приложения это можно сделать двумя способами 1 если приложение ранее собиралось то будет доступна кнопка пересобрать проект в панели инструментов на странице приложения rebuild img rebuild png 2 если проект ранее не собирался или указанная выше кнопка по какой либо причине не активна можно перейти в раздел конфигурация в этом разделе при наличии заполненной конфигурации configuration config file md внизу будет доступна кнопка собрать configuration img configuration png лог сборки для отслеживания процесса сборки следует воспользоваться консолью вывода логов которая находится во вкладке лог сборки загрузка логов может занимать некоторое время и работать с задержкой для загрузки логов необходимо нажать на кнопку загрузить историю которая расположена в нижнем правом углу окна логов и выглядит как циферблат load logs img load logs png eval rst admonition важно class warning если процесс сборки завершился с ошибкой и лог остается пустым при нескольких попытках его загрузить следует проверить правильность заполнения секции build конфигурационного файла", 3 | "metadata": { 4 | "file_name": "build.md", 5 | "section_count": 6, 6 | "section_1": "Сборка", 7 | "section_2": "Процесс сборки с `amvera.yaml`", 8 | "section_3": "Инициализация сборки", 9 | "section_4": "Автоматическая сборка", 10 | "section_5": "Ручная сборка", 11 | "section_6": "Лог сборки" 12 | } 13 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/topup.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "пополнение счета eval rst admonition внимание class attention если у вас нет российской карты и вы используете иностранную карту следует использовать mastercard и пополнять на сумму от 1000 руб российские карты поддерживаются без ограничений если вы столкнулись со сложностями при пополнении пишите на почту support amvera ru мы обязательно поможем пополнение счета для юридических лиц для пополнения счета через банковский перевод направьте реквизиты организации и ник пользователя на почту support amvera ru мы выставим счет по которому можно произвести оплату зачисление производится в течении двух рабочих дней после поступления оплаты закрывающие документы направляются ежеквартально по почте россии пополнение счета для физических лиц амвера использует предоплатную модель работы поэтому для обеспечения бесперебойной работы контейнеров необходимо заранее пополнять баланс для этого на странице баланс https cloud amvera ru balance необходимо воспользоваться формой пополнения баланса topup img topup png укажите сумму на которую вы хотите пополнить баланс допускается целое значение в рублях после этого нажмите кнопку пополнить вы попадете на страницу оплаты сервиса робокасса robokassa img robokassa png введите свои данные для оплаты и нажмите кнопку оплатить если вы передумали можете нажать на ссылку amvera cloud в верхнем левом углу экрана либо просто закрыть страницу оплаты в случае успешной оплаты вас переместит на страницу со списком проектов к этому моменту оплата уже могла пройти и она отразится в вашем балансе тем не менее из за специфики банковских переводов деньги могут дойти позже если платеж не пришел в течение 15 минут свяжитесь с поддержкой amvera для выяснения причин промокоды если у вас имеется промокод для нашего сервиса amvera то перед пополнением баланса необходимо ввести промокод в соответсвующее поле и только после этого нажимать кнопку пополнить promo img promo png подключение автоплатежа отслеживание баланса и ручное пополнение через интерфейс может быть неудобным поэтому есть возможность подключить автоплатеж на заданную сумму на странице баланс https cloud amvera ru balance auto topup img auto topup png как это работает при пополнении баланса вы ставите галочку «автоплатеж» по умолчанию она выключена чтобы избежать случайной подписки задаете максимальное количество платежей в месяц это необходимо чтобы гарантировать списание не более определенной суммы пополняете баланс на n рублей когда ваш баланс становится близок к 0 менее 100 руб производится автопополнение с привязанной карты на сумму равную сумме последнего пополнения если вы пополнили баланс на 500 руб при привязке автоплатежа при достижении около нулевого баланса будет списываться по 500 руб но не более заданного лимита в совокупности если вы хотите отключить подключенный вами автоплатеж просто удалите его на странице баланс одной кнопкой eval rst admonition важно class warning мы не храним данные карт на своей стороне все данные необходимые для повторных транзакций хранятся на стороне платежной системы робокасса списания amvera списывает со счета пользователя средства за каждый работающий контейнер используется поминутная тарификация однако списание происходит раз в час или в момент удаления ресурса детализация детализацию списаний и зачислений находится на странице баланс https cloud amvera ru balance используя переключатель можно отдельно просматривать списания или зачисления за выбранный период balance details img balance details png", 3 | "metadata": { 4 | "file_name": "topup.md", 5 | "section_count": 7, 6 | "section_1": "Пополнение счета", 7 | "section_2": "Пополнение счета для юридических лиц", 8 | "section_3": "Пополнение счета для физических лиц", 9 | "section_4": "Промокоды", 10 | "section_5": "Подключение автоплатежа", 11 | "section_6": "Списания", 12 | "section_7": "Детализация" 13 | } 14 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/secondary-origin.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "подключение к существующему репозиторию если у вас уже есть приложение которое вы хотите развернуть в amvera но оно уже использует другой репозиторий git github bitbucket или что то другое можно привязать дополнительный remote к вашему репозиторию eval rst admonition подсказка class hint для ознакомления с принципом работы с git рекомендуем эту статью https habr com ru articles 541258 которая упроcтит работу с нашим сервисом адрес удаленного репозитория находится на странице репозиторий приложения python config img git main png подключение репозитория откройте командную строку и перейдите в корневую папку проекта вашего приложения выполните команду shell git remote add amvera https git amvera ru имя пользователя транслитерированное имя проекта заполнение репозитория чтобы код можно было собрать и запустить необходимо наличие файла конфигурации amvera yaml configuration config file md и или dockerfile configuration docker md советуем так же ознакомится с процессом сборки build md и развертывания run md приложения развертывание проекта для инициализации процесса сборки и развертывания приложения достаточно отправить изменения в репозиторий амвера shell git push amvera master на запрос пользователя и пароля укажите имя пользователя и пароль вашей учетной записи amvera eval rst admonition подсказка class hint запущенные инстансы вашего проекта при ошибке сборки не останавливаются и продолжат работать пример 1 вызываем терминал в ide где открыто приложение или открываем папку проекта в терминале 2 инициализируем локальный гит репозиторий командой если он не инициализирован shell git init 3 добавим удаленный репозиторий нашего проекта url вашего репозитория будет отличаться во избежание синтаксических ошибок скопируйте ссылку на втором шаге создания проекта shell git remote add amvera https git amvera ru ваш ник имя проекта eval rst admonition важно class warning если вы задавали конфигурацию в интерфейсе не забудьте сделать git pull git pull amvera master для синхронизации репозиториев если вы не хотите синхронизировать репозитории то создайте yaml по ссылке https manifest amvera ru добавьте его в корень репозитория перед певым push при этом не добавляйте задавайте конфигурацию в интерфейсе задание конфигурации и добавление файлов в интерфейсе создает коммит после которого нужно синхронизировать репозитории при работе через git 4 добавим файлы и сделаем первый коммит shell git add git commit m initial commit 5 запушим наш код в репозиторий проекта shell git push amvera master 6 когда вы хотите сделать обновление проекта вы обновили код конфигурацию зависимости выполните команды shell git add git commit m описание сделанных изменений git push amvera master возможные ошибки если основная ветка называется не master а например main при выполнении команды git push amvera master появится ошибка для избежания ошибки достаточно указать из какой ветки необходимо запушить изменения shell git push amvera имя основной ветки master так например если основная ветка называется main команда будет выглядеть следующим образом shell git push amvera main master чтобы узнать какое название имеет основная ветка в предположении что вы на ней находитесь shell git branch show current eval rst admonition примечание class hint другие частые ошибки по работе с git собраны по doc ссылке freq errors если вы столкнулись с ошибкой или вам что то непонятно ознакомьтесь с разделом частые ошибки git freq errors md при работе с git", 3 | "metadata": { 4 | "file_name": "secondary-origin.md", 5 | "section_count": 7, 6 | "section_1": "Подключение к существующему репозиторию", 7 | "section_2": "Подключение репозитория", 8 | "section_3": "Заполнение репозитория", 9 | "section_4": "Развертывание проекта", 10 | "section_5": "Пример", 11 | "section_6": "Возможные ошибки", 12 | "section_7": "Если вы столкнулись с ошибкой или вам что-то непонятно" 13 | } 14 | } -------------------------------------------------------------------------------- /article_2/app/chroma_db/8f7d9537-e6d7-43d6-93cd-61bafb0edaf3/length.bin: -------------------------------------------------------------------------------- 1 | {"file_name": "sqlite.md", "section_count": 13, "section_1": "SQLite", "section_2": "\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 Amvera", "section_3": "\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f", "section_4": "Python", "section_5": "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0438\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442)", "section_6": "\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 cursor \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432", "section_7": "\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430", "section_8": "cursor.execute('''CREATE TABLE stocks", "section_9": " (date text, trans text, symbol text, qty real, price real)''')", "section_10": "\u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f", "section_11": "Java", "section_12": "JavaScript (Node.js)", "section_13": "\u0412\u0438\u0434\u0435\u043e\u043f\u0440\u0438\u043c\u0435\u0440", "chroma:document": "\u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 sqlite \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0438\u043c\u0435\u044e\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 db sqlite \u0438\u043b\u0438 sqlite3 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 amvera \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f sqlite \u0432 amvera \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432 \u043a\u043e\u0434\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0443\u0442\u044c \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u044d\u0442\u043e\u0439 \u0431\u0434 \u0432 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0435\u0441\u043b\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430 \u0431\u0434 \u0438\u043b\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0434 \u0443\u0436\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u043c\u0441\u044f \u0444\u0430\u0439\u043b\u043e\u043c \u0442\u043e \u0435\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432\u044b\u0431\u0440\u0430\u0432 \u043f\u0430\u043f\u043a\u0443 data \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 data folder img data folder png eval rst admonition"}\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u044b \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 sqlite \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0438\u043c\u0435\u044e\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u -------------------------------------------------------------------------------- /article_1/amvera_data/chroma_db/8f7d9537-e6d7-43d6-93cd-61bafb0edaf3/length.bin: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /article_1/examples/shop_chroma_db/bde937fa-5a00-4c59-aa70-ed6be129b2c8/length.bin: -------------------------------------------------------------------------------- 1 |  -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/jvm-gradle.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "jvm gradle данная конфигурация подходит если проект собирается при помощи gradle и запускается на jvm в этом случае проект может быть написан на таких языках как java или kotlin написать yaml файл можно как самостоятельно используя инструкцию ниже так и воспользоваться нашим генератором yaml перейдя по ссылке https manifest amvera ru секция meta секция meta файла amvera yml будет выглядеть следующим образом yaml meta environment jvm toolchain name gradle version 11 из параметров которые можно здесь менять это meta toolchain version логически это версия jdk который нужно использовать для сборки технически значение version подставляется в имя образа docker который будет использован для фазы сборки это gradle jdk meta toolchain version допустимые значения можно увидеть на странице докер хаба https hub docker com gradle tags page 1 name jdk для фазы запуска это bellsoft liberica openjre debian meta toolchain version допустимые значения можно увидеть на странице докер хаба https hub docker com r bellsoft liberica openjre debian tags eval rst admonition важно class warning значение meta toolchain version должно быть допустимым как для фазы сборки так и для фазы запуска лучше всего подходит простой номер lts версии jdk секция build в секции build могут быть указаны следующие параметры image args artifacts параметр image позволяет использовать другой образ для сборки а не тот который предлагается amvera образ должен удовлетворять следующим требованиям исходный код для сборки ожидается в папке app или образу без разницы где будет находиться исходный код в образе присутствует команда gradle которую можно вызвать по имени без указания абсолютного пути с параметром build параметр args позволяет указать дополнительные параметры команде gradle build build args например чтобы задать свойство server port yaml build args dserver port 80 в этом случае для сборки будет выполнена команда gradle build dserver port 80 параметр artifacts позволяет указать какие файлы должны попасть в итоговое приложение по умолчанию будут скопированы все файлы с расширением jar из папки build libs в корень папки приложения параметр artifacts в отличие от других параметров это не строка а словарь ключ в нем это маска файлов источника копирования а значение папка в которую будут скопированы файлы так значение artifacts по умолчанию yaml build artifacts build libs jar мы используем следующие правила копирования в качестве источника указываются только относительные пути без в начале если под маску попал файл файл будет скопирован в папку назначения без исходного пути если под маску попала папка она будет скопирована целиком в папку назначения вместе со всем содержимым секция run в сети run могут быть использованы следующие параметры jarname image persistencemount containerport параметр jarname является обязательным он указывает путь до файла с расширением jar который нужно запустить командой java jar run jarname пример yaml run jarname bin bag end jar параметр image позволяет использовать другой образ для сборки а не тот который предлагается amvera образ должен удовлетворять следующим требованиям результат сборки ожидается в папке app или образу без разницы где будет находиться результат сборки в образе присутствует команда java которую можно вызвать по имени без указания абсолютного пути с параметрами jar имя образа параметр persistencemount позволяет указать в какую директорию будет примонтирована папка с постоянным хранилищем storage md data по умолчанию имеет значение data параметр containerport позволяет указать какой порт слушает приложение по умолчанию имеет значение 80 рецепты минимальный файл amvera yml yaml meta environment jvm toolchain name gradle version 11 run jarname bag end jar spring boot yaml meta environment jvm toolchain name gradle version 11 run jarname bag end 1 0 0 jar containerport 8080", 3 | "metadata": { 4 | "file_name": "jvm-gradle.md", 5 | "section_count": 7, 6 | "section_1": "JVM Gradle", 7 | "section_2": "Секция meta", 8 | "section_3": "Секция build", 9 | "section_4": "Секция run", 10 | "section_5": "Рецепты", 11 | "section_6": "Минимальный файл amvera.yml", 12 | "section_7": "Spring Boot" 13 | } 14 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/ffmpeg-pip.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "ffmpeg для развертывания приложения с использованием ffmpeg в нашем случае python нам нужно установить этот набор программ в сам контейнер а не только библиотеку для python которая ставится через менеджер пакетов pip установка через dockerfile используем docker для установки ffmpeg шаги 1 создаем dockerfile в директории с проектом 2 в dockerfile указываем базовый образ python dockerfile from python 3 8 slim 3 выполняем команду установки ffmpeg dockerfile run apt get update apt get install y ffmpeg 4 копируем проект в собираемый образ и назначаем workdir dockerfile copy usr src app workdir usr src app 5 добавляем команду для запуска приложения dockerfile cmd python main py получившийся dockerfile dockerfile from python 3 9 run apt get update apt get install y ffmpeg copy usr src app workdir usr src app run pip install r requirements txt copy usr src app cmd python bot py созданный файл необходимо поместить в корень проекта eval rst admonition примечание class info вместо 3 8 slim вы можете указать любую другую версию python которая вам нужна если вы используете другой язык программирования вам нужно будет изменить команду установки ffmpeg в соответствии с вашим языком примечание вместо 3 8 slim возможно указать другую версию python которая требуется приложению если используется другой язык программирования необходимо выбрать другой базовый образ с нужным языком и установить библиотеку для этого языка пример создадим telegram бота на python с использованием библиотек telebot и ffmpeg python который будет принимать пользовательские видео и добавлять туда watermark’и eval rst admonition примечание class warning код является демонстрационным примером и мы настоятельно не рекомендуем хранить токены ботов или подобные данные в коде используйте переменные окружения секреты python import os import telebot import ffmpeg bot telebot telebot your bot token bot message handler commands start def handle start message bot send message message chat id привет отправь мне видео и я добавлю водяной знак с помощью ffmpeg bot message handler content types video def handle video message video message video file info bot get file video file id downloaded file bot download file file info file path with open video mp4 wb as new file new file write downloaded file in file ffmpeg input video mp4 overlay file ffmpeg input watermark png ffmpeg concat in file trim start frame 10 end frame 20 in file trim start frame 30 end frame 40 overlay overlay file hflip drawbox 50 50 120 120 color red thickness 5 output out mp4 run with open out mp4 rb as video bot send video message chat id video os remove video mp4 os remove out mp4 bot polling добавим в корень проекта следующие файлы конфигурационный yaml файл yaml meta environment docker toolchain name docker version latest build dockerfile dockerfile run persistencemount data containerport 80 dockerfile dockerfile from python 3 9 run apt get update apt get install y ffmpeg copy usr src app workdir usr src app run pip install r requirements txt copy usr src app cmd python bot py файл с зависимостями requirements txt в нашем случае это pytelegrambotapi официальное название telebot и ffmpeg python pytelegrambotapi 4 15 4 ffmpeg python 0 2 0 возможные ошибки python не находит файл py – проверьте изменили ли вы название main py в параметре cmd dockerfile а или в параметре command в amvera yml font на название вашего скрипта или путь до него attributeerror module ffmpeg has no attribute input проверьте что вы установили ffmpeg python а не python ffmpeg видеопример деплой приложения с ffmpeg описание в этом видео подробно рассматривается процесс развертывания приложения при помощи dockerfile на amvera cloud 00 00 интро 00 29 dockerfile 01 57 bot py 03 21 requirements txt 05 55 amvera yaml 06 52 git 08 55 переменные окружения 09 17 структура проекта data 09 58 тестируем бота eval rst youtube m9gt8ly ocy align center width 100", 3 | "metadata": { 4 | "file_name": "ffmpeg-pip.md", 5 | "section_count": 5, 6 | "section_1": "ffmpeg", 7 | "section_2": "Установка через Dockerfile ", 8 | "section_3": "Пример", 9 | "section_4": "Возможные ошибки", 10 | "section_5": "Видеопример - Деплой приложения с FFmpeg" 11 | } 12 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/run.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "запуск получив команду на запуск облако amvera ищет в папке code конфигурационный файл configuration config file md amvera yaml возможны три ситуации 1 отсутствует amvera yaml но удается найти dockerfile начинается запуск образа полученного в результате сборки dockerfile configuration docker md 2 отсутствует и amvera yaml и dockerfile запуск завершается ошибкой 3 присутствует amvera yaml начинается запуск приложения процесс запуска с amvera yaml build proc img run proc png облако amvera считывает раздел meta из файла конфигурации amvera yaml и ищет подходящий инструмент для запуска в списке поддерживаемых окружений supported env rst под инструментом для запуска подразумевается готовый образ с установленным в него программами которые позволят запустить приложение python jvm и т д выбранный благодаря конфигурации образ запускается в новом контейнере с параметрами указанными в секции run этой же конфигурации в процессе создания контейнера в него монтируются storage md две папки artifacts папка storage md artifacts с полученными в результате процесса сборки файлами может затираться при пересборке монтирование происходит в папку app запущенного контейнера data папка постоянного хранилища storage md data которую не затрагивает процесс сборки и следовательно файлы остаются нетронутыми для хранения получаемых в процессе работы программы данных таких как бд логи и т д необходимо использовать именно эту папку монтирование происходит в папку persistencemount заданную конфигурации по умолчанию data в процессе запуска статус приложения будет выполняется запуск который при успехе сменится на приложение запущено в случае если статус ошибка развертывания или проект долго висит в статусе выполняется запуск стоит искать проблему в секции run файла конфигурации жизненный цикл eval rst admonition важно class warning в первые минуты работы приложения статус может быть ошибка работы приложения так как приложение формально ещё не запустилось и амвера не может явно определить его точный статус amvera стремиться обеспечить бесперебойную работу развернутого приложения если приложение по какой либо причине завершает работу возникло исключение программа дошла до конца оно автоматически будет перезапущено если возникающая ошибка не дает проработать приложению больше минуты то статус приложения переходит в ошибка работы приложения однако облако продолжает пытаться его перезапустить снова и снова если впервые развернутое приложение находится в этом состояние больше получаса то оно автоматически останавливается и переходит в статус остановлено из за повторяющейся ошибки eval rst admonition важно class warning для профилактики ошибок работы приложения рекомендуем перейти во вкладку лог приложения остановка приложения если требуется на время остановить проект можно воспользоваться кнопкой включить выключить или задать желаемое кол во реплик равное нулю на панели инструментов при этом данные во всех папках остаются нетронутыми если приложение находится в выключенном статусе более 30 дней то оно автоматически замораживается заморозка приложения заморозка приложения если приложение больше не нужно но вы хотите сохранить данные в репозитории и в постоянном хранилище то можно воспользоваться кнопкой заморозить проект во вкладке настройки при заморозке полностью очищается папка artifacts а так же привязанные домены приложение переходит в статус заморожено для разморозки требуется инициализировать процесс сборки проекта и выставить кол во желаемых реплик general scaling md более нуля лог приложения для отслеживания работы приложения следует воспользоваться консолью вывода логов которая находится во вкладке лог приложения загрузка логов может занимать некоторое время и работать с задержкой для загрузки логов необходимо нажать на кнопку загрузить историю которая расположена в нижнем правом углу окна логов и выглядит как циферблат load logs img load logs png", 3 | "metadata": { 4 | "file_name": "run.md", 5 | "section_count": 6, 6 | "section_1": "Запуск", 7 | "section_2": "Процесс запуска с `amvera.yaml`", 8 | "section_3": "Жизненный цикл", 9 | "section_4": "Остановка приложения", 10 | "section_5": "Заморозка приложения", 11 | "section_6": "Лог приложения" 12 | } 13 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/redis.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "redis разворачивание субд для развертывания субд redis вам потребуется выполнить следующие шаги 1 создать преднастроенное приложение с подходящим тарифом 1 на главной странице выбрать преднастроенные сервисы и нажать кнопку создать преднастроенный сервис 2 выбираем задайте параметры сервиса базы данных задайте тип сервиса redis 3 вводим произвольное название проекта и подходящий тариф eval rst admonition внимание class attention стабильная работа возможна на тарифах не ниже начальный при развертывании используется образ docker redis redis stack server meta toolchain version параметр meta toolchain version необязательный если его не указать будет использоваться последний образ redis redis stack server latest так как значение параметра meta toolchain version является тегом образа redis можно в качестве его значения использовать произвольный тег из докер хаба https hub docker com r redis redis stack server tags 2 указать необходимые параметры окружения в разделе переменные у проекта необходимо задать следующие переменные окружения applications configuration variables md для добавления пароля пользователя default и безопасного его хранения требуется нажать на кнопку создать секрет в поле название указать redis args а в поле значение вписать requirepass желаемый пароль eval rst admonition важно class warning придумать достаточно сложный пароль для базы данных чтобы злоумышленники не смогли получить к ней доступ при необходимости можно задать и другие поддерживаемые образом параметры более подробно об этих параметрах можно узнать на странице образа https hub docker com r redis redis stack server mongo img redis envvars png подключение к бд eval rst admonition внимание class attention подключение к базе данных возможно только из других проектов созданных в amvera для подключения к базе данных необходимо использовать 6379 порт и внутренее доменное имя указанное на странице инфо в формате amvera имя пользователя run транслитерированное имя проекта развертывание redis insight порядок действий совпадает с развертыванием самой субд 1 создать преднастроенный сервис с подходящим тарифом 1 также на главной странице нажать преднастроенные сервисы а после создать преднастроенный сервис 2 задаем следующие параметры параметры сервиса утилиты для баз данных тип сервиса redis insight 3 вводим необходимое название проекта eval rst admonition внимание class attention для работы mongo express требуется контейнер с тарифом не ниже начальный при развертывании используется образ https hub docker com r redislabs redisinsight docker redislabs redisinsight meta toolchain version 4 указать необходимые параметры окружения в разделе переменные у проекта необходимо задать следующие переменные окружения applications configuration variables md переменная riauthprompt true ritrustedorigins разрешенные хосты для доступа https транслитерированное имя проекта имя пользователя amvera io http localhost 8001 переменная riauthtimer установленная в 30 переменная riproxyenable установленная в true redis insight img redis insight png 5 в разделе настройки приложения активируем бесплатное доменное имя applications configuration network md бесплатное доменное имя амвера или добавляем свое applications configuration network md свое доменное имя db create img pgadmin domain png eval rst admonition хитрость class hint чтобы экономить на потреблении проекта с mongo express рекомендуем ставить его на паузу после окончания работы", 3 | "metadata": { 4 | "file_name": "redis.md", 5 | "section_count": 9, 6 | "section_1": "Redis", 7 | "section_2": "Разворачивание СУБД.", 8 | "section_3": "1. Создать преднастроенное приложение с подходящим тарифом.", 9 | "section_4": "2. Указать необходимые параметры окружения.", 10 | "section_5": "Подключение к БД", 11 | "section_6": "Развертывание Redis Insight", 12 | "section_7": "1. Создать преднастроенный сервис с подходящим тарифом.", 13 | "section_8": "4. Указать необходимые параметры окружения.", 14 | "section_9": "5. В разделе \"Настройки\" приложения активируем [бесплатное доменное имя](../applications/configuration/network.md#бесплатное-доменное-имя-амвера) или [добавляем свое](../applications/configuration/network.md#свое-доменное-имя). " 15 | } 16 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/infinite-build-run.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "бесконечный запуск сборка или отсутствие логов бесконечный запуск cопровождается статусом сборка выполнена успешно выполняется запуск если статус выполняется запуск наблюдается более 5 минут это свидетельствует об ошибке в конфигурационном файле или его отсутствии либо о другой ошибке работы приложения необходимо загрузить лог приложения в нем вы найдете лог с error который подскажет причину ошибки либо вашему приложению необходимо использовать более высокий тариф требуется больше ресурса для запуска мы рекомендуем при первой сборке выбрать один из старших тарифов и потом его изменить после запуска вы сможете изменить тариф в настройках на тот при котором приложение работает и который устраивает вас по цене бесконечная сборка сборка проектов в amvera cloud происходит дольше чем на локальной машине среднее время сборки составляет 5 20 минут в редких случаях сборка может происходить до 30 60 минут если ваш проект находится в статусе сборка больше часа и отсутствуют логи значит сборка закончилась с ошибкой и стоит убедиться в правильности конфигурационного файла ознакомьтесь с логом сборки в нем вы найдете лог с error который подскажет причину ошибки либо вашему приложению необходимо использовать более высокий тариф требуется больше ресурса для запуска мы рекомендуем при первой сборке выбрать один из старших тарифов и потом его изменить после запуска вы сможете изменить тариф в настройках на тот при котором приложение работает и который устраивает вас по цене проект завис при сборке запуске при этом в интерфейсе не получается им управлять неактивны кнопки пересборки перезапуска симптоматикой данной проблемы является статус сборки запуска более 30 минут и неактивные кнопки в интерфейсе это вызвано либо тем что ваш проект сложный и требует долгой сборки 0 проверьте лог сборки и лог приложения на наличие ошибок 1 попробуйте немного подождать 20 30 минут некоторые проекты долго собираются запускаются и дополнительные действия просто приведут к тому что процесс начнется заново 2 если ничего не произошло попробуйте запустить процесс сборки заново воспользовавшись кнопкой собрать на вкладке конфигурация предварительно можно удалить файлы из папки artifacts 3 если вы используете dockerfile без amvera yaml то вместо прошлого действия требуется внести формальные изменения в репозиторий и запушить их в amvera 4 попробуйте повысить тариф возможно вашему приложению не хватает ресурса для запуска 5 если ничего не помогает пересоздайте проект желательно с новым именем и напишите нам в поддержку support amvera ru будем разбираться вместе вывести проект из зависшего состояния можно в разделе конфигурация в котором кнопки применения конфигурации и сборки активны всегда нет логов архитектурной особенностью нашей системы является то что логи в интерфейсе отображаются с задержкой задержка может составлять около 2 5 минут это штатная ситуация внизу экрана есть кнопка для ручной загрузки истории после нажатия кнопки логи загрузятся примерно через 1 3 минуты quick start2 img load logs png если логов сборки нет более 5 минут то у вас одна из следующих проблем конфигурационного файла amvera yaml или dockerfile нет в корне проекта или он назван неверно как пример он назван amvera 3 yaml а не amvera yaml или находится не в корне а в какой то папке проекта логи пишутся в print при использовании python чтобы отображать логи из print надо выставить для проекта переменную окружения pythonunbuffered в 1 push не дошел до master сборка зависла с ошибкой в некоторых случаях они не пришли с первого раза может помочь нажатие кнопки пересборки или перезапуска в интерфейсе и повторное нажатие кнопки загрузки логов выбранного тарифа не хватает для сборки рекомендуем начать с одного из старших тарифов и потом его изменить если у нет логов приложения но сборка выполнена успешно ознакомьтесь с этим разделом 502 503 error md eval rst admonition подсказка class hint если не получается разобраться пишите в поддержку support amvera ru просим сразу указывать имя пользователя и проекта мы постараемся помочь", 3 | "metadata": { 4 | "file_name": "infinite-build-run.md", 5 | "section_count": 5, 6 | "section_1": "Бесконечный запуск, сборка или отсутствие логов", 7 | "section_2": "Бесконечный запуск", 8 | "section_3": "Бесконечная сборка", 9 | "section_4": "Проект \"завис\" при сборке/запуске", 10 | "section_5": "Нет логов" 11 | } 12 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/sqlite.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "sqlite sqlite — это компактная встраиваемая реляционная база данных она не требует отдельного сервера для работы что делает её идеальным выбором для легковесных приложений для разработки тестирования и производства sqlite используют в тех случаях когда не требуется сложная обработка транзакций или большая параллельная нагрузка sqlite обеспечивает поддержку основных функций sql включая транзакции индексы триггеры и большинство стандартных типов данных файлы баз данных sqlite как правило имеют расширение db sqlite или sqlite3 использование в amvera для использования sqlite в amvera отдельное приложение контейнер не требуется достаточно в коде указать путь для хранения файлов этой бд в постоянное хранилище если библиотека для вашего языка требует ручного создания файла бд или необходимо инициализировать бд уже имеющимся файлом то его необходимо загрузить через интерфейс выбрав папку data вкладки репозиторий data folder img data folder png eval rst admonition важно class warning сохранять данные в папку постоянного хранилища указанного в конфигурации по умолчанию data папка data в корне репозитория и data это разные директории eval rst admonition внимание class attention файлы бд сохраненные в папке artifacts откуда запускается код могу быть затерты и потеряны при пересборке проекта чтобы проверить куда сохраняются данные папку data в разделе репозиторий если в папке отсутствует требуемый файл вероятно сохранение данных идет в папку artifacts её можно посмотреть так же корректный путь при условии дефолтной папки монтирования data выглядит следующим образом не забудьте про перед data data sqlite database db eval rst admonition подсказка class hint для удобства локального тестирования и проверки путей вы можете создать директорию data на локальном компьютере это позволит тестировать локально используя верные пути при отправке приложения в облако примеры подключения в приведенных примерах предполагается что папка постоянного хранилища примонтирована в дефолтную папку data python в python для работы с sqlite часто используется встроенная библиотека sqlite3 python import sqlite3 подключение к базе данных или создание если она не существует conn sqlite3 connect data example db создание объекта cursor для выполнения sql запросов cursor conn cursor выполнение запроса cursor execute create table stocks date text trans text symbol text qty real price real закрытие соединения conn close java в java для подключения к sqlite можно использовать jdbc драйвер например sqlite jdbc от xerial java import java sql connection import java sql drivermanager import java sql sqlexception public class main public static void main string args connection connection null try подключение к бд string url jdbc sqlite data database db connection drivermanager getconnection url system out println подключение к sqlite выполнено успешно здесь могут быть запросы и обработка данных catch sqlexception e system out println e getmessage finally try if connection null connection close catch sqlexception ex system out println ex getmessage javascript node js в node js с sqlite можно работать через пакет sqlite3 который нужно установить через npm javascript const sqlite3 require sqlite3 verbose подключение к бд let db new sqlite3 database data example db sqlite3 open readwrite sqlite3 open create err if err return console error err message console log подключение к sqlite базе данных выполнено успешно закрытие подключения db close err if err return console error err message console log соединение с базой данных закрыто видеопример eval rst youtube q5vjp1l8tl4 align center width 100", 3 | "metadata": { 4 | "file_name": "sqlite.md", 5 | "section_count": 13, 6 | "section_1": "SQLite", 7 | "section_2": "Использование в Amvera", 8 | "section_3": "Примеры подключения", 9 | "section_4": "Python", 10 | "section_5": "Подключение к базе данных (или создание, если она не существует)", 11 | "section_6": "Создание объекта cursor для выполнения SQL-запросов", 12 | "section_7": "Выполнение запроса", 13 | "section_8": "cursor.execute('''CREATE TABLE stocks", 14 | "section_9": " (date text, trans text, symbol text, qty real, price real)''')", 15 | "section_10": "Закрытие соединения", 16 | "section_11": "Java", 17 | "section_12": "JavaScript (Node.js)", 18 | "section_13": "Видеопример" 19 | } 20 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/nodejs-server.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "node js server данная конфигурация подходит если проект использует окружение node js и пакетный менеджер npm в этом случае проект может быть написан на таких языках как javascript или typescript данная конфигурация предназначена для серверных приложений для браузерных приложений см node js browser nodejs browser md написать yaml файл можно как самостоятельно используя инструкцию ниже так и воспользоваться нашим генератором yaml перейдя по ссылке https manifest amvera ru секция meta секция meta файла amvera yml будет выглядеть следующим образом yaml meta environment node toolchain name npm version 18 из параметров которые можно здесь менять это meta toolchain version логически это версия node js которую нужно использовать для работы технически значение version подставляется в имя образа docker который будет использован как для фазы сборки так и для фазы запуска используется образ node meta toolchain version так как для обеих фаз используется один и тот же образ meta toolchain version может быть любым тегом этого образа на докер хабе https hub docker com node tags секция build секция build может содержать следующие необязательные параметры skip additionalcommands artifacts параметр skip может использоваться если у проекта нет зависимостей и или отсутствует файл package json указание skip yes будет означать что фаза сборки будет целиком пропущена во время сборки скрипт выполняет команду npm install если нужно выполнить дополнительные команды например npm run build используется параметр additionalcommands yaml build additionalcommands npm run build в этом случае во время сборки будет выполнена команда npm install npm run build параметр artifacts позволяет указать какие файлы должны попасть в итоговое приложение по умолчанию будут скопированы все файлы в корень папки приложения параметр artifacts в отличие от других параметров это не строка а словарь ключ в нем это маска файлов источника копирования а значение папка в которую будут скопированы файлы так значение artifacts по умолчанию yaml build artifacts мы используем следующие правила копирования в качестве источника указываются только относительные пути без в начале если под маску попал файл файл будет скопирован в папку назначения без исходного пути если под маску попала папка она будет скопирована целиком в папку назначения вместе со всем содержимым секция run секция run может содержать следующие параметры scriptname scriptarguments nodearguments command persistencemount persistencemount параметр scriptname является обязательным для запуска используется команда node run nodearguments run scriptname run scriptarguments параметр scriptname это путь до скрипта который нужно запустить относительно корня репозитория yaml run scriptname index js если нужно передать дополнительные аргументы node для запуска их нужно указать в параметре nodearguments если нужно передать дополнительные аргументы сприкту для запуска их нужно указать в параметре scriptarguments параметр command это альтернативный способ запустить приложение при использовании этого параметра игнорируются параметры scriptname scriptarguments и nodearguments он должен содержать полную команду запуска yaml run command npm run start параметр persistencemount позволяет указать в какую директорию будет примонтирована папка с постоянным хранилищем storage md data по умолчанию имеет значение data параметр containerport позволяет указать какой порт слушает приложение по умолчанию имеет значение 80 рецепты минимальный файл amvera yml yaml meta environment node toolchain name npm version 18 run scriptname index js приложение на express js yaml meta environment node toolchain name npm version 18 run scriptname index js containerport 3000 приложение с фазой сборки webpack tsc и т п данный файл предполагает что скрипт запуска сборки прописан в задаче build а также скрипт запуска приложения прописан в задаче start в файле package json yaml meta environment node toolchain name npm version 18 build additionalcommands npm run build run command npm run start containerport 3000", 3 | "metadata": { 4 | "file_name": "nodejs-server.md", 5 | "section_count": 8, 6 | "section_1": "Node.JS Server", 7 | "section_2": "Секция meta", 8 | "section_3": "Секция build", 9 | "section_4": "Секция run", 10 | "section_5": "Рецепты", 11 | "section_6": "Минимальный файл amvera.yml", 12 | "section_7": "Приложение на Express.JS", 13 | "section_8": "Приложение с фазой сборки (Webpack, tsc и т.п.)" 14 | } 15 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/502-503-error.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "502 503 ошибка при статусе «приложение запущено» если развернув проект со статусом «приложение запущено» вы наблюдаете 503 или 502 ошибку и нет логов это связано с одной из нижеперечисленных причин ошибка 502 ошибка 502 в нашем случае чаще всего возникает в двух случаях 1 от несоответствия портов прописанных в коде или команде запуска и портов прописанных в файле конфигурации amvera yaml 2 из за того что приложение работает на localhost вместо 0 0 0 0 разберем оба случая более подробно приложение слушает не тот порт по умолчанию в amvera cloud открыт порт 80 при разработке веб приложения вы указываете то какой порт будет ваше приложение обычно это значение port в команде запуска приложения либо в значении параметра метода запуска приложения например если логика запуска вашего приложения в коде выглядит так пример на python flask python if name main app run host 0 0 0 0 port 5000 debug true то в amvera yml нужно указать в значение параметра containerport порт 5000 yaml часть amvera yaml run containerport 5000 вместо 5000 можно указать номер порта который слушает ваше приложение по аналогии host не изменен на 0 0 0 0 обычно в тех же параметрах запуска приложения указывается адрес host на котором будет работать ваше приложение как правило этот параметр несет название host а его значение по умолчанию localhost 127 0 0 1— 127 255 255 254 если host оставлен в значении localhost 127 0 0 1— 127 255 255 254 а не 0 0 0 0 вы можете получить ошибку 502 если это так поменяйте значение хоста на 0 0 0 0 в таком случае приложение будет работать на всех интерфейсах а не только на localhost что и требуется для успешного запуска приложения пример как должен выглядеть запуск вашего приложения python flask python app run host 0 0 0 0 port ваш порт если ничего из этого не помогло решить проблему проверьте что вы пересобираете проект а не просто перезапускаете или попробуйте повысить тариф ошибка 503 ошибка 503 говорит о том что сервис недоступен как правило явные причины следующие 1 приложение фактически не запущено или не может запуститься в связи с какой либо ошибкой 2 сервис перегружен и нужно повысить тариф в первом случае необходимо проверить лог приложения скорее всего там будет ошибка во втором рекомендуется поднять тариф eval rst admonition рекомендация class tip попробуйте запустить проект на одном из старших тарифов и после успешного запуска измените тариф на более подходящий в разделе настройки выбран неподходящий тариф иногда вашему проекту может не хватать ресурса озу или cpu попробуйте изменить тариф в разделе настройки увеличив ресурс если причина только в тарифе то проект заработает причина может быть не только в тарифе в связи с этим рекомендуем во время отладки выставить один из старших тарифов чтобы исключить эту причину и когда отладка завершена поменять на требуемый тариф eval rst admonition важно class warning на тарифе пробный не работают бд и их клиенты pgadmin из за недостатка озу таким сервисам больше подходит тариф начальный и выше eval rst admonition рекомендация class tip для любых не тестовых проектов выбирать тариф уровня не ниже начальный допущена ошибка в названии файла при написании amvera yaml или dockerfile вы могли допустить ошибку в имени копируемого файла убедитесь что все файлы указаны верно ошибка в зависимостях проверьте все ли зависимости верно указаны особенно это касается проектов на python убедитесь что у вас есть файл requirements txt и в нем перечислены все требуемые зависимости этот файл должен находиться в корне проекта если это не так укажите путь до него в amvera yaml yaml часть amvera yml build requirementspath src requirements amvera txt вместо src requirements amvera txt укажите путь до вашего файла requirements txt eval rst admonition подсказка class hint если не получается разобраться пишите в поддержку support amvera ru просим сразу указывать имя пользователя и проекта мы постараемся помочь", 3 | "metadata": { 4 | "file_name": "502-503-error.md", 5 | "section_count": 10, 6 | "section_1": "502/503 ошибка при статусе «Приложение запущено»", 7 | "section_2": "Ошибка 502", 8 | "section_3": "Приложение слушает не тот порт", 9 | "section_4": "часть amvera.yaml", 10 | "section_5": "Host не изменен на 0.0.0.0", 11 | "section_6": "Ошибка 503", 12 | "section_7": "Выбран неподходящий тариф", 13 | "section_8": "Допущена ошибка в названии файла", 14 | "section_9": "Ошибка в зависимостях", 15 | "section_10": "часть amvera.yml" 16 | } 17 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/jvm-maven.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "jvm maven данная конфигурация подходит если проект собирается при помощи maven и запускается на jvm в этом случае проект может быть написан на таких языках как java или kotlin написать yaml файл можно как самостоятельно используя инструкцию ниже так и воспользоваться нашим генератором yaml перейдя по ссылке https manifest amvera ru либо заполнить в разделе конфигурация личного кабинета секция meta секция meta файла amvera yml будет выглядеть следующим образом yaml meta environment jvm toolchain name maven version 11 из параметров которые можно здесь менять это meta toolchain version логически это версия jdk который нужно использовать для сборки технически значение version подставляется в имя образа docker который будет использован для фазы сборки это maven 3 openjdk meta toolchain version допустимые значения можно увидеть на странице докер хаба https hub docker com maven tags page 1 name 3 openjdk для фазы запуска это bellsoft liberica openjre debian meta toolchain version допустимые значения можно увидеть на странице докер хаба https hub docker com r bellsoft liberica openjre debian tags eval rst admonition важно class warning значение meta toolchain version должно быть допустимым как для фазы сборки так и для фазы запуска лучше всего подходит простой номер lts версии jdk секция build в секции build могут быть указаны следующие параметры image args artifacts параметр image позволяет использовать другой образ для сборки а не тот который предлагается amvera образ должен удовлетворять следующим требованиям исходный код для сборки ожидается в папке app или образу без разницы где будет находиться исходный код в образе присутствует команда mvn которую можно вызвать по имени без указания абсолютного пути с параметрами clean package параметр args позволяет указать дополнительные параметры команде mvn clean package build args например если в проекте используется spring boot может потребоваться следующий параметр yaml build args spring boot repackage в этом случае для сборки будет выполнена команда mvn clean package spring boot repackage указывать можно несколько параметров все они будут подставлены в команду например если нужно указать еще и профиль мавен yaml build args spring boot repackage pproduction параметр artifacts позволяет указать какие файлы должны попасть в итоговое приложение по умолчанию будут скопированы все файлы с расширением jar из папки target в корень папки приложения параметр artifacts в отличие от других параметров это не строка а словарь ключ в нем это маска файлов источника копирования а значение папка в которую будут скопированы файлы так значение artifacts по умолчанию yaml build artifacts target jar мы используем следующие правила копирования в качестве источника указываются только относительные пути без в начале если под маску попал файл файл будет скопирован в папку назначения без исходного пути если под маску попала папка она будет скопирована целиком в папку назначения вместе со всем содержимым секция run в секции run могут быть использованы следующие параметры jarname image persistencemount containerport параметр jarname является обязательным он указывает путь до файла с расширением jar который нужно запустить командой java jar run jarname пример yaml run jarname bin bag end jar параметр image позволяет использовать другой образ для сборки а не тот который предлагается amvera образ должен удовлетворять следующим требованиям результат сборки ожидается в папке app или образу без разницы где будет находиться результат сборки в образе присутствует команда java которую можно вызвать по имени без указания абсолютного пути с параметрами jar имя файла параметр persistencemount позволяет указать в какую директорию будет примонтирована папка с постоянным хранилищем storage md data по умолчанию имеет значение data параметр containerport позволяет указать какой порт слушает приложение по умолчанию имеет значение 80 рецепты минимальный файл amvera yml yaml meta environment jvm toolchain name maven version 11 run jarname bag end jar spring boot yaml meta environment jvm toolchain name maven version 17 build args spring boot repackage pproduction run jarname bag end 1 0 0 jar containerport 8080", 3 | "metadata": { 4 | "file_name": "jvm-maven.md", 5 | "section_count": 7, 6 | "section_1": "JVM Maven", 7 | "section_2": "Секция meta", 8 | "section_3": "Секция build", 9 | "section_4": "Секция run", 10 | "section_5": "Рецепты", 11 | "section_6": "Минимальный файл amvera.yml", 12 | "section_7": "Spring Boot" 13 | } 14 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/cli.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "cli управление через командную строку для упрощения взаимодействия с системой нами разработан инструмент командной строки cli позволяет управлять всеми сервисами amvera не покидая консоли установка eval rst youtube qxaulhcedhm align center width 100 details summary для windows summary установка скачайте amvera exe файл по ссылке https github com amvera cloud homebrew brew releases download v0 9 5 amvera windows x64 zip распакуйте его и переместите в любую удобную директорию например c program files amvera cli win1 img cli win1 png добавьте в переменную окружения path путь до этой директории чтобы система смогла найти исполняемый файл cli win2 img cli win2 png удаление для удаления cli необходимо удалить созданную директорию вместе с файлом amvera yml и убрать добавленное значение из переменной path details details summary для mac os summary установка производится с использованием homebrew https brew sh для установки brew выполните команду shell bin bash c curl fssl https raw githubusercontent com homebrew install head install sh для установки cli выполните команду shell brew install amvera cloud brew amvera удаление если требуется удалить cli выполните команду shell brew uninstall amvera альтернативным способом является установка из архива если у вас процессор m1 m2 используйте ссылку https github com amvera cloud homebrew brew releases download v0 9 5 amvera macos arm zip для скачивания архива если у вас процессор intel используйте ссылку https github com amvera cloud homebrew brew releases download v0 9 5 amvera macos x64 zip https docs amvera ru loading gif uploadimage ad034fab697b8 для скачивания архива details details summary для linux summary установка производится с использованием homebrew https brew sh для установки brew выполните команду shell bin bash c curl fssl https raw githubusercontent com homebrew install head install sh для установки cli выполните команду shell brew install amvera cloud brew amvera удаление если требуется удалить cli выполните команду shell brew uninstall amvera альтернативным способом является установка из архива который можно скачать по ссылке https github com amvera cloud homebrew brew releases download v0 9 5 amvera linux x64 zip details ваша система может заблокировать установку с предупреждением что файл от неизвестного издателя для mac os это сопровождается следующим предупреждением cli macos1 img cli macos1 png для продолжения установки зайдите в настройках oc во вкладку защита и безопасность разблокируйте замок в левом нижнем угу экрана и нажмите все равно разрешить cli macos2 img cli macos2 png для иных ос порядок действий схож нужно разрешить установку в настройках безопасности авторизация после установки введите в командной строке amvera v или amvera version если вы получите ошибку что приложение нельзя открыть из за невозможности проверить разработчика используйте инструкцию по разблокировке из пункта выше токен хранится в amvera json если вы не пользовались cli в течении 24 часов то перед следующей командой вам придется ввести логин и пароль заново если все верно cистема выведет примерно следующее cli1 img cli1 png пример использования введите shell amvera help вы получите список доступных команд недоступные команды отмечены после авторизации все команды будут доступны пример вывода списка доступных команд cli2 img cli2 png для начала работы с amvera сloud вам нужно войти под своим именем и паролем введите shell amvera help amvera login cli3 img cli3 png посмотреть описание и пример использования команды можно подставив флаг h например shell amvera env delete h cli4 img cli4 png если требуется string integer то нужно перечислить значения через пробел опции и флаги можно не указывать shell amvera env delete my project 1 2 3 4 5 в таком случае значения должны идти в строгом порядке указанном в “help” во избежание ошибок рекомендуем указывать опции явно тогда можно нарушить порядок shell amvera end delete i 1 2 3 p my project если требуется boolean значение то достаточно просто указать флаг cli5 img cli5 png shell amvera create c так же валидны shell amvera create true amvera create c true amvera create c true если значение состоит из двух слов то их нужно заключить в кавычки eval rst admonition важно class warning cli работает в beta версии могут наблюдаться ошибки работы cli утилиты будем благодарны если напишете о них нам в support amvera ru", 3 | "metadata": { 4 | "file_name": "cli.md", 5 | "section_count": 4, 6 | "section_1": "CLI. Управление через командную строку", 7 | "section_2": "Установка", 8 | "section_3": "Авторизация", 9 | "section_4": "Пример использования" 10 | } 11 | } -------------------------------------------------------------------------------- /article_1/amvera_data/generated_amvera_db.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | import sys 4 | from typing import Any, Dict, List, Optional 5 | 6 | import torch 7 | from langchain_chroma import Chroma 8 | from langchain_huggingface import HuggingFaceEmbeddings 9 | from langchain_text_splitters import RecursiveCharacterTextSplitter 10 | from loguru import logger 11 | 12 | # Добавляем путь к родительской директории для импорта config 13 | sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 14 | from config import settings 15 | 16 | 17 | def load_json_files(directory: str) -> List[Dict[str, Any]]: 18 | """Загрузка всех JSON файлов из указанной директории.""" 19 | documents = [] 20 | 21 | try: 22 | if not os.path.exists(directory): 23 | logger.error(f"Директория {directory} не существует") 24 | return documents 25 | 26 | for filename in os.listdir(directory): 27 | if filename.endswith(".json"): 28 | file_path = os.path.join(directory, filename) 29 | try: 30 | with open(file_path, "r", encoding="utf-8") as file: 31 | data = json.load(file) 32 | documents.append( 33 | {"text": data["text"], "metadata": data["metadata"]} 34 | ) 35 | logger.info(f"Загружен файл: {filename}") 36 | except Exception as e: 37 | logger.error(f"Ошибка при чтении файла {filename}: {e}") 38 | 39 | logger.success(f"Загружено {len(documents)} JSON файлов") 40 | return documents 41 | except Exception as e: 42 | logger.error(f"Ошибка при загрузке JSON файлов: {e}") 43 | return documents 44 | 45 | 46 | def split_text_into_chunks(text: str, metadata: Dict[str, Any]) -> List[Any]: 47 | """Разделение текста на чанки с сохранением метаданных.""" 48 | text_splitter = RecursiveCharacterTextSplitter( 49 | chunk_size=settings.MAX_CHUNK_SIZE, 50 | chunk_overlap=settings.CHUNK_OVERLAP, 51 | length_function=len, 52 | is_separator_regex=False, 53 | ) 54 | 55 | chunks = text_splitter.create_documents(texts=[text], metadatas=[metadata]) 56 | return chunks 57 | 58 | 59 | def generate_chroma_db() -> Optional[Chroma]: 60 | """Инициализация ChromaDB с данными из JSON файлов.""" 61 | try: 62 | # Создаем директорию для хранения базы данных, если она не существует 63 | os.makedirs(settings.AMVERA_CHROMA_PATH, exist_ok=True) 64 | 65 | # Загружаем JSON файлы 66 | documents = load_json_files(settings.PARSED_JSON_PATH) 67 | 68 | if not documents: 69 | logger.warning("Нет документов для добавления в базу данных") 70 | return None 71 | 72 | # Инициализируем модель эмбеддингов 73 | embeddings = HuggingFaceEmbeddings( 74 | model_name=settings.LM_MODEL_NAME, 75 | model_kwargs={"device": "cuda" if torch.cuda.is_available() else "cpu"}, 76 | encode_kwargs={"normalize_embeddings": True}, 77 | ) 78 | 79 | # Подготавливаем данные для Chroma 80 | all_chunks = [] 81 | for i, doc in enumerate(documents): 82 | chunks = split_text_into_chunks(doc["text"], doc["metadata"]) 83 | all_chunks.extend(chunks) 84 | logger.info( 85 | f"Документ {i+1}/{len(documents)} разбит на {len(chunks)} чанков" 86 | ) 87 | 88 | # Создаем векторное хранилище 89 | texts = [chunk.page_content for chunk in all_chunks] 90 | metadatas = [chunk.metadata for chunk in all_chunks] 91 | ids = [f"doc_{i}" for i in range(len(all_chunks))] 92 | 93 | chroma_db = Chroma.from_texts( 94 | texts=texts, 95 | embedding=embeddings, 96 | ids=ids, 97 | metadatas=metadatas, 98 | persist_directory=settings.AMVERA_CHROMA_PATH, 99 | collection_name=settings.AMVERA_COLLECTION_NAME, 100 | collection_metadata={ 101 | "hnsw:space": "cosine", 102 | }, 103 | ) 104 | 105 | logger.success( 106 | f"База Chroma инициализирована, добавлено {len(all_chunks)} чанков из {len(documents)} документов" 107 | ) 108 | return chroma_db 109 | except Exception as e: 110 | logger.error(f"Ошибка инициализации Chroma: {e}") 111 | raise 112 | 113 | 114 | if __name__ == "__main__": 115 | generate_chroma_db() 116 | -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/mysql.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "mysql разворачивание кластера 1 на главной странице нажать на кнопку создать 2 выбрать тип сервиса преднастроенное приложение из маркетплейса 3 выбрать параметр сервиса базы данных и сервис mysql 4 ввести произвольное название проекта и выбрать подходящий тариф eval rst admonition внимание class attention работа возможна на тарифе не ниже начальный если вам требуется создание бэкапов то необходимо повысить тариф до начальный плюс 3 задать параметры субд mysql mysql database имя создаваемой базы данных mysql root password пароль для root пользователя eval rst admonition важно class warning это пароль для пользователя root который будеть иметь доступ ко всем бд и права на любые действия пароль необходимо запомнить его будет невозможно восстановить или изменить mysql user имя создаваемого пользователя mysql mysql password пароль для вышеуказанного пользователя eval rst admonition важно class warning тарификация происходит отдельно за каждую реплику согласно выбранному тарифу 4 нажать кнопку завершить и дождаться перехода кластера в статус приложение запущено добавление бд после создания кластера по дефолту будет создана бд mysql или та что была указана в параметре mysql database которая доступна для полноценной работы eval rst admonition важно class warning имя бд может состоять только из a z a z 0 9 и подключение к кластеру eval rst admonition внимание class attention подключение к базе данных возможно только из других проектов созданных в amvera для доступа к базе данных из других проектов амвера необходимо указать доменное имя которое находится на вкладке инфо internal domain img mysql info png развертывание phpmyadmin 1 создать приложение с подходящим тарифом 1 на главной странице выбираем преднастроенные сервисы 2 нажимаем кнопку создать преднастроенный сервис и задаем утилиты для баз данных как параметры сервиса и phpmyadmin как тип сервиса 3 жмем далее и вводим произвольное название проекта eval rst admonition внимание class attention для работы phpmyadmin требуется выбрать тариф начальный phpmyadmin create img phpmyadmin create png 2 указать необходимые переменные окружения в разделе переменные у проекта необходимо задать следующие переменные окружения applications configuration variables md переменная pma absolute uri ссылка на приложение в формате https транслитерированное имя проекта имя пользователя amvera io переменная pma arbitrary установленная в 1 phpmyadmin variables img phpmyadmin variables png 3 активировать в настройках бесплатное доменное имя applications configuration network md бесплатное доменное имя амвера или добавляем свое applications configuration network md свое доменное имя db create img pgadmin domain png eval rst admonition хитрость class hint чтобы экономить на потреблении проекта с phpmyadmin рекомендуем ставить его на паузу после окончания работы 4 подключиться к кластеру mysql phpmyadmin connect img phpmyadmin connect png введите внутренне доменное имя подключение к кластеру имя пользователя по дефолту создается пользователь root пароль пользователя для root пользователя вы устанавливали пароль при создании кластера eval rst admonition важно class warning доступ ко всем базам данных имеет только пользователь root вы можете зайти под иным созданным пользователем тогда будет открыт доступ только к той бд в которой он был создан phpmyadmin success img phpmyadmin success png видеопример как использовать mysql и phpmyadmin в amvera cloud eval rst youtube ofkja vnxuo align center width 100 в этом видео мы рассмотрим как использовать базу данных mysql в amvera cloud как развернуть базу данных mysql как подключаться к базе данных mysql из других приложений как использовать phpmyadmin для управления базами данных mysql таймкоды 00 00 интро 00 34 развертывание mysql 01 28 развертывание phpmyadmin 02 47 подключение к бд из другого проекта 05 04 проверка работоспособности", 3 | "metadata": { 4 | "file_name": "mysql.md", 5 | "section_count": 10, 6 | "section_1": "MySQL", 7 | "section_2": "Разворачивание кластера", 8 | "section_3": "Добавление БД", 9 | "section_4": "Подключение к кластеру", 10 | "section_5": "Развертывание phpMyAdmin", 11 | "section_6": "1. Создать приложение с подходящим тарифом.", 12 | "section_7": "2. Указать необходимые переменные окружения.", 13 | "section_8": "3. Активировать в настройках [бесплатное доменное имя](../applications/configuration/network.md#бесплатное-доменное-имя-амвера) или [добавляем свое](../applications/configuration/network.md#свое-доменное-имя). ", 14 | "section_9": "4. Подключиться к кластеру MySQL", 15 | "section_10": "Видеопример как использовать MySQL и phpMyAdmin в Amvera Cloud" 16 | } 17 | } -------------------------------------------------------------------------------- /article_1/amvera_data/generate_json_files.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | import re 4 | import string 5 | import sys 6 | from typing import Any, Dict, List 7 | 8 | # Добавляем путь к родительской директории для импорта config 9 | sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 10 | 11 | from config import settings 12 | from loguru import logger 13 | 14 | # Константы 15 | HEADER_PATTERN = re.compile(r"^(#+)\s(.+)") 16 | PUNCTUATION_PATTERN = re.compile(f"[{re.escape(string.punctuation)}]") 17 | WHITESPACE_PATTERN = re.compile(r"\s+") 18 | 19 | 20 | def normalize_text(text: str) -> str: 21 | """Нормализация текста: удаление знаков препинания и специальных символов.""" 22 | if not isinstance(text, str): 23 | raise ValueError("Входной текст должен быть строкой") 24 | 25 | # Удаление знаков препинания 26 | text = PUNCTUATION_PATTERN.sub(" ", text) 27 | # Удаление переносов строк и лишних пробелов 28 | text = WHITESPACE_PATTERN.sub(" ", text) 29 | # Приведение к нижнему регистру 30 | return text.lower().strip() 31 | 32 | 33 | def parse_markdown(md_path: str) -> Dict[str, Any]: 34 | """Парсинг markdown файла и создание структурированных данных.""" 35 | if not os.path.exists(md_path): 36 | raise FileNotFoundError(f"Файл {md_path} не найден") 37 | 38 | try: 39 | with open(md_path, "r", encoding="utf-8") as file: 40 | content = file.read() 41 | except Exception as e: 42 | logger.error(f"Ошибка при чтении файла {md_path}: {e}") 43 | raise 44 | 45 | sections: List[str] = [] 46 | section_titles: List[str] = [] 47 | current_section: str | None = None 48 | current_content: List[str] = [] 49 | 50 | for line in content.splitlines(): 51 | section_match = HEADER_PATTERN.match(line) 52 | 53 | if section_match: 54 | if current_section: 55 | sections.append("\n".join(current_content).strip()) 56 | section_titles.append(current_section) 57 | current_content = [] 58 | current_section = section_match.group(2) 59 | current_content.append(current_section) 60 | else: 61 | current_content.append(line) 62 | 63 | if current_section: 64 | sections.append("\n".join(current_content).strip()) 65 | section_titles.append(current_section) 66 | 67 | # Нормализация текста для векторной базы данных 68 | normalized_sections = [normalize_text(section) for section in sections] 69 | full_text = " ".join(normalized_sections) 70 | 71 | # Создаем структуру метаданных 72 | metadata = { 73 | "file_name": os.path.basename(md_path), 74 | "section_count": len(section_titles), 75 | } 76 | 77 | # Добавляем заголовки как отдельные поля 78 | for i, title in enumerate(section_titles): 79 | metadata[f"section_{i+1}"] = title 80 | 81 | return {"text": full_text, "metadata": metadata} 82 | 83 | 84 | def process_all_markdown(input_folder: str, output_folder: str) -> None: 85 | """Обработка всех markdown файлов в директории.""" 86 | if not os.path.exists(input_folder): 87 | raise FileNotFoundError(f"Входная директория {input_folder} не найдена") 88 | 89 | try: 90 | os.makedirs(output_folder, exist_ok=True) 91 | except Exception as e: 92 | logger.error(f"Ошибка при создании выходной директории: {e}") 93 | raise 94 | 95 | for root, _, files in os.walk(input_folder): 96 | for file_name in files: 97 | if file_name.endswith(".md"): 98 | try: 99 | md_path = os.path.join(root, file_name) 100 | output_path = os.path.join( 101 | output_folder, file_name.replace(".md", ".json") 102 | ) 103 | parsed_data = parse_markdown(md_path) 104 | 105 | with open(output_path, "w", encoding="utf-8") as file: 106 | json.dump(parsed_data, file, ensure_ascii=False, indent=4) 107 | logger.info(f"Результат сохранен в {output_path}") 108 | except Exception as e: 109 | logger.error(f"Ошибка при обработке файла {file_name}: {e}") 110 | 111 | 112 | if __name__ == "__main__": 113 | try: 114 | process_all_markdown( 115 | input_folder=settings.DOCS_AMVERA_PATH, 116 | output_folder=settings.PARSED_JSON_PATH, 117 | ) 118 | except Exception as e: 119 | logger.error(f"Критическая ошибка: {e}") 120 | sys.exit(1) 121 | -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/freq-errors.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "ошибки при работе с git repository not found если вы клонировали репозиторий он мог стать основным в таком случае следует выполнить просто команду git push без main master и т д дополнительно проверьте корректность команды что вы не перепутали и и т д проверьте что вы пушите в нужный проект с актуального аккаунта попробуйте сделать push из другой консоли github desktop как пример проверьте привязали ли вы репозиторий git remote v проверьте с того ли аккаунта происходит авторизация так если у вас несколько аккаунтов в amvera вы можете пытаться делать push pull в другой аккаунт где такого репозитория естественно нет и необходимо сбросить данные авторизации используются старые авторизационные данные faild to push some refs to не удается загрузить некоторые ссылки возможно вы производили загрузку файлов конфигурации через интерфейс до этого вам нужно сделать git pull либо git pull amvera master чтобы синхронизировать проект с учётом тех изменений что были внесены с другого устройства из интерфейса нет реакции на push сделали push но ничего не происходит сборка не начинается логи пустые и т д вероятно push не дошел до master ветки удаленного репозитория пуш идет не в master а в main если основная ветка называется не master а например main при выполнении команды git push amvera master появится ошибка в таком случае выполните команду shell git push amvera имя основной ветки master так например если ваша основная ветка называется main команда будет выглядеть следующим образом shell git push amvera main master чтобы узнать какое название имеет основная ветка в предположении что вы на ней находитесь shell git branch show current неверно выполняется обновление git когда проект запущен и нужно обновить данные частой ошибкой является неверная последовательность команд git когда проект уже запущен и нужно его обновить симптомом является ответ команды git когда вы изменяли код everything up to date вам поможет следующая последовательность команд shell git add добавляем все сделанные изменения в данной папке в список проиндексированных git commit m описание сделанных изменений git push amvera master не забудьте про точку в первой команде она нужна если требуется добавить все файлы в индекс если требуется добавить в гит только некоторые файлы то стоит отдельно выполнить git add file name для каждого из них или исключить ненужные файлы из индексации путем написания gitignore файла используются старые авторизационные данные если при клонировании или пуше в репозиторий amvera возникает ошибка 404 но вы уверены что прописали адрес репозитория верно например скопировали скорее всего клиент git пытается авторизоваться с запомненными учетными данными другого репозитория github heroku amvera etc для того чтобы выполнить вход с учетными данными amvera необходимо забыть старые учетные данные details summary для windows summary control panel credential manager в разделе generic credentials найдите учетные данные git обычно начинаются с git разверните их и нажмите кнопку remove после этого клиент git снова запросит данные для входа details details summary для mac os summary в командной строке выполните команду shell git credential osxkeychain erase команда ничего не выведет напечатайте в командную строку следующее shell host git amvera ru protocol https после этого нажмите клавишу return два раза команда завершит работу после этого клиент git снова запросит данные для входа details details summary для linux summary откройте файл home git credentials в текстовом редакторе и удалите нужные записи после этого клиент git снова запросит данные для входа details альтернативным вариантом является выполнение команды shell git config global unset user password отсутствует конфигурационный файл в корне репозитория без конфигурационного файла yaml или dockerfile сборка начаться не сможет инструкция как написать и добавить файл конфигурации есть в разделе файл конфигурации https docs amvera ru books amvera page fail konfiguracii включена двухфакторная аутентификация иногда при попытке авторизоваться в консоли при включенной двухфакторной авторизации вы можете наблюдать ошибку авторизации рекомендуем выключить двухфакторную авторизацию eval rst admonition примечание class hint если вы все проверили и не нашли причину пишите на почту support amvera ru указав название приложения и ник в системе мы посмотрим в чем может быть проблема и обязательно постараемся помочь", 3 | "metadata": { 4 | "file_name": "freq-errors.md", 5 | "section_count": 5, 6 | "section_1": "Ошибки при работе с git", 7 | "section_2": "\"Repository ... not found\"", 8 | "section_3": "\"faild to push some refs to ...\"", 9 | "section_4": "Нет реакции на push", 10 | "section_5": "Используются старые авторизационные данные" 11 | } 12 | } -------------------------------------------------------------------------------- /article_1/examples/create_chroma_db_example.py: -------------------------------------------------------------------------------- 1 | import time 2 | from langchain_huggingface import HuggingFaceEmbeddings 3 | import torch 4 | from loguru import logger 5 | from langchain_chroma import Chroma 6 | 7 | 8 | CHROMA_PATH = "./shop_chroma_db" 9 | COLLECTION_NAME = "shop_data" 10 | 11 | SHOP_DATA = [ 12 | { 13 | "text": 'Ноутбук Lenovo IdeaPad 5: 16 ГБ RAM, SSD 512 ГБ, экран 15.6", цена 55000 руб.', 14 | "metadata": { 15 | "id": "1", 16 | "type": "product", 17 | "category": "laptops", 18 | "price": 55000, 19 | "stock": 3, 20 | }, 21 | }, 22 | { 23 | "text": "Смартфон Xiaomi Redmi Note 12: 128 ГБ, камера 108 МП, цена 18000 руб.", 24 | "metadata": { 25 | "id": "2", 26 | "type": "product", 27 | "category": "phones", 28 | "price": 18000, 29 | "stock": 10, 30 | }, 31 | }, 32 | { 33 | "text": "Планшет Samsung Galaxy Tab A8: 10.5 дюймов, 64 ГБ, цена 22000 руб.", 34 | "metadata": { 35 | "id": "3", 36 | "type": "product", 37 | "category": "tablets", 38 | "price": 22000, 39 | "stock": 5, 40 | }, 41 | }, 42 | { 43 | "text": "Наушники Sony WH-1000XM4: шумоподавление, 30 часов работы, цена 28000 руб.", 44 | "metadata": { 45 | "id": "4", 46 | "type": "product", 47 | "category": "audio", 48 | "price": 28000, 49 | "stock": 7, 50 | }, 51 | }, 52 | { 53 | "text": "Умные часы Apple Watch Series 8: GPS, пульсометр, цена 35000 руб.", 54 | "metadata": { 55 | "id": "5", 56 | "type": "product", 57 | "category": "wearables", 58 | "price": 35000, 59 | "stock": 4, 60 | }, 61 | }, 62 | { 63 | "text": "Игровая консоль PlayStation 5: 825 ГБ SSD, 4K HDR, цена 49990 руб.", 64 | "metadata": { 65 | "id": "6", 66 | "type": "product", 67 | "category": "gaming", 68 | "price": 49990, 69 | "stock": 2, 70 | }, 71 | }, 72 | { 73 | "text": "Фотоаппарат Canon EOS 250D: 24.1 МП, 4K видео, цена 42000 руб.", 74 | "metadata": { 75 | "id": "7", 76 | "type": "product", 77 | "category": "cameras", 78 | "price": 42000, 79 | "stock": 3, 80 | }, 81 | }, 82 | { 83 | "text": "Электросамокат Xiaomi Mi Electric Scooter Pro 2: 25 км/ч, запас хода 45 км, цена 39990 руб.", 84 | "metadata": { 85 | "id": "8", 86 | "type": "product", 87 | "category": "transport", 88 | "price": 39990, 89 | "stock": 6, 90 | }, 91 | }, 92 | { 93 | "text": "Робот-пылесос Roborock S7: влажная и сухая уборка, цена 32000 руб.", 94 | "metadata": { 95 | "id": "9", 96 | "type": "product", 97 | "category": "appliances", 98 | "price": 32000, 99 | "stock": 8, 100 | }, 101 | }, 102 | { 103 | "text": "Кофемашина DeLonghi Magnifica S: автоматическая, 15 бар, цена 29990 руб.", 104 | "metadata": { 105 | "id": "10", 106 | "type": "product", 107 | "category": "kitchen", 108 | "price": 29990, 109 | "stock": 4, 110 | }, 111 | }, 112 | ] 113 | 114 | 115 | def generate_chroma_db(): 116 | try: 117 | start_time = time.time() 118 | 119 | logger.info("Загрузка модели эмбеддингов...") 120 | embeddings = HuggingFaceEmbeddings( 121 | model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2", 122 | model_kwargs={"device": "cuda" if torch.cuda.is_available() else "cpu"}, 123 | encode_kwargs={"normalize_embeddings": True}, 124 | ) 125 | logger.info(f"Модель загружена за {time.time() - start_time:.2f} сек") 126 | 127 | logger.info("Создание Chroma DB...") 128 | chroma_db = Chroma.from_texts( 129 | texts=[item["text"] for item in SHOP_DATA], 130 | embedding=embeddings, 131 | ids=[str(item["metadata"]["id"]) for item in SHOP_DATA], 132 | metadatas=[item["metadata"] for item in SHOP_DATA], 133 | persist_directory=CHROMA_PATH, 134 | collection_name=COLLECTION_NAME, 135 | ) 136 | logger.info(f"Chroma DB создана за {time.time() - start_time:.2f} сек") 137 | 138 | return chroma_db 139 | except Exception as e: 140 | logger.error(f"Ошибка: {e}") 141 | raise 142 | 143 | 144 | generate_chroma_db() 145 | -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/quick-start.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "быстрый старт amvera стремиться сделать доставку кода и развертывания приложения максимально простым и понятным код своего приложения можно загружать двумя способами 1 используя git репозиторий подробно о работе с git и использованием репозиториев написано в соответствующем разделе git rst 2 через интерфейс всегда можно загрузить нужные файлы в удобном графическом окне процесс создания приложения инициализация 1 перейдите в личный кабинет amvera https cloud amvera ru при необходимости авторизовавшись 2 для открытия формы создания приложения необходимо нажать кнопку создать 3 в появившемся окне требуется указать название для вашего приложения выбрать тип сервиса приложение необходимый тарифный план и нажать далее quick start1 img quick start1 png 4 после окончания индикатора загрузки приложение будет создано и откроется следующий этап создания проекта загрузка данных загрузка данных для хранения пользовательского кода вне зависимости от метода загрузки используется git git rst репозиторий при использовании загрузки через интерфейс всегда можно переключиться на доставку кода через git и наоборот загрузка через git для загрузки данных приложения с использованием git потребуется 1 привязать к amvera свой репозиторий или склонировать созданный в amvera информация о том как это сделать находится в разделе git git rst этой документации предположим что на локальном компьютере ещё нет git репозитория выполним команду указанную первой на текущей странице shell git clone https git amvera ru username service slug quick start2 img quick start2 png теперь на локальном компьютере есть папка связанная с удалённым репозиторием amvera в эту папку нужно скопировать код проекта 2 создать файл конфигурации подробно о том что такое файл конфигурации и зачем он нужен можно найти в соответсвующем разделе configuration config file md сгенерировать файл конфигурации через генератор yaml файла https manifest amvera ru воспользоваться следующим шагом создания проекта потребуется сделать git pull в некоторых случаях может потребоваться написать файл самостоятельно инструкцию для вашего окружения можно найти на странице поддерживаемых окружений supported env rst если нужно воспользоваться сборкой и запуском dockerfile то это описано тут configuration docker md eval rst admonition важно class warning сгенерированный файл конфигурации нужно положить в корневую папку репозитория 3 создать файл с зависимостями прописать корректно все зависимости в файл чтобы наше облако смогло их установить eval rst admonition важно class warning для python необходимо наличие файла requirements txt с требуемыми библиотеками 4 сделать push в master ветку если все шаги выполнены правильно ваш проект автоматически соберется build md и развернется run md после отправки кода в master загрузка через интерфейс для развертывания через интерфейс необходимо загрузить файлы проекта в том числе файл с необходимыми зависимостями eval rst admonition важно class warning для python необходимо наличие файла requirements txt с требуемыми библиотеками после того как файлы были перетянуты нужно дождаться их появления списка загруженных файлов и проверить что ничего не потерялось quick start2 img quick start4 png задание конфигурации конфигурацию configuration config file md можно задать используя последний этап при создании приложения требуется выбрать используемое вашим приложением окружение и инструмент чтобы лучше ознакомится с вводимыми параметрами следует ознакомиться с необходимым окружением в данном разделе supported env rst quick start2 img quick start5 png eval rst admonition важно class warning поскольку файл конфигурации хранится в том же репозитории что и код то его добавление создает новый commit в репозиторий amvera если используется git необходимо будет сделать pull чтобы забрать его локально после нажатия кнопки завершить при условии загрузки файлов через интерфейс начнется сборка и впоследствии запуск приложения примеры примеры развертывания проектов для разных стеков находятся в разделе примеры general examples rst если вы столкнулись с ошибкой или вам что то непонятно ознакомьтесь с разделом частые ошибки general faq rst мы постарались собрать самые частые ошибки возникающие у наших пользователей пишите в поддержку на почту support amvera ru мы обязательно ответим и постараемся вам помочь обычно ответ занимает от 5 минут до суток если ничего не помогает вы можете написать нашему ceo кириллу косолапову на почту kkosolapov amvera ru отвечает он дольше чем поддержка но обязательно с вами свяжется и поможет решить ваш вопрос", 3 | "metadata": { 4 | "file_name": "quick-start.md", 5 | "section_count": 9, 6 | "section_1": "Быстрый старт", 7 | "section_2": "Процесс создания приложения", 8 | "section_3": "Инициализация", 9 | "section_4": "Загрузка данных", 10 | "section_5": "Загрузка через git", 11 | "section_6": "Загрузка через интерфейс", 12 | "section_7": "Задание конфигурации", 13 | "section_8": "Примеры", 14 | "section_9": "Если вы столкнулись с ошибкой или вам что-то непонятно" 15 | } 16 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/mongodb.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "mongodb при развертывании используется образ docker mongo meta toolchain version параметр meta toolchain version необязательный если его не указать будет использоваться последний образ mongo latest так как значение параметра meta toolchain version является тегом образа mongo можно в качестве его значения использовать произвольный тег из докер хаба https hub docker com mongo tags разворачивание субд для развертывания субд mongodb вам потребуется выполнить следующие шаги 1 создать проект выбираем тип преднастроенное приложение из маркетплейса параметры сервиса базы данных тип сервиса mongodb вводим произвольное название проекта и выбирает подходящий тариф eval rst admonition внимание class attention стабильная работа возможна на тарифах не ниже начальный 2 на этапе конфигурация настроить переменные окружения envvars в разделе переменные у проекта необходимо задать следующие переменные окружения applications configuration variables md для добавления имени пользователя необходимо нажать на кнопку создать переменную в поле название указать mongo initdb root username а в поле значение вписать желаемое имя пользователя для добавления пароля и безопасного его хранения требуется нажать на кнопку создать секрет в поле название указать mongo initdb root password а в поле значение вписать желаемый пароль eval rst admonition важно class warning придумать достаточно сложный пароль для базы данных чтобы злоумышленники не смогли получить к ней доступ при необходимости можно задать и другие поддерживаемые образом параметры более подробно об этих параметрах можно узнать на странице образа https hub docker com mongo db create img mongo env png eval rst admonition важно class warning стабильная работа с mongodb проверена только с версиями 5 0 и 6 0 подключение к бд eval rst admonition внимание class attention подключение к базе данных возможно только из других проектов созданных в amvera для подключения к базе данных необходимо использовать 27017 порт и внутреннее доменное имя указанное на странице инфо в формате amvera имя пользователя run транслитерированное имя проекта развертывание mongo express порядок действий совпадает с развертыванием самой субд 1 создать проект выбираем тип преднастроенное приложение из маркетплейса параметры сервиса утилиты для баз данных тип сервиса mongo express вводим произвольное название проекта и выбирает подходящий тариф eval rst admonition внимание class attention как и в случае с mongodb стабильная работа возможна на тарифах не ниже начальный 2 указать необходимые параметры окружения в разделе переменные у проекта необходимо задать следующие переменные окружения applications configuration variables md переменная me config basicauth username имя пользователя администратора mongo express секрет me config basicauth password пароль для доступа к mongo express не имеет ничего общего с паролем от бд me config mongodb auth username имя пользователя mongodb то что указывалось в переменной mongo initdb root username секрет me config mongodb auth password пароль для доступа к mongodb то что указывалось в секрете mongo initdb root password переменная me config mongodb server внутреннее доменное имя проекта с mongodb 3 в разделе настройки приложения активируем бесплатное доменное имя applications configuration network md бесплатное доменное имя амвера или добавляем свое applications configuration network md свое доменное имя db create img example domain png eval rst admonition хитрость class hint чтобы экономить на потреблении проекта с mongo express рекомендуем ставить его на паузу после окончания работы видеопример как использовать mongodb и mongo express в amvera cloud eval rst youtube fe18ntzubss align center width 100 в этом видео мы рассмотрим как использовать базу данных mongodb в amvera cloud как развернуть базу данных mongodb как подключаться к базе данных mongodb из других приложений как использовать mongo express для управления базами данных mongodb как развернуть приложение в amvera cloud https docs amvera ru applications quick start html примеры деплоя в amvera cloud https docs amvera ru general examples html таймкоды 00 00 интро 00 33 развертывание mongodb 01 17 развертывание mongo express 03 03 подключение к бд из другого проекта 05 15 проверка работоспособности", 3 | "metadata": { 4 | "file_name": "mongodb.md", 5 | "section_count": 10, 6 | "section_1": "MongoDB", 7 | "section_2": "Разворачивание СУБД", 8 | "section_3": "1. Создать проект.", 9 | "section_4": "2. На этапе \"Конфигурация\" настроить переменные окружения (envvars)", 10 | "section_5": "Подключение к БД", 11 | "section_6": "Развертывание mongo-express", 12 | "section_7": "1. Создать проект.", 13 | "section_8": "2. Указать необходимые параметры окружения.", 14 | "section_9": "3. В разделе \"Настройки\" приложения активируем [бесплатное доменное имя](../applications/configuration/network.md#бесплатное-доменное-имя-амвера) или [добавляем свое](../applications/configuration/network.md#свое-доменное-имя). ", 15 | "section_10": "Видеопример как использовать MongoDB и Mongo Express в Amvera Cloud" 16 | } 17 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/docker.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "docker для сборки и развертывания своего приложения в контейнере docker можно вообще не писать файл конфигурации config file md amvera yaml достаточно написать dockerfile однако для более точной настройки файл amvera yaml может понадобиться settings img docker proc png при использовании dockerfile сначала инициализируется процесс сборки образа запускаемый в отдельном контейнере с доступом к папке code по завершению сборки образ загружается в хранилище registry после успешной загрузки образа инициализируется процесс разворачивания приложения в процессе которого создается контейнер из полученного ранее образа eval rst admonition важно class warning docker compose yml не поддерживается возможно использование только классического dockerfile конфигурационный файл для более точной настройки следует дополнять dockerfile файлом конфигурации amvera yaml использование файла конфигураци дает возможность пропустить сборку и запускать приложение с использованием готового общедоступного образа из сторонних registry так же можно указать папку монтирования постоянного хранилища секция meta для окружения docker секцию meta можно не писать вовсе по умолчанию она подразумевается следующей meta environment docker toolchain name docker секция build секция build поддерживает следующие параметры dockerfile путь до файла dockerfile относительно папки с исходным кодом без слэша в начале это необязательный параметр если его не указать то dockerfile будет искаться в следующих местах amvera dockerfile dockerfile docker dockerfile deploy dockerfile deployment dockerfile skip пропуск сборки образа применяется при запуске готовых образов docker секция run секция run поддерживает следующие параметры image образ для запуска вместо собранного обычно используется в сочетании с build skip yes command команда для запуска в указанном образе полезно в сочетании с run image в этом параметре указывается то что указывается в параметре entrypoint докерфайла или в параметре command для пода kubernetes обычно это имя команды без параметров args параметры команды указанной в run command в этом параметре указвается то что указывается в параметре cmd докерфайла или в параметре args для пода kubernetes с тем отличием что здесь параметры указываются обычной строкой а не массивом persistencemount абсолютный путь в файловой системе контейнера куда должна быть примонтирована папка с постоянным хранилищем storage md data по умолчанию равен data containerport номер порта tcp который слушает приложение в контейнере по умолчанию равен 80 рецепты свое приложение с нестандартным портом если ваше приложение работает по протоколу http но использует номер порта отличный от 80 это можно настроить следующим файлом amvera yml yaml run containerport 3000 свое приложение с нестандартным расположением dockerfile допустим dockerfile находится по пути myapp amvera dockerfile yaml build dockerfile myapp amvera dockerfile готовый образ docker если вам нужно запустить готовый образ docker который либо работает по протоколу http либо не принимает входящих соединений например бот можно пропустить фазу сборки и указать имя образа напрямую в качестве примера рассмотрим развертывание dokuwiki https hub docker com r linuxserver dokuwiki https hub docker com r linuxserver dokuwiki dokuwiki слушает порт 80 поэтому эту настройку нам менять не нужно а вот папку с данными нужно примонтировать по пути config получается следующий файл amvera yml yaml build skip yes run image lscr io linuxserver dokuwiki latest persistencemount config так как кроме файла amvera yml вам ничего не нужно это единственный файл который нужно отправить в репозиторий git созданный для проекта приложение с нестандартным entrypoint если вы написали приложение и не указали в dockerfile ни entrypoint ни cmd либо используете готовый образ и хотите использовать иное приложение из него нежели было предусмотрено разработчиком вам пригодятся параметры run command и run args для примера рассмотрим приложение на языке go go package main import fmt net http os func main var port string if len os args 2 os args 1 port port fmt sprintf v os args 2 else port 80 http handlefunc helloserver http listenandserve port nil func helloserver w http responsewriter r http request fmt fprintf w hello s r url path 1 dockerfile для него dockerfile from golang 1 19 workdir app copy server go go mod run cgo enabled 0 go build a installsuffix cgo o server from alpine latest workdir app copy from 0 app server чтобы запустить сервер нужно вызвать команду app server port 8080 но в dockerfile по тем или иным причинам это не написано укажем параметры запуска в amvera yml yaml run command app server args port 8080 containerport 8080", 3 | "metadata": { 4 | "file_name": "docker.md", 5 | "section_count": 10, 6 | "section_1": "Docker", 7 | "section_2": "Конфигурационный файл", 8 | "section_3": "Секция meta", 9 | "section_4": "Секция build", 10 | "section_5": "Секция run", 11 | "section_6": "Рецепты", 12 | "section_7": "Свое приложение с нестандартным портом", 13 | "section_8": "Свое приложение с нестандартным расположением Dockerfile", 14 | "section_9": "Готовый образ Docker", 15 | "section_10": "Приложение с нестандартным ENTRYPOINT" 16 | } 17 | } -------------------------------------------------------------------------------- /article_1/chat_with_ai.py: -------------------------------------------------------------------------------- 1 | from typing import Any, Dict, List, Literal, Optional 2 | 3 | import torch 4 | from config import settings 5 | from langchain_chroma import Chroma 6 | from langchain_deepseek import ChatDeepSeek 7 | from langchain_huggingface import HuggingFaceEmbeddings 8 | from langchain_openai import ChatOpenAI 9 | from loguru import logger 10 | 11 | 12 | class ChatWithAI: 13 | def __init__(self, provider: Literal["deepseek", "openai"] = "deepseek"): 14 | self.provider = provider 15 | self.embeddings = HuggingFaceEmbeddings( 16 | model_name=settings.LM_MODEL_NAME, 17 | model_kwargs={"device": "cuda" if torch.cuda.is_available() else "cpu"}, 18 | encode_kwargs={"normalize_embeddings": True}, 19 | ) 20 | 21 | if provider == "deepseek": 22 | self.llm = ChatDeepSeek( 23 | api_key=settings.DEEPSEEK_API_KEY, 24 | model=settings.DEEPSEEK_MODEL_NAME, 25 | temperature=0.7, 26 | ) 27 | elif provider == "openai": 28 | self.llm = ChatOpenAI( 29 | api_key=settings.OPENAI_API_KEY, 30 | model=settings.OPENAI_MODEL_NAME, 31 | temperature=0.7, 32 | ) 33 | else: 34 | raise ValueError(f"Неподдерживаемый провайдер: {provider}") 35 | 36 | self.chroma_db = Chroma( 37 | persist_directory=settings.AMVERA_CHROMA_PATH, 38 | embedding_function=self.embeddings, 39 | collection_name=settings.AMVERA_COLLECTION_NAME, 40 | ) 41 | 42 | def get_relevant_context(self, query: str, k: int = 3) -> List[Dict[str, Any]]: 43 | """Получение релевантного контекста из базы данных.""" 44 | try: 45 | results = self.chroma_db.similarity_search(query, k=k) 46 | return [ 47 | { 48 | "text": doc.page_content, 49 | "metadata": doc.metadata, 50 | } 51 | for doc in results 52 | ] 53 | except Exception as e: 54 | logger.error(f"Ошибка при получении контекста: {e}") 55 | return [] 56 | 57 | def format_context(self, context: List[Dict[str, Any]]) -> str: 58 | """Форматирование контекста для промпта.""" 59 | formatted_context = [] 60 | for item in context: 61 | metadata_str = "\n".join(f"{k}: {v}" for k, v in item["metadata"].items()) 62 | formatted_context.append( 63 | f"Текст: {item['text']}\nМетаданные:\n{metadata_str}\n" 64 | ) 65 | return "\n---\n".join(formatted_context) 66 | 67 | def generate_response(self, query: str) -> Optional[str]: 68 | """Генерация ответа на основе запроса и контекста.""" 69 | try: 70 | context = self.get_relevant_context(query) 71 | if not context: 72 | return "Извините, не удалось найти релевантный контекст для ответа." 73 | 74 | formatted_context = self.format_context(context) 75 | 76 | messages = [ 77 | { 78 | "role": "system", 79 | "content": """Ты — внутренний менеджер компании Amvera Cloud. Отвечаешь по делу без лишних вступлений. 80 | 81 | Правила: 82 | 1. Сразу переходи к сути, без фраз типа "На основе контекста" 83 | 2. Используй только факты. Если точных данных нет — отвечай общими фразами об Amvera Cloud, но не придумывай конкретику 84 | 3. Используй обычный текст без форматирования 85 | 4. Включай ссылки только если они есть в контексте 86 | 5. Говори от первого лица множественного числа: "Мы предоставляем", "У нас есть" 87 | 6. При упоминании файлов делай это естественно, например: "Я прикреплю инструкцию, где подробно описаны шаги" 88 | 7. На приветствия отвечай доброжелательно, на негатив — с легким юмором 89 | 8. Можешь при ответах использовать общую информацию из открытых источников по Amvera Cloud, но опирайся на контекст 90 | 9. Если пользователь спрашивает о ценах, планах или технических характеристиках — давай конкретные ответы из контекста 91 | 10. При технических вопросах предлагай практические решения 92 | 93 | Персонализируй ответы, упоминая имя клиента если оно есть в контексте. Будь краток, информативен и полезен.""", 94 | }, 95 | { 96 | "role": "user", 97 | "content": f"Вопрос: {query}\nКонтекст: {formatted_context}", 98 | }, 99 | ] 100 | response = self.llm.invoke(messages) 101 | if hasattr(response, "content"): 102 | return str(response.content) 103 | return str(response).strip() 104 | except Exception as e: 105 | logger.error(f"Ошибка при генерации ответа: {e}") 106 | return "Произошла ошибка при генерации ответа." 107 | 108 | 109 | if __name__ == "__main__": 110 | chat = ChatWithAI(provider="deepseek") 111 | print("\n=== Чат с ИИ ===\n") 112 | 113 | while True: 114 | query = input("Вы: ") 115 | if query.lower() == "выход": 116 | print("\nДо свидания!") 117 | break 118 | 119 | print("\nИИ печатает...", end="\r") 120 | response = chat.generate_response(query) 121 | print(" " * 20, end="\r") # Очищаем "ИИ печатает..." 122 | print(f"ИИ: {response}\n") 123 | -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/network.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "сетевое взаимодействие для каждого приложения создается сервис доступа с помощью которого к данному приложению можно подключиться из других приложений амвера и сети интернет сервис доступа транслирует указанные через запятую порты приложения в разделе run containerport файла конфигурации config file md в порты доступа указываемые так же через запятую в переменной serviceport по умолчанию для приложений значения serviceport и containerport равны 80 сервис обеспечивает балансировку запросов в случае если запущено несколько реплик одного приложения eval rst admonition подсказка class hint чтобы не прописывать явно номер порта можно использовать переменную окружения port по умолчанию ее значение равно 80 network proc img network proc png доступ из других приложений для доступа к приложению из других приложений развернутый в амвера достаточно обратиться к приложению по внутреннему доменному имени amvera транслитерированное имя проекта run имя пользователя для управления портами необходимо использовать параметры run containerport и run serviceport файла конфигурации config file md по умолчанию для приложений их значения равны 80 так если ваше приложения слушает порт 8090 и требуется подключаться к нему по порту 90 секция run будет следующая yaml run some other parameters containerport 8090 serviceport 90 eval rst admonition внимание class attention взаимодействие по внутренней сети происходит без шифрования со стороны amvera доступ из сети интернет для внешнего доступа к приложениям используется два типа контроллера http https на базе nginx tcp с открытыми портами 5432 27017 и 6379 для их активации требуется перейти в раздел настройки http https на базе nginx при добавлении доменного имени создается входной контроллер который слушает указанный домен и 80 порт и пересылает запросы в сервис доступа который в свою очередь доставляет их в одну из запущенных реплик приложения при выборе типа подключения https к домену привязывается сертификат обеспечивающий доступ по протоколу https eval rst admonition важно class warning создание входного контроллера и выдача ssl сертификата может занимать какое то время к одному входному контроллеру данного типа на разные пути можно посадить разные порты приложения если требуется чтобы domain amvera io web указывал на 80 порт а domain amvera io backend на 8080 настройки будут такими web ports img web ports png бесплатное доменное имя амвера для каждого приложения есть возможность привязать бесплатное доменное имя третьего уровня которое обеспечит защищенный доступ к приложению из глобальной сети интернет для этого в разделе настройки в секции доменные имена необходимо нажать на кнопку добавить доменное имя выбрать тип подключения и тип домена бесплатный домен амвера приложение получит url в формате транслитерированное имя проекта имя пользователя amvera io так для проекта тест пользователя user обратиться к приложению можно по адресу https test user amvera io default domain img default domain png свое доменное имя для привязки своего доменного имени купленного у регистратора например reg ru https reg ru требуется выполнить следующие действия 1 зайти в лк регистратора найти «dns серверы и управление зоной» или подобное название а именно там где прописываются a запись txt и т д в личном кабинете регистратора найти a запись и прописать туда ip указанный в разделе «настройки» «создать доменное имя» требуемого приложения в amvera cloud найти txt запись и прописать туда txt указанный в разделе «настройки» «создать доменное имя» требуемого приложения в amvera cloud 2 подождать пока запись распространится по dns серверам может занимать до 24 часов 3 в разделе «настройки» «создать доменное имя» указать доменное имя и нажать подтвердить и привязать в случае если все сделано верно и информация о домене дошла до dns сервера google 8 8 8 8 домен успешно привяжется 4 подождать пока сконфигурируется входной контроллер и сгенерируется бесплатный let s encrypt https letsencrypt org ssl сертификат tcp трафик при выборе типа подключения postgres mongo или redis создается контроллер который слушает соответствующие порты и перенаправляет tcp трафик на сервис доступа основываясь на sni postgres 5432 подходит только для managed postgres mongo 27017 redis 6379 если нужно чтобы приложение получало tcp трафик можно выбрать например тип подключения mongo и указать run serviceport равным 27017 доменное имя для tcp трафика отличается от http s и имеет вид транслитерированное имя проекта имя пользователя db region amvera tech пример настройки записей в лк reg ru https reg ru reg ru img reg ru png нужно нажать «добавить запись» внизу страницы и ввести значения a и txt профилактика ошибок в случае если при нажатии кнопки подтвердить и привязать вылезает ошибка следует проверить правильность заполнения записей и их наличие на dns серверах для проверки записей можно воспользоваться специальным сервисом https mxtoolbox com txtlookup aspx введя в поле доменное имя и нажав txt lookup в списке должна появится строчка с записью требуемой к заполнению в разделе «настройки» «создать доменное имя» сменив txt lookup на dns lookup должен вывестись ipv4 адрес сервера amvera указанный в разделе «настройки» «создать доменное имя»", 3 | "metadata": { 4 | "file_name": "network.md", 5 | "section_count": 9, 6 | "section_1": "Сетевое взаимодействие", 7 | "section_2": "Доступ из других приложений", 8 | "section_3": "Доступ из сети Интернет", 9 | "section_4": "HTTP|HTTPS на базе nginx", 10 | "section_5": "Бесплатное доменное имя Амвера", 11 | "section_6": "Свое доменное имя", 12 | "section_7": "TCP трафик", 13 | "section_8": "Пример настройки записей в ЛК [reg.ru](https://reg.ru)", 14 | "section_9": "Профилактика ошибок" 15 | } 16 | } -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/mysql-beta.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "mysql beta облако amvera поддерживает создание управляемого кластера mysql с одной или несколькими запущенными репликами создание кластера происходит в несколько простых шагов разворачивание кластера 1 на главной странице нажать на кнопку создать 2 выбрать тип сервиса преднастроенное приложение из маркетплейса 3 выбрать параметр сервиса базы данных и сервис mysql 4 ввести произвольное название проекта и выбрать подходящий тариф eval rst admonition внимание class attention работа возможна на тарифе не ниже начальный если вам требуется создание бэкапов то необходимо повысить тариф до начальный плюс 3 задать параметры субд mysql mysql database имя создаваемой базы данных mysql root password пароль для root пользователя eval rst admonition важно class warning это пароль для пользователя root который будеть иметь доступ ко всем бд и права на любые действия пароль необходимо запомнить его будет невозможно восстановить или изменить mysql user имя создаваемого пользователя mysql mysql password пароль для вышеуказанного пользователя eval rst admonition важно class warning тарификация происходит отдельно за каждую реплику согласно выбранному тарифу 4 нажать кнопку завершить и дождаться перехода кластера в статус приложение запущено добавление бд после создания кластера по дефолту будет создана бд mysql или та что была указана в параметре mysql database которая доступна для полноценной работы eval rst admonition важно class warning имя бд может состоять только из a z a z 0 9 и бэкапы бэкапы по расписанию сервис предоставляет возможность создания бесплатных бэкапов по расписанию бэкапы начнут создаваться со следующего дня в час их активации сервис хранит крайние ins три ins бэкапа бэкапы по клику для создания бэкапа нажмите на кнопку создать бэкап и введите его описание чтобы отличить его от других имя бэкапа будет сгенерировано автоматически максимально вы можете создать ins три ins бэкапа они также являются бесплатными backups img mysql backups png восстановление кластера eval rst admonition внимание class attention восстановление кластера повлечет за собой потерю несохраненных данных убедитесь что у вы создали бэкап требуемого состояния перед восстановлением из другого бэкапа восстановить кластер можно по клику на иконку необходимого бэкапа во время восстановления ваш кластер остановится и запустится автоматически в течении этого времени он будет недоступен restore img mysql restore png подключение к кластеру eval rst admonition внимание class attention подключение к базе данных возможно только из других проектов созданных в amvera для доступа к базе данных из других проектов амвера необходимо указать доменное имя которое находится на вкладке инфо internal domain img mysql internal domain png развертывание phpmyadmin 1 создать приложение с подходящим тарифом eval rst admonition внимание class attention для работы phpmyadmin требуется выбрать тариф начальный phpmyadmin create img phpmyadmin create png 2 указать необходимые переменные окружения в разделе переменные у проекта необходимо задать следующие переменные окружения applications configuration variables md переменная pma absolute uri ссылка на приложение в формате https транслитерированное имя проекта имя пользователя amvera io переменная pma arbitrary установленная в 1 phpmyadmin variables img phpmyadmin variables png 3 активировать в настройках бесплатное доменное имя applications configuration network md бесплатное доменное имя амвера или добавляем свое applications configuration network md свое доменное имя db create img pgadmin domain png eval rst admonition хитрость class hint чтобы экономить на потреблении проекта с phpmyadmin рекомендуем ставить его на паузу после окончания работы 4 подключиться к кластеру mysql phpmyadmin connect img phpmyadmin connect png введите внутренне доменное имя подключение к кластеру имя пользователя по дефолту создается пользователь root пароль пользователя для root пользователя вы устанавливали пароль при создании кластера eval rst admonition важно class warning доступ ко всем базам данных имеет только пользователь root вы можете зайти под иным созданным пользователем тогда будет открыт доступ только к той бд в которой он был создан phpmyadmin success img phpmyadmin success png видеопример как использовать mysql и phpmyadmin в amvera cloud eval rst youtube ofkja vnxuo align center width 100 в этом видео мы рассмотрим как использовать базу данных mysql в amvera cloud как развернуть базу данных mysql как подключаться к базе данных mysql из других приложений как использовать phpmyadmin для управления базами данных mysql таймкоды 00 00 интро 00 34 развертывание mysql 01 28 развертывание phpmyadmin 02 47 подключение к бд из другого проекта 05 04 проверка работоспособности", 3 | "metadata": { 4 | "file_name": "mysql-beta.md", 5 | "section_count": 14, 6 | "section_1": "MySQL (beta)", 7 | "section_2": "Разворачивание кластера", 8 | "section_3": "Добавление БД", 9 | "section_4": "Бэкапы", 10 | "section_5": "Бэкапы по расписанию", 11 | "section_6": "Бэкапы по клику", 12 | "section_7": "Восстановление кластера", 13 | "section_8": "Подключение к кластеру", 14 | "section_9": "Развертывание phpMyAdmin", 15 | "section_10": "1. Создать приложение с подходящим тарифом.", 16 | "section_11": "2. Указать необходимые переменные окружения.", 17 | "section_12": "3. Активировать в настройках [бесплатное доменное имя](../applications/configuration/network.md#бесплатное-доменное-имя-амвера) или [добавляем свое](../applications/configuration/network.md#свое-доменное-имя). ", 18 | "section_13": "4. Подключиться к кластеру MySQL", 19 | "section_14": "Видеопример как использовать MySQL и phpMyAdmin в Amvera Cloud" 20 | } 21 | } -------------------------------------------------------------------------------- /article_2/app/static/script.js: -------------------------------------------------------------------------------- 1 | marked.setOptions({ 2 | highlight: function (code, lang) { 3 | if (lang && hljs.getLanguage(lang)) { 4 | return hljs.highlight(code, { language: lang }).value 5 | } 6 | return hljs.highlightAuto(code).value 7 | }, 8 | breaks: false, 9 | gfm: true, 10 | headerIds: true, 11 | mangle: false, 12 | }) 13 | 14 | function createLoadingIndicator() { 15 | const loadingDiv = document.createElement('div') 16 | loadingDiv.className = 'loading' 17 | loadingDiv.innerHTML = ` 18 |
19 |
20 |
21 | ` 22 | return loadingDiv 23 | } 24 | 25 | function addMessage(content, isUser = false) { 26 | const chatOutput = document.getElementById('chatOutput') 27 | const messageDiv = document.createElement('div') 28 | messageDiv.className = `message ${isUser ? 'user' : 'assistant'}` 29 | 30 | const copyButton = document.createElement('button') 31 | copyButton.className = 'copy-button' 32 | copyButton.innerHTML = '' 33 | copyButton.onclick = () => { 34 | navigator.clipboard.writeText(content).then(() => { 35 | copyButton.innerHTML = '' 36 | copyButton.classList.add('copied') 37 | setTimeout(() => { 38 | copyButton.innerHTML = '' 39 | copyButton.classList.remove('copied') 40 | }, 2000) 41 | }) 42 | } 43 | 44 | const contentDiv = document.createElement('div') 45 | contentDiv.className = 'message-content' 46 | contentDiv.innerHTML = marked.parse(content) 47 | 48 | messageDiv.appendChild(contentDiv) 49 | messageDiv.appendChild(copyButton) 50 | chatOutput.appendChild(messageDiv) 51 | chatOutput.scrollTop = chatOutput.scrollHeight 52 | return messageDiv 53 | } 54 | 55 | function updateMessage(messageDiv, content) { 56 | const copyButton = messageDiv.querySelector('.copy-button') 57 | const contentDiv = 58 | messageDiv.querySelector('.message-content') || 59 | document.createElement('div') 60 | contentDiv.className = 'message-content' 61 | contentDiv.innerHTML = marked.parse(content) 62 | 63 | if (!messageDiv.querySelector('.message-content')) { 64 | messageDiv.innerHTML = '' 65 | messageDiv.appendChild(contentDiv) 66 | messageDiv.appendChild(copyButton) 67 | } 68 | 69 | messageDiv.scrollIntoView({ behavior: 'smooth', block: 'end' }) 70 | } 71 | 72 | document 73 | .getElementById('queryInput') 74 | .addEventListener('keypress', function (e) { 75 | if (e.key === 'Enter' && !e.shiftKey) { 76 | e.preventDefault() 77 | document.getElementById('sendButton').click() 78 | } 79 | }) 80 | 81 | document.getElementById('sendButton').addEventListener('click', async () => { 82 | const query = document.getElementById('queryInput').value.trim() 83 | const provider = document.getElementById('provider').value 84 | const chatOutput = document.getElementById('chatOutput') 85 | const sendButton = document.getElementById('sendButton') 86 | const queryInput = document.getElementById('queryInput') 87 | 88 | if (!query) { 89 | alert('Введите запрос!') 90 | return 91 | } 92 | 93 | addMessage(query, true) 94 | queryInput.value = '' 95 | sendButton.disabled = true 96 | 97 | const loadingIndicator = createLoadingIndicator() 98 | chatOutput.appendChild(loadingIndicator) 99 | chatOutput.scrollTop = chatOutput.scrollHeight 100 | 101 | try { 102 | const response = await fetch('/api/ask_with_ai', { 103 | method: 'POST', 104 | headers: { 'Content-Type': 'application/json' }, 105 | body: JSON.stringify({ response: query, provider }), 106 | }) 107 | 108 | if (!response.ok) { 109 | if (response.status === 401) { 110 | window.location.href = '/login' 111 | return 112 | } 113 | throw new Error('Ошибка сервера') 114 | } 115 | 116 | const reader = response.body.getReader() 117 | const decoder = new TextDecoder('utf-8') 118 | let buffer = '' 119 | let currentText = '' 120 | 121 | chatOutput.removeChild(loadingIndicator) 122 | const assistantMessage = addMessage('') 123 | assistantMessage.classList.add('streaming') 124 | 125 | while (true) { 126 | const { done, value } = await reader.read() 127 | if (done) break 128 | 129 | buffer += decoder.decode(value, { stream: true }) 130 | 131 | // Обрабатываем буфер посимвольно 132 | while (buffer.length > 0) { 133 | const char = buffer[0] 134 | buffer = buffer.slice(1) 135 | currentText += char 136 | 137 | // Обновляем сообщение каждые 50мс 138 | await new Promise((resolve) => setTimeout(resolve, 50)) 139 | updateMessage(assistantMessage, currentText) 140 | } 141 | } 142 | 143 | assistantMessage.classList.remove('streaming') 144 | if (currentText.trim() === '{"response":"Ничего не найдено"}') { 145 | updateMessage(assistantMessage, 'Ничего не найдено') 146 | } 147 | } catch (error) { 148 | chatOutput.removeChild(loadingIndicator) 149 | addMessage(`Ошибка: ${error.message}`) 150 | } finally { 151 | sendButton.disabled = false 152 | queryInput.focus() 153 | } 154 | }) 155 | 156 | document.getElementById('logoutButton').addEventListener('click', async () => { 157 | try { 158 | const response = await fetch('/api/logout', { 159 | method: 'POST', 160 | credentials: 'include', 161 | }) 162 | 163 | if (response.ok) { 164 | window.location.href = '/login' 165 | } 166 | } catch (error) { 167 | console.error('Ошибка при выходе:', error) 168 | } 169 | }) 170 | -------------------------------------------------------------------------------- /article_1/amvera_data/parsed_json/python-flask.json: -------------------------------------------------------------------------------- 1 | { 2 | "text": "backend с использованием flask инстукция содержит туториал и видеопример развертывания flask приложения видеопример деплой flask приложения с базой данных postgresql details summary содержание видео summary таймкоды 00 00 intro 00 20 развертывание бд 01 00 подключение к бд 02 02 развертывание сайта 02 27 requirements txt 03 00 amvera yml 03 48 загрузка файлов 04 24 переменные окружения 05 24 постоянное хранилище data 05 42 подключение через git details eval rst youtube i dn7lk1mrw align center width 100 планирование создадим простое приложение на языке программирования python с использованием фреймворка flask это будет api для todo заметок eval rst admonition подсказка class hint для ознакомления с принципом работы с git рекомендуем эту статью https habr com ru articles 541258 которая позволит понять как создавать git репозиторий и вносить в него изменения каждая заметка будет определяться следующим образом text купить молоко done true все заметки будут храниться массивом в файле формата json определим api следующим образом get todo получает список всех todo get todo id получает todo с заданным id индексом в массиве post todo добавляет новую todo в конец списка put todo id заменяет todo с заданным id реализация для начала напишем само приложение так как наше приложение использует flask создадим файл requirements txt text flask 2 2 2 flask cors 3 0 10 gunicorn 20 1 0 напишем код приложения работающий локально в файле app py python import json from flask import flask request abort from flask cors import cors filename todo json def get data try with open filename r encoding utf 8 as f return json load f except filenotfounderror return def save data data with open filename w encoding utf 8 as f json dump data f app flask name cors cors app app route def index return todo app app route todo def get all todo return get data app route todo int id def get single todo id data get data if id 0 or id len data abort 404 return data id app route todo methods post def add new todo new todo request json if new todo is none abort 400 data get data data append new todo save data data return ok 201 app route todo int id methods put def update todo id data get data if id 0 or id len data abort 404 updated todo request json if updated todo is none abort 400 data id updated todo save data data return ok if name main app run port 8080 установим зависимости shell pip install r requirements txt запустим приложение shell python app py убедимся в его работоспособности при помощи postman подготовка приложения для amvera подготовим приложение для окружения amvera напишем amvera yaml написать yaml файл можно как самостоятельно используя инструкцию ниже так и воспользоваться нашим генератором yaml перейдя по ссылке https manifest amvera ru yaml meta environment python toolchain name pip run command gunicorn bind 0 0 0 0 5000 app app containerport 5000 так как для развертывания нашего приложения мы используем gunicorn добавим его в requirements txt text flask 2 2 2 flask cors 3 0 10 gunicorn 20 1 0 осталось решить проблему с сохранением файла с todo в data добавим import os в начало файла app py а также изменим объявление переменной filename python filename data todo json if amvera in os environ else todo json теперь начало файла app py выглядит так python import os import json from flask import flask request abort from flask cors import cors filename data todo json if amvera in os environ else todo json def get data остаток файла инициализируем репозиторий git shell git init добавим созданные нами файлы в индекс shell git add app py requirements txt amvera yml зафиксируем изменения shell git commit m todo app создание проекта в amvera теперь нужно создать приложение в amvera откроем страницу https cloud amvera ru projects https cloud amvera ru projects и нажмите кнопку создать в процессе создания приложение возьмем данные для git репозитория на этапе загрузка данных так же их можно найти во вкладке репозиторий самого приложения shell git remote add amvera https git amvera ru имя пользователя todo app git push amvera master config img quick start2 png после этого начнется сборка applications build md и развертывание applications run md приложения дождитесь появления статуса успешно развернуто проверка работоспособности снова воспользуемся postman для отправки запросов для проверки сохранности данных после перезагрузки перезапустим сервис кнопкой в интерфейсе после завершения перезапуска отправим запрос постманом для проверки наличия todo заметок если они есть значит мы все сделали правильно если что то не работает рекомендуем ознакомиться с логами сборки и приложения eval rst admonition подсказка class hint если логи пишутся в print для их отображения надо выставить переменную окружения pythonunbuffered в 1 eval rst admonition важно class warning сохраняйте файлы бд и иные изменяемые данные в постоянное хранилище чтобы избежать их потери при обновлении проекта когда производится откат папки код до состояния обновления репозитория папка data в корне проекта и директория data это разные директории проверить что сохранение идет в data можно зайдя в папку data на странице репозиторий eval rst admonition важно class warning чтобы избежать ошибки 502 измените в вашем коде host 127 0 0 1 или подобный localhost на 0 0 0 0 и пропишите в конфигурации порт который слушает ваше приложение пример 8080 поздравляем вы успешно создали свое первое приложение в amvera если у вас не получается развернуть проект напишите наблюдаемую вами симптоматику на support amvera ru с указанием вашего имени пользователя и названия проекта мы постараемся вам помочь", 3 | "metadata": { 4 | "file_name": "python-flask.md", 5 | "section_count": 9, 6 | "section_1": "Backend с использованием Flask", 7 | "section_2": "Видеопример - Деплой Flask приложения с базой данных PostgreSQL", 8 | "section_3": "Планирование", 9 | "section_4": "Реализация", 10 | "section_5": "Подготовка приложения для Amvera", 11 | "section_6": "... остаток файла", 12 | "section_7": "Создание проекта в Amvera", 13 | "section_8": "Проверка работоспособности", 14 | "section_9": "Если у вас не получается развернуть проект " 15 | } 16 | } --------------------------------------------------------------------------------