Compare commits

..

No commits in common. "dev" and "master" have entirely different histories.
dev ... master

13 changed files with 46 additions and 371 deletions

141
.desc.md
View file

@ -1,141 +0,0 @@
# 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*

180
Cargo.lock generated
View file

@ -156,72 +156,6 @@ dependencies = [
"typenum", "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]] [[package]]
name = "digest" name = "digest"
version = "0.10.7" version = "0.10.7"
@ -302,33 +236,15 @@ version = "0.1.0"
dependencies = [ dependencies = [
"axum", "axum",
"chrono", "chrono",
"handlebars",
"http", "http",
"mime_guess", "mime_guess",
"rust-embed", "rust-embed",
"serde_json",
"term_size", "term_size",
"tokio", "tokio",
"tower-http", "tower-http",
"tower-service", "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]] [[package]]
name = "http" name = "http"
version = "1.3.1" version = "1.3.1"
@ -436,12 +352,6 @@ dependencies = [
"cc", "cc",
] ]
[[package]]
name = "ident_case"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
[[package]] [[package]]
name = "itoa" name = "itoa"
version = "1.0.15" version = "1.0.15"
@ -518,21 +428,6 @@ dependencies = [
"windows-sys 0.61.2", "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]] [[package]]
name = "num-traits" name = "num-traits"
version = "0.2.19" version = "0.2.19"
@ -577,49 +472,6 @@ version = "2.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" 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]] [[package]]
name = "pin-project-lite" name = "pin-project-lite"
version = "0.2.16" version = "0.2.16"
@ -827,12 +679,6 @@ dependencies = [
"windows-sys 0.60.2", "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]] [[package]]
name = "syn" name = "syn"
version = "2.0.110" version = "2.0.110"
@ -859,26 +705,6 @@ dependencies = [
"libc", "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]] [[package]]
name = "tokio" name = "tokio"
version = "1.48.0" version = "1.48.0"
@ -975,12 +801,6 @@ version = "1.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb"
[[package]]
name = "ucd-trie"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971"
[[package]] [[package]]
name = "unicase" name = "unicase"
version = "2.8.1" version = "2.8.1"

View file

@ -6,11 +6,9 @@ edition = "2024"
[dependencies] [dependencies]
axum = "0.8.7" axum = "0.8.7"
chrono = "0.4" chrono = "0.4"
handlebars = "6.3.2"
http = "1.3.1" http = "1.3.1"
mime_guess = "2.0" mime_guess = "2.0"
rust-embed = "8.9.0" rust-embed = "8.9.0"
serde_json = "1.0.145"
term_size = "0.1" term_size = "0.1"
tokio = { version = "*", features = ["full"] } tokio = { version = "*", features = ["full"] }
tower-http = "0.6.6" tower-http = "0.6.6"

View file

@ -1,6 +0,0 @@
---
title: about
---
<h1>about</h1>
<a href="/">about</a>

14
assets/pages/about.html Normal file
View file

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>About</title>
<base href="{{BASE_URL}}">
</head>
<body>
<h1>About Page</h1>
<p>This is the about page.</p>
<a href="/">index</a>
</body>
</html>

View file

@ -1,7 +0,0 @@
---
title: grechkaGK
---
<h1>Hello world!</h1>
<img src="media/uzi.gif"/>
<a href="about/">about</a>

14
assets/pages/index.html Normal file
View file

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<base href="{{BASE_URL}}">
</head>
<body>
<h1>Hello world!</h1>
<img src="media/uzi.gif"/>
<a href="about/">about</a>
</body>
</html>

View file

@ -1,4 +0,0 @@
---
title: test
---
<p>just test</p>

View file

@ -1,13 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{title}}</title>
<base href="{{BASE_URL}}"> {{!-- в зависимости от хостинга свой домен --}}
<link rel="stylesheet" href="{{style}}"> {{!-- если не используется style то по дефолту styles/main.css --}}
</head>
<body>
{{{body}}} {{! контент страницы }}
</body>
</html>

11
assets/template.html Normal file
View file

@ -0,0 +1,11 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
</html>

View file

@ -1,18 +0,0 @@
/*
мы должны реализовать билдер HBS файлов в готовый HTML для вывода пользователю
для этого мы должны для начала иметь шаблон HTML, в который будет вставлен HBS код
допустим 2 варианта - template файл или вставка внутри кода
1 вариант более гибкий но неудобнее
2 вариант удобнее но не гибкий
потом решу что лучше
ладно, пусть пока 1 вариант
механизмы:
подготовка - чистка release/ папки
обработка - берём .hbs файл, обрабатываем переменные ссковзь функции, и сохраняем в .html
сохраняем файлы в формате как было в assets/
*/
fn main() {
println!("cargo:warning=BUILD SCRIPT RUNNING");
}

6
src/builder.rs Normal file
View file

@ -0,0 +1,6 @@
use crate::assets::Assets;
pub fn build_template(Assets: Assets) -> Assets {
}

View file

@ -1,4 +1,5 @@
mod logger; mod logger;
mod builder;
use crate::logger::logger as log; use crate::logger::logger as log;
mod debug; mod debug;
mod assets; mod assets;