This commit is contained in:
2025-11-08 15:59:45 +06:00
parent 4779c4bca4
commit 63876a393c
20 changed files with 1339 additions and 99 deletions

View File

@@ -1,32 +0,0 @@
# Goreleaser configuration version 2
version: 2
builds:
- id: lcg
binary: "lcg_{{ .Version }}"
goos:
- linux
- windows
- darwin
goarch:
- amd64
- arm64
env:
- CGO_ENABLED=0
ldflags:
- -s -w
- -X main.version={{.Version}}
- -X main.commit={{.Commit}}
- -X main.date={{.Date}}
main: .
dir: .
archives:
- id: lcg
ids:
- lcg
formats:
- binary
name_template: "{{ .Binary }}_{{ .Os }}_{{ .Arch }}"
files:
- "lcg_{{ .Version }}"

View File

@@ -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

15
Dockerfiles/OllamaServer/.gitignore vendored Normal file
View File

@@ -0,0 +1,15 @@
# Временные файлы
*.log
*.tmp
*.temp
# IDE
.idea/
.vscode/
*.swp
*.swo
# OS files
.DS_Store
Thumbs.db

View File

@@ -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 []

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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.

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -1 +1 @@
v2.0.14
v2.0.15

View File

@@ -1 +1 @@
v2.0.14
v2.0.15

View File

@@ -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)
## 🔒 Безопасность

View File

@@ -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

View File

@@ -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

View File

@@ -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
```
---

60
main.go
View File

@@ -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 Файл истории результатов (по умолчанию: <result_folder>/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()

View File

@@ -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 регистрирует все маршруты сервера

View File

@@ -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 = `
<div class="card">
<div class="code">404</div>
<div class="title">Страница не найдена</div>
<p class="desc">{{.Message}}</p>
<p class="desc">Такой страницы не существует. Вы можете вернуться на главную страницу или выполнить команду.</p>
<div class="btns">
<a class="btn" href="{{.BasePath}}/">🏠 На главную</a>
<a class="btn secondary" href="{{.BasePath}}/run">🚀 К выполнению</a>
@@ -143,5 +155,3 @@ const NotFoundTemplate = `
</body>
</html>
`