Документация

Документация предназначена для администраторов, которые размещают Wanmory на NAS, домашнем сервере или личном компьютере. Здесь описаны установка, настройка, развёртывание ИИ-сервиса, повседневная работа, системные настройки и обслуживание. Об устройстве системы и алгоритмах — в разделе Архитектура.

Установка · Начало работы

Введение#

Wanmory — открытая частная фототека с ИИ для размещения на своём сервере. Система состоит из четырёх контейнеров: бэкенда на Go (server), сервиса ИИ-инференса на Python (ml), базы данных PostgreSQL + pgvector (postgres) и mdns, который объявляет локальный домен. Все фото, метаданные, векторы и очередь задач хранятся локально, без зависимости от облачных сервисов.

  • Работа с фото: хронология по месяцам, альбомы и умные альбомы, разбор серий и похожих снимков, карта путешествий, слайд-шоу.
  • Возможности ИИ: обнаружение и группировка лиц, поиск на естественном языке (Chinese-CLIP), распознавание текста (PP-OCR), эстетическая оценка (выбор ИИ).
  • Несколько участников: отдельные учётные записи, право удаления по принципу владения, история входов.

Системные требования#

ПараметрМинимумРекомендуется
Архитектура CPUx86_64 (amd64) или ARM64—
ПроцессорУровня Intel N100 / Raspberry Pi 5Уровня Intel i5 и выше или ИИ-сервис на отдельной машине с GPU
Память4 ГБ (автоматически выбирается уровень «Лёгкий»)8 ГБ и больше (уровень «Сбалансированный»)
ДискОколо 1–4 ГБ на модели плюс место под миниатюрыSSD для data/ и тома базы данных
ПОDocker Engine и Docker Compose v2—
ОСЛюбой дистрибутив Linux, где работает DockerSynology DSM, QNAP QTS, TrueNAS SCALE, Unraid, Ubuntu / Debian
Образы выпускаются для linux/amd64 и linux/arm64, Docker сам скачает подходящий. Контейнеры Docker в macOS не могут использовать GPU Apple; для аппаратного ускорения на Mac см. ИИ-сервис на отдельной машине.

Быстрая установка#

Способ 1: скрипт установки (рекомендуется)

На 64-битной машине с установленным Docker выполните:

bash
curl -fsSL https://wanmory.com/install.sh | bash

Скрипт по порядку делает следующее:

  • Проверка окружения: архитектура CPU (amd64 / arm64) и 64-битное пользовательское окружение, наличие Docker и Docker Compose v2, свободная память и место на диске.
  • Интерактивная настройка: каталог установки (по умолчанию ~/wanmory), порт (по умолчанию 8080, проверяется занятость), локальный домен (по умолчанию wanmory.local), пароль базы данных (по умолчанию случайный) и расположение базы (по умолчанию том Docker pgdata, можно указать каталог на локальном диске), часовой пояс (введите город или регион для поиска, например shanghai, tokyo или 北京; при нескольких совпадениях выберите номер).
  • Места хранения: каталог данных (миниатюры, превью и загруженные фото, по умолчанию ./data) и каталог моделей ИИ (по умолчанию ./models).
  • Вопросы и вывод скрипта — на английском, чтобы корректно отображаться в любом терминале NAS.
  • Существующие папки с фото: добавляйте сколько нужно, для каждой выбирая подключение только для чтения (рекомендуется) или для чтения и записи.
  • Создаёт .env (права 600); если указаны папки с фото, создаёт также docker-compose.override.yml, который Docker Compose подхватывает автоматически.
  • Скачивает официальный docker-compose.yml (если GitHub недоступен — с Gitee), проверяет конфигурацию, загружает образы, запускает сервисы и, когда всё готово, выводит адрес.
