![]() |
[включить плавающее окно] Вверх #1 |
![]() Автор темы Регистрация: 13.09.2016
Адрес: Citizen of the World
|
Домашний NAS (один из вариантов)
Наконец-то созрел, чтобы рассказать о своей полусамосборной файлопомойке.
Дисклеймер. Здесь поделюсь своими мыслями, техническими решениями и опишу, почему такой путь самурая выбрал. Всё нижеизложенное не есть истина в первой инстанции, а всего лишь жонглирование между ценой, трудоёмкостью и тз, но может кому-то понравятся некоторые технические моменты, поэтому и выкладываю сие. Ценники в рублях, конечный продублирую в долларах. ТЗ. Без ТЗ - результат хз (с) Так что тут без него никак, хотя оно наипростейшее: дешёвая мультимедийная файлопомойка, на которую не страшно посмотреть. Ну и реального доступного места от 10TiB, всё же все мои потребители контента могут воспроизводить 4к, да и какой-никакой запас контента должен быть. Никаких рейдов, ибо высокая доступность не нужна. Эта файлопомойка является ответом на уход Нетфликсов/Амазонов/etc, тут на >90% контент будет состоять из фильмов и сериалов. Бекапы? Вероятны для оставшихся <10%, но без изысканных решений, простой rsync на внешний das. Железо. Уже давно присматривался к китайским nas'ам, но то ценник заоблачный, то железо слабенькое, особенно сетевая часть. По факту следил за эволюцией Kingnovy R1/AOOSTAR R1/TAPTON R1/CHATREEY R1, там много клонов этой платформы на разных процах. Очень хотелось на райзене r7, но это сразу ставило крест на ТЗ, где во главе стоял ценник, так что мониторил варианты на Intel N100. Что мне не нравилось в варианте на Intel: слабая сетевая часть (1-2 гигабитных интерфейса) и высокий ценник, если без скидок. Рядовая цена была около 25к, что много для данной платформы, что по мне. Но порой на Али проскакивают акции и сие железо можно взять за ~15к, что уже адекватно. И вот как-то звёзды сложились очень удачно и на просторах Али нашёл вариант за 15к, так ещё с intel i226v сдвоенной сетевухой, т.е. 2.5Гб/с врывается в нашу жизнь с двух ног за очень "вкусный" прайс. Решено было брать безотлагательно, по итогу не пожалел. Вот тут можно найти обзор это коробки. Если тезисно, то: дёшево, сердито, биос глючный, охлад надо доводить до ума, но своих денег стоит. В свой вариант добавил 16ГБ RAM, бо для файлопомойки этого хватает с головой. Ну и вентилятор заменил на ID-COOLING TF-9215-W. Диски. Это боль в моя дырка зад...ца (с) Самая затратная часть бюджета. Локальные ценники ни в какие ворота, а с учётом обрезанной годовой гарантии даже не рассматривал локальный ритейл как вариант. В статье Собираем бюджетный домашний NAS на 14 ТБ, которая стала для меня стартовой точкой для сбора файлопомойки, как раз обсуждается вариант покупки б/у дисков за рубежом, но отталкиваясь от статистики Backblaze. Хотел повторить всё 1-в-1, но варианты на 14ТБ резко стали невыгодны, видимо "хабраэффект" на Али сработал, пришлось брать Exos X12, которые не так хороши в статистике Backblaze, но показывали лучшее отношение цены/объём на тот момент. Оба диска в среднем вышли по 13к. Пробил их по серийнику - не retail вариант и были поставлены в составе каких-то серваков, дата производства - оба январь 2024, смарт сброшен. Посмотрим, как себя поведут со временем, пока всё ок. Итого: 2х12ТБ за 26к. Системный диск. Тут m.2 nvme без вариантов. Intel N100 поддерживает только pcie 3.0, так что можно было не гнаться за скоростью, а выбрать проверенный вариант. Там же на Али нашёл WD Black SN770 на 1ТБ за 7к. Пробил по серийнику: выпущен в мае 2024, 5 лет гарантии на Материковом Китае ![]() В планах хочу туда слетать, так что гарантия условно-рабочая ![]() Софт. Надо выбирать ОС, которую хорошо знает твой друг-админ (с) Тут как бы само напрашивается либо OMV, либо Truenas, либо Xpenology. Но у самурая свой путь, выбрал ОС общего назначения в лице Alpine Linux, ибо легковесная и я всё собираюсь докеризировать в ней. По-классике настроил связку zsh + oh-my-zsh + powerlevel10k, нужных мне плагинов накидал, современных тулов (docker + docker compose, lazydocker, btop, ncdu, duf, etc) и готово, осталось подготовить docker compose файлы с подмонтированными дисками. В докере крутятся: самба с RO для всех (это домашняя мультимедийная файлопомойка), transmission и jellyfin. Последнее в связке в впн на роутере даёт возможность смотреть фильмы извне даже на плохих каналах, т.к. jellyfin умеет транскодить "на лету", чтобы подстраиваться под пропускную способность. Единственное что, так это лаг с воспроизведением и перемоткой секунд по 10, но я ещё с Intel QSV не разобрался, должно ускорить всё это, если правильно приготовить. Сеть. Самый короткий железный абзац: на Али купил sfp модуль для роутера на 2.5Гб/с за 1.5к. Работает на полной скорости. Единственное что, так это надо выключить Energy Efficient Ethernet, ибо i226v. Итого. Конечная стоимость: 55к или ~600$ за всё. Доступного места 21.5TiB. Доступа к фотографиям сего чуда пока нет, добавлю, если будет нужда. Советы, вопросы, критика приветствуются. |
![]() |
![]() |
![]() |
[включить плавающее окно] Вверх #2 |
![]() Регистрация: 28.05.2024
Адрес: Germany
|
Цитата
Доступного места 21.5TiB
|
![]() |
![]() |
![]() |
[включить плавающее окно] Вверх #3 |
![]() Автор темы Регистрация: 13.09.2016
Адрес: Citizen of the World
|
Цитата
(Multimedia) »
Зачем столько?
![]() |
![]() |
![]() |
![]() |
[включить плавающее окно] Вверх #4 |
![]() Регистрация: 28.05.2024
Адрес: Germany
|
Цитата
(VitohA) »
Люблю смотреть в качестве. Три части Крёстного Отца, два Аватара и сериал Друзья - уже террабайт
![]() |
![]() |
![]() |
![]() |
[включить плавающее окно] Вверх #5 |
![]() Регистрация: 28.05.2024
Адрес: Germany
|
VitohAв каком разрешении и на каком монике(тв) смотришь?
|
![]() |
![]() |
![]() |
[включить плавающее окно] Вверх #6 |
![]() Автор темы Регистрация: 13.09.2016
Адрес: Citizen of the World
|
Multimedia
На телевизорах, оба 4к. И у обоих на плеерах установлен coreelec, а на файлопомойке микро-база для синка библиотеки и прогресса между ними. Как тут: KODI: собираем удобный и функциональный медиацентр для дома. Часть 6. MariaDB и синхронизация медиатеки |
![]() |
![]() |
![]() |
[включить плавающее окно] Вверх #7 |
![]() Регистрация: 08.02.2003
Адрес: Nsk
|
VitohA
![]() А что, хорошее решение как для медиа. 2.5 на сколько избыточно? На телевизорах то поди 100 ![]()
__________________
и тут пришел лесник ;) |
![]() |
![]() |
![]() |
[включить плавающее окно] Вверх #8 |
![]() Автор темы Регистрация: 13.09.2016
Адрес: Citizen of the World
|
Цитата
(Lesnik75) »
2.5 на сколько избыточно? На телевизорах то поди 100
![]() ![]() |
![]() |
![]() |
![]() |
[включить плавающее окно] Вверх #9 |
![]() Регистрация: 08.02.2003
Адрес: Nsk
|
Цитата
(VitohA) »
и на 100, последнюю надо менять тоже на гигабит, а то на крупных файлах лагает из-за сети.
__________________
и тут пришел лесник ;) |
![]() |
![]() |
![]() |
[включить плавающее окно] Вверх #10 |
![]() Автор темы Регистрация: 13.09.2016
Адрес: Citizen of the World
|
Цитата
(Lesnik75) »
Так и я за то же. Хотя на мелких файлах не лагает, факт )))
|
![]() |
![]() |
![]() |
[включить плавающее окно] Вверх #11 |
![]() Автор темы Регистрация: 13.09.2016
Адрес: Citizen of the World
|
И пару слов о софте/багах/etc.
Т.к. у меня всё докеризировано, а файлопомоечные диски не рутовые, то нужно пофиксить демон докера, чтобы он ждал маунта всех дисков. В противном случае докер порой поднимается быстрее, нежели монтируются диски, легковесность дистрибутива даёт о себе знать. Так что правим openrc конфиг докера в /etc/runlevels/default/docker, добавив dev-mount в depend() секцию. По итогу получаем такой результат: СПОЙЛЕР »
Код:
#!/sbin/openrc-run supervisor=supervise-daemon name="Docker Daemon" description="Persistent process that manages docker containers" description_reload="Reload configuration without exiting" command="${DOCKERD_BINARY:-/usr/bin/dockerd}" command_args="${DOCKER_OPTS}" DOCKER_LOGFILE="${DOCKER_LOGFILE:-/var/log/${RC_SVCNAME}.log}" DOCKER_ERRFILE="${DOCKER_ERRFILE:-${DOCKER_LOGFILE}}" DOCKER_OUTFILE="${DOCKER_OUTFILE:-${DOCKER_LOGFILE}}" if [ "$DOCKER_ERRFILE" = "$DOCKER_OUTFILE" ]; then LOGPROXY_OPTS="$LOGPROXY_OPTS -m" fi export \ LOGPROXY_CHMOD="${LOGPROXY_CHMOD:-0644}" \ LOGPROXY_LOG_DIRECTORY="${LOGPROXY_LOG_DIRECTORY:-/var/log}" \ LOGPROXY_ROTATION_SIZE="${LOGPROXY_ROTATION_SIZE:-104857600}" \ LOGPROXY_ROTATION_TIME="${LOGPROXY_ROTATION_TIME:-86400}" \ LOGPROXY_ROTATION_SUFFIX="${LOGPROXY_ROTATION_SUFFIX:-.%Y%m%d%H%M%S}" \ LOGPROXY_ROTATED_FILES="${LOGPROXY_ROTATE_FILES:-5}" output_logger="log_proxy $LOGPROXY_OPTS $DOCKER_OUTFILE" error_logger="log_proxy $LOGPROXY_OPTS $DOCKER_ERRFILE" extra_started_commands="reload" rc_ulimit="${DOCKER_ULIMIT:--c unlimited -n 1048576 -u unlimited}" retry="${DOCKER_RETRY:-TERM/60/KILL/10}" if [ -e /etc/profile.d/proxy.sh ]; then . /etc/profile.d/proxy.sh fi depend() { need sysfs cgroups net dev-mount after firewall } start_pre() { checkpath -f -m 0644 -o root:docker "$DOCKER_ERRFILE" "$DOCKER_OUTFILE" } reload() { ebegin "Reloading configuration" $supervisor $RC_SVCNAME --signal HUP eend $? } Весь софт докеризирован для лёгкого переноса между серверами и восстановления. Даже самба ![]() Всё добро расположено в одном docker-compose,yaml файле, примерно такого вида: СПОЙЛЕР »
Код:
services: samba: image: samba restart: ${RESTART_POLICY} build: context: . dockerfile: docker/samba environment: - PUID=1000 - PGID=1000 - TZ=${TIMEZONE:-Europe/Moscow} volumes: - ${DOWNLOAD_FOLDER}:/downloads - ./config/samba/smb.conf:/etc/samba/smb.conf:ro ports: - 445:445 deploy: resources: limits: cpus: '0.5' memory: 500M transmission: image: transmission user: vitoha restart: ${RESTART_POLICY} build: context: . dockerfile: docker/transmission environment: - PUID=1000 - PGID=1000 - TZ=${TIMEZONE:-Europe/Moscow} volumes: - ./config/transmission:/transmission/config - ${DOWNLOAD_FOLDER}:/downloads ports: - ${WEB_UI_PORT:-9091}:9091 - ${TORRENT_PORT:-64320}:64320 - ${TORRENT_PORT:-64320}:64320/udp deploy: resources: limits: cpus: '1' memory: 4G jellyfin: image: lscr.io/linuxserver/jellyfin:10.9.11 container_name: jellyfin devices: - /dev/dri environment: - PUID=1000 - PGID=1000 - TZ=Etc/UTC - DOCKER_MODS=linuxserver/mods:jellyfin-opencl-intel volumes: - ./config/jellyfin:/config - ${DOWNLOAD_FOLDER}/tvseries:/data/tvshows - ${DOWNLOAD_FOLDER}/movies:/data/movies ports: - 8096:8096 - 8920:8920 - 7359:7359/udp - 1900:1900/udp restart: ${RESTART_POLICY} deploy: resources: limits: cpus: '2' memory: 1G И содержимое .env файла, откуда подтягиваются переменные (только там что-то и надо править): СПОЙЛЕР »
Код:
RESTART_POLICY=always DOWNLOAD_FOLDER=/fileshare Transmission и samba билдятся на локальной машине, вот их контент: samba СПОЙЛЕР »
Код:
FROM alpine:edge RUN apk add --no-cache samba ENTRYPOINT ["smbd", "-F", "--no-process-group"] transmission (с закомменченым примером смены веб-интерфейса) СПОЙЛЕР »
Код:
FROM alpine:edge ENV USER_ID=1000 ENV GROUP_ID=1000 ENV USER_NAME=vitoha ENV GROUP_NAME=vitoha RUN addgroup -g $GROUP_ID $GROUP_NAME && \ adduser --shell /sbin/nologin --disabled-password \ --no-create-home --uid $USER_ID --ingroup $GROUP_NAME $USER_NAME WORKDIR /app RUN apk add --no-cache transmission-daemon wget unzip #RUN wget https://github.com/Secretmapper/combustion/archive/release.zip && unzip release.zip #ENV TRANSMISSION_WEB_HOME='/app/combustion-release' ENTRYPOINT ["/usr/bin/transmission-daemon", "--foreground", "--config-dir", "/transmission/config"] Да, не везде "красота", но это в процессе, т.к. надо добавить ещё jakett и Radarr для автоматизации автодобавления фильмов в библиотеку, а потом только оптимизировать compose. Ибо преждевременная оптимизация - корень всех бед. По-факту система работает и работает без сбоев, после ребута автоматически поднимается очень быстро, но работы много впереди: и сервисов добавить, и нормально переписать композ, и адекватно добавить второй диск, который пока что только для "красоты". По ресурсам: чисто для файлопомойки с торрентами хватит и 4ГБ ОЗУ, у меня потребление чуть повыше, т.к. ещё много, что там в тестовых целях крутится. |
![]() |
![]() |
![]() |
[включить плавающее окно] Вверх #12 |
![]() Регистрация: 08.02.2003
Адрес: Nsk
|
VitohA
К Transmission какой-нибудь GUI юзаешь? TrguiNG, Transmission remote, Transgui?
__________________
и тут пришел лесник ;) |
![]() |
![]() |
![]() |
[включить плавающее окно] Вверх #13 |
![]() Автор темы Регистрация: 13.09.2016
Адрес: Citizen of the World
|
Lesnik75
Transmission remote на телефоне и встроенную web-морду с компа. Но если всё же нормально настрою radarr, то в этом почти отпадёт надобность |
![]() |
![]() |
![]() |
[включить плавающее окно] Вверх #14 |
![]() Регистрация: 17.03.2004
Адрес: K-PAX
|
Цитата
(VitohA) »
докеризировано
|
![]() |
![]() |
![]() |
[включить плавающее окно] Вверх #15 |
![]() Регистрация: 28.05.2024
Адрес: Germany
|
Я тоже подумал о файлопомойке,но как выяснилось мне это не нужно,посмотрел и удалил,нафиг их хранить? Сейчас у меня 3 тб мне хватит
|
![]() |
![]() |
![]() |
[включить плавающее окно] Вверх #16 |
![]() Регистрация: 08.02.2003
Адрес: Nsk
|
XaXoL
Это контейнеры такие.
__________________
и тут пришел лесник ;) |
![]() |
![]() |
![]() |
[включить плавающее окно] Вверх #17 |
![]() Регистрация: 17.03.2004
Адрес: K-PAX
|
Цитата
(Lesnik75) »
XaXoL
Это контейнеры такие. |
![]() |
![]() |
![]() |
[включить плавающее окно] Вверх #18 |
![]() Регистрация: 08.02.2003
Адрес: Nsk
|
XaXoL
А что не понятно то? Специализированное ПО, разворачивающее конкретное приложение в автономном контейнере. Линуксовая тема, позволяющая избежать нестыковок и лишних костылей за счет костылей не лишних )))
__________________
и тут пришел лесник ;) |
![]() |
![]() |
![]() |
[включить плавающее окно] Вверх #19 |
![]() Автор темы Регистрация: 13.09.2016
Адрес: Citizen of the World
|
Цитата
(Lesnik75) »
Линуксовая тема, позволяющая избежать нестыковок и лишних костылей за счет костылей не лишних )))
![]() Цитата
(Multimedia) »
Я тоже подумал о файлопомойке,но как выяснилось мне это не нужно,посмотрел и удалил,нафиг их хранить? Сейчас у меня 3 тб мне хватит
Последний раз редактировалось VitohA; 24.11.2024 в 18:17. |
![]() |
![]() |
![]() |
[включить плавающее окно] Вверх #20 |
![]() Регистрация: 08.02.2003
Адрес: Nsk
|
Цитата
(VitohA) »
Не только линуксовая, в винде тоже есть.
__________________
и тут пришел лесник ;) |
![]() |
![]() |