Веб-интерфейс для работы с S3 и S3-совместимыми хранилищами.
Drift запускается локально, подключается к указанному бакету через Node.js-сервер и предоставляет привычный интерфейс для просмотра, загрузки, скачивания и организации объектов.
- подключение нескольких S3-бакетов с разными endpoint и регионами;
- навигация по префиксам как по обычным папкам;
- пагинация через S3 continuation token;
- поиск и сортировка объектов на текущей странице;
- загрузка отдельных файлов и целых директорий;
- drag-and-drop с сохранением структуры вложенных папок;
- скачивание файлов и директорий в виде ZIP-архива;
- создание, копирование, перенос, переименование и удаление объектов;
- контекстное меню и операции copy/cut/paste;
- предпросмотр изображений, PDF, JSON, исходного кода и текстовых файлов;
- path-style и virtual-hosted-style S3 endpoint.
- Node.js 22 или новее;
- S3-совместимое хранилище;
- ключи с разрешениями для необходимых операций.
git clone https://github.com/Epoxidex/drift-s3-browser.git
cd drift-s3-browser
npm install
npm run devПосле запуска откройте http://127.0.0.1:5173 и добавьте подключение через стартовый экран.
Vite запускает клиент на порту 5173 и проксирует API-запросы на локальный Fastify-сервер на порту 4173.
Подключения можно добавлять через интерфейс. Если нужен заранее настроенный локальный бакет, скопируйте пример конфигурации:
Copy-Item .env.example .envЗатем заполните .env:
S3_ENDPOINT=https://s3.example.com
S3_BUCKET=my-private-bucket
S3_REGION=us-east-1
S3_ACCESS_KEY_ID=replace-me
S3_SECRET_ACCESS_KEY=replace-me
S3_FORCE_PATH_STYLE=true
HOST=127.0.0.1
PORT=4173| Переменная | Назначение |
|---|---|
S3_ENDPOINT |
URL S3-совместимого API |
S3_BUCKET |
название бакета |
S3_REGION |
регион подписи запросов |
S3_ACCESS_KEY_ID |
Access Key |
S3_SECRET_ACCESS_KEY |
Secret Access Key |
S3_FORCE_PATH_STYLE |
true для path-style адресации |
HOST |
адрес локального сервера, по умолчанию 127.0.0.1 |
PORT |
порт локального сервера, по умолчанию 4173 |
Файл .env исключён из Git. В .env.example должны оставаться только фиктивные значения.
Набор разрешений зависит от используемых функций:
| Операция | Разрешения |
|---|---|
| просмотр содержимого бакета | s3:ListBucket |
| предпросмотр и скачивание | s3:GetObject |
| загрузка и копирование | s3:PutObject |
| удаление и перенос | s3:DeleteObject |
Для копирования и переноса одновременно нужны разрешения на чтение исходного объекта и запись нового.
- Secret Access Key не возвращается из API в браузер.
- Подключения, добавленные через интерфейс, хранятся только в памяти Node.js-процесса.
- После перезапуска сервера подключения из памяти исчезают.
- В
sessionStorageнаходится только случайный идентификатор подключения. - Сервер по умолчанию слушает только
127.0.0.1. - HTML, SVG и неизвестные MIME-типы скачиваются как вложения и не исполняются внутри приложения.
- Текстовый предпросмотр ограничен первыми 512 КБ.
Приложение рассчитано на локальную работу одного пользователя. Для размещения в сети потребуются HTTPS, пользовательская авторизация, CSRF-защита и внешнее хранилище секретов.
| Команда | Назначение |
|---|---|
npm run dev |
запуск клиента и API в режиме разработки |
npm run build |
production-сборка |
npm start |
запуск собранного приложения на порту 4173 |
npm run typecheck |
проверка TypeScript |
npm test |
запуск unit-тестов |
npm run check |
typecheck, тесты и production-сборка |
npm run check:s3 |
read-only проверка подключения из .env |
npm run build
npm startСобранное приложение будет доступно на http://127.0.0.1:4173.
В S3 нет настоящих директорий: Drift отображает префиксы ключей как папки.
Перемещение выполняется через копирование с последующим удалением и не является атомарной операцией. Перенос больших директорий может занять время и требует разрешений на перечисление, чтение, запись и удаление объектов.
ZIP-архивы создаются потоково. Сервер не загружает всю директорию или готовый архив в оперативную память.
src/ React-интерфейс
server/ Fastify API и S3-операции
scripts/ служебные проверки
Основной стек: React, TypeScript, Vite, Fastify, AWS SDK v3, PDF.js и Vitest.