Параметр / переменнаяОписание
-yБез вопросов, все значения по умолчанию (пароль базы данных случайный). Подходит для автоматической установки.
--dir КАТАЛОГЗадать каталог установки.
--dry-runТолько проверить окружение и создать файлы конфигурации, без загрузки образов и запуска.
WANMORY_PORTЗадаёт порт заранее; так же работают WANMORY_DOMAIN, WANMORY_DB_PASSWORD, WANMORY_TZ, WANMORY_DATA_DIR, WANMORY_MODELS_DIR, WANMORY_DB_DIR, WANMORY_REGISTRY и WANMORY_VERSION.
WANMORY_PHOTOSПапки с фото через запятую, по умолчанию только для чтения; :rw после пути — чтение и запись, например /volume1/photo,/mnt/usb:rw.
bash
# Пример: установка без вопросов в /opt/wanmory на порт 9000 с подключением папок с фото NAS
curl -fsSL https://wanmory.com/install.sh | WANMORY_PORT=9000 WANMORY_PHOTOS=/volume1/photo,/volume2/family bash -s -- -y --dir /opt/wanmory
Если запустить скрипт повторно, а в каталоге установки уже есть .env, по умолчанию сохраняется прежняя конфигурация (пароль базы данных после первого запуска нельзя просто так сменить); обновляется только файл Compose и сервисы перезапускаются — так что это работает и как обновление.

Способ 2: ручная установка

  1. 1
    Создайте каталог и скачайте файл Compose

    Создайте каталог для файла Compose, данных и моделей и скачайте официальный docker-compose.yml:

    bash
    mkdir -p ~/wanmory && cd ~/wanmory
    curl -fsSLO https://raw.githubusercontent.com/i-dj/wanmory/main/docker/docker-compose.yml
  2. 2
    (Необязательно) Создайте .env

    Создайте в том же каталоге .env, чтобы переопределить значения по умолчанию. В рабочей среде обязательно смените пароль базы данных:

    .env
    WANMORY_DB_PASSWORD=замените-на-случайную-строку
    WANMORY_PORT=8080
    WANMORY_TZ=Europe/Moscow
    WANMORY_VERSION=latest
  3. 3
    Запустите сервисы

    При первом запуске загружаются образы и автоматически выполняются миграции базы данных:

    bash
    docker compose up -d
    docker compose ps # убедитесь, что все четыре сервиса running / healthy
  4. 4
    Откройте и настройте

    Откройте в браузере http://wanmory.local:8080 (или http://<IP хоста>:8080), создайте учётную запись администратора по подсказкам и загрузите модели в «Системные настройки → ИИ». После загрузки моделей существующие фото автоматически встают в очередь ИИ.

Установка · Настройка развёртывания

Разбор docker-compose.yml#

Официальный файл Compose описывает четыре сервиса: базу данных postgres, бэкенд server, объявление локального домена mdns и встроенный ИИ-сервис ml. Назначение каждого параметра указано прямо в файле:

