Поднимаем медиа-сервер и хостинг с помощью Docker

от автора

Приветствую Хабр в моей первой статье. Было много предпосылок для создания этого проекта: локальное хранилище для музыки и фильмов, которые достойны большего чем «сохраненка» в чужом облаке, независимость в данных и платформа для профессионального развития. Мой интерес заключался в поиске способов реализовать имеющийся у меня статический IP.

Сначала была идея

Изначально целью было именно хранилище, потом решил выложить там свои приложения, а там где код, там и пляшем. Короче захотелось еще и платформу для контейнеров, всяких pet-проектов и экспериментов, поэтому решено было на малом не останавливаться и собирать приемлемую сборку. В итоге вышло как-то так:

  • Процессор: AMD Ryzen 5 4500

  • Материнская плата: ASUS TUF Gaming B450M-Plus II

  • ОЗУ: Crucial 16GB DDR4 PC4-21300 CT16G4DFRA266 (2x)

  • M2 SSD: SSD Gigabyte NVMe 128GB GP-GSM2NE3128GNTD

  • SATA SSD: SSD Kingston A400 120GB [SA400S37/120G]

  • БП: be quiet! System Power 9 500W

  • Корпус: Fractal Design Define Mini

Важными требованиями к сборке были отсеки для HDD и тишина. Данный комплект всем требованиям соответствует 6 отсеков для HDD и абсолютно бесшумная работа, благодаря наклеенной по всему корпусу «шумке». Запустив сервер впервые, я даже удивился, такой он был тихий.

Не железом единым…

Первое к чему мы приступим — это установка ПО. В качестве основной системы выбрана была Ubuntu. Если честно, из всего многообразия дистрибутивов, успел я поработать только с ней. GUI использовать не планируется, поэтому мы стартанем ssh сервер.

apt install openssh-server

Переставим монитор на рабочий комп и подключимся к серверу.

ssh <host>

Поехали дальше по списку.

Git server

На фоне блокировки некоторых GitHub аккаунтов, я подумал, что неплохая идея, иметь свои проекты, в прямом смысле, под рукой. Поднимем для этой цели контейнер с ssh на борту и пробросим порты.

В этом контейнере будет сервер, который отвечает на три запроса:

  • Создать аккаунт

  • Добавить SSH-ключ

  • Добавить репозиторий

Если вкратце описать, что делают обработчики каждого запроса получится следующее:

Создание аккаунта:

useradd -ms /bin/sh <username> cd /home/<username> mkdir .ssh && chmod 700 .ssh touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys chown -R <username>:<username> /home/<username>

Добавление SSH-ключа:

echo "<ssh_pub_key>" >> /home/<username>/.ssh/authorized_keys

Добавление репозитория:

cd /home/<username> git init --bare <rep_name>

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

git remote add origin ssh://<username>@<host>:<port>/home/<username>/<rep_name>

Потом git push origin master, и вводи секретную фразу.

Я обратил внимание на то, что хост-машина занимает 22-ой порт под ssh-сервер, и для того, чтобы использовать еще и контейнер с Git server нужен был порт отличный от 22, что накладывало некоторые неудобства на клиента который работает с репозиторием. Но решено было заняться этим позже.

Хостинг

Думаю, не очень корректно называть это так, но выделенная операционка с возможностью выложить сайт в сеть похожа на это.

Очень не хотелось захламлять систему, и решено было эти вещи сделать тоже в контейнерах. Вышло следующее:

Создаем базовый образ с openssh-server.

FROM ubuntu:20.04  RUN apt update RUN apt install -y openssh-server RUN service ssh start  RUN apt install -y sudo  CMD ["tail", "-f", "/dev/null"]

Создаем на хост машине, которая будет заниматься созданием контейнеров, прилагу, которая по HTTP запросу, содержащему имя и пароль пользователя, создаст готовый к ssh-подключению контейнер с двумя проброшенными портами (под SSH и под HTTP)

Действия клиента:

Отправить запрос на создание контейнера нашему приложению.

curl -X POST -d 'name=<username>&passwd=<strong_password>@host' https://host/Server/Create

Подключиться к серверу.

ssh -p <ssh_port> <username>@example.com

Запустить внутри некоторый сервер, отвечающий на HTTP.

sudo apt install -y apache2 sudo service apache2 start

Посмотреть результат по адресу: https://example.com:<http_port>

Изначально я хотел избежать явного указания порта при подключении, путем проксирования соединения по некоторой переменной, как это делает, например, Apache в виртуальных хостах, я даже нашел инструкцию, как это реализовать в nginx, пересобрал его, включил нужные модули, но видимо где-то я недопонял, и этот вопрос тоже пока остался нерешенным, буду рад если кто-то подскажет, возможно ли это сделать в принципе.

Для пары приложений своих одногруппников, я решил прописать в DNS A-записи для субдоменов, чтоб избавиться хотя-бы от указания порта при доступе к приложению.

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

Хранилище

Хранилище было первоначальной целью создания сервера. Так как я работаю под Windows, то хотел сделать удобный способ «расшаривать» папку сервака на свой рабочий комп. Первым ответом Гугла стал Samba.

Установим пакет.

apt-get install -y samba

Создадим пользователя.

groupadd smbgrp useradd <user> usermod -aG smbgrp <user> chgrp smbgrp <path_to_folder> smbpasswd -a <user> 

Отредактируем конфигурационный файл /etc/samba/smb.conf

[global] security = user map to guest = bad user wins support = no dns proxy = no  [folder] path = path_to_folder valid users = @smbgrp guest ok = no browsable = yes writable = yes

Рестартнул Samba.

service smbd restart

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

Также я воспользовался стандартными возможностями Apache и прописал пермишены к примонтированным разделам, что позволило просматривать файлы через веб-интерфейс. Простые файлы типа .mp3 и .mp4, Chrome может воспроизводить сам, а для .mkv, например, я использовал VLC с его потоковым воспроизведением.

На этом пока все, в дальнейшем планируется добавить торрент сервер, стать настоящим «сидом» и набивать себе рейтинг, ведь раздача не будет прекращаться круглые сутки.


ссылка на оригинал статьи https://habr.com/ru/post/714388/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *