Александр Меняйло

Александр Меняйло

Разработчик. Учёный

©2024

Сделал web-сервер для расшаривания папки по сети

Около трёх лет назад я начал разрабатывать свой маленький веб-сервер на nodejs. Он просто отдавал статические файлы. Нужно это было для тестирования в своих проектах, и просто для опыта. Но потихоньку сервер обрастал возможностями. И совсем недавно я решил изменить основное предназначение и сделать из него сервер, который предназначен для того, чтобы дать сетевой доступ к папке, расположенной на локальной машине. Это очень удобно. Расшаренные на компьютере файлы можно скачать и с телефона и с другого компьютера в локальной сети или даже открыть доступ к файлам через интернет. Свою первоначальную функцию программа тоже не потеряла и может использоваться как веб-сервер для отдачи статических сайтов. В результате получилось неплохо. Я добавил иконки файлов и папок и понял, что пришло время мою работу опубликовать. Сделал npm-пакет web-shared-folder. Также исходный код можно посмотреть на GitHub. Можете попробовать сами. Запустить мой сервер проще, чем расшаривать папку по сети, например, средствами Windows. А Веб браузер есть на большинстве устройствах. Ещё если нужно, то доступ можно защитить паролем и раздавать по защищённому протоколу https.

Возможности

  • Страницы автоматически отображаются на нужном языке (пока доступно только два языка).
  • Возможность скачать выбранные файлы и папки разом как zip-архив.
  • Пользователь может загружать файлы на сервер (если это разрешено на сервере).
  • Сортировка по имени, размеру и дате.
  • Возможна работа по протоколу https с автоматическим редиректом с http.
  • Возможность включить базовую HTTP аутентификацию с заданными именем пользователя и паролем.
  • У файлов и папок есть иконки.
  • Некоторые файлы можно просмотреть прямо в браузере
  • Может работать без включенного javascript на стороне клиента.

Пример работы сервера с отключенной загрузкой файлов на сервер
Пример работы сервера с отключенной загрузкой файлов на сервер

Пример работы сервера с разрешённой загрузкой файлов на сервер
Пример работы сервера с разрешённой загрузкой файлов на сервер

Тщательная проверка на безопасность не проводилась, поэтому если к серверу планируется публичный доступ, то рекомендую запускать его в контейнере. Пример как это сделать в докере будет ниже.

Установка

npm i -g web-shared-folder

Запуск

web-shared-folder <Путь к папке, которую нужно расшарить> <port> [<key> <cert>] [<username> <password>]

Если в заданной пользователем папке будет находится файл “index.html”, то сервер запустится в режиме отдачи веб страниц, а не в режиме отображения папки. Режим отображения содержмимого папки можно включить принудительно, задав переменную окружения SERVER_DIRECTORY_MODE=1. Также этот режим можно принудительно отключить, задав SERVER_DIRECTORY_MODE=0.

Для работы сервера по протоколу https необходимо задать путь файлу закрытого ключа, и путь к файлу сертификата. Это ключи <key> и <cert> соответственно. При работе сервера в этом режиме, можно включить автоматическое перенаправление с http на https. Для этого нужно в переменной окружения SERVER_AUTO_REDIRECT_HTTP_PORT указать номер порта, с которого будет осуществляться перенаправление (обычно 80).

Задание параметров <username> и <password> - включает базовую HTTP аутентификацию с заданными именем пользователя и паролем.

Все параметры командной строки можно задавать также в переменных окружения: SERVER_ROOT, SERVER_PORT, SERVER_KEY, SERVER_CERT, SERVER_USERNAME, SERVER_PASSWORD. Параметры, заданные в командной строке имеют более высокий приоритет.

Для того, чтобы разрешить пользователям не только скачивать файлы и папки, но и загружать их на сервер, нужно задать переменную окружения SERVER_UPLOAD_ENABLE=1. В частности, в этом режиме пользователь может загрузить на сервер zip-архив, а затем разархивировать его, нажав на значок разархивирования.

