Самохостинг Google Photos и Spotify за 3 месяца
Откажитесь от Google Photos и Spotify: пошаговое руководство по самохостингу за 3 месяца, сравнение решений, практические советы для приватной медиатеки.
Установка 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, то эта статья для вас. В ней я поделюсь своим опытом перехода на самохостинговые альтернативы и расскажу, как настроить их самостоятельно.
За 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, что обеспечивает отказоустойчивость и масштабируемость.
Сборка и настройка инфраструктуры
Требования к системе
Для самохостинга я использую сервер с следующими характеристиками:
| Компонент | Рекомендуемые требования | Минимальные требования |
|---|---|---|
| CPU | 4+ ядер | 2 ядра |
| RAM | 8+ ГБ | 4 ГБ |
| Хранилище | 2+ ТБ SSD | 500 ГБ 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
- Экспорт данных из Google Photos:
# Установите Google Takeout
# Скачайте архив с вашими фото и видео
- Подготовка к импорту в PhotoPrism:
# Создайте структуру папок для импорта
mkdir -p ~/selfhosted/photoprism/import/Google_Photos
# Распакуйте архивы в папку импорта
unzip Takeout.zip -d ~/selfhosted/photoprism/import/Google_Photos
- Импорт в PhotoPrism:
- Зайдите в веб-интерфейс PhotoPrism (http://your-server:2342)
- Перейдите в Settings > Import
- Выберите папку импорта и запустите импорт
- Процесс может занять от нескольких часов до нескольких дней
Миграция из Spotify
- Экспорт плейлистов:
# Установите 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и запустите сканирование - Настройте 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 не индексирует новые фото, выполните следующие шаги:
- Проверьте права доступа на папки:
sudo chown -R 1000:1000 ~/selfhosted/photoprism
- Проверьте логи контейнера:
docker logs photoprism
- Перезапустите индексацию вручную через веб-интерфейс.
Airsonic не воспроизводит музыку
- Проверьте кодеки, поддерживаемые Airsonic. В настройках можно указать, какие кодеки транскодировать.
- Убедитесь, что права доступа к файлам музыки корректны:
sudo chown -R 1000:1000 ~/selfhosted/airsonic/music
- Проверьте наличие свободного места на диске.
Высокая загрузка CPU при работе PhotoPrism
- Ограничьте количество ядер, используемых PhotoPrism:
services:
photoprism:
deploy:
resources:
limits:
cpus: '2.0'
- Запустите индексацию в ночное время, когда система не нагружена:
environment:
- PHOTOPRISM_SCHEDULE_INDEXING="true"
- PHOTOPRISM_SCHEDULE_INDEXING_TIME=02:00
Проблемы с памятью в Nextcloud
- Увеличьте лимит памяти для Nextcloud:
services:
nextcloud:
environment:
- MEMORY_LIMIT=512M
- Настройте кеширование Redis, если вы еще не сделали этого.
Медленная загрузка веб-интерфейсов
- Проверьте настройки 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;
}
- Включите сжатие в 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-сертификатами
- Автоматическое обновление 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
- Настройте cron-задачу для автоматического обновления:
0 12 * * * /usr/bin/certbot renew --quiet
Советы по оптимизации
PhotoPrism
- Регулярные бэкапы: Настройте автоматическое резервное копирование в отдельное хранилище.
# Настройте cron-задачу для бэкапа
0 2 * * * docker exec photoprism photoprism backup
- Оптимизация индексации: Настройте ночную индексацию для снижения нагрузки на систему.
# Добавьте в docker-compose.yml для photoprism
environment:
- PHOTOPRISM_SCHEDULE_INDEXING="true"
- PHOTOPRISM_SCHEDULE_INDEXING_TIME=02:00
- Использование GPU: Если у вас есть NVIDIA GPU, настройте ускорение с помощью CUDA.
services:
photoprism:
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
- Организация папок: Используйте четкую структуру папок для импорта фото.
Airsonic-Advanced
- Кеширование: Настройте кеширование транскодированных треков для ускорения загрузки.
services:
airsonic:
environment:
- AIRSONIC_CACHEDIR=/var/airsonic/cache
- AIRSONIC_MAX_MEMORY_CACHE_SIZE=512
-
Оптимизация тегов: Используйте утилиты типа
beetsдля автоматического заполнения метаданных. -
Ограничение одновременных потоков: Настройте лимиты для предотвращения перегрузки сервера.
services:
airsonic:
environment:
- AIRSONIC_MAX_PLAYERS=5
- AIRSONIC_MAX_BIT_RATE=320
- Интеграция с Chromecast: Настройте Chromecast для потоковой трансляции на телевизор.
Общие рекомендации
-
Мониторинг ресурсов: Используйте
htopилиglancesдля отслеживания нагрузки на систему. -
Регулярные обновления: Следите за обновлениями Docker-образов.
# Скрипт для обновления всех контейнеров
#!/bin/bash
cd ~/selfhosted
docker-compose pull
docker-compose up -d
-
Резервное копирование: Настройте регулярное бэкапирование важных данных.
-
Тестирование восстановления: Периодически проверяйте восстановление из бэкапов.
Безопасность и приватность
Конфигурация безопасности
Основные меры безопасности, которые я внедрил:
- Двухфакторная аутентификация: Включена для всех сервисов.
- Регулярные обновления: Система обновляется автоматически.
- Ограничение доступа: Используются VPN для доступа к сервисам извне.
- Шифрование: Весь трафик шифруется через SSL/TLS.
- Изоляция контейнеров: Каждый сервис работает в отдельном контейнере.
Конфиденциальность
- Локальная обработка: Все данные обрабатываются локально, без отправки на внешние серверы.
- Отсутствие отслеживания: В сервисах нет встроенной аналитики.
- Контроль данных: Вы полностью владеете своими данными и знаете, где они хранятся.
- Федеративные протоколы: Используются открытые протоколы для обмена данными.
Настройка 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
Дополнительные меры безопасности
- Обновление системных пакетов:
sudo apt update && sudo apt upgrade -y
- Настройка файрвола:
sudo ufw enable
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
- Изоляция Docker-контейнеров:
sudo nano /etc/docker/daemon.json
Добавьте:
{
"live-restore": true,
"userland-proxy": false,
"icc": false,
"userns-remap": "default"
}
- Регулярный аудит безопасности:
sudo apt install lynis
sudo lynis audit system
Заключение
За 3 месяца использования самохостинговых решений я не пожалел о своем решении. Да, это требует больше усилий по настройке и обслуживанию, но дает полный контроль над данными и экономию денег.
Если вы готовы инвестировать время в настройку, я настоятельно рекомендую попробовать самохостинг. Это открывает новые возможности для кастомизации и интеграции сервисов под ваши нужды.
Надеюсь, мой опыт поможет вам в переходе на самохостинг. Если у вас есть вопросы или вы хотите поделиться своим опытом, оставьте комментарий ниже!
P.S. Все конфигурационные файлы и скрипты для автоматизации настройки доступны в моем репозитории на GitHub: [ссылка]