Приветствую Хабр в моей первой статье. Было много предпосылок для создания этого проекта: локальное хранилище для музыки и фильмов, которые достойны большего чем "сохраненка" в чужом облаке, независимость в данных и платформа для профессионального развития. Мой интерес заключался в поиске способов реализовать имеющийся у меня статический 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 с его потоковым воспроизведением.
На этом пока все, в дальнейшем планируется добавить торрент сервер, стать настоящим "сидом" и набивать себе рейтинг, ведь раздача не будет прекращаться круглые сутки.
Комментарии (10)
lexore
02.02.2023 15:11Отличный гайд для тех, кому актуально! Добавлю несколько советов.
Все содержимое всех запущенных контейнеров будет утеряно при рестарте. Если данные жалко, рекомендую к каждому новому контейнеру создавать и подключать отдельный docker volume. А когда надоест поднимать контейнеры руками, посмотрите в сторону docker compose.
Как можно избавиться от портов. Если у вас есть свой домен, многие DNS провайдеры разрешают сделать А запись со звездочкой. То есть, "*.domain.ru". Это работает, как любое имя в домене domain.ru. Если домена нет, самое время его купить) Дальше, при создании нового контейнера newcontainer, нужно в конфигах веб сервера сделать новый конфиг "newcontainer.domain.ru". И настроить проксирование на нужный порт. Если хотите ssl, то нужно будет добавить команд, чтобы для нового домена генерировался сертификат.
Постарайтесь все же перейти от apache к nginx. Apache очень неудобен в настройке. Дефолтный пакет nginx содержит все нужные модули, его не нужно пересобирать.
Ну и не забывайте бекапить все конфиги сервера где-то еще, кроме сервера.
peabody28 Автор
02.02.2023 15:21Спасибо за совет. Docker-compose уже используется.Виртуальные хосты я тоже настроил и А-записи прописал. Проблема не с http портами, а с ssh. Для ssh протокола нет hostname переменной, как в http соединении, поэтому проксировать его у меня пока не получилось.
А по поводу пересборки nginx. Я этим занимался для проксирования не HTTP-соединений ( как раз для моего SSH ), из коробки нужные модули у меня включены не были (ngx_stream_ssl_preread_module)
ALIEN900
03.02.2023 10:39Я наверное что-то упустил из текста, но на хорошем железе подняли убунту, открыли ssh, на ней же развернули git и samba. Или ubuntu+docker и там уже git, только об этом не сказано. из своего опыта, выбираю дебиан, на дебиане докер+портейнер, и уже потом в докере HAProxy и остальные контейнеры. для домашнего использования truenas+k3s из коробки. 8 месяцев полет нормальный. Сильно не сужу,да да не судим будешь, но как по мне для администратора неверное название поста, плюс слабое описание работы)
peabody28 Автор
03.02.2023 10:43В контейнерах все кроме samba. Первый пост, рука еще не набита, хотел рассказать про идеи в основном, описание примерное приложил. По специальности я вообще не администратор, это как хобби, отсюда и ваши замечания. Спасибо за комментарий
KillJ0y
03.02.2023 12:32Treenas... столько боли с ним было. Ну этот ваш freebsd и zfs... то веб морда отвалилась, то ssh перестал работать, то zfs потеряла все данные.
Перешёл на omv. Стабильно но не достаточно по функционалу. Перешёл на pve изначально хотел omv соединить с pve но отказался от затеи и перешёл на lxc контейнеры, в pve очень удобно работать с ними. И поднял сначала chr на отдельных сетевых, а позднее на ipfire перешел (убунта убунтой, а деб надежнее, а к freebsd нет доверия после treenas/freenas .. еще и обновляется медленнее) спек r5 3600, b450, 32gb, 6 дисков ironwolf по 4 тб, 2 ssd, и м2. 2 сетевых по 1гбит и 1 2.5гбит
evseevvd
03.02.2023 10:39Сделал подобное на китайском железе, заказал основу на xeon 2666v3 16gb ram, периферию типа БП и хдд брал в днс, тарахтит год без остановки. И свет отрубался и в грозу перепады были, цена вопроса 10 000 р. (Проц серверный, оперативка, мать). По функционалу докер демон, плекс как стриминг медиа, торрент для скачивания, ну и небольшое апп для поиска фильмов-торентов с автоматической закачкой.
Urukov
На такое железо можно поставить Proxmox и поднять полноценную виртуалку с операционной системой (TrueNAS, OpenMediaVault), у которой кликами мышки можно задать пользователей, ACL, NFS, SMB, FTP.
Костыли с контейнерами тоже неочевидны, в том же ProxMox в пару кликов можно создать любой LXC контейнер.
peabody28 Автор
Я учту ваш совет. Контейнеры - это не костыли. У меня возникала идея, я решил ее реализовать