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


  1. Urukov
    02.02.2023 15:03

    На такое железо можно поставить Proxmox и поднять полноценную виртуалку с операционной системой (TrueNAS, OpenMediaVault), у которой кликами мышки можно задать пользователей, ACL, NFS, SMB, FTP.

    Костыли с контейнерами тоже неочевидны, в том же ProxMox в пару кликов можно создать любой LXC контейнер.


    1. peabody28 Автор
      02.02.2023 15:05

      Я учту ваш совет. Контейнеры - это не костыли. У меня возникала идея, я решил ее реализовать


  1. lexore
    02.02.2023 15:11

    Отличный гайд для тех, кому актуально! Добавлю несколько советов.

    Все содержимое всех запущенных контейнеров будет утеряно при рестарте. Если данные жалко, рекомендую к каждому новому контейнеру создавать и подключать отдельный docker volume. А когда надоест поднимать контейнеры руками, посмотрите в сторону docker compose.

    Как можно избавиться от портов. Если у вас есть свой домен, многие DNS провайдеры разрешают сделать А запись со звездочкой. То есть, "*.domain.ru". Это работает, как любое имя в домене domain.ru. Если домена нет, самое время его купить) Дальше, при создании нового контейнера newcontainer, нужно в конфигах веб сервера сделать новый конфиг "newcontainer.domain.ru". И настроить проксирование на нужный порт. Если хотите ssl, то нужно будет добавить команд, чтобы для нового домена генерировался сертификат.

    Постарайтесь все же перейти от apache к nginx. Apache очень неудобен в настройке. Дефолтный пакет nginx содержит все нужные модули, его не нужно пересобирать.

    Ну и не забывайте бекапить все конфиги сервера где-то еще, кроме сервера.


    1. peabody28 Автор
      02.02.2023 15:21

      Спасибо за совет. Docker-compose уже используется.Виртуальные хосты я тоже настроил и А-записи прописал. Проблема не с http портами, а с ssh. Для ssh протокола нет hostname переменной, как в http соединении, поэтому проксировать его у меня пока не получилось.

      А по поводу пересборки nginx. Я этим занимался для проксирования не HTTP-соединений ( как раз для моего SSH ), из коробки нужные модули у меня включены не были (ngx_stream_ssl_preread_module)

      источник


  1. ALIEN900
    03.02.2023 10:39

    Я наверное что-то упустил из текста, но на хорошем железе подняли убунту, открыли ssh, на ней же развернули git и samba. Или ubuntu+docker и там уже git, только об этом не сказано. из своего опыта, выбираю дебиан, на дебиане докер+портейнер, и уже потом в докере HAProxy и остальные контейнеры. для домашнего использования truenas+k3s из коробки. 8 месяцев полет нормальный. Сильно не сужу,да да не судим будешь, но как по мне для администратора неверное название поста, плюс слабое описание работы)


    1. peabody28 Автор
      03.02.2023 10:43

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


    1. KillJ0y
      03.02.2023 12:32

      Treenas... столько боли с ним было. Ну этот ваш 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гбит


  1. evseevvd
    03.02.2023 10:39

    Сделал подобное на китайском железе, заказал основу на xeon 2666v3 16gb ram, периферию типа БП и хдд брал в днс, тарахтит год без остановки. И свет отрубался и в грозу перепады были, цена вопроса 10 000 р. (Проц серверный, оперативка, мать). По функционалу докер демон, плекс как стриминг медиа, торрент для скачивания, ну и небольшое апп для поиска фильмов-торентов с автоматической закачкой.


  1. savostin
    04.02.2023 21:40
    +1

    Где же медиа в этом сервере?


    1. peabody28 Автор
      05.02.2023 00:33

      Есть хранилище. Там фильмы, музыка (медиа). Удобство воспроизведения - другой вопрос, мне достаточно того, что описал в статье. В планах было накатить условный plex, но пока не дошли руки