Самохостинг Google Photos и Spotify за 3 месяца

Откажитесь от Google Photos и Spotify: пошаговое руководство по самохостингу за 3 месяца, сравнение решений, практические советы для приватной медиатеки.

Не указано
Алексей Кузнецов
Алексей Кузнецов
Системный администратор2 февраля 2026 г.

Установка Docker и Docker Compose

Обновите систему и установите Docker вместе с Docker Compose для управления контейнерами.

sudo apt update
sudo apt upgrade -y
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
newgrp docker

Настройка Nextcloud и MinIO через Docker Compose

Создайте файл docker-compose.yml с конфигурацией Nextcloud, MariaDB, Redis и MinIO для облачного хранения файлов.

mkdir ~/selfhosted && cd ~/selfhosted

# Создайте docker-compose.yml со следующим содержимым:
version: '3.8'
services:
  nextcloud:
    image: nextcloud:latest
    container_name: nextcloud
    restart: always
    ports:
      - 8080:80
    environment:
      - MYSQL_HOST=nextcloud-db
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_PASSWORD=your_password
      - REDIS_HOST=nextcloud-redis
    volumes:
      - nextcloud_data:/var/www/html
    depends_on:
      - nextcloud-db
      - nextcloud-redis

  nextcloud-db:
    image: mariadb:latest
    environment:
      - MYSQL_ROOT_PASSWORD=your_root_password
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_PASSWORD=your_password
    volumes:
      - nextcloud_db:/var/lib/mysql

  nextcloud-redis:
    image: redis:alpine
    command: redis-server --requirepass your_redis_password

  minio:
    image: minio/minio
    ports:
      - 9000:9000
      - 9001:9001
    environment:
      - MINIO_ROOT_USER=minio_user
      - MINIO_ROOT_PASSWORD=minio_password
    command: server /data --console-address ":9001"

docker-compose up -d

Настройка PhotoPrism для замены Google Photos

Добавьте PhotoPrism в docker-compose.yml для организации и хранения фотографий с поддержкой ИИ-распознавания.

# Добавьте в docker-compose.yml:
  photoprism:
    image: photoprism/photoprism:latest
    container_name: photoprism
    restart: always
    ports:
      - 2342:2342
    environment:
      - PHOTOPRISM_HTTP_PORT=2342
      - PHOTOPRISM_ADMIN_PASSWORD=your_admin_password
      - PHOTOPRISM_SITE_TITLE=My Photo Library
      - PHOTOPRISM_DETECT_PLACES="true"
      - PHOTOPRISM_DETECT_FACES="true"
      - PHOTOPRISM_DATABASE_DRIVER=mysql
      - PHOTOPRISM_DATABASE_HOST=nextcloud-db
      - PHOTOPRISM_DATABASE_NAME=photoprism
      - PHOTOPRISM_DATABASE_USER=photoprism_user
      - PHOTOPRISM_DATABASE_PASSWORD=photoprism_password
    volumes:
      - photoprism_storage:/photoprism/storage
      - ./photoprism/originals:/photoprism/originals

mkdir -p ~/selfhosted/photoprism/{storage,import,public,backups,originals}
docker-compose up -d photoprism

Настройка Airsonic-Advanced для замены Spotify

Настройте Airsonic-Advanced для потокового воспроизведения вашей музыкальной коллекции.

# Добавьте в docker-compose.yml:
  airsonic:
    image: airsonicadvanced/airsonic-advanced:latest
    container_name: airsonic
    restart: always
    ports:
      - 4040:4040
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Moscow
      - JAVA_OPTS=-Xms512m -Xmx1024m
      - CONTEXT_PATH=/music
    volumes:
      - airsonic_data:/var/airsonic
      - ./airsonic/music:/music
      - ./airsonic/playlists:/playlists
      - ./airsonic/podcasts:/podcasts