Также в переменной окружения SERVER_DIRECTORY_MODE_TITLE можно задать заголовок страницы.

Сервер можно запустить в режиме кластера путём задания переменной окружения SERVER_USE_CLUSTER_MODE=1. В этом случае будут созданы дочерние процессы nodejs по числу ядер процессора. Этот режим позволяет задействовать в работе сервера все ресурсы процессора, но при этом кратно возрастает потребление опертивной памяти. Для режима кластера имеется возможность задать переменную окружения SERVER_SHOULD_RESTART_WORKER=1. Это приведёт к автоматическому перезапуску дочернего процесса в случае его непредвиденного завершения.

По умолчанию сервер отдаёт содержимое web-страницы в сжатом виде. Если такое поведение требуется отключить, то можно задать SERVER_DISABLE_COMPRESSION=1

В этом сервере для отображения иконок файлов и папок используется npm-пакет file-icon-vectors. В нём предусмотрена три различных варианта иконок: “classic”, “square-o”, “vivid”. Подробней смотрите на странице пакета. В моём сервере можно установить любой из этих вариантов передав соответствующее значение в переменную окружения SERVER_ICONS_TYPE. По умолчанию используется “square-o”.

Простой пример

Пусть ip адрес компьютера 192.168.1.2. Требуется расшарить в локальной сети с этого компьютера папку “/home/user/shared”. Выполняем:

web-shared-folder /home/user/shared 8080

Доступ к файлам из папки “/home/user/shared” можно получить набрав в адресной строке браузера:

http://192.168.1.2:8080

Сложный пример

Пусть компьютер имеет белый ip адрес в интернете. Требуется расшарить в интернете с этого компьютера папку “/home/user/shared” и вы не хотите использовать обратный прокси сервер для работы через https. Пусть уже имеется ssl-сертификат на домен example.com и этот домен привязан к ip компьютера. Путь к файлу сертификата: “/etc/ssl/ssl.crt”. Путь к файлу приватного ключа для этого сертификата: “/etc/ssl/ssl.key”.
Для защиты от постороннего доступа зададим имя пользователя “qwerty” и пароль “123456” (не используйте простые пароли для HTTP аутентификации!). Выполняем:

#Path to shared folder
export SERVER_ROOT=/home/user/shared

#Standard https port
export SERVER_PORT=443

#Standart http port
export SERVER_AUTO_REDIRECT_HTTP_PORT=80

#Force enable folder view mode
export SERVER_DIRECTORY_MODE=1

#Path to ssl certificate file
export SERVER_CERT=/etc/ssl/ssl.crt

#Path to ssl key file
export SERVER_KEY=/etc/ssl/ssl.key

#User name for HTTP authentication
export SERVER_USERNAME=qwerty

#Password for HTTP authentication
export SERVER_PASSWORD=123456

#Page title
export SERVER_DIRECTORY_MODE_TITLE="Secret folder"

#Enable multi process start
export SERVER_USE_CLUSTER_MODE=1

#Restart worker process if destroyed
export SERVER_SHOULD_RESTART_WORKER=1

#Start server from root with preserve environment key
sudo -E web-shared-folder

Доступ к файлам из папки “/home/user/shared” можно получить набрав в адресной строке браузера:

https://example.com

Запуск в Docker

Чтобы запустить сервер в docker-контейнере, сначала нужно подготовить dockerfile. Простейший пример такого файла представлен ниже.

FROM node:latest
WORKDIR /app
RUN useradd -M -s /bin/false nodeserv && mkdir /var/www && npm install --global-style web-shared-folder@<current_verson>
USER nodeserv
ENTRYPOINT ["node", "node_modules/web-shared-folder/server.js"]

Где <current_verson> - текущая версия npm-пакета web-shared-folder.

Дальше нужно собрать образ из этого докер файла.

docker build -t web-shared-folder .

Теперь для простого примера выше создадим контейнер и запустим в нём сервер.

docker run -d -v /home/user/shared:/var/www -e SERVER_ROOT="/var/www" -e SERVER_PORT=8

На сайте используются cookie для аналитики