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