diff --git a/.desc.md b/.desc.md new file mode 100644 index 0000000..8ddf67c --- /dev/null +++ b/.desc.md @@ -0,0 +1,141 @@ +# GKWeb - Rust веб-сервер + +## Обзор проекта + +**GKWeb** — это современный веб-сервер, написанный на языке программирования Rust с использованием фреймворка Axum. Проект представляет собой простой, но функциональный веб-сервер, способный обслуживать статические файлы и HTML-страницы с поддержкой автоматической маршрутизации. + +## Архитектура и особенности + +### Основные компоненты + +1. **Главный модуль** (`src/main.rs`) + - Точка входа в приложение + - Создание и запуск сервера на порту 3000 + - Инициализация маршрутизации + +2. **Система маршрутизации** (`src/routing.rs`) + - Автоматическая маршрутизация с помощью Axum + - Поддержка статических файлов и HTML страниц + - Обработка 404 ошибок + - Поддержка переменной BASE_URL для настройки базового пути + +3. **Управление ресурсами** (`src/assets.rs`) + - Встраивание статических файлов в исполняемый файл с помощью `rust-embed` + - Компиляция всех файлов из директории `assets/` в бинарник + - Поддержка любых типов файлов + +4. **Система логирования** (`src/logger.rs`) + - Цветной терминальный логгер с временными метками + - 4 уровня логирования: INFO, WARN, ERROR, DEBUG + - Адаптивный вывод с учетом ширины терминала + +5. **Отладочные функции** (`src/debug/`) + - Вывод списка всех встроенных ресурсов + - Помощь в разработке и отладке + +6. **Система сборки** (`src/builder.rs`) + - Модуль для будущих функций сборки шаблонов (пока не реализован) + +## Технологический стек + +- **Язык**: Rust (edition 2024) +- **Веб-фреймворк**: Axum 0.8.7 +- **Асинхронность**: Tokio (полная поддержка) +- **HTTP**: http 1.3.1 +- **Типы файлов**: mime_guess для определения MIME-типов +- **Ресурсы**: rust-embed для встраивания файлов +- **Время**: chrono для временных меток +- **Терминал**: term_size для определения размеров окна + +## Функциональность + +### Маршрутизация +- `/` — главная страница (index.html) +- `/{path}` — общий маршрут для статических файлов и HTML страниц +- Автоматический поиск файлов с добавлением `.html` для путей +- Поддержка статических файлов (CSS, JS, изображения, медиа) + +### Особенности HTML страниц +- Автоматическая замена плейсхолдера `{{BASE_URL}}` на значение из переменной окружения +- Поддержка базового href для корректной работы ссылок +- Fallback на 404 для несуществующих страниц + +### Логирование +```rust +log(0, "Server started successfully on port 3000", true); // INFO уровень, жирный шрифт +log(3, "Debug information", false); // DEBUG уровень, обычный шрифт +``` + +## Структура проекта + +``` +├── src/ +│ ├── main.rs # Главный файл +│ ├── routing.rs # Система маршрутизации +│ ├── assets.rs # Управление ресурсами +│ ├── builder.rs # Сборщик (заготовка) +│ ├── logger.rs # Система логирования +│ └── debug/ +│ ├── mod.rs +│ └── static_content.rs # Отладочные функции +├── assets/ # Статические ресурсы +│ ├── pages/ +│ │ ├── index.html # Главная страница +│ │ ├── about.html # Страница "О нас" +│ │ └── test.hbs # Handlebars шаблон (не используется) +│ ├── template.html # Шаблон страницы +│ ├── styles/ +│ │ └── main.css # Основные стили +│ ├── scripts/ +│ │ └── hello.js # JavaScript файлы +│ ├── media/ +│ │ └── uzi.gif # Медиа файлы +│ └── content/ +│ └── about.md # Markdown контент +├── Cargo.toml # Конфигурация проекта +├── TECHDOC.md # Техническая документация +└── .desc.md # Данное описание проекта +``` + +## Использование + +### Запуск сервера +```bash +cargo run +``` + +### Переменные окружения +- `BASE_URL` — базовый URL для замены в HTML страницах (по умолчанию "/") + +### Пример работы +1. Сервер запускается на `http://0.0.0.0:3000` +2. При старте выводится список всех встроенных ресурсов +3. Главная страница доступна по адресу `/` +4. Статические файлы обслуживаются напрямую +5. HTML страницы обрабатываются с заменой BASE_URL + +## Преимущества + +1. **Производительность**: Rust обеспечивает высокую скорость и низкое потребление памяти +2. **Безопасность**: Встроенная безопасность памяти Rust +3. **Простота развертывания**: Все ресурсы встроены в один исполняемый файл +4. **Гибкость**: Поддержка переменных окружения для конфигурации +5. **Отладка**: Встроенные инструменты логирования и отладки +6. **Современность**: Использует последние версии Rust и фреймворков + +## Возможности для развития + +1. **Поддержка шаблонов**: Завершение реализации системы сборки шаблонов +2. **Динамические страницы**: Добавление обработки шаблонов Handlebars +3. **API эндпоинты**: Расширение функциональности для REST API +4. **Конфигурация**: Поддержка файлов конфигурации +5. **Мониторинг**: Добавление метрик и мониторинга +6. **Кэширование**: Реализация системы кэширования +7. **HTTPS**: Поддержка SSL/TLS соединений + +## Заключение + +GKWeb представляет собой современный, производительный и расширяемый веб-сервер, построенный с использованием лучших практик Rust. Проект демонстрирует эффективное использование экосистемы Rust для создания веб-приложений с минимальными зависимостями и максимальной производительностью. + +--- +*Проект разработан с использованием Rust 2024 edition и Axum framework* diff --git a/Cargo.lock b/Cargo.lock index 89c77aa..ad6eed1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -156,6 +156,72 @@ dependencies = [ "typenum", ] +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "derive_builder" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "derive_builder_macro" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" +dependencies = [ + "derive_builder_core", + "syn", +] + [[package]] name = "digest" version = "0.10.7" @@ -236,15 +302,33 @@ version = "0.1.0" dependencies = [ "axum", "chrono", + "handlebars", "http", "mime_guess", "rust-embed", + "serde_json", "term_size", "tokio", "tower-http", "tower-service", ] +[[package]] +name = "handlebars" +version = "6.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759e2d5aea3287cb1190c8ec394f42866cb5bf74fcbf213f354e3c856ea26098" +dependencies = [ + "derive_builder", + "log", + "num-order", + "pest", + "pest_derive", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "http" version = "1.3.1" @@ -352,6 +436,12 @@ dependencies = [ "cc", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "itoa" version = "1.0.15" @@ -428,6 +518,21 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "num-modular" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17bb261bf36fa7d83f4c294f834e91256769097b3cb505d44831e0a179ac647f" + +[[package]] +name = "num-order" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "537b596b97c40fcf8056d153049eb22f481c17ebce72a513ec9286e4986d1bb6" +dependencies = [ + "num-modular", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -472,6 +577,49 @@ version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +[[package]] +name = "pest" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbcfd20a6d4eeba40179f05735784ad32bdaef05ce8e8af05f180d45bb3e7e22" +dependencies = [ + "memchr", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51f72981ade67b1ca6adc26ec221be9f463f2b5839c7508998daa17c23d94d7f" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dee9efd8cdb50d719a80088b76f81aec7c41ed6d522ee750178f83883d271625" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pest_meta" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf1d70880e76bdc13ba52eafa6239ce793d85c8e43896507e43dd8984ff05b82" +dependencies = [ + "pest", + "sha2", +] + [[package]] name = "pin-project-lite" version = "0.2.16" @@ -679,6 +827,12 @@ dependencies = [ "windows-sys 0.60.2", ] +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "syn" version = "2.0.110" @@ -705,6 +859,26 @@ dependencies = [ "libc", ] +[[package]] +name = "thiserror" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tokio" version = "1.48.0" @@ -801,6 +975,12 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + [[package]] name = "unicase" version = "2.8.1" diff --git a/Cargo.toml b/Cargo.toml index 48d1797..51d27d9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,9 +6,11 @@ edition = "2024" [dependencies] axum = "0.8.7" chrono = "0.4" +handlebars = "6.3.2" http = "1.3.1" mime_guess = "2.0" rust-embed = "8.9.0" +serde_json = "1.0.145" term_size = "0.1" tokio = { version = "*", features = ["full"] } tower-http = "0.6.6" diff --git a/assets/pages/about.hbs b/assets/pages/about.hbs new file mode 100644 index 0000000..011b521 --- /dev/null +++ b/assets/pages/about.hbs @@ -0,0 +1,6 @@ +--- +title: about +--- +