yaml
# Официальный файл Compose для Wanmory: выполните docker compose up -d в каталоге этого файла
# Переменные вида ${VAR:-значение} читаются из .env в том же каталоге; если не заданы — берётся значение по умолчанию
services:
# ── База данных: PostgreSQL 17 + pgvector ────────────────────────
# Хранит метаданные фото, людей, альбомы, настройки, очередь задач и векторы (индекс HNSW)
# Порт не публикуется; доступна только во внутренней сети Compose
postgres:
image: pgvector/pgvector:pg17
environment:
POSTGRES_USER: wanmory
POSTGRES_PASSWORD: ${WANMORY_DB_PASSWORD:-wanmory} # в рабочей среде обязательно смените в .env
POSTGRES_DB: wanmory
volumes:
- ${WANMORY_DB_DIR:-pgdata}:/var/lib/postgresql/data # по умолчанию именованный том pgdata; с WANMORY_DB_DIR — этот каталог. Включите в резервные копии
healthcheck: # server ждёт эту проверку и стартует, когда база готова
test: ["CMD", "pg_isready", "-U", "wanmory", "-d", "wanmory"]
interval: 5s
timeout: 3s
retries: 20
restart: unless-stopped
# ── Бэкенд: программа на Go со встроенным веб-приложением ────────
# Отвечает за API, загрузки (tus), планирование задач, миниатюры и права; при запуске выполняет миграции БД
server:
image: ${WANMORY_REGISTRY:-ghcr.io/i-dj}/wanmory-server:${WANMORY_VERSION:-latest}
environment:
DATABASE_URL: postgres://wanmory:${WANMORY_DB_PASSWORD:-wanmory}@postgres:5432/wanmory
WANMORY_ML_URL: http://ml:3003 # адрес встроенного ИИ-сервиса; удалённый задаётся в «Настройках ИИ»
TZ: ${WANMORY_TZ:-Asia/Shanghai} # часовой пояс, если в EXIF его нет
WANMORY_MDNS: "off" # в сети bridge контейнер не получает мультикаст; домен объявляет сервис mdns ниже
WANMORY_HTTP_PUBLIC_PORT: ${WANMORY_PORT:-8080} # порт, который показывает веб-приложение; должен совпадать с пробросом
WANMORY_DOMAIN: ${WANMORY_DOMAIN:-wanmory.local} # начальный локальный домен; после смены в веб-настройках действует настройка
ports:
- "${WANMORY_PORT:-8080}:8080" # порт хоста:порт контейнера
volumes:
- ${WANMORY_DATA_DIR:-./data}:/data # upload/ — загруженные оригиналы, thumbs/ — миниатюры и превью 1440 px
# Существующие папки с фото подключаются подкаталогами /photos, сколько угодно; :ro — только чтение; сканируются каждые 15 минут
# - /mnt/nas/photos:/photos/nas:ro
# - /media/usb/camera:/photos/usb:ro
depends_on:
postgres:
condition: service_healthy
restart: unless-stopped
# ── Объявление локального домена (mDNS) ──────────────────────────
# Тот же образ, что и server, запускает только подкоманду mdns; объявляет wanmory.local (можно сменить в веб-приложении)
mdns:
image: ${WANMORY_REGISTRY:-ghcr.io/i-dj}/wanmory-server:${WANMORY_VERSION:-latest}
command: ["mdns"]
network_mode: host # для отправки и приёма мультикаста в локальной сети нужна сеть хоста
environment:
WANMORY_URL: http://127.0.0.1:${WANMORY_PORT:-8080} # периодически запрашивает у server текущий домен
WANMORY_DOMAIN: ${WANMORY_DOMAIN:-wanmory.local} # объявляется, пока server недоступен
depends_on:
- server
restart: unless-stopped
# ── Встроенный ИИ-сервис: FastAPI + ONNX Runtime, только CPU ─────
# Без состояния; получает превью от server и возвращает лица, векторы и текст; порт не публикуется
ml:
image: ${WANMORY_REGISTRY:-ghcr.io/i-dj}/wanmory-ml:${WANMORY_VERSION:-latest}
volumes:
- ${WANMORY_MODELS_DIR:-./models}:/models # модели сохраняются, пересоздание контейнера не требует повторной загрузки
environment:
WANMORY_MODEL_DIR: /models
WANMORY_AUTO_DOWNLOAD: "0" # без автозагрузки; администратор сначала подтверждает лицензии и место на диске в веб-приложении
restart: unless-stopped
volumes:
pgdata:

Переменные окружения#

.env (переменные Compose)

Эти переменные используются в docker-compose.yml; запишите их в .env в том же каталоге, чтобы они вступили в силу:

ПеременнаяПо умолчаниюОписание
WANMORY_DB_PASSWORDwanmoryПароль PostgreSQL, используется и в DATABASE_URL сервиса server. Смена после первого запуска требует сменить и пароль пользователя внутри базы.
WANMORY_PORT8080Порт на хосте; используется и в адресе, который показывает веб-приложение.
WANMORY_TZAsia/ShanghaiЧасовой пояс, если в данных EXIF его нет.
WANMORY_VERSIONlatestТег образа; закрепите конкретную версию, чтобы самим решать, когда обновляться.
WANMORY_REGISTRYghcr.io/i-djРеестр образов. Если ghcr.io недоступен, замените на доступный.
WANMORY_DATA_DIR./dataКаталог данных: загруженные оригиналы (upload/), миниатюры и превью (thumbs/); подключается в контейнер как /data.
WANMORY_MODELS_DIR./modelsКаталог моделей ИИ, подключается в контейнер ml как /models.
WANMORY_DB_DIRтом pgdataКаталог базы данных. Если не задан, используется том Docker pgdata; если указан путь к каталогу на локальном диске, база хранится прямо там. Не используйте сетевые папки.
WANMORY_DOMAINwanmory.localНачальный локальный домен, должен оканчиваться на .local. После смены в «Системные настройки → Домен доступа» действует настройка.

