# Trashbox — Минималистичный CGI-файловый сервер
Легковесный файлообменник на чистом C для Linux/Debian. Работает через связку **Nginx (Reverse Proxy)** + **BusyBox `httpd` (CGI Backend)**.
> **Примечания:**
1) Nginx опционален, нужен только если необходимен Reverse Proxy, например, для SSL.
> 2) Зачем? Хотелось что-то легковесного, но сам я не погромист, потому был применён вайбкод подход, делал вместе с DeepSeek. Вдохновленно [этим](https://github.com/metalx1000/Directory-Index-for-httpd) проектом, но там есть нюанс, сурсы закрыты, а что-то такое от рута пускать такое себе.
> 3) [Здесь](https://home.mashup.su) можно потыкать и посмотреть как работает.
> 4) Нейрокод вряд-ли качественный, да и конечно же без багов никуда, есть issue, PR, кому это инетерсно, конечно.
> 5) Активно (не очень) какаю в репу в своем [GitLab](https://git.mashup.su/RomkaZVO/Trashbox), а тут скорее просто результат.
## Скриншоты:
### Главная страница (светлая тема)
https://home.mashup.su/trashpics/1.png
### Тёмная тема
https://home.mashup.su/trashpics/2.png
### Мобильная версия
https://home.mashup.su/trashpics/3.png
### Форма пароля
https://home.mashup.su/trashpics/4.png
## Полный список возможностей
### Авторизация и безопасность
| № | Особенность| Примечание |
| :-: | :--- | :--- |
| **1** | **Пароль на папки** | Защита отдельных директорий через `.htpasswd`. |
| **2** | **POST-форма авторизации** | Безопасная передача пароля. |
| **3** | **Токены сессий** | Уникальные токены для доступа к защищённым разделам. |
| **4** | **Токен в localStorage** | Сохранение авторизации в браузере между переходами. |
| **5** | **Время жизни сессии** | Токен валиден **1 час**, после чего автоматически удаляется на сервере. |
| **6** | **Защита от брутфорса** | Лимит в **5 неудачных попыток** ввода пароля. |
| **7** | **Временный бан** | Блокировка доступа на **15 минут** при превышении лимита попыток. |
### Навигация и работа с файлами
| № | Особенность| Примечание |
| :-: | :--- | :--- |
| **1** | **Навигация** | Удобная (вроде) навигационная цепочка. |
| **2** | **Просмотр директорий** | Наглядное отображение полного содержимого папок. |
| **3** | **Гибкая сортировка** | Сортировка по имени, размеру и дате. |
| **4** | **Поиск файлов** | Рекурсивный поиск по имени внутри текущей директории. |
| **5** | **Скачивание файлов** | Прямая выдача файлов. |
| **6** | **Предпросмотр** | Модальное окно для просмотра картинок, видео, аудио, PDF и текста. |
| **7** | **Копирование ссылок** | Быстрое копирование чистой прямой ссылки на файл или папку. |
| **8** | **Иконки типов файлов** | Наглядные эмодзи-иконки для разграничения форматов. |
| **9** | **Подсчет размера папок** | Рекурсивный расчет и отображение общего объема папки. |
| **10** | **Сводная статистика** | Подсчет количества файлов, папок и их суммарного размера. |
### Интерфейс и UX
| № | Особенность| Примечание |
| :-: | :--- | :--- |
| **1** | **Адаптивный дизайн** | Полная оптимизация под ПК, планшеты и смартфоны. |
| **2** | **Тёмная / Светлая тема** | Переключение оформления с сохранением выбора. |
| **3** | **Сохранение контекста** | Навигация по хлебным крошкам без потери авторизации. |
| **4** | **Единая высота тулбара** | Одинаковый размер и стиль для элементов поиска и сортировки. |
| **5** | **Увеличенный UI на мобильных устройствах** | Крупные кнопки и элементы для удобного нажатия пальцами. |
| **6** | **Кнопка «Наверх»** | Быстрая прокрутка к началу страницы. |
| **7** | **Фиксированная сетка** | Фиксированная ширина иконок без «прыжков» верстки. |
| **8** | **Папки жирным шрифтом** | Визуальное отличие папок от файлов. |
| **9** | **Модальная авторизация** | Красивое окно запроса пароля при входе в закрытую папку. |
### Мониторинг и логи
| № | Особенность| Примечание |
| :-: | :--- | :--- |
| **1** | **Статус сервера** | Показывает память BusyBox/Nginx и нагрузку CPU. |
| **2** | **Асинхронные метрики** | Подгрузка статистики без блокировки основного UI и сессии. |
### Технические особенности
| № | Особенность| Примечание |
| :-: | :--- | :--- |
| **1** | **Чистый C** | Без PHP/Python/Node.js, максимум производительности при минимуме зависимостей. |
| **2** | **Универсальный CGI** | Работает через CGI на любом веб-сервере. |
| **3** | **Оптимизация под BusyBox** | Идеально подходит для встраиваемых систем и домашних серверов. |
| **4** | **~2 МБ RAM** | Минимальное потребление оперативной памяти. |
| **5** | **Хранение токенов в `/tmp`** | Автоматическая очистка сессий при перезагрузке системы. |
| **6** | **Конфигурация `config.ini`** | Гибкая настройка путей и параметров без пересборки. |
### Оптимизация для мобильных устройств
| № | Особенность| Примечание |
| :-: | :--- | :--- |
| **1** | **Крупные кнопки** | Размер тач-зон 38–44px для удобства клика пальцем. |
| **2** | **Скрытие даты** | На маленьких экранах дата скрыта, отображается только размер. |
| **3** | **Увеличенные иконки** | Значки 32px вместо мелких 20px. |
---
## Установка зависимостей
``` bash
sudo apt update
sudo apt install nginx busybox gcc make
```
---
## Настройка структуры и загрузка
``` bash
mkdir -p /patch/to/www/cgi-bin
cd /patch/to/www/cgi-bin
git clone https://git.mashup.su/RomkaZVO/Trashbox.git .
```
---
## Структура
``` bash
cgi-bin/
├── Makefile
├── config.ini
├── template.html
├── style.css
├── .htpasswd # Файл с паролями для защищенных папок
├── src/
│ ├── main.c # Точка входа главного CGI-скрипта
│ ├── config.c / .h # Парсинг конфигурации (config.ini)
│ ├── auth.c / .h # Авторизация, сессии и защита от брутфорса
│ ├── fs.c / .h # Навигация по файловой системе и операции
│ ├── render.c / .h # Шаблонизатор и генерация HTML
│ ├── utils.c / .h # Вспомогательные функции (URL encoding, escape, форматирование)
│ ├── style.c # Выдача и кэширование CSS
│ └── status.c # Мониторинг системных ресурсов
├── index.cgi # Бинарник списка файлов / навигации
├── style.cgi # Бинарник отдачи стилей
└── status.cgi # Бинарник системной статистики
```
> **Примечание:** Кастомные страницы ошибок 403.html и 404.html опционально размещаются на уровень выше cgi-bin - в /patch/to/www/.
---
## Компиляция и установка
``` bash
cd src
make
sudo make install
```
---
## Конфигурация Nginx
Создайте файл конфигурации /etc/nginx/sites-available/service.
Образец конфигурации доступен по ссылке:
[Конфигурация BusyBox + Nginx](https://git.mashup.su/RomkaZVO/Trashbox/src/branch/main/busybox_nginx_reverse.txt)
Активация виртуального хоста:
``` bash
sudo ln -s /etc/nginx/sites-available/service /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
```
---
## Запуск BusyBox
Запуск фонового CGI-сервера:
``` bash
busybox httpd -p 127.0.0.1:8050 -h /patch/to/www
```
---
## Настройка папок с паролями (.htpasswd)
Папка создается обычным образом в файловой системе. Чтобы задать для нее пароль, добавьте запись в файл .htpasswd:
``` bash
cat >> /patch/to/www/cgi-bin/.htpasswd << EOF
secret_folder:mysecretpassword
EOF
```
---
### Лицензия
Ну это даже не смешно, это вайбкод проект, делайте что хотите, а если по нормальному, то GPLv3, но не обижусь если что-то и проприектарное будет.