about

+about + diff --git a/assets/pages/about.html b/assets/pages/about.html deleted file mode 100644 index 063b8b4..0000000 --- a/assets/pages/about.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - About - - - -

About Page

-

This is the about page.

- index - - diff --git a/assets/pages/index.hbs b/assets/pages/index.hbs new file mode 100644 index 0000000..fe5e93d --- /dev/null +++ b/assets/pages/index.hbs @@ -0,0 +1,7 @@ +--- +title: grechkaGK +--- +

Hello world!

+ +about + diff --git a/assets/pages/index.html b/assets/pages/index.html deleted file mode 100644 index 4666399..0000000 --- a/assets/pages/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - Document - - - -

Hello world!

- - about - - \ No newline at end of file diff --git a/assets/pages/test.hbs b/assets/pages/test.hbs new file mode 100644 index 0000000..3131ff7 --- /dev/null +++ b/assets/pages/test.hbs @@ -0,0 +1,4 @@ +--- +title: test +--- +

just test

diff --git a/assets/template.hbs b/assets/template.hbs new file mode 100644 index 0000000..eea15c7 --- /dev/null +++ b/assets/template.hbs @@ -0,0 +1,13 @@ + + + + + + {{title}} + {{!-- в зависимости от хостинга свой домен --}} + {{!-- если не используется style то по дефолту styles/main.css --}} + + + {{{body}}} {{! контент страницы }} + + \ No newline at end of file diff --git a/assets/template.html b/assets/template.html deleted file mode 100644 index d01f779..0000000 --- a/assets/template.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - Document - - - - - \ No newline at end of file diff --git a/src/builder.rs b/src/builder.rs deleted file mode 100644 index 4fe87dc..0000000 --- a/src/builder.rs +++ /dev/null @@ -1,6 +0,0 @@ -use crate::assets::Assets; - -pub fn build_template(Assets: Assets) -> Assets { - -} - diff --git a/src/main.rs b/src/main.rs index f44ccb4..861bf0f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,5 @@ mod logger; -mod builder; +mod static_builder; use crate::logger::logger as log; mod debug; mod assets; diff --git a/src/static_builder.rs b/src/static_builder.rs new file mode 100644 index 0000000..b2e61e0 --- /dev/null +++ b/src/static_builder.rs @@ -0,0 +1,15 @@ +use crate::assets::Assets; +use handlebars::Handlebars; +use serde_json::Value; +use std::collections::HashMap; + +pub struct static_builder; + +impl static_builder { + pub fn build_pages(assets: Assets) -> Assets { + let mut reg = Handlebars::new(); + reg.register_escape_fn(handlebars::no_escape); + let mut res_assets = Assets::default(); + + } +}