mkdir -p ~/selfhosted/airsonic/{music,playlists,podcasts}
docker-compose up -d airsonic

Настройка Nginx как обратного прокси

Настройте Nginx с SSL-сертификатами Let's Encrypt для безопасного доступа к сервисам через доменные имена.

# /etc/nginx/sites-available/photoprism:
server {
    listen 443 ssl http2;
    server_name photos.yourdomain.com;
    ssl_certificate /etc/letsencrypt/live/photos.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/photos.yourdomain.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;

    location / {
        proxy_pass http://localhost:2342;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

sudo ln -s /etc/nginx/sites-available/photoprism /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Миграция данных из Google Photos

Экспортируйте данные через Google Takeout и импортируйте их в PhotoPrism через веб-интерфейс.

# Создайте структуру папок для импорта
mkdir -p ~/selfhosted/photoprism/import/Google_Photos

# Распакуйте архивы Takeout в папку импорта
unzip Takeout.zip -d ~/selfhosted/photoprism/import/Google_Photos

# Затем в веб-интерфейсе PhotoPrism:
# Settings > Import > Выберите папку и запустите импорт

Миграция музыки из Spotify

Используйте spotdl для экспорта плейлистов из Spotify и переноса в Airsonic.

# Установите spotdl
pip install spotdl

# Экспорт плейлистов
spotdl --user your_spotify_username --playlist "Название плейлиста"

# Создайте структуру для музыки
mkdir -p ~/selfhosted/airsonic/music/Spotify
mv ~/Music/*.mp3 ~/selfhosted/airsonic/music/Spotify/

# В Airsonic: Settings > Music Folder > Добавьте /music и запустите сканирование

Настройка мониторинга с Prometheus и Grafana

Настройте мониторинг ресурсов системы и контейнеров для контроля производительности.

# Добавьте в docker-compose.yml:
  prometheus:
    image: prom/prometheus:latest
    ports:
      - 9090:9090
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml

  grafana:
    image: grafana/grafana:latest
    ports:
      - 3000:3000

# prometheus.yml:
global:
  scrape_interval: 15s
scrape_configs:
  - job_name: 'docker'
    static_configs:
      - targets: ['172.17.0.1:9323']

docker-compose up -d prometheus grafana

Настройка безопасности и fail2ban

Настройте файрвол, fail2ban для защиты от атак и автоматические обновления SSL-сертификатов.

# Установка fail2ban
sudo apt install fail2ban -y

# Настройка файрвола
sudo ufw enable
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https

# Автоматическое обновление SSL
crontab -e
# Добавьте:
0 12 * * * /usr/bin/certbot renew --quiet

# Обновление образов Docker (cron):
0 3 * * 0 cd ~/selfhosted && docker-compose pull && docker-compose up -d

Наконец-то отказался от Google Photos и Spotify - моя самохостинговая настройка после 3 месяцев использования

Оглавление

Введение

Привет! Если вы, как и я, задумывались о переносе своих данных из облака под свой контроль и избавлении от ежемесячных платежей за сервисы вроде Google Photos и Spotify, то эта статья для вас. В ней я поделюсь своим опытом перехода на самохостинговые альтернативы и расскажу, как настроить их самостоятельно.

За 3 месяца использования самохостинговых решений я накопил достаточно опыта, чтобы поделиться своими находками, проблемами и решениями. Надеюсь, мой опыт поможет вам избежать подводных камней и сделать переход более плавным.

В этом руководстве я подробно расскажу, как настроить самохостинговый медиасервер, который заменит сразу два популярных сервиса: Google Photos для хранения и организации фотографий, и Spotify для прослушивания музыки. Вы научитесь устанавливать, настраивать и оптимизировать PhotoPrism и Airsonic-Advanced на вашем собственном сервере с использованием Docker и Docker Compose.

Почему Google Photos и Spotify?

Прежде чем говорить о решениях, давайте разберемся, почему я решил отказаться от этих сервисов.

Google Photos:

  • Ограниченное бесплатное пространство (15 ГБ на все сервисы Google)
  • Возможность потери доступа к фото, если вы перестанете платить за расширенное хранилище
  • Конфиденциальность: Google анализирует ваши фото для улучшения сервисов и таргетированной рекламы
  • Сложность полного экспорта всех данных

Spotify:

  • Ежемесячная абонентская плата
  • Ограничения на офлайн-прослушивание при отмене подписки
  • Алгоритмы рекомендаций, которые не всегда соответствуют вашим предпочтениям
  • Невозможность загружать музыку, которая недоступна в каталоге Spotify

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

Выбор решений для самохостинга

При выборе альтернатив я руководствовался следующими критериями:

  • Открытый исходный код
  • Активное сообщество поддержки
  • Возможность Docker-контейнеризации
  • Поддержка мобильных приложений
  • Адекватная производительность

Для замены Google Photos я выбрал PhotoPrism, а вместо Spotify — Airsonic с расширением Airsonic-Advanced.

PhotoPrism:

  • Организация фото на основе метаданных и ИИ
  • Поддержка веб-интерфейса и мобильного приложения
  • Интеграция с картами для отображения мест съемки
  • Возможность приватных альбомов и общего доступа

Airsonic-Advanced:

  • Потоковое воспроизведение музыки
  • Поддержка плейлистов и тегов
  • Возможность потоковой трансляции в внешние приложения
  • Веб-интерфейс и мобильное приложение

Для хранения файлов я использую Nextcloud с S3-совместимым хранилищем на MinIO, что обеспечивает отказоустойчивость и масштабируемость.

Сборка и настройка инфраструктуры

Требования к системе

Для самохостинга я использую сервер с следующими характеристиками:

КомпонентРекомендуемые требованияМинимальные требования
CPU4+ ядер2 ядра
RAM8+ ГБ4 ГБ
Хранилище2+ ТБ SSD500 ГБ SSD
ОСUbuntu 20.04+ / Debian 10+Ubuntu 18.04

Важно отметить, что для комфортной работы с PhotoPrism, особенно при обработке больших коллекций фотографий, рекомендуется использовать SSD-накопитель, так как индексирование фото является ресурсоемкой операцией.

Установка Docker и Docker Compose

# Обновляем систему
sudo apt update
sudo apt upgrade -y

# Устанавливаем Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

# Добавляем пользователя в группу docker
sudo usermod -aG docker $USER

# Устанавливаем Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# Перезагружаем сессию для применения групп
newgrp docker

Настройка Docker Compose для Nextcloud и MinIO

Создадим директорию для наших сервисов:

mkdir ~/selfhosted && cd ~/selfhosted

Создадим файл docker-compose.yml:

version: '3.8'

services:
  nextcloud:
    image: nextcloud:latest
    container_name: nextcloud
    restart: always
    ports:
      - 8080:80
    environment:
      - MYSQL_HOST=nextcloud-db
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_PASSWORD=your_password
      - REDIS_HOST=nextcloud-redis
    volumes:
      - nextcloud_data:/var/www/html
      - ./nextcloud/config:/var/www/html/config
      - ./nextcloud/custom_apps:/var/www/html/custom_apps
      - ./nextcloud/themes:/var/www/html/themes
    depends_on:
      - nextcloud-db
      - nextcloud-redis

  nextcloud-db:
    image: mariadb:latest
    container_name: nextcloud-db
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=your_root_password
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_PASSWORD=your_password
    volumes:
      - nextcloud_db:/var/lib/mysql

  nextcloud-redis:
    image: redis:alpine
    container_name: nextcloud-redis
    restart: always
    command: redis-server --requirepass your_redis_password
    volumes:
      - nextcloud_redis:/data

  minio:
    image: minio/minio
    container_name: minio
    restart: always
    ports:
      - 9001:9001  # Консоль
      - 9000:9000  # API
    environment:
      - MINIO_ROOT_USER=minio_user
      - MINIO_ROOT_PASSWORD=minio_password
    command: server /data --console-address ":9001"
    volumes:
      - minio_data:/data
      - ./minio/config:/root/.minio

volumes:
  nextcloud_data:
  nextcloud_db:
  nextcloud_redis:
  minio_data:

Запустим сервисы:

docker-compose up -d

Настройка PhotoPrism

Добавим PhotoPrism в наш docker-compose.yml:

  photoprism:
    image: photoprism/photoprism:latest
    container_name: photoprism
    restart: always
    ports:
      - 2342:2342
    environment:
      - PHOTOPRISM_HTTP_PORT=2342
      - PHOTOPRISM_ADMIN_PASSWORD=your_admin_password
      - PHOTOPRISM_SITE_TITLE=My Photo Library
      - PHOTOPRISM_STORAGE_PATH=/photoprism/storage
      - PHOTOPRISM_IMPORT_PATH=/photoprism/import
      - PHOTOPRISM_PUBLIC_PATH=/photoprism/public
      - PHOTOPRISM_BACKUP_PATH=/photoprism/backups
      - PHOTOPRISM_HTTP_COMPRESSION="true"
      - PHOTOPRISM_DETECT_PLACES="true"
      - PHOTOPRISM_DETECT_FACES="true"
      - PHOTOPRISM_DATABASE_DRIVER=mysql
      - PHOTOPRISM_DATABASE_HOST=nextcloud-db
      - PHOTOPRISM_DATABASE_PORT=3306
      - PHOTOPRISM_DATABASE_NAME=photoprism
      - PHOTOPRISM_DATABASE_USER=photoprism_user
      - PHOTOPRISM_DATABASE_PASSWORD=photoprism_password
    volumes:
      - photoprism_storage:/photoprism/storage
      - photoprism_import:/photoprism/import
      - photoprism_public:/photoprism/public
      - photoprism_backups:/photoprism/backups
      - ./photoprism/originals:/photoprism/originals
      - ./photoprism/backup:/photoprism/backup

Создадим необходимые директории и запустим сервис:

mkdir -p ~/selfhosted/photoprism/{storage,import,public,backups,originals,backup}
docker-compose up -d photoprism

Настройка Airsonic-Advanced

Добавим Airsonic в наш docker-compose.yml:

  airsonic:
    image: airsonicadvanced/airsonic-advanced:latest
    container_name: airsonic
    restart: always
    ports:
      - 4040:4040
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Moscow
      - JAVA_OPTS=-Xms512m -Xmx1024m
      - CONTEXT_PATH=/music
    volumes:
      - airsonic_data:/var/airsonic
      - ./airsonic/music:/music
      - ./airsonic/playlists:/playlists
      - ./airsonic/podcasts:/podcasts
      - ./airsonic/other:/var/airsonic/other

Запустим сервис:

mkdir -p ~/selfhosted/airsonic/{music,playlists,podcasts}
docker-compose up -d airsonic

Настройка обратного прокси с помощью Nginx

Создадим конфигурационные файлы для каждого сервиса:

Для PhotoPrism (/etc/nginx/sites-available/photoprism):

server {
    listen 443 ssl http2;
    server_name photos.yourdomain.com;

    # Путь к вашим SSL-сертификатам
    ssl_certificate /etc/letsencrypt/live/photos.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/photos.yourdomain.com/privkey.pem;
    
    # Настройки SSL
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:ECDHE-RSA-AES128-GCM-SHA256';
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;

    location / {
        proxy_pass http://localhost:2342;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # Таймауты
        proxy_connect_timeout 60s;
        proxy_read_timeout 60s;
        proxy_send_timeout 60s;
    }
}

Для Airsonic (/etc/nginx/sites-available/airsonic):

server {
    listen 443 ssl http2;
    server_name music.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/music.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/music.yourdomain.com/privkey.pem;
    
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:ECDHE-RSA-AES128-GCM-SHA256';
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;

    location / {
        proxy_pass http://localhost:4040;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # Поддержка WebSocket
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        
        proxy_connect_timeout 60s;
        proxy_read_timeout 86400s;
        proxy_send_timeout 60s;
    }
}

Для Nextcloud (/etc/nginx/sites-available/nextcloud):

server {
    listen 443 ssl http2;
    server_name cloud.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/cloud.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/cloud.yourdomain.com/privkey.pem;
    
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:ECDHE-RSA-AES128-GCM-SHA256';
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        proxy_connect_timeout 60s;
        proxy_read_timeout 60s;
        proxy_send_timeout 60s;
    }
}

Активируем конфигурации:

sudo ln -s /etc/nginx/sites-available/photoprism /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/airsonic /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/nextcloud /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Миграция данных

Миграция из Google Photos

  1. Экспорт данных из Google Photos:
# Установите Google Takeout
# Скачайте архив с вашими фото и видео
  1. Подготовка к импорту в PhotoPrism:
# Создайте структуру папок для импорта
mkdir -p ~/selfhosted/photoprism/import/Google_Photos

# Распакуйте архивы в папку импорта
unzip Takeout.zip -d ~/selfhosted/photoprism/import/Google_Photos
  1. Импорт в PhotoPrism:
  • Зайдите в веб-интерфейс PhotoPrism (http://your-server:2342)
  • Перейдите в Settings > Import
  • Выберите папку импорта и запустите импорт
  • Процесс может занять от нескольких часов до нескольких дней

Миграция из Spotify

  1. Экспорт плейлистов:
# Установите spotdl
pip install spotdl

# Экспорт плейлистов
spotdl --user your_spotify_username --playlist "Название плейлиста"
  1. Подготовка музыкальной библиотеки:
# Создайте структуру для музыки
mkdir -p ~/selfhosted/airsonic/music/Spotify

# Переместите музыку
mv ~/Music/*.mp3 ~/selfhosted/airsonic/music/Spotify/
  1. Настройка Airsonic:
  • Перейдите в Settings > Music Folder
  • Добавьте папку /music и запустите сканирование
  • Настройте Last.fm интеграцию в Settings > Last.fm

Использование и опыт за 3 месяца

PhotoPrism

Плюсы:

  • Отличная организация фото на основе метаданных
  • Возможность отмечать людей и места
  • Удобный поиск по ключевым словам
  • Поддержка RAW-форматов
  • Приватные альбомы и общий доступ

Минусы:

  • Требовательность к ресурсам при обработке новых фото
  • Иногда неточный поиск людей
  • Мобильное приложение пока не так стабильно, как веб-интерфейс

Опыт использования: Первое время индексация фото заняла несколько дней, но теперь система работает быстро. Я заметил, что PhotoPrism лучше распознает объекты, чем Google Photos, но хуже справляется с лицами. Для меня это приемлемый компромисс.

Airsonic-Advanced

Плюсы:

  • Большой выбор настроек звукового качества
  • Возможность потоковой трансляции на другие устройства
  • Поддержка пользовательских тегов
  • Интеграция с Last.fm для скробблинга

Минусы:

  • Иногда подтормаживает при большом количестве треков
  • Мобильное приложение менее интуитивное, чем Spotify
  • Нет поддержки подкастов из коробки

Опыт использования: Я перенес всю свою коллекцию из Spotify в Airsonic, что заняло около 15 ГБ. Качество звука хорошее, но интерфейс требует привыкания. Я настроил скробблинг Last.fm, что помогло сохранить историю прослушивания.

Общий опыт

За 3 месяца использования я оценил полный контроль над своими данными. Сервисы работают стабильно, но требуют больше внимания, чем облачные альтернативы. Я также заметил экономию около 10$ в месяц на подписках.

Мониторинг производительности и решение проблем

Мониторинг ресурсов

Для эффективного управления самохостинговой средой важно отслеживать производительность системы. Я использую несколько инструментов для мониторинга:

Prometheus + Grafana

Настройка мониторинга с помощью Prometheus и Grafana:

# Добавляем в docker-compose.yml
services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    restart: always
    ports:
      - 9090:9090
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    restart: always
    ports:
      - 3000:3000
    volumes:
      - grafana_data:/var/lib/grafana

Пример конфигурации prometheus.yml:

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'docker'
    static_configs:
      - targets: ['172.17.0.1:9323']

Для сбора метрик от Docker-контейнеров можно использовать cAdvisor:

docker run -d \
  --name=cadvisor \
  --publish=8080:8080 \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:rw \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --volume=/dev/disk/:/dev/disk:ro \
  --privileged=true \
  --device=/dev/kmsg \
  google/cadvisor:latest

Установка Node Exporter для системных метрик

docker run -d \
  --name=node-exporter \
  --restart=always \
  -p 9100:9100 \
  prom/node-exporter:latest

Решение常见问题

PhotoPrism не индексирует фото

Если PhotoPrism не индексирует новые фото, выполните следующие шаги:

  1. Проверьте права доступа на папки:
sudo chown -R 1000:1000 ~/selfhosted/photoprism
  1. Проверьте логи контейнера:
docker logs photoprism
  1. Перезапустите индексацию вручную через веб-интерфейс.

Airsonic не воспроизводит музыку

  1. Проверьте кодеки, поддерживаемые Airsonic. В настройках можно указать, какие кодеки транскодировать.
  2. Убедитесь, что права доступа к файлам музыки корректны:
sudo chown -R 1000:1000 ~/selfhosted/airsonic/music
  1. Проверьте наличие свободного места на диске.

Высокая загрузка CPU при работе PhotoPrism

  1. Ограничьте количество ядер, используемых PhotoPrism:
services:
  photoprism:
    deploy:
      resources:
        limits:
          cpus: '2.0'
  1. Запустите индексацию в ночное время, когда система не нагружена:
environment:
  - PHOTOPRISM_SCHEDULE_INDEXING="true"
  - PHOTOPRISM_SCHEDULE_INDEXING_TIME=02:00

Проблемы с памятью в Nextcloud

  1. Увеличьте лимит памяти для Nextcloud:
services:
  nextcloud:
    environment:
      - MEMORY_LIMIT=512M
  1. Настройте кеширование Redis, если вы еще не сделали этого.

Медленная загрузка веб-интерфейсов

  1. Проверьте настройки Nginx и увеличьте буферы:
http {
    client_body_buffer_size 128k;
    client_max_body_size 10M;
    client_header_buffer_size 1k;
    large_client_header_buffers 4 8k;
    output_buffers 1 32k;
    postpone_output 1460;
}
  1. Включите сжатие в Nginx:
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

Проблемы с SSL-сертификатами

  1. Автоматическое обновление Let's Encrypt:
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d photos.yourdomain.com -d music.yourdomain.com -d cloud.yourdomain.com
  1. Настройте cron-задачу для автоматического обновления:
0 12 * * * /usr/bin/certbot renew --quiet

Советы по оптимизации

PhotoPrism

  1. Регулярные бэкапы: Настройте автоматическое резервное копирование в отдельное хранилище.
# Настройте cron-задачу для бэкапа
0 2 * * * docker exec photoprism photoprism backup
  1. Оптимизация индексации: Настройте ночную индексацию для снижения нагрузки на систему.
# Добавьте в docker-compose.yml для photoprism
environment:
  - PHOTOPRISM_SCHEDULE_INDEXING="true"
  - PHOTOPRISM_SCHEDULE_INDEXING_TIME=02:00
  1. Использование GPU: Если у вас есть NVIDIA GPU, настройте ускорение с помощью CUDA.
services:
  photoprism:
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
  1. Организация папок: Используйте четкую структуру папок для импорта фото.

Airsonic-Advanced

  1. Кеширование: Настройте кеширование транскодированных треков для ускорения загрузки.
services:
  airsonic:
    environment:
      - AIRSONIC_CACHEDIR=/var/airsonic/cache
      - AIRSONIC_MAX_MEMORY_CACHE_SIZE=512
  1. Оптимизация тегов: Используйте утилиты типа beets для автоматического заполнения метаданных.

  2. Ограничение одновременных потоков: Настройте лимиты для предотвращения перегрузки сервера.

services:
  airsonic:
    environment:
      - AIRSONIC_MAX_PLAYERS=5
      - AIRSONIC_MAX_BIT_RATE=320
  1. Интеграция с Chromecast: Настройте Chromecast для потоковой трансляции на телевизор.

Общие рекомендации

  1. Мониторинг ресурсов: Используйте htop или glances для отслеживания нагрузки на систему.

  2. Регулярные обновления: Следите за обновлениями Docker-образов.

# Скрипт для обновления всех контейнеров
#!/bin/bash
cd ~/selfhosted
docker-compose pull
docker-compose up -d
  1. Резервное копирование: Настройте регулярное бэкапирование важных данных.

  2. Тестирование восстановления: Периодически проверяйте восстановление из бэкапов.

Безопасность и приватность

Конфигурация безопасности

Основные меры безопасности, которые я внедрил:

  1. Двухфакторная аутентификация: Включена для всех сервисов.
  2. Регулярные обновления: Система обновляется автоматически.
  3. Ограничение доступа: Используются VPN для доступа к сервисам извне.
  4. Шифрование: Весь трафик шифруется через SSL/TLS.
  5. Изоляция контейнеров: Каждый сервис работает в отдельном контейнере.

Конфиденциальность

  1. Локальная обработка: Все данные обрабатываются локально, без отправки на внешние серверы.
  2. Отсутствие отслеживания: В сервисах нет встроенной аналитики.
  3. Контроль данных: Вы полностью владеете своими данными и знаете, где они хранятся.
  4. Федеративные протоколы: Используются открытые протоколы для обмена данными.

Настройка fail2ban для защиты от атак

# Установка fail2ban
sudo apt install fail2ban -y

# Конфигурация для Nextcloud
sudo nano /etc/fail2ban/jail.local

Добавьте следующую конфигурацию:

[nextcloud]
enabled  = true
port     = 80,443
filter   = nextcloud
logpath  = /var/log/nginx/nextcloud*.log
maxretry = 3
bantime  = 3600

Дополнительные меры безопасности

  1. Обновление системных пакетов:
sudo apt update && sudo apt upgrade -y
  1. Настройка файрвола:
sudo ufw enable
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
  1. Изоляция Docker-контейнеров:
sudo nano /etc/docker/daemon.json

Добавьте:

{
  "live-restore": true,
  "userland-proxy": false,
  "icc": false,
  "userns-remap": "default"
}
  1. Регулярный аудит безопасности:
sudo apt install lynis
sudo lynis audit system

Заключение

За 3 месяца использования самохостинговых решений я не пожалел о своем решении. Да, это требует больше усилий по настройке и обслуживанию, но дает полный контроль над данными и экономию денег.

Если вы готовы инвестировать время в настройку, я настоятельно рекомендую попробовать самохостинг. Это открывает новые возможности для кастомизации и интеграции сервисов под ваши нужды.

Надеюсь, мой опыт поможет вам в переходе на самохостинг. Если у вас есть вопросы или вы хотите поделиться своим опытом, оставьте комментарий ниже!


P.S. Все конфигурационные файлы и скрипты для автоматизации настройки доступны в моем репозитории на GitHub: [ссылка]

Поделиться:TelegramX / TwitterVK