Pull to refresh

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

Reading time4 min
Views16K

Приветствую Хабр в моей первой статье. Было много предпосылок для создания этого проекта: локальное хранилище для музыки и фильмов, которые достойны большего чем "сохраненка" в чужом облаке, независимость в данных и платформа для профессионального развития. Мой интерес заключался в поиске способов реализовать имеющийся у меня статический 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 с его потоковым воспроизведением.

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

Tags:
Hubs:
Total votes 9: ↑5 and ↓4+5
Comments14

Articles