From e54b99f6f4c420ef39b66019889c74f81ff0b89c Mon Sep 17 00:00:00 2001 From: Anton Kuznetcov Date: Sat, 8 Nov 2025 15:59:45 +0600 Subject: [PATCH] v2.0.15 --- Dockerfiles/OllamaServer/.dockerignore | 52 +++ Dockerfiles/OllamaServer/.gitignore | 15 + Dockerfiles/OllamaServer/Dockerfile | 78 ++++ Dockerfiles/OllamaServer/Makefile | 107 ++++++ Dockerfiles/OllamaServer/QUICKSTART.md | 172 +++++++++ Dockerfiles/OllamaServer/README.md | 397 ++++++++++++++++++++ Dockerfiles/OllamaServer/STRUCTURE.md | 111 ++++++ Dockerfiles/OllamaServer/docker-compose.yml | 54 +++ Dockerfiles/OllamaServer/entrypoint.sh | 171 +++++++++ Dockerfiles/OllamaServer/podman-compose.yml | 54 +++ VERSION.txt | 2 +- deploy/VERSION.txt | 2 +- docs/CONFIG_COMMAND.md | 16 +- docs/README.md | 13 +- docs/USAGE_GUIDE.md | 4 +- docs/VALIDATION_CONFIG.md | 72 ++-- main.go | 60 ++- serve/serve.go | 10 +- serve/templates/not_found.go | 16 +- 19 files changed, 1339 insertions(+), 67 deletions(-) create mode 100644 Dockerfiles/OllamaServer/.dockerignore create mode 100644 Dockerfiles/OllamaServer/.gitignore create mode 100644 Dockerfiles/OllamaServer/Dockerfile create mode 100644 Dockerfiles/OllamaServer/Makefile create mode 100644 Dockerfiles/OllamaServer/QUICKSTART.md create mode 100644 Dockerfiles/OllamaServer/README.md create mode 100644 Dockerfiles/OllamaServer/STRUCTURE.md create mode 100644 Dockerfiles/OllamaServer/docker-compose.yml create mode 100755 Dockerfiles/OllamaServer/entrypoint.sh create mode 100644 Dockerfiles/OllamaServer/podman-compose.yml diff --git a/Dockerfiles/OllamaServer/.dockerignore b/Dockerfiles/OllamaServer/.dockerignore new file mode 100644 index 0000000..c4e1bb4 --- /dev/null +++ b/Dockerfiles/OllamaServer/.dockerignore @@ -0,0 +1,52 @@ +# Git +.git +.gitignore +.gitattributes + +# Build artifacts +dist/ +*.exe +*.dll +*.so +*.dylib +lcg +go-lcg + +# IDE +.idea/ +.vscode/ +*.swp +*.swo +*~ + +# Documentation +docs/ +*.md +!README.md + +# Tests +*_test.go +test_*.sh + +# Deployment scripts +deploy/ +shell-code/ +kustomize/ + +# Temporary files +*.log +*.tmp +*.temp + +# OS files +.DS_Store +Thumbs.db + +# Go +vendor/ + +# Docker +Dockerfile* +docker-compose*.yml +.dockerignore + diff --git a/Dockerfiles/OllamaServer/.gitignore b/Dockerfiles/OllamaServer/.gitignore new file mode 100644 index 0000000..77d13f0 --- /dev/null +++ b/Dockerfiles/OllamaServer/.gitignore @@ -0,0 +1,15 @@ +# Временные файлы +*.log +*.tmp +*.temp + +# IDE +.idea/ +.vscode/ +*.swp +*.swo + +# OS files +.DS_Store +Thumbs.db + diff --git a/Dockerfiles/OllamaServer/Dockerfile b/Dockerfiles/OllamaServer/Dockerfile new file mode 100644 index 0000000..6a73f6f --- /dev/null +++ b/Dockerfiles/OllamaServer/Dockerfile @@ -0,0 +1,78 @@ +# Multi-stage build для LCG с Ollama +FROM golang:1.24.6-alpine3.22 AS builder + +WORKDIR /build + +# Копируем файлы зависимостей +COPY go.mod go.sum ./ +RUN go mod download + +# Копируем исходный код +COPY . . + +# Собираем бинарник +RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-w -s -buildid=" -trimpath -o /build/lcg . + +# Финальный образ с Ollama +FROM alpine:3.22 + +# Устанавливаем необходимые пакеты +RUN apk add --no-cache \ + curl \ + ca-certificates \ + bash \ + && rm -rf /var/cache/apk/* + +# Устанавливаем Ollama 0.9.5 (поддержка разных архитектур) +ARG TARGETARCH +RUN case ${TARGETARCH} in \ + amd64) OLLAMA_ARCH=amd64 ;; \ + arm64) OLLAMA_ARCH=arm64 ;; \ + arm) OLLAMA_ARCH=arm64 ;; \ + *) echo "Unsupported architecture: ${TARGETARCH}" && exit 1 ;; \ + esac && \ + curl -L https://github.com/ollama/ollama/releases/download/v0.9.5/ollama-linux-${OLLAMA_ARCH} -o /usr/local/bin/ollama \ + && chmod +x /usr/local/bin/ollama + +# Создаем пользователя для запуска сервисов +RUN addgroup -g 1000 ollama && \ + adduser -D -u 1000 -G ollama ollama && \ + mkdir -p /home/ollama/.ollama && \ + chown -R ollama:ollama /home/ollama + +# Копируем бинарник lcg +COPY --from=builder /build/lcg /usr/local/bin/lcg +RUN chmod +x /usr/local/bin/lcg + +# Копируем entrypoint скрипт +COPY --chmod=755 Dockerfiles/OllamaServer/entrypoint.sh /entrypoint.sh + +# Создаем директории для данных +RUN mkdir -p /app/data/results /app/data/prompts /app/data/config \ + && chown -R ollama:ollama /app/data + +# Настройки по умолчанию +ENV LCG_PROVIDER=ollama +ENV LCG_HOST=http://127.0.0.1:11434/ +ENV LCG_MODEL=codegeex4 +ENV LCG_RESULT_FOLDER=/app/data/results +ENV LCG_PROMPT_FOLDER=/app/data/prompts +ENV LCG_CONFIG_FOLDER=/app/data/config +ENV LCG_SERVER_HOST=0.0.0.0 +ENV LCG_SERVER_PORT=8080 +ENV LCG_SERVER_ALLOW_HTTP=true +ENV OLLAMA_HOST=0.0.0.0 +ENV OLLAMA_PORT=11434 + +# Expose порты +EXPOSE 8080 11434 + +# Переключаемся на пользователя ollama +USER ollama + +WORKDIR /home/ollama + +# Запускаем entrypoint +ENTRYPOINT ["/entrypoint.sh"] +CMD [] + diff --git a/Dockerfiles/OllamaServer/Makefile b/Dockerfiles/OllamaServer/Makefile new file mode 100644 index 0000000..8e2b43c --- /dev/null +++ b/Dockerfiles/OllamaServer/Makefile @@ -0,0 +1,107 @@ +.PHONY: build build-podman run run-podman stop stop-podman logs logs-podman clean help + +# Переменные +IMAGE_NAME = lcg-ollama +IMAGE_TAG = latest +CONTAINER_NAME = lcg-ollama +DOCKERFILE = Dockerfile +CONTEXT = ../.. + +help: ## Показать справку + @echo "Доступные команды:" + @echo " make build - Собрать Docker образ" + @echo " make build-podman - Собрать Podman образ" + @echo " make run - Запустить контейнер (Docker)" + @echo " make run-podman - Запустить контейнер (Podman)" + @echo " make stop - Остановить контейнер (Docker)" + @echo " make stop-podman - Остановить контейнер (Podman)" + @echo " make logs - Показать логи (Docker)" + @echo " make logs-podman - Показать логи (Podman)" + @echo " make clean - Удалить контейнер и образ" + @echo " make compose-up - Запустить через docker-compose" + @echo " make compose-down - Остановить docker-compose" + @echo " make podman-compose-up - Запустить через podman-compose" + @echo " make podman-compose-down - Остановить podman-compose" + +build: ## Собрать Docker образ + docker build -f $(DOCKERFILE) -t $(IMAGE_NAME):$(IMAGE_TAG) $(CONTEXT) + @echo "Образ $(IMAGE_NAME):$(IMAGE_TAG) успешно собран" + +build-podman: ## Собрать Podman образ + podman build -f $(DOCKERFILE) -t $(IMAGE_NAME):$(IMAGE_TAG) $(CONTEXT) + @echo "Образ $(IMAGE_NAME):$(IMAGE_TAG) успешно собран" + +run: ## Запустить контейнер (Docker) + docker run -d \ + --name $(CONTAINER_NAME) \ + -p 8080:8080 \ + -p 11434:11434 \ + -v ollama-data:/home/ollama/.ollama \ + -v lcg-results:/app/data/results \ + -v lcg-prompts:/app/data/prompts \ + -v lcg-config:/app/data/config \ + $(IMAGE_NAME):$(IMAGE_TAG) + @echo "Контейнер $(CONTAINER_NAME) запущен" + +run-podman: ## Запустить контейнер (Podman) + podman run -d \ + --name $(CONTAINER_NAME) \ + -p 8080:8080 \ + -p 11434:11434 \ + -v ollama-data:/home/ollama/.ollama \ + -v lcg-results:/app/data/results \ + -v lcg-prompts:/app/data/prompts \ + -v lcg-config:/app/data/config \ + $(IMAGE_NAME):$(IMAGE_TAG) + @echo "Контейнер $(CONTAINER_NAME) запущен" + +stop: ## Остановить контейнер (Docker) + docker stop $(CONTAINER_NAME) || true + docker rm $(CONTAINER_NAME) || true + @echo "Контейнер $(CONTAINER_NAME) остановлен и удален" + +stop-podman: ## Остановить контейнер (Podman) + podman stop $(CONTAINER_NAME) || true + podman rm $(CONTAINER_NAME) || true + @echo "Контейнер $(CONTAINER_NAME) остановлен и удален" + +logs: ## Показать логи (Docker) + docker logs -f $(CONTAINER_NAME) + +logs-podman: ## Показать логи (Podman) + podman logs -f $(CONTAINER_NAME) + +clean: ## Удалить контейнер и образ + docker stop $(CONTAINER_NAME) || true + docker rm $(CONTAINER_NAME) || true + docker rmi $(IMAGE_NAME):$(IMAGE_TAG) || true + @echo "Контейнер и образ удалены" + +compose-up: ## Запустить через docker-compose + docker-compose up -d + @echo "Сервисы запущены через docker-compose" + +compose-down: ## Остановить docker-compose + docker-compose down + @echo "Сервисы остановлены" + +podman-compose-up: ## Запустить через podman-compose + podman-compose -f podman-compose.yml up -d + @echo "Сервисы запущены через podman-compose" + +podman-compose-down: ## Остановить podman-compose + podman-compose -f podman-compose.yml down + @echo "Сервисы остановлены" + +shell: ## Подключиться к контейнеру (Docker) + docker exec -it $(CONTAINER_NAME) sh + +shell-podman: ## Подключиться к контейнеру (Podman) + podman exec -it $(CONTAINER_NAME) sh + +pull-model: ## Загрузить модель codegeex4 (Docker) + docker exec $(CONTAINER_NAME) ollama pull codegeex4 + +pull-model-podman: ## Загрузить модель codegeex4 (Podman) + podman exec $(CONTAINER_NAME) ollama pull codegeex4 + diff --git a/Dockerfiles/OllamaServer/QUICKSTART.md b/Dockerfiles/OllamaServer/QUICKSTART.md new file mode 100644 index 0000000..bb8faa8 --- /dev/null +++ b/Dockerfiles/OllamaServer/QUICKSTART.md @@ -0,0 +1,172 @@ +# 🚀 Быстрый старт - LCG с Ollama + +## Подготовка + +1. Убедитесь, что у вас установлен Docker или Podman +2. Клонируйте репозиторий (если еще не сделали) +3. Перейдите в папку с Dockerfile + +```bash +cd Dockerfiles/OllamaServer +``` + +## Запуск с Docker + +### Вариант 1: Docker Compose (рекомендуется) + +```bash +docker-compose up -d +``` + +### Вариант 2: Ручная сборка и запуск + +```bash +# Сборка образа +docker build -f Dockerfile -t lcg-ollama:latest ../.. + +# Запуск контейнера +docker run -d \ + --name lcg-ollama \ + -p 8080:8080 \ + -p 11434:11434 \ + -v ollama-data:/home/ollama/.ollama \ + -v lcg-results:/app/data/results \ + lcg-ollama:latest +``` + +## Запуск с Podman + +### Вариант 1: Podman Compose + +```bash +podman-compose -f podman-compose.yml up -d +``` + +### Вариант 2: Ручная сборка и запуск + +```bash +# Сборка образа +podman build -f Dockerfile -t lcg-ollama:latest ../.. + +# Запуск контейнера +podman run -d \ + --name lcg-ollama \ + -p 8080:8080 \ + -p 11434:11434 \ + -v ollama-data:/home/ollama/.ollama \ + -v lcg-results:/app/data/results \ + lcg-ollama:latest +``` + +## Проверка запуска + +### Проверка логов + +```bash +# Docker +docker logs -f lcg-ollama + +# Podman +podman logs -f lcg-ollama +``` + +Дождитесь сообщений: +- `Ollama сервер готов!` +- `LCG сервер запущен на http://0.0.0.0:8080` + +### Проверка доступности + +```bash +# Проверка Ollama +curl http://localhost:11434/api/tags + +# Проверка LCG +curl http://localhost:8080/ +``` + +## Загрузка модели + +После запуска контейнера загрузите модель: + +```bash +# Docker +docker exec lcg-ollama ollama pull codegeex4 + +# Podman +podman exec lcg-ollama ollama pull codegeex4 +``` + +Или используйте модель по умолчанию, указанную в переменных окружения. + +## Доступ к веб-интерфейсу + +Откройте в браузере: http://localhost:8080 + +## Остановка + +```bash +# Docker +docker-compose down + +# Podman +podman-compose -f podman-compose.yml down +``` + +Или для ручного запуска: + +```bash +# Docker +docker stop lcg-ollama +docker rm lcg-ollama + +# Podman +podman stop lcg-ollama +podman rm lcg-ollama +``` + +## Решение проблем + +### Порт занят + +Измените порты в docker-compose.yml или команде run: + +```bash +-p 9000:8080 # LCG на порту 9000 +-p 11435:11434 # Ollama на порту 11435 +``` + +### Контейнер не запускается + +Проверьте логи: + +```bash +docker logs lcg-ollama +# или +podman logs lcg-ollama +``` + +### Модель не загружена + +Убедитесь, что модель существует: + +```bash +docker exec lcg-ollama ollama list +# или +podman exec lcg-ollama ollama list +``` + +Если модели нет, загрузите её: + +```bash +docker exec lcg-ollama ollama pull codegeex4 +# или +podman exec lcg-ollama ollama pull codegeex4 +``` + +## Следующие шаги + +- Прочитайте полную документацию в [README.md](README.md) +- Настройте аутентификацию для продакшена +- Настройте reverse proxy для HTTPS +- Загрузите нужные модели Ollama + diff --git a/Dockerfiles/OllamaServer/README.md b/Dockerfiles/OllamaServer/README.md new file mode 100644 index 0000000..1652453 --- /dev/null +++ b/Dockerfiles/OllamaServer/README.md @@ -0,0 +1,397 @@ +# 🐳 LCG с Ollama Server - Docker/Podman контейнер + +Этот образ содержит Linux Command GPT (LCG) и Ollama сервер, работающие вместе в одном контейнере. + +Поддерживается запуск через Docker и Podman. + +## 📋 Описание + +Контейнер автоматически запускает: +1. **Ollama сервер** (v0.9.5) на порту 11434 +2. **LCG веб-сервер** на порту 8080 + +Ollama используется как провайдер LLM для генерации Linux команд. + +## 🚀 Быстрый старт + +### Сборка образа + +#### Docker +```bash +# Из корня проекта +docker build -f Dockerfiles/OllamaServer/Dockerfile -t lcg-ollama:latest . +``` + +#### Podman +```bash +# Из корня проекта +podman build -f Dockerfiles/OllamaServer/Dockerfile -t lcg-ollama:latest . +``` + +### Запуск контейнера + +#### Docker +```bash +docker run -d \ + --name lcg-ollama \ + -p 8080:8080 \ + -p 11434:11434 \ + lcg-ollama:latest +``` + +#### Podman +```bash +podman run -d \ + --name lcg-ollama \ + -p 8080:8080 \ + -p 11434:11434 \ + lcg-ollama:latest +``` + +### Использование docker-compose / podman-compose + +#### Docker Compose +```bash +cd Dockerfiles/OllamaServer +docker-compose up -d +``` + +#### Podman Compose +```bash +cd Dockerfiles/OllamaServer +podman-compose -f podman-compose.yml up -d +``` + +Или используйте встроенную поддержку Podman: +```bash +cd Dockerfiles/OllamaServer +podman play kube podman-compose.yml +``` + +## 🌐 Доступ к сервисам + +После запуска контейнера доступны: + +- **LCG веб-интерфейс**: http://localhost:8080 +- **Ollama API**: http://localhost:11434 + +## ⚙️ Переменные окружения + +### Настройки LCG + +| Переменная | Значение по умолчанию | Описание | +|------------|----------------------|----------| +| `LCG_PROVIDER` | `ollama` | Тип провайдера | +| `LCG_HOST` | `http://127.0.0.1:11434/` | URL Ollama API | +| `LCG_MODEL` | `codegeex4` | Модель для использования | +| `LCG_SERVER_HOST` | `0.0.0.0` | Хост LCG сервера | +| `LCG_SERVER_PORT` | `8080` | Порт LCG сервера | +| `LCG_SERVER_ALLOW_HTTP` | `true` | Разрешить HTTP | +| `LCG_RESULT_FOLDER` | `/app/data/results` | Папка для результатов | +| `LCG_PROMPT_FOLDER` | `/app/data/prompts` | Папка для промптов | +| `LCG_CONFIG_FOLDER` | `/app/data/config` | Папка для конфигурации | + +### Настройки Ollama + +| Переменная | Значение по умолчанию | Описание | +|------------|----------------------|----------| +| `OLLAMA_HOST` | `127.0.0.1` | Хост Ollama сервера | +| `OLLAMA_PORT` | `11434` | Порт Ollama сервера | + +### Безопасность + +| Переменная | Значение по умолчанию | Описание | +|------------|----------------------|----------| +| `LCG_SERVER_REQUIRE_AUTH` | `false` | Требовать аутентификацию | +| `LCG_SERVER_PASSWORD` | `admin#123456` | Пароль для аутентификации | + +## 📦 Volumes + +Рекомендуется монтировать volumes для персистентного хранения данных: + +```bash +docker run -d \ + --name lcg-ollama \ + -p 8080:8080 \ + -p 11434:11434 \ + -v ollama-data:/home/ollama/.ollama \ + -v lcg-results:/app/data/results \ + -v lcg-prompts:/app/data/prompts \ + -v lcg-config:/app/data/config \ + lcg-ollama:latest +``` + +### Volumes описание + +- `ollama-data`: Модели и данные Ollama +- `lcg-results`: Результаты генерации команд +- `lcg-prompts`: Системные промпты +- `lcg-config`: Конфигурация LCG + +## 🔧 Примеры использования + +### Запуск с кастомной моделью + +```bash +docker run -d \ + --name lcg-ollama \ + -p 8080:8080 \ + -p 11434:11434 \ + -e LCG_MODEL=llama3:8b \ + lcg-ollama:latest +``` + +### Запуск с аутентификацией + +```bash +docker run -d \ + --name lcg-ollama \ + -p 8080:8080 \ + -p 11434:11434 \ + -e LCG_SERVER_REQUIRE_AUTH=true \ + -e LCG_SERVER_PASSWORD=my_secure_password \ + lcg-ollama:latest +``` + +### Запуск с кастомным портом + +```bash +docker run -d \ + --name lcg-ollama \ + -p 9000:9000 \ + -p 11434:11434 \ + -e LCG_SERVER_PORT=9000 \ + lcg-ollama:latest +``` + +## 📥 Загрузка моделей Ollama + +После запуска контейнера можно загрузить модели: + +```bash +# Подключиться к контейнеру +docker exec -it lcg-ollama sh + +# Загрузить модель +ollama pull codegeex4 +ollama pull llama3:8b +ollama pull qwen2.5:7b +``` + +Или извне контейнера: + +```bash +# Убедитесь, что Ollama доступен извне (OLLAMA_HOST=0.0.0.0) +docker exec lcg-ollama ollama pull codegeex4 +``` + +## 🔍 Проверка работоспособности + +### Проверка Ollama + +```bash +# Проверка health +curl http://localhost:11434/api/tags + +# Список моделей +curl http://localhost:11434/api/tags | jq '.models' +``` + +### Проверка LCG + +```bash +# Проверка веб-интерфейса +curl http://localhost:8080/ + +# Проверка через API +curl -X POST http://localhost:8080/api/execute \ + -H "Content-Type: application/json" \ + -d '{"prompt": "создать директорию test"}' +``` + +## 🐧 Podman специфичные инструкции + +### Запуск с Podman + +Podman работает аналогично Docker, но есть несколько отличий: + +#### Создание сетей (если нужно) + +```bash +podman network create lcg-network +``` + +#### Запуск с сетью + +```bash +podman run -d \ + --name lcg-ollama \ + --network lcg-network \ + -p 8080:8080 \ + -p 11434:11434 \ + lcg-ollama:latest +``` + +#### Запуск в rootless режиме + +Podman по умолчанию работает в rootless режиме, что повышает безопасность: + +```bash +# Не требует sudo +podman run -d \ + --name lcg-ollama \ + -p 8080:8080 \ + -p 11434:11434 \ + lcg-ollama:latest +``` + +#### Использование systemd для автозапуска + +Создайте systemd unit файл: + +```bash +# Генерируем unit файл +podman generate systemd --name lcg-ollama --files + +# Копируем в systemd +sudo cp container-lcg-ollama.service /etc/systemd/system/ + +# Включаем автозапуск +sudo systemctl enable container-lcg-ollama.service +sudo systemctl start container-lcg-ollama.service +``` + +#### Проверка статуса + +```bash +# Статус контейнера +podman ps + +# Логи +podman logs lcg-ollama + +# Логи в реальном времени +podman logs -f lcg-ollama +``` + +## 🐛 Отладка + +### Просмотр логов + +#### Docker +```bash +# Логи контейнера +docker logs lcg-ollama + +# Логи в реальном времени +docker logs -f lcg-ollama +``` + +#### Podman +```bash +# Логи контейнера +podman logs lcg-ollama + +# Логи в реальном времени +podman logs -f lcg-ollama +``` + +### Подключение к контейнеру + +#### Docker +```bash +docker exec -it lcg-ollama sh +``` + +#### Podman +```bash +podman exec -it lcg-ollama sh +``` + +### Проверка процессов + +#### Docker +```bash +docker exec lcg-ollama ps aux +``` + +#### Podman +```bash +podman exec lcg-ollama ps aux +``` + +## 🔒 Безопасность + +### Рекомендации для продакшена + +1. **Используйте аутентификацию**: + ```bash + -e LCG_SERVER_REQUIRE_AUTH=true + -e LCG_SERVER_PASSWORD=strong_password + ``` + +2. **Ограничьте доступ к портам**: + - Используйте firewall правила + - Не экспортируйте порты на публичный интерфейс + +3. **Используйте HTTPS**: + - Настройте reverse proxy (nginx, traefik) + - Используйте SSL сертификаты + +4. **Ограничьте ресурсы**: + ```bash + docker run -d \ + --name lcg-ollama \ + --memory="4g" \ + --cpus="2" \ + lcg-ollama:latest + ``` + +## 📊 Мониторинг + +### Healthcheck + +Контейнер включает healthcheck, который проверяет доступность LCG сервера: + +```bash +docker inspect lcg-ollama | jq '.[0].State.Health' +``` + +### Метрики + +LCG предоставляет Prometheus метрики на `/metrics` endpoint (если включено). + +## 🚀 Production Deployment + +### С docker-compose + +```bash +cd Dockerfiles/OllamaServer +docker-compose up -d +``` + +### С Kubernetes + +Используйте манифесты из папки `deploy/` или `kustomize/`. + +## 📝 Примечания + +- Ollama версия: 0.9.5 +- LCG версия: см. VERSION.txt +- Минимальные требования: 2GB RAM, 2 CPU cores +- Рекомендуется: 4GB+ RAM для больших моделей + +## 🔗 Полезные ссылки + +- [Ollama документация](https://github.com/ollama/ollama) +- [LCG документация](../../docs/README.md) +- [LCG API Guide](../../docs/API_GUIDE.md) + +## ❓ Поддержка + +При возникновении проблем: +1. Проверьте логи: `docker logs lcg-ollama` +2. Проверьте переменные окружения +3. Убедитесь, что порты не заняты +4. Проверьте, что модели загружены в Ollama + diff --git a/Dockerfiles/OllamaServer/STRUCTURE.md b/Dockerfiles/OllamaServer/STRUCTURE.md new file mode 100644 index 0000000..4efc13e --- /dev/null +++ b/Dockerfiles/OllamaServer/STRUCTURE.md @@ -0,0 +1,111 @@ +# 📁 Структура проекта OllamaServer + +## Файлы + +``` +Dockerfiles/OllamaServer/ +├── Dockerfile # Multi-stage Dockerfile для сборки образа +├── entrypoint.sh # Скрипт запуска LCG и Ollama серверов +├── docker-compose.yml # Docker Compose конфигурация +├── podman-compose.yml # Podman Compose конфигурация +├── Makefile # Команды для сборки и запуска +├── README.md # Полная документация +├── QUICKSTART.md # Быстрый старт +├── STRUCTURE.md # Этот файл +├── .dockerignore # Исключения для Docker build +└── .gitignore # Исключения для Git +``` + +## Описание файлов + +### Dockerfile +Multi-stage Dockerfile, который: +1. Собирает бинарник LCG из исходного кода +2. Устанавливает Ollama 0.9.5 +3. Создает пользователя ollama +4. Настраивает рабочее окружение + +### entrypoint.sh +Скрипт запуска, который: +1. Запускает Ollama сервер в фоне +2. Ожидает готовности Ollama API +3. Запускает LCG сервер в фоне +4. Мониторит состояние процессов +5. Корректно обрабатывает сигналы завершения + +### docker-compose.yml / podman-compose.yml +Конфигурация для запуска через compose: +- Настройки портов +- Переменные окружения +- Volumes для персистентного хранения +- Healthcheck + +### Makefile +Удобные команды для: +- Сборки образа +- Запуска/остановки контейнера +- Просмотра логов +- Работы с compose + +### README.md +Полная документация с: +- Описанием функциональности +- Инструкциями по установке +- Настройками переменных окружения +- Примерами использования +- Решением проблем + +### QUICKSTART.md +Краткое руководство для быстрого старта. + +## Порты + +- **8080**: LCG веб-сервер +- **11434**: Ollama API + +## Volumes + +- `ollama-data`: Данные Ollama (модели) +- `lcg-results`: Результаты генерации команд +- `lcg-prompts`: Системные промпты +- `lcg-config`: Конфигурация LCG + +## Переменные окружения + +Основные переменные (см. README.md для полного списка): +- `LCG_PROVIDER=ollama` +- `LCG_HOST=http://127.0.0.1:11434/` +- `LCG_MODEL=codegeex4` +- `OLLAMA_HOST=0.0.0.0` +- `OLLAMA_PORT=11434` + +## Запуск + +### Docker +```bash +cd Dockerfiles/OllamaServer +docker-compose up -d +``` + +### Podman +```bash +cd Dockerfiles/OllamaServer +podman-compose -f podman-compose.yml up -d +``` + +### Make +```bash +cd Dockerfiles/OllamaServer +make compose-up +# или +make podman-compose-up +``` + +## Архитектура + +Контейнер запускает два сервиса: +1. **Ollama** (порт 11434) - LLM сервер +2. **LCG** (порт 8080) - Веб-интерфейс и API + +Оба сервиса работают в одном контейнере и общаются через localhost. + diff --git a/Dockerfiles/OllamaServer/docker-compose.yml b/Dockerfiles/OllamaServer/docker-compose.yml new file mode 100644 index 0000000..ca76825 --- /dev/null +++ b/Dockerfiles/OllamaServer/docker-compose.yml @@ -0,0 +1,54 @@ +version: '3.8' + +services: + lcg-ollama: + build: + context: ../.. + dockerfile: Dockerfiles/OllamaServer/Dockerfile + container_name: lcg-ollama + ports: + - "8080:8080" # LCG веб-сервер + - "11434:11434" # Ollama API + environment: + # Настройки LCG + - LCG_PROVIDER=ollama + - LCG_HOST=http://127.0.0.1:11434/ + - LCG_MODEL=codegeex4 + - LCG_RESULT_FOLDER=/app/data/results + - LCG_PROMPT_FOLDER=/app/data/prompts + - LCG_CONFIG_FOLDER=/app/data/config + - LCG_SERVER_HOST=0.0.0.0 + - LCG_SERVER_PORT=8080 + - LCG_SERVER_ALLOW_HTTP=true + # Настройки Ollama + - OLLAMA_HOST=0.0.0.0 + - OLLAMA_PORT=11434 + - OLLAMA_ORIGINS=* + # Опционально: настройки безопасности + - LCG_SERVER_REQUIRE_AUTH=false + - LCG_SERVER_PASSWORD=admin#123456 + volumes: + # Персистентное хранилище для данных Ollama + - ollama-data:/home/ollama/.ollama + # Персистентное хранилище для результатов LCG + - lcg-results:/app/data/results + - lcg-prompts:/app/data/prompts + - lcg-config:/app/data/config + restart: unless-stopped + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8080/"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + +volumes: + ollama-data: + driver: local + lcg-results: + driver: local + lcg-prompts: + driver: local + lcg-config: + driver: local + diff --git a/Dockerfiles/OllamaServer/entrypoint.sh b/Dockerfiles/OllamaServer/entrypoint.sh new file mode 100755 index 0000000..f7b6f97 --- /dev/null +++ b/Dockerfiles/OllamaServer/entrypoint.sh @@ -0,0 +1,171 @@ +#!/bin/bash +set -e + +# Цвета для вывода +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Функция для логирования +log() { + echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1" +} + +error() { + echo -e "${RED}[ERROR]${NC} $1" >&2 +} + +warn() { + echo -e "${YELLOW}[WARN]${NC} $1" +} + +info() { + echo -e "${BLUE}[INFO]${NC} $1" +} + +# Обработка сигналов для корректного завершения +cleanup() { + log "Получен сигнал завершения, останавливаем сервисы..." + if [ ! -z "$LCG_PID" ]; then + kill $LCG_PID 2>/dev/null || true + wait $LCG_PID 2>/dev/null || true + fi + if [ ! -z "$OLLAMA_PID" ]; then + kill $OLLAMA_PID 2>/dev/null || true + wait $OLLAMA_PID 2>/dev/null || true + fi + log "Сервисы остановлены" + exit 0 +} + +trap cleanup SIGTERM SIGINT + +# Проверка наличия бинарника lcg +if [ ! -f /usr/local/bin/lcg ]; then + error "Бинарник lcg не найден в /usr/local/bin/lcg" + exit 1 +fi + +# Проверка наличия Ollama +if [ ! -f /usr/local/bin/ollama ]; then + error "Ollama не найден в /usr/local/bin/ollama" + exit 1 +fi + +# Создаем необходимые директории +mkdir -p "${LCG_RESULT_FOLDER:-/app/data/results}" +mkdir -p "${LCG_PROMPT_FOLDER:-/app/data/prompts}" +mkdir -p "${LCG_CONFIG_FOLDER:-/app/data/config}" + +# Настройка переменных окружения для Ollama +export OLLAMA_HOST="${OLLAMA_HOST:-0.0.0.0}" +export OLLAMA_PORT="${OLLAMA_PORT:-11434}" +export OLLAMA_ORIGINS="*" + +# Настройка переменных окружения для LCG +export LCG_PROVIDER="${LCG_PROVIDER:-ollama}" +export LCG_HOST="${LCG_HOST:-http://127.0.0.1:11434/}" +export LCG_MODEL="${LCG_MODEL:-codegeex4}" +export LCG_RESULT_FOLDER="${LCG_RESULT_FOLDER:-/app/data/results}" +export LCG_PROMPT_FOLDER="${LCG_PROMPT_FOLDER:-/app/data/prompts}" +export LCG_CONFIG_FOLDER="${LCG_CONFIG_FOLDER:-/app/data/config}" +export LCG_SERVER_HOST="${LCG_SERVER_HOST:-0.0.0.0}" +export LCG_SERVER_PORT="${LCG_SERVER_PORT:-8080}" +export LCG_SERVER_ALLOW_HTTP="${LCG_SERVER_ALLOW_HTTP:-true}" + +log "==========================================" +log "Запуск LCG с Ollama сервером" +log "==========================================" +info "LCG Provider: $LCG_PROVIDER" +info "LCG Host: $LCG_HOST" +info "LCG Model: $LCG_MODEL" +info "LCG Server: http://${LCG_SERVER_HOST}:${LCG_SERVER_PORT}" +info "Ollama Host: $OLLAMA_HOST:$OLLAMA_PORT" +log "==========================================" + +# Запускаем Ollama сервер в фоне +log "Запуск Ollama сервера..." +/usr/local/bin/ollama serve & +OLLAMA_PID=$! + +# Ждем, пока Ollama запустится +log "Ожидание запуска Ollama сервера..." +sleep 5 + +# Проверяем, что Ollama запущен +if ! kill -0 $OLLAMA_PID 2>/dev/null; then + error "Ollama сервер не запустился" + exit 1 +fi + +# Проверяем доступность Ollama API +max_attempts=30 +attempt=0 +while [ $attempt -lt $max_attempts ]; do + # Проверяем через localhost, так как OLLAMA_HOST может быть 0.0.0.0 + if curl -s -f "http://127.0.0.1:${OLLAMA_PORT}/api/tags" > /dev/null 2>&1; then + log "Ollama сервер готов!" + break + fi + attempt=$((attempt + 1)) + if [ $attempt -eq $max_attempts ]; then + error "Ollama сервер не отвечает после $max_attempts попыток" + exit 1 + fi + sleep 1 +done + +# Запускаем LCG сервер в фоне +log "Запуск LCG сервера..." +/usr/local/bin/lcg serve \ + --host "${LCG_SERVER_HOST}" \ + --port "${LCG_SERVER_PORT}" & +LCG_PID=$! + +# Ждем, пока LCG запустится +sleep 3 + +# Проверяем, что LCG запущен +if ! kill -0 $LCG_PID 2>/dev/null; then + error "LCG сервер не запустился" + kill $OLLAMA_PID 2>/dev/null || true + exit 1 +fi + +log "LCG сервер запущен на http://${LCG_SERVER_HOST}:${LCG_SERVER_PORT}" +log "Ollama сервер доступен на http://${OLLAMA_HOST}:${OLLAMA_PORT}" +log "==========================================" +log "Сервисы запущены и готовы к работе!" +log "==========================================" + +# Функция для проверки здоровья процессов +health_check() { + while true; do + # Проверяем Ollama + if ! kill -0 $OLLAMA_PID 2>/dev/null; then + error "Ollama процесс завершился неожиданно" + kill $LCG_PID 2>/dev/null || true + exit 1 + fi + + # Проверяем LCG + if ! kill -0 $LCG_PID 2>/dev/null; then + error "LCG процесс завершился неожиданно" + kill $OLLAMA_PID 2>/dev/null || true + exit 1 + fi + + sleep 10 + done +} + +# Запускаем проверку здоровья в фоне +health_check & +HEALTH_CHECK_PID=$! + +# Ждем завершения процессов +wait $LCG_PID $OLLAMA_PID +kill $HEALTH_CHECK_PID 2>/dev/null || true + diff --git a/Dockerfiles/OllamaServer/podman-compose.yml b/Dockerfiles/OllamaServer/podman-compose.yml new file mode 100644 index 0000000..ca76825 --- /dev/null +++ b/Dockerfiles/OllamaServer/podman-compose.yml @@ -0,0 +1,54 @@ +version: '3.8' + +services: + lcg-ollama: + build: + context: ../.. + dockerfile: Dockerfiles/OllamaServer/Dockerfile + container_name: lcg-ollama + ports: + - "8080:8080" # LCG веб-сервер + - "11434:11434" # Ollama API + environment: + # Настройки LCG + - LCG_PROVIDER=ollama + - LCG_HOST=http://127.0.0.1:11434/ + - LCG_MODEL=codegeex4 + - LCG_RESULT_FOLDER=/app/data/results + - LCG_PROMPT_FOLDER=/app/data/prompts + - LCG_CONFIG_FOLDER=/app/data/config + - LCG_SERVER_HOST=0.0.0.0 + - LCG_SERVER_PORT=8080 + - LCG_SERVER_ALLOW_HTTP=true + # Настройки Ollama + - OLLAMA_HOST=0.0.0.0 + - OLLAMA_PORT=11434 + - OLLAMA_ORIGINS=* + # Опционально: настройки безопасности + - LCG_SERVER_REQUIRE_AUTH=false + - LCG_SERVER_PASSWORD=admin#123456 + volumes: + # Персистентное хранилище для данных Ollama + - ollama-data:/home/ollama/.ollama + # Персистентное хранилище для результатов LCG + - lcg-results:/app/data/results + - lcg-prompts:/app/data/prompts + - lcg-config:/app/data/config + restart: unless-stopped + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8080/"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + +volumes: + ollama-data: + driver: local + lcg-results: + driver: local + lcg-prompts: + driver: local + lcg-config: + driver: local + diff --git a/VERSION.txt b/VERSION.txt index 68496c0..0e18aae 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -v2.0.14 +v2.0.15 diff --git a/deploy/VERSION.txt b/deploy/VERSION.txt index 68496c0..0e18aae 100644 --- a/deploy/VERSION.txt +++ b/deploy/VERSION.txt @@ -1 +1 @@ -v2.0.14 +v2.0.15 diff --git a/docs/CONFIG_COMMAND.md b/docs/CONFIG_COMMAND.md index 1b35f76..70ef9af 100644 --- a/docs/CONFIG_COMMAND.md +++ b/docs/CONFIG_COMMAND.md @@ -69,8 +69,8 @@ lcg co -f "host": "localhost" }, "validation": { - "max_system_prompt_length": 1000, - "max_user_message_length": 2000, + "max_system_prompt_length": 2000, + "max_user_message_length": 4000, "max_prompt_name_length": 2000, "max_prompt_desc_length": 5000, "max_command_length": 8000, @@ -116,12 +116,12 @@ lcg co -f ### Настройки валидации (validation) -- **max_system_prompt_length** - максимальная длина системного промпта -- **max_user_message_length** - максимальная длина пользовательского сообщения -- **max_prompt_name_length** - максимальная длина названия промпта -- **max_prompt_desc_length** - максимальная длина описания промпта -- **max_command_length** - максимальная длина команды/ответа -- **max_explanation_length** - максимальная длина объяснения +- **max_system_prompt_length** - максимальная длина системного промпта (по умолчанию: 2000) +- **max_user_message_length** - максимальная длина пользовательского сообщения (по умолчанию: 4000) +- **max_prompt_name_length** - максимальная длина названия промпта (по умолчанию: 2000) +- **max_prompt_desc_length** - максимальная длина описания промпта (по умолчанию: 5000) +- **max_command_length** - максимальная длина команды/ответа (по умолчанию: 8000) +- **max_explanation_length** - максимальная длина объяснения (по умолчанию: 20000) ## 🔒 Безопасность diff --git a/docs/README.md b/docs/README.md index 05eec33..d5bcf78 100644 --- a/docs/README.md +++ b/docs/README.md @@ -35,10 +35,17 @@ Explanations: Clipboard support requires `xclip` or `xsel`. -## What's new in 2.0.1 +## What's new in 2.0.14 -- Mobile UI improvements: better responsiveness (buttons, fonts, spacing) and reduced motion support -- Public REST endpoint: `POST /execute` (curl-only) for programmatic access — see `API_GUIDE.md` +- Authentication: JWT-based authentication with HTTP-only cookies +- CSRF protection: Full CSRF protection with tokens and middleware +- Security: Enhanced security with token validation and sessions +- Kubernetes deployment: Full set of manifests for Kubernetes deployment with Traefik +- Reverse Proxy: Support for working behind reverse proxy with cookie configuration +- Web interface: Improved web interface with modern design +- Monitoring: Prometheus metrics and ServiceMonitor +- Scaling: HPA for automatic scaling +- Testing: CSRF protection testing tools ## Environment diff --git a/docs/USAGE_GUIDE.md b/docs/USAGE_GUIDE.md index 4c74dc8..c408c51 100644 --- a/docs/USAGE_GUIDE.md +++ b/docs/USAGE_GUIDE.md @@ -22,7 +22,7 @@ sudo apt-get install xsel ```bash -git clone --depth 1 https://github.com/Direct-Dev-Ru/go-lcg.git ~/.linux-command-gpt +git clone --depth 1 https://github.com/Direct-Dev-Ru/linux-command-gpt.git ~/.linux-command-gpt cd ~/.linux-command-gpt go build -o lcg @@ -60,7 +60,7 @@ lcg --file /path/to/context.txt "хочу вывести список дирек Действия: (c)копировать, (s)сохранить, (r)перегенерировать, (e)выполнить, (v|vv|vvv)подробно, (n)ничего: ``` -### Что нового в 3.0.0 +### Что нового в 2.0.14 - **Аутентификация**: Добавлена система аутентификации с JWT токенами и HTTP-only cookies - **CSRF защита**: Полная защита от CSRF атак с токенами и middleware diff --git a/docs/VALIDATION_CONFIG.md b/docs/VALIDATION_CONFIG.md index e1f2d9d..de88b96 100644 --- a/docs/VALIDATION_CONFIG.md +++ b/docs/VALIDATION_CONFIG.md @@ -8,26 +8,26 @@ | Переменная | Описание | По умолчанию | |------------|----------|--------------| -| `LCG_MAX_SYSTEM_PROMPT_LENGTH` | Максимальная длина системного промпта | 1000 | -| `LCG_MAX_USER_MESSAGE_LENGTH` | Максимальная длина пользовательского сообщения | 2000 | -| `LCG_MAX_PROMPT_NAME_LENGTH` | Максимальная длина названия промпта | 200 | -| `LCG_MAX_PROMPT_DESC_LENGTH` | Максимальная длина описания промпта | 500 | -| `LCG_MAX_COMMAND_LENGTH` | Максимальная длина команды/ответа | 2000 | -| `LCG_MAX_EXPLANATION_LENGTH` | Максимальная длина объяснения | 2000 | +| `LCG_MAX_SYSTEM_PROMPT_LENGTH` | Максимальная длина системного промпта | 2000 | +| `LCG_MAX_USER_MESSAGE_LENGTH` | Максимальная длина пользовательского сообщения | 4000 | +| `LCG_MAX_PROMPT_NAME_LENGTH` | Максимальная длина названия промпта | 2000 | +| `LCG_MAX_PROMPT_DESC_LENGTH` | Максимальная длина описания промпта | 5000 | +| `LCG_MAX_COMMAND_LENGTH` | Максимальная длина команды/ответа | 8000 | +| `LCG_MAX_EXPLANATION_LENGTH` | Максимальная длина объяснения | 20000 | ## 🚀 Примеры использования ### Установка через переменные окружения ```bash -# Увеличить лимит системного промпта до 2к символов -export LCG_MAX_SYSTEM_PROMPT_LENGTH=2000 +# Увеличить лимит системного промпта до 3к символов +export LCG_MAX_SYSTEM_PROMPT_LENGTH=3000 -# Уменьшить лимит пользовательского сообщения до 1к символов -export LCG_MAX_USER_MESSAGE_LENGTH=1000 +# Уменьшить лимит пользовательского сообщения до 2к символов +export LCG_MAX_USER_MESSAGE_LENGTH=2000 -# Увеличить лимит названия промпта до 500 символов -export LCG_MAX_PROMPT_NAME_LENGTH=500 +# Увеличить лимит названия промпта до 3000 символов +export LCG_MAX_PROMPT_NAME_LENGTH=3000 ``` ### Установка в .env файле @@ -35,11 +35,11 @@ export LCG_MAX_PROMPT_NAME_LENGTH=500 ```bash # .env файл LCG_MAX_SYSTEM_PROMPT_LENGTH=2000 -LCG_MAX_USER_MESSAGE_LENGTH=1500 -LCG_MAX_PROMPT_NAME_LENGTH=300 -LCG_MAX_PROMPT_DESC_LENGTH=1000 -LCG_MAX_COMMAND_LENGTH=3000 -LCG_MAX_EXPLANATION_LENGTH=5000 +LCG_MAX_USER_MESSAGE_LENGTH=4000 +LCG_MAX_PROMPT_NAME_LENGTH=2000 +LCG_MAX_PROMPT_DESC_LENGTH=5000 +LCG_MAX_COMMAND_LENGTH=8000 +LCG_MAX_EXPLANATION_LENGTH=20000 ``` ### Установка в systemd сервисе @@ -55,8 +55,8 @@ User=lcg WorkingDirectory=/opt/lcg ExecStart=/opt/lcg/lcg serve Environment=LCG_MAX_SYSTEM_PROMPT_LENGTH=2000 -Environment=LCG_MAX_USER_MESSAGE_LENGTH=1500 -Environment=LCG_MAX_PROMPT_NAME_LENGTH=300 +Environment=LCG_MAX_USER_MESSAGE_LENGTH=4000 +Environment=LCG_MAX_PROMPT_NAME_LENGTH=2000 Restart=always [Install] @@ -72,7 +72,7 @@ FROM golang:1.21-alpine AS builder FROM alpine:latest COPY --from=builder /app/lcg /usr/local/bin/ ENV LCG_MAX_SYSTEM_PROMPT_LENGTH=2000 -ENV LCG_MAX_USER_MESSAGE_LENGTH=1500 +ENV LCG_MAX_USER_MESSAGE_LENGTH=4000 CMD ["lcg", "serve"] ``` @@ -84,8 +84,8 @@ services: image: lcg:latest environment: - LCG_MAX_SYSTEM_PROMPT_LENGTH=2000 - - LCG_MAX_USER_MESSAGE_LENGTH=1500 - - LCG_MAX_PROMPT_NAME_LENGTH=300 + - LCG_MAX_USER_MESSAGE_LENGTH=4000 + - LCG_MAX_PROMPT_NAME_LENGTH=2000 ports: - "8080:8080" ``` @@ -153,9 +153,9 @@ validation.FormatLengthInfo(systemPrompt, userMessage) ## 📝 Примеры сообщений об ошибках ``` -❌ Ошибка: system_prompt: системный промпт слишком длинный: 1500 символов (максимум 1000) -❌ Ошибка: user_message: пользовательское сообщение слишком длинное: 2500 символов (максимум 2000) -❌ Ошибка: prompt_name: название промпта слишком длинное: 300 символов (максимум 200) +❌ Ошибка: system_prompt: системный промпт слишком длинный: 2500 символов (максимум 2000) +❌ Ошибка: user_message: пользовательское сообщение слишком длинное: 4500 символов (максимум 4000) +❌ Ошибка: prompt_name: название промпта слишком длинное: 2500 символов (максимум 2000) ``` ## 🔄 Миграция с жестко заданных значений @@ -179,25 +179,25 @@ if err := validation.ValidateSystemPrompt(prompt); err != nil { ### Для разработки ```bash export LCG_MAX_SYSTEM_PROMPT_LENGTH=2000 -export LCG_MAX_USER_MESSAGE_LENGTH=2000 -export LCG_MAX_PROMPT_NAME_LENGTH=200 -export LCG_MAX_PROMPT_DESC_LENGTH=500 +export LCG_MAX_USER_MESSAGE_LENGTH=4000 +export LCG_MAX_PROMPT_NAME_LENGTH=2000 +export LCG_MAX_PROMPT_DESC_LENGTH=5000 ``` ### Для продакшена ```bash -export LCG_MAX_SYSTEM_PROMPT_LENGTH=1000 -export LCG_MAX_USER_MESSAGE_LENGTH=1500 -export LCG_MAX_PROMPT_NAME_LENGTH=100 -export LCG_MAX_PROMPT_DESC_LENGTH=300 +export LCG_MAX_SYSTEM_PROMPT_LENGTH=2000 +export LCG_MAX_USER_MESSAGE_LENGTH=4000 +export LCG_MAX_PROMPT_NAME_LENGTH=2000 +export LCG_MAX_PROMPT_DESC_LENGTH=5000 ``` ### Для высоконагруженных систем ```bash -export LCG_MAX_SYSTEM_PROMPT_LENGTH=500 -export LCG_MAX_USER_MESSAGE_LENGTH=1000 -export LCG_MAX_PROMPT_NAME_LENGTH=50 -export LCG_MAX_PROMPT_DESC_LENGTH=200 +export LCG_MAX_SYSTEM_PROMPT_LENGTH=1000 +export LCG_MAX_USER_MESSAGE_LENGTH=2000 +export LCG_MAX_PROMPT_NAME_LENGTH=1000 +export LCG_MAX_PROMPT_DESC_LENGTH=2500 ``` --- diff --git a/main.go b/main.go index 114314f..eb86f93 100644 --- a/main.go +++ b/main.go @@ -60,7 +60,7 @@ func main() { CompileConditions.NoServe = false } - fmt.Println("Build conditions:", CompileConditions) + // fmt.Println("Build conditions:", CompileConditions) _ = colorBlue @@ -87,12 +87,56 @@ lcg [опции] <описание команды> {{.AppName}} - инструмент для генерации Linux команд из описаний на естественном языке. Поддерживает чтение частей промпта из файлов и позволяет сохранять, копировать или перегенерировать результаты. может задавать системный промпт или выбирать из предустановленных промптов. + Переменные окружения: - LCG_HOST Endpoint для LLM API (по умолчанию: http://192.168.87.108:11434/) - LCG_MODEL Название модели (по умолчанию: codegeex4) - LCG_PROMPT Текст промпта по умолчанию - LCG_PROVIDER Тип провайдера: "ollama" или "proxy" (по умолчанию: ollama) - LCG_JWT_TOKEN JWT токен для proxy провайдера + +Основные настройки: + LCG_HOST Endpoint для LLM API (по умолчанию: http://192.168.87.108:11434/) + LCG_MODEL Название модели (по умолчанию: hf.co/yandex/YandexGPT-5-Lite-8B-instruct-GGUF:Q4_K_M) + LCG_PROMPT Текст промпта по умолчанию + LCG_PROVIDER Тип провайдера: "ollama" или "proxy" (по умолчанию: ollama) + LCG_JWT_TOKEN JWT токен для proxy провайдера + LCG_PROMPT_ID ID промпта по умолчанию (по умолчанию: 1) + LCG_TIMEOUT Таймаут запроса в секундах (по умолчанию: 300) + LCG_COMPLETIONS_PATH Путь к API для завершений (по умолчанию: api/chat) + LCG_PROXY_URL URL прокси для proxy провайдера (по умолчанию: /api/v1/protected/sberchat/chat) + LCG_API_KEY_FILE Файл с API ключом (по умолчанию: .openai_api_key) + LCG_APP_NAME Название приложения (по умолчанию: Linux Command GPT) + +Настройки истории и выполнения: + LCG_NO_HISTORY Отключить запись истории ("1" или "true" = отключено, пусто = включено) + LCG_ALLOW_EXECUTION Разрешить выполнение команд ("1" или "true" = разрешено, пусто = запрещено) + LCG_RESULT_FOLDER Папка для сохранения результатов (по умолчанию: ~/.config/lcg/gpt_results) + LCG_RESULT_HISTORY Файл истории результатов (по умолчанию: /lcg_history.json) + LCG_PROMPT_FOLDER Папка для системных промптов (по умолчанию: ~/.config/lcg/gpt_sys_prompts) + LCG_CONFIG_FOLDER Папка для конфигурации (по умолчанию: ~/.config/lcg/config) + +Настройки сервера (команда serve): + LCG_SERVER_PORT Порт сервера (по умолчанию: 8080) + LCG_SERVER_HOST Хост сервера (по умолчанию: localhost) + LCG_SERVER_ALLOW_HTTP Разрешить HTTP соединения ("true" для localhost, "false" для других хостов) + LCG_SERVER_REQUIRE_AUTH Требовать аутентификацию ("1" или "true" = требуется, пусто = не требуется) + LCG_SERVER_PASSWORD Пароль администратора (по умолчанию: admin#123456) + LCG_SERVER_SSL_CERT_FILE Путь к SSL сертификату + LCG_SERVER_SSL_KEY_FILE Путь к приватному ключу SSL + LCG_DOMAIN Домен для сервера (по умолчанию: значение LCG_SERVER_HOST) + LCG_COOKIE_SECURE Безопасные cookie ("1" или "true" = включено, пусто = выключено) + LCG_COOKIE_PATH Путь для cookie (по умолчанию: /lcg) + LCG_COOKIE_TTL_HOURS Время жизни cookie в часах (по умолчанию: 168) + LCG_BASE_URL Базовый URL приложения (по умолчанию: /lcg) + LCG_HEALTH_URL URL для проверки здоровья API (по умолчанию: /api/v1/protected/sberchat/health) + +Настройки валидации: + LCG_MAX_SYSTEM_PROMPT_LENGTH Максимальная длина системного промпта (по умолчанию: 2000) + LCG_MAX_USER_MESSAGE_LENGTH Максимальная длина пользовательского сообщения (по умолчанию: 4000) + LCG_MAX_PROMPT_NAME_LENGTH Максимальная длина названия промпта (по умолчанию: 2000) + LCG_MAX_PROMPT_DESC_LENGTH Максимальная длина описания промпта (по умолчанию: 5000) + LCG_MAX_COMMAND_LENGTH Максимальная длина команды (по умолчанию: 8000) + LCG_MAX_EXPLANATION_LENGTH Максимальная длина объяснения (по умолчанию: 20000) + +Отладка и браузер: + LCG_DEBUG Включить режим отладки ("1" или "true" = включено, пусто = выключено) + LCG_BROWSER_PATH Путь к браузеру для автоматического открытия (команда serve --browser) `, Flags: []cli.Flag{ &cli.StringFlag{ @@ -159,8 +203,8 @@ lcg [опции] <описание команды> config.AppConfig.MainFlags.Debug = config.AppConfig.MainFlags.Debug || config.GetEnvBool("LCG_DEBUG", false) - fmt.Println("Debug:", config.AppConfig.MainFlags.Debug) - fmt.Println("LCG_DEBUG:", config.GetEnvBool("LCG_DEBUG", false)) + // fmt.Println("Debug:", config.AppConfig.MainFlags.Debug) + // fmt.Println("LCG_DEBUG:", config.GetEnvBool("LCG_DEBUG", false)) args := c.Args().Slice() diff --git a/serve/serve.go b/serve/serve.go index f05dd78..d0d8244 100644 --- a/serve/serve.go +++ b/serve/serve.go @@ -232,11 +232,11 @@ func registerRoutesExceptHome() { http.HandleFunc(makePath("/api/add-to-history"), AuthMiddleware(CSRFMiddleware(handleAddToHistory))) // Catch-all 404 для любых незарегистрированных путей (только когда BasePath задан) - if getBasePath() != "" { - http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - renderNotFound(w, "Страница не найдена", getBasePath()) - }) - } + // if getBasePath() != "" { + // http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + // renderNotFound(w, "Страница не найдена", getBasePath()) + // }) + // } } // registerRoutes регистрирует все маршруты сервера diff --git a/serve/templates/not_found.go b/serve/templates/not_found.go index 09296d0..99c90f4 100644 --- a/serve/templates/not_found.go +++ b/serve/templates/not_found.go @@ -53,6 +53,16 @@ const NotFoundTemplate = ` backdrop-filter: blur(10px); text-align: center; } + @keyframes pulse { + 0%, 100% { + transform: scale(1); + text-shadow: 0 8px 40px var(--accentGlow); + } + 50% { + transform: scale(1.15); + text-shadow: 0 12px 60px var(--accentGlow), 0 0 30px var(--accentGlow2); + } + } .code { font-size: clamp(48px, 12vw, 120px); line-height: 0.9; @@ -64,6 +74,8 @@ const NotFoundTemplate = ` color: transparent; margin: 8px 0 12px 0; text-shadow: 0 8px 40px var(--accentGlow); + animation: pulse 2.5s ease-in-out infinite; + transform-origin: center; } .title { font-size: clamp(18px, 3.2vw, 28px); @@ -133,7 +145,7 @@ const NotFoundTemplate = `
404
Страница не найдена
-

{{.Message}}

+

Такой страницы не существует. Вы можете вернуться на главную страницу или выполнить команду.

🏠 На главную 🚀 К выполнению @@ -143,5 +155,3 @@ const NotFoundTemplate = ` ` - -