Контейнер server (необязательно)

DATABASE_URL, WANMORY_ML_URL, WANMORY_MDNS и WANMORY_HTTP_PUBLIC_PORT уже заданы в файле Compose с пояснениями. Следующих переменных в стандартном файле нет; при необходимости добавьте их в environment сервиса server:

ПеременнаяПо умолчаниюОписание
WANMORY_WORKERSавтоПараллельность задач метаданных и миниатюр по умолчанию. Если не задана, рассчитывается по числу ядер и памяти; меняется в разделе «Производительность» веб-приложения.
WANMORY_ML_TOKENпустоТокен доступа встроенного ИИ-сервиса; должен совпадать с одноимённой переменной контейнера ml. Обычно не нужен.
WANMORY_FACE_MODELantelopev2Модель лиц, если уровень моделей не выбран.
WANMORY_CLIP_MODELchinese-clip-vit-h-14Модель семантического поиска, если уровень моделей не выбран.
WANMORY_STORAGE_ROOTSкаталог данныхКаталоги, которые можно просматривать и выбирать в веб-приложении, через двоеточие.

Подключение папок с фото#

Фото, которые уже лежат на NAS или внешнем диске, загружать не нужно. Подключите папку подкаталогом /photos внутри контейнера: она сканируется каждые 15 минут, новые файлы импортируются на месте (без копирования и перемещения), а затем, как и загруженные фото, проходят чтение метаданных, создание миниатюр и обработку ИИ.

yaml
server:
volumes:
- ./data:/data
- /mnt/nas/photos:/photos/nas:ro # :ro — только для чтения
- /media/usb/camera:/photos/usb:ro
- /home/me/Pictures:/photos/pictures # чтение и запись

После изменения выполните docker compose up -d. Первое сканирование начнётся примерно через 20 секунд после перезапуска контейнера.

  • Рекомендуется подключать только для чтения (:ro): система ничего не пишет в такие папки. Удаление фото в приложении лишь переносит его в «Недавно удалённые», окончательное удаление никогда не стирает исходный файл, и при следующих сканированиях он не импортируется снова. В папках с правом записи окончательное удаление стирает и исходный файл.
  • Файлы с одинаковым содержимым импортируются один раз (сверка по контрольной сумме SHA-1), включая уже загруженные файлы и дубликаты в разных папках.
  • Скрытые каталоги и системные папки NAS (.xxx, @eaDir, #recycle и т. п.) пропускаются автоматически.
  • Фото из подключённых папок не принадлежат ни одному участнику; удалять их могут только администраторы.

Локальный домен (mDNS)#

Сервис mdns работает в режиме сети хоста и объявляет домен доступа в локальной сети (по умолчанию wanmory.local). macOS, iOS, iPadOS и Windows 10 и новее открывают http://wanmory.local:8080 без настройки роутера. Домен меняется в «Системные настройки → Домен доступа» и должен оканчиваться на .local.

Некоторые устройства Android не разрешают имена mDNS — используйте IP-адрес. Если порт 5353 уже занят (например, на Synology), сервис mdns может не запуститься; в этом случае тоже заходите по IP. На остальные функции это не влияет.

Обратный прокси и доступ из интернета#

Веб-загрузка использует протокол с докачкой tus (/api/uploads/) с блоками по 16 МБ. За обратным прокси снимите ограничение на размер запроса и отключите буферизацию запросов. Пример для Nginx:

nginx
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /api/uploads/ {
proxy_pass http://127.0.0.1:8080;
client_max_body_size 0; # без ограничения размера (не меньше 20m)
proxy_request_buffering off; # передавать потоком, не сохраняя на диск прокси
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
}
Перед открытием доступа из интернета: используйте HTTPS, отключите гостевой доступ в системных настройках и задайте надёжные пароли всем участникам. Бесплатный тариф Cloudflare ограничивает запрос 100 МБ, так что для блоков по 16 МБ ничего дополнительно настраивать не нужно.
Установка · ИИ-сервис

Режимы работы#

ИИ-сервис — HTTP-сервис без состояния: он получает от бэкенда превью размером 1440 пикселей и возвращает лица, векторы и распознанный текст. Он не обращается к базе данных и не сохраняет файлы. Бэкенд поддерживает два режима, которые переключаются в «Системные настройки → ИИ → Режим работы ИИ»:

РежимГде работаетКогда подходит
Встроенный (только CPU)Контейнер ml в Compose, доступен только во внутренней сетиРаботает сразу; NAS или мини-ПК с небольшой фототекой или когда допустима долгая первичная обработка
Удалённый сервисДругая машина в локальной сети, Python-сервис запущен напрямуюMac на Apple Silicon (CoreML / MPS) или машина с GPU NVIDIA (CUDA) — первичная обработка намного быстрее

Когда ИИ-сервис недоступен, задачи ИИ остаются в очереди и перестают забираться, не расходуя повторы; когда сервис вернётся, обработка продолжится сама. Просмотр, загрузка и прочее при этом работают.

ИИ-сервис на отдельной машине#

Способ 1: напрямую на Mac или машине с GPU (рекомендуется)

При прямом запуске доступно аппаратное ускорение: на Apple Silicon модели лиц используют CoreML, а Chinese-CLIP — MPS; на GPU NVIDIA Chinese-CLIP работает через CUDA в половинной точности (около 1,9 ГБ видеопамяти / памяти). Сначала установите uv.

bash
git clone https://github.com/i-dj/wanmory.git
cd wanmory/ml
uv sync --extra torch # установить зависимости PyTorch (семантический поиск с ускорением на GPU)
# Сгенерируйте токен доступа; бэкенд и ИИ-сервис используют одно значение
export WANMORY_ML_TOKEN=$(openssl rand -hex 24)
echo $WANMORY_ML_TOKEN
WANMORY_FACE_MODEL_PRELOAD=1 uv run --extra torch python -m wanmory_ml
# По умолчанию слушает 0.0.0.0:3003; меняется через WANMORY_ML_HOST / WANMORY_ML_PORT

Способ 2: образ Docker на другой машине

Для более мощной машины x86 без подходящего GPU; образ использует только процессор:

bash
docker run -d --name wanmory-ml --restart unless-stopped \
-p 3003:3003 \
-e WANMORY_ML_TOKEN=<токен-доступа> \
-v $PWD/models:/models \
ghcr.io/i-dj/wanmory-ml:latest

Включение удалённого сервиса в бэкенде

  1. 1
    Откройте настройки ИИ

    Войдите как администратор, откройте «Системные настройки → ИИ → Режим работы ИИ» и выберите «Удалённый сервис».

  2. 2
    Укажите адрес и токен

    Адрес вида http://192.168.1.20:3003, токен — значение, сгенерированное на предыдущем шаге. Перед сохранением соединение проверяется, показываются задержка и версия сервиса.

  3. 3
    Проверьте уровень и модели

    После подключения уровень «Авто» пересчитывается по оборудованию удалённой машины; загрузите нужные модели в разделе «Уровень моделей».

Удалённый ИИ-сервис должен быть доступен только в локальной сети или через VPN (например, Tailscale), и токен задавайте обязательно. Для подключения через интернет используйте обратный прокси с HTTPS.

Уровни моделей и загрузка#

Уровень определяет, какие модели используются для лиц и семантического поиска. В режиме «Авто» система рекомендует уровень по оборудованию машины с ИИ-сервисом: при наличии подходящего GPU — «Высокая точность»; только с процессором и памятью меньше 6 ГБ — «Лёгкий», иначе — «Сбалансированный».

УровеньОбнаружение и признаки лицСемантический поискПодходящее оборудование
Высокая точность (quality)antelopev2 (SCRFD-10G + ArcFace R100)Chinese-CLIP ViT-H/14 (1024-d)Mac на Apple Silicon, GPU NVIDIA
Сбалансированный (balanced)antelopev2Chinese-CLIP ViT-L/14 (768-d)NAS уровня Intel i5
Лёгкий (lite)buffalo_l (ArcFace R50)Chinese-CLIP ViT-B/16 (512-d)N100, Raspberry Pi 5
  • Распознавание текста использует PP-OCRv6 (RapidOCR); его модели ставятся вместе с зависимостями и отдельно не загружаются.
  • После смены уровня лица на всех фото обнаруживаются заново, а семантические векторы пересчитываются новыми моделями; пока это идёт, поиск работает по старым векторам, а люди с именами сохраняются.
  • Модели загружаются в подключённый каталог ./models; неиспользуемые можно удалить, чтобы освободить место (используемую модель удалить нельзя).
  • Модели лиц InsightFace разрешены только для некоммерческого использования; перед коммерческим использованием замените их или получите лицензию.

Переменные ИИ-сервиса#

ПеременнаяПо умолчаниюОписание
WANMORY_ML_HOST0.0.0.0Адрес прослушивания.
WANMORY_ML_PORT3003Порт прослушивания.
WANMORY_ML_TOKENпустоТокен доступа; если задан, каждый запрос должен содержать Authorization: Bearer.
WANMORY_MODEL_DIR~/.cache/wanmory/modelsКаталог моделей; в образе — /models.
WANMORY_AUTO_DOWNLOAD0 в образеЗагружать ли модели автоматически при первом использовании.
WANMORY_FACE_MODEL_PRELOAD—При значении 1 модели лиц загружаются при старте; Chinese-CLIP загружается в фоне.
WANMORY_UNLOAD_AFTER5 / 30 минутЧерез сколько секунд простоя модель выгружается для освобождения памяти; 0 — никогда. По умолчанию зависит от памяти хоста.
Руководство · Основы

Первый запуск и вход#

  1. 1
    Создайте администратора

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

  2. 2
    Загрузите модели

    Откройте «Системные настройки → ИИ», подтвердите уровень моделей и загрузите их. Пока модели не готовы, задачи ИИ ждут в очереди.

  3. 3
    Импортируйте фото

    Загрузите через веб-приложение или подключите фото с NAS, как описано в разделе Подключение папок с фото.

  4. 4
    Добавьте участников

    В «Системные настройки → Участники» создайте учётные записи для других людей и выберите роль «Участник» или «Администратор».

Загрузка и импорт#

  • Веб-загрузка принимает фото, видео, HEIC, RAW (например, DNG) и другое, с выбором нескольких файлов; загрузка идёт блоками по протоколу tus и продолжается после обрыва сети или перезагрузки страницы.
  • Загруженные файлы раскладываются по годам и месяцам в каталоге загрузок (по умолчанию data/upload). Каталог меняется в «Системные настройки → Каталог загрузок» и влияет только на новые загрузки.
  • После импорта по порядку выполняются: чтение метаданных (ExifTool) → миниатюры и превью 1440 пикселей (libvips / FFmpeg) → семантические векторы, лица и текст (ИИ-сервис) → обратное геокодирование.
  • Индикатор фоновых задач вверху боковой панели показывает в штуках фото прогресс и оставшееся время для «Импорт фото» и «Распознавание ИИ».

Просмотр, поиск и упорядочивание#

ФункцияОписание
ФототекаХронология фото по месяцам, вверху — карусель выбора ИИ и «В этот день».
Поиск на естественном языкеВведите описание (например, «фото с третьего дня рождения малыша»); результаты ранжируются по распознанному тексту, месту съёмки и семантическому сходству Chinese-CLIP. Название категории сразу возвращает эту категорию.
ЛюдиЛица группируются автоматически; человек появляется в списке, если он есть хотя бы на 3 фото. Можно давать имена, объединять, указывать день рождения и смотреть взросление по возрасту, места и общие фото.
Альбомы · Умные альбомыВ альбомы фото добавляются вручную, альбом можно сделать личным; умные альбомы собирают фото сами по людям, местам, времени и другим условиям.
МестаПоказывает места съёмки на карте по GPS, с видами «Карта», «Спутник» и «Сетка».
Серии и похожиеАвтоматически группирует серии и похожие фото и рекомендует лучший кадр; в «Дубликатах» — файлы с одинаковым содержимым.
Слайд-шоуМожно запускать для фототеки, альбомов, людей и воспоминаний; вертикальные фото объединяются по два-три на кадр, есть фоновая музыка и переходы.

Участники и права#

РольПрава
АдминистраторДобавляет и удаляет участников, сбрасывает их пароли, меняет системные настройки; может удалить любое фото.
УчастникЗагружает, просматривает и упорядочивает фото; удаляет только свои загрузки; не может менять системные настройки.
ГостьПри включённом гостевом доступе посетители без входа могут только смотреть общий контент; личные альбомы и скрытые фото не видны.

Сведения о людях (имена, объединения) общие для всех участников; число фото, обложки и страницы людей считаются по фото, которые видит конкретный участник, а скрытые фото видит только владелец.

Руководство · Системные настройки

Участники и история входов#

  • Участники: при добавлении задаются имя, начальный пароль (не короче 4 символов) и роль; пароль участника можно сбросить, а самого участника — удалить.
  • История входов: записываются время, устройство и IP каждого входа, местоположение оценивается по IP без интернета (ip2region), хранятся последние полгода. Видна только администраторам.
  • В разделе «Моя учётная запись» каждый участник может сменить пароль и аватар и посмотреть устройства, на которых выполнен вход.

Настройки ИИ#

ПараметрВариантыОписание
Режим работы ИИВстроенный (только CPU) / Удалённый сервисДля удалённого сервиса нужны адрес и токен, перед переключением проверяется соединение; пока сервис недоступен, обработка ИИ приостановлена.
Вычислительное устройствоАвто / GPU / Только CPUБез подходящей видеокарты доступен только CPU; при переключении модели перезагружаются, а текущая обработка ИИ вскоре продолжается.
Уровень моделейАвто / Высокая точность / Сбалансированный / ЛёгкийПосле смены все фото обрабатываются новыми моделями заново, прогресс отображается.
Управление моделямиЗагрузить / УдалитьПоказывает размер и состояние каждой модели (используется, загружена, не загружена).

Производительность и ресурсы#

ПараметрВариантыОписание
Время обработкиВ простое / Всегда / НочьюВ простое: обработка ИИ приостанавливается во время загрузок и создания миниатюр; Всегда: обработка идёт постоянно, загрузки могут замедлиться; Ночью: только в заданные часы.
Параллельная обработка фотоЧислоСколько фото одновременно читается и получает миниатюры; по умолчанию считается по ядрам и памяти.
Параллельная обработка ИИЧислоСколько фото одновременно отправляется в ИИ-сервис.
Потоки CPUЧислоСколько потоков CPU использует каждая модель при инференсе.

Вверху карточки в реальном времени показывается состояние ИИ (работает или причина паузы). Изменения применяются сразу, без перезапуска.

Хранилище, гости, карты и домен#

ПараметрПо умолчаниюОписание
Каталог загрузокdata/uploadЗагруженные файлы раскладываются по годам и месяцам; изменение влияет только на новые загрузки.
Гостевой доступВкл.Позволяет смотреть общий контент без входа. При доступе из интернета лучше отключить.
Онлайн-картыВкл.Показывает карты, названия мест и поиск по местам, отправляя координаты фото картографическому сервису; если выключено — только координаты.
Источник картАвтоАвто: AMap в материковом Китае, OpenStreetMap в остальных регионах; можно закрепить один из них.
Домен доступаwanmory.localДомен для доступа в локальной сети; должен оканчиваться на .local.

Обновление системы#

«Системные настройки → Обновление системы» показывает текущие версии бэкенда и ИИ-сервиса и сообщает о новых. Для обновления выполните в каталоге с docker-compose.yml:

bash
docker compose pull && docker compose up -d

Миграции базы данных выполняются автоматически при запуске server. Если версия закреплена через WANMORY_VERSION, сначала измените тег в .env.

Обслуживание

Резервное копирование и восстановление#

Резервировать нужно три вида данных:

ДанныеГдеОписание
База данныхименованный том pgdataМетаданные фото, люди, альбомы, настройки, векторы и очередь задач.
Загрузки и миниатюры./dataЗагруженные оригиналы (data/upload) и миниатюры (data/thumbs); миниатюры можно создать заново.
Папки с фотопапки, подключённые в /photosЗащищаются собственным резервным копированием NAS; приложение не меняет папки, подключённые только для чтения.
bash
# Выгрузить базу данных
docker compose exec -T postgres pg_dump -U wanmory -Fc wanmory > wanmory-$(date +%F).dump
# Восстановить в новую установку (сначала docker compose up -d postgres)
docker compose exec -T postgres pg_restore -U wanmory -d wanmory --clean < wanmory-2026-11-10.dump
Файлы моделей в ./models резервировать не нужно — их можно снова загрузить из веб-приложения.

Сброс пароля администратора#

Если участник забыл пароль, администратор сбрасывает его в «Системные настройки → Участники». Если пароль забыл сам администратор, выполните на хосте с приложением, в каталоге с docker-compose.yml:

bash
docker compose exec server wanmory reset-password # показать учётные записи и выбрать
docker compose exec server wanmory reset-password <имя> # указать учётную запись сразу
  • Команда выводит все учётные записи (имя, роль, дата создания, последний вход); выберите номер и дважды введите новый пароль.
  • После сброса учётная запись выходит из системы на всех устройствах; фото и альбомы не затрагиваются.
  • Сделать это можно только на хосте, в веб-приложении такой возможности нет. Без Docker запустите wanmory reset-password с теми же переменными окружения, что и сервер, например DATABASE_URL.

Устранение неполадок#

СимптомЧто проверить
Не открывается wanmory.localУбедитесь, что сервис mdns работает (docker compose ps); некоторые Android не поддерживают mDNS — используйте IP; проверьте, не занят ли порт 5353 на хосте.
В настройках ИИ «Нет соединения, обработка ИИ приостановлена»Во встроенном режиме посмотрите журнал контейнера ml (docker compose logs ml); в удалённом — проверьте, совпадают ли адрес, порт, файрвол и токен.
Нет результатов в «Людях» или поискеУбедитесь, что модели загружены; в «Производительности» проверьте, не приостановлен ли ИИ настройкой времени обработки; посмотрите прогресс распознавания в индикаторе задач.
Не загружаются большие файлыСлишком маленький лимит размера запроса на обратном прокси; настройте client_max_body_size, как в разделе «Обратный прокси и доступ из интернета».
Не появляются фото из подключённой папкиПапки нужно подключать подкаталогами /photos; первое сканирование — примерно через 20 секунд после запуска, затем каждые 15 минут; скрытые каталоги пропускаются.
Образы загружаются медленно или не загружаютсяУкажите в .env WANMORY_REGISTRY с доступным реестром.

Журналы сервисов: docker compose logs -f server и docker compose logs -f ml. Если проблема не решается, напишите нам на странице Сообщить о проблеме, указав версию и приложив нужные журналы.

Удаление#

Запустите скрипт удаления на хосте, где работает Wanmory:

bash
curl -fsSL https://wanmory.com/uninstall.sh | bash

Скрипт сначала читает .env в каталоге установки и показывает контейнеры, базу данных, каталог данных, модели ИИ и занимаемое ими место, а также подключённые папки с фото. Затем останавливает и удаляет контейнеры и сеть и по каждому пункту спрашивает, удалять ли его (по умолчанию всё сохраняется):

ПунктОписание
База данныхТом Docker pgdata или каталог из WANMORY_DB_DIR. После удаления люди, альбомы, настройки и результаты ИИ не восстанавливаются.
Каталог данныхМиниатюры, превью и исходные фото, загруженные через веб-приложение.
Модели ИИПосле переустановки их можно снова загрузить из веб-приложения.
Образы DockerВключая образ postgres/pgvector; их можно скачать снова. Образы, используемые другими контейнерами, не удаляются.
Файлы конфигурации.env (с паролем базы данных), docker-compose.yml и docker-compose.override.yml; опустевший каталог удаляется вместе с ними.
  • Подключённые папки с фото (NAS, внешние диски) никогда не удаляются.
  • Для удаления базы данных или каталога данных нужно подтвердить действие вводом DELETE.
  • Если удалить только контейнеры и сохранить данные, повторный запуск install.sh в том же каталоге вернёт всё как было; если удаляете .env, но оставляете базу данных, сначала запишите указанный в нём WANMORY_DB_PASSWORD.
ПараметрОписание
--dir КАТАЛОГЗадать каталог установки; по умолчанию ~/wanmory.
-yБез вопросов: удалить только контейнеры и сеть, сохранив все данные и конфигурацию.
--purgeБез вопросов: удалить все пункты таблицы выше (кроме папок с фото).
--dry-runТолько показать, что будет сделано, ничего не меняя.