• Stars
    star
    202
  • Rank 193,691 (Top 4 %)
  • Language
    C#
  • License
    MIT License
  • Created about 7 years ago
  • Updated 5 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Self-hosted family wiki engine / photoalbum

Bonsai

Фамильный вики-движок и фотоальбом.

Демо: попробовать в действии

Возможности

  • Страницы с разметкой Markdown
  • Медиа-файлы: фото, видео, планируется поддержка документов PDF
  • Отметки людей на фото
  • Родственные связи (с проверками и автоматическим выводом)
  • Факты (дата рождения, пол, группа крови, владение языками, хобби, и так далее)
  • Контроль доступа по ролям: администратор, редактор, читатель, гость
  • История правок: для любой страницы или медиа-файла хранится история с diff'ами и возможностью отката к предыдущей версии

Скриншоты

Публичные страницы:

Панель администратора:

Установка с помощью Docker

  1. Скачайте файл docker-compose.

  2. Опционально:

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

    Создайте приложение авторизации Google (или Yandex, Вконтакте).

    Отредактируйте файл docker-compose.yml:

    • Впишите данные для авторизации Google в поля Auth__Google__ClientId и Auth__Google__ClientSecret
    • Задайте настройку Auth__AllowPasswordAuth=false если хотите отключить менее безопасную авторизацию по паролю
    • Замените заглушку @@YOUR_EMAIL@@ на свой адрес email (для автоматической генерации HTTPS-сертификата LetsEncrypt)
    • Замените заглушку @@DOMAIN@@ на доменное имя (если у вас только IP-адрес, используйте nip.io, например 192.168.1.1.nip.io)
    • Разкомментируйте две строки с Host(`@@DOMAIN@@`)
    • Закомментируйте две строки с PathPrefix(`/`)
  3. Запустите все контейнеры с помощью docker compose:

    docker-compose up -d
    
  4. После старта Bonsai будет доступен на портах 80 и 443.

Разработка (на Windows)

Для участия в разработке понадобится:

  • .NET 7: основной рантайм для Bonsai
  1. Установите NodeJS 14
  2. Установите PostgreSQL server 9.6
  3. Скачайте shared-сборку ffmpeg для вашей операционной системы и извлеките данные в папку External/ffmpeg в корне проекта (необходимы исполняемые файлы ffmpeg и ffprobe).
  4. Создайте файл appsettings.Development.json, пропишите строку подключения к БД:
  {
    "ConnectionStrings": {
      "Database": "Server=127.0.0.1;Port=5432;Database=bonsai;User Id=<login>;Password=<password>;Persist Security Info=true"
    },
    "Auth": {
      "AllowPasswordAuth": true
    } 
  }
  1. Опционально, но рекомендуемо:

    Создайте приложение авторизации Google (или Yandex, Вконтакте).

    Впишите данные для авторизации в файл appsettings.Development.json и установите свойство AllowPasswordAuth в значение false:

    {
      "Auth": {
        "AllowPasswordAuth": false,
        "Google": {
          "ClientId": "<...>",
          "ClientSecret": "<...>" 
        },
        "Yandex": {
          "ClientId": "<...>",
          "ClientSecret": "<...>" 
        },
        "Vkontakte": {
          "ClientId": "<...>",
          "ClientSecret": "<...>" 
        }
      }
    }
    
  2. Создайте базу данных:

    dotnet ef database update
    
  3. Запустите сборку стилей и скриптов:

    npm install
    npm run build
    
  4. Запустите приложение (из Visual Studio или через dotnet run).

Безопасность

Резервные копии данных

Если вам ценна информация, которую вы заносите в Bonsai, обязательно НАСТРОЙТЕ РЕЗЕРВНОЕ КОПИРОВАНИЕ.

Копировать необходимо следующие данные:

  • Базу данных (десятки мегабайт)
  • Загруженные медиа-файлы в папке wwwroot/media (могут быть гигабайты)

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

Способы авторизации

Bonsai поддерживает 2 метода авторизации: OAuth с использованием внешних сайтов и авторизация по паролю.

OAuth является предпочтительным: он проще для пользователей, более безопасный и универсальный. Если можете, используйте его! Для этого вам потребуется создать приложение авторизации на сайте Google, ВКонтакте или в Яндексе, как написано в инструкции. Можно подключить несколько авторизационных приложений одновременно - пользователи смогут выбирать из них то, которое им больше по душе.

Также вы можете создать учетную запись с авторизацией по логину и паролю. Она пригодится в двух случаях:

  • Быстро попробовать Bonsai в действии (установка без создания приложений значительно быстрее)
  • Дать доступ родственникам, которые не зарегистрированы в соцсетях

Несколько фактов об авторизации, которые стоит иметь в виду:

  • У одной учетной записи может быть только один способ авторизации: или пароль, или Google, или Вконтакте, и т.д.
  • После создания учетной записи поменять тип авторизации нельзя.
  • Учетные записи с авторизацией по паролю автоматически блокируются, если пароль был введен неверно слишком много раз подряд.
  • Пароль может сменить только администратор вручную. Если у вас только одна учетная запись администратора и вы забыли от нее пароль - восстановить доступ можно только с помощью манипуляций с базой данных!

Авторизация через Facebook

С лета 2021 года Facebook поменял правила пользования авторизационными приложениями. Приложение должно периодически проходить ручную модерацию, для чего администратор Bonsai должен создать специальную учетную запись и предоставить данные от нее в Facebook. Данный способ имеет смысл на публичных сервисах с автоматической регистрацией, но в контексте Bonsai противоречит основной идее: хранимые данные о семье не должны быть доступны третьим лицам. В связи с этим авторизация через Facebook больше не поддерживается.

Существующие учетные записи, привязанные к Facebook, необходимо перевести в тип "авторизация по паролю" с помощью SQL-скрипта:

UPDATE "public"."AspNetUsers"
SET
  "PasswordHash" = 'AQAAAAEAACcQAAAAEOKtY+Y/P0WYToOv6fhFyQKDRj8ZBPbZBNX72ilP9a9jsrk+MsX2L0Q1FVUFkbQ7SQ==',
  "SecurityStamp" = 'OFYAMDMHVW5CK5Y3W6OJIKQX4INUIZC2',
  "AuthType" = 1
WHERE
  "Email" = '<EMAIL>'