#!/usr/bin/env bash # Первичная подготовка сервера: каталоги данных, общий корень библиотеки с mount propagation, .env с секретами. # Запуск: sudo ./install.sh (повторный запуск безопасен) set -euo pipefail cd "$(dirname "$0")" # .env и каталоги создаются от root, но сам репозиторий должен остаться у пользователя, который делает git pull. OWNER="${SUDO_USER:-root}" DATA="${PIPU_DATA:-/srv/pipu}" echo "→ каталоги в $DATA" mkdir -p "$DATA"/{library,library-host,cache/transcode,cache/covers,postgres,meili,redis,models,updates,uploads,backups,caddy/data,caddy/config} # Каталоги, куда пишут сервисы без root: api (distroless nonroot, uid 65532) и analyzer (uid 10001). # Без рекурсии: файлы внутри создают сами сервисы, а повторный запуск не обходит весь кэш. chown 65532:65532 "$DATA"/{cache,cache/transcode,cache/covers,updates,uploads} chown 10001:10001 "$DATA/models" # Папка с локальной музыкой: sudo LIBRARY_HOST=/mnt/music ./install.sh (или LIBRARY_HOST в .env) LIBRARY_HOST="${LIBRARY_HOST:-$( [ -f .env ] && sed -n 's/^LIBRARY_HOST=//p' .env || true )}" if [ -n "$LIBRARY_HOST" ]; then if [ ! -d "$LIBRARY_HOST" ]; then echo "LIBRARY_HOST=$LIBRARY_HOST: каталога нет — смонтируйте диск с музыкой (docs/install-guide.md, шаг 4)" >&2 exit 1 fi findmnt -n --target "$LIBRARY_HOST" -o TARGET,SOURCE | sed 's/^/→ музыка: /' fi # storage-agent монтирует NFS внутрь $DATA/library; чтобы точки монтирования видели другие контейнеры, # каталог должен быть отдельной точкой монтирования с shared propagation. if ! findmnt -n "$DATA/library" >/dev/null 2>&1; then echo "→ bind-mount $DATA/library (rshared)" mount --bind "$DATA/library" "$DATA/library" fi mount --make-rshared "$DATA/library" UNIT=/etc/systemd/system/pipu-library-mount.service if [ -d /etc/systemd/system ] && [ ! -f "$UNIT" ]; then echo "→ systemd-юнит $UNIT (повторяет bind-mount после перезагрузки)" cat > "$UNIT" <