Павел Гастелло

Нейрослоп о том, о сём

Эгея в Docker

«Эгея» — это, пожалуй, самый самобытный блоговый движок в рунете, созданный дизайнером Ильей Бирманом. Он пропитан философией автора: движок сам заботится о типографике, аккуратно расставляет изображения и создает ощущение дорогого бумажного издания. Однако эта «заботливость» имеет обратную сторону — жёсткие рамки и технологический консерватизм. Своего рода компромисс между эстетикой и функциональностью. Современного пользователя может озадачить отсутствие поддержки Markdown и (или) полноценного WYSIWYG-редактора, что делает процесс оформления постов специфическим ритуалом, к которому нужно привыкнуть.

До Эгеи мне импонировал Writefreely — минималистичный движок с поддержкой ActivityPub, но он тоже не без нюансов, хранение картинок для блога пришлось бы размещать вне платформы. Но это так, лирическое отступление. Оба эти проекта объединяет один большой недостаток — нет официального Docker контейнера. И тут на помощь пришли сторонние ментейнеры: для Writefreely это algernon/writefreely, а для Эгеи недавно появившийся ahton/egeya (спасибо тебе добрый человек!). Вот на последнем и остановимся.

Образ ahton/egeya:11.4.4171 без проблем заводится на Synology вот с такими параметрами:

Если запуск происходит не на Synology, то команда будет выглядеть примерно как-то так:

docker run -d \
  --name egeya \
  -p 8080:80 \
  -v egeya/audio:/var/www/html/audio \
  -v egeya/pictures:/var/www/html/pictures \
  -v egeya/user:/var/www/html/user \
  -v egeya/video:/var/www/html/video \
  ahton/egeya:11.4.4171

Никаких переменных окружения заполнять не надо, но нужна предварительно установленная база данных MySQL (5.6 и выше) или MariaDB (10.1 и выше). Настраиваем обратный прокси на выбранный вами порт, переходим по адресу и вуаля, оно работает.

В заключении могу порекомендовать скрипт на Python, конвертирущий Markdown в разметку понятную Эгее. Сбережёт немножечко нервов и сэкономит время, если текст будет набираться в сторонних редакторах.

Установка Bluesky PDS на Synology

Пролог

Что такое Bluesky? Это децентрализованная социальная сеть для микроблогинга, созданная как альтернатива X (ex-Twitter). Bluesky PDS (Personal Data Server) — персональный сервер данных, личный «узел» в сети Bluesky на базе AT Protocol. Он хранит посты, подписки и профили пользователей, позволяя им контролировать свои данные и взаимодействовать с другими серверами сети.

Не хочется размусоливать тему зачем нужно размещать у себя «полудецентрализованный» Bluesky, вместо замечательных и многообразных fediverse проектов. Для меня лично это экономия ресурсов на не так уж и мощном NAS, плюс наличие интересных мне аккаунтов типа Eric Migicovsky или крупных брендов таких как Xbox.

Подготовка

Будем исходить из того, что у нас уже есть зарегистрированное доменное имя, PDS мы будем размещать на субдомене social.example.com, а псевдонимом Bluesky у нас будет корневое имя домена example.com. В настройках у регистратора домена нужно прописать эти A записи:

Name Type TTL Value
example.com A 600 12.34.56.78
social.example.com A 600 12.34.56.78


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

Name Type TTL Value
example.com A 600 12.34.56.78
social.example.com A 600 12.34.56.78
username1.example.com A 600 12.34.56.78
username2.example.com A 600 12.34.56.78

Страницу управления доменом не закрываем, после установки она нам ещё пригодится.

Переходим к Synology. В Настройки — Безопасность — Сертификат для всего вышеописанного получаем сертификат Let’s Encrypt.

Предположим, что папка общего доступа с именем docker у нас уже существует. В ней создаём ещё одну и называем её bluesky.
Дальше идём в Панель управления — Портал для входа — Дополнительно — Обратный прокси — Создать

Источник
Имя обратного прокси — Bluesky
Протокол — HTTPS
Имя хоста — social.example.com
Порт — 443
Включить HSTS — Включить

Место назначения
Протокол — HTTP
Имя хоста — 127.0.0.1
Порт — 3000

Во вкладке Пользовательский заголовок нужно добавить WebSocket. Всё тоже самое проделываем ещё и с корневым доменом (либо субдоменами, если пользователей несколько).

Запускаем службу SSH, если она отключена и подключаемся к Synology

Скачиваем образ Bluesky-PDS.

sudo docker pull ghcr.io/bluesky-social/pds:latest

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

echo PDS_ADMIN_PASSWORD: $(openssl rand --hex 16)

echo PDS_JWT_SECRET: $(openssl rand --hex 16)

echo PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX: $(openssl ecparam --name secp256k1 --genkey --noout --outform DER | tail --bytes=+8 | head --bytes=32 | xxd --plain --cols 32)

Установка

В Container Manager на вкладке Образ находим ghcr.io/bluesky-social/pds и запускаем его. Имя контейнера произвольно, я выбрал bluesky-pds. Жмём Далее.

Локальный порт — 3000. Добавляем ранее созданную папку, с привязкой к /pds

Переменные добавляем по этому списку. Здесь менять ничего не надо. Если только значение PDS_BLOB_UPLOAD_LIMIT, это лимит загрузки в байтах. Здесь он ограничен 100МБ.

PDS_DATA_DIRECTORY /pds
PDS_BLOBSTORE_DISK_LOCATION /pds/blocks
PDS_BLOB_UPLOAD_LIMIT 104857600
PDS_DID_PLC_URL https://plc.directory
PDS_BSKY_APP_VIEW_URL https://api.bsky.app
PDS_BSKY_APP_VIEW_DID did:web:api.bsky.app
PDS_REPORT_SERVICE_URL https://mod.bsky.app
PDS_REPORT_SERVICE_DID did:plc:ar7c4by46qjdydhdevvrndac
PDS_CRAWLERS https://bsky.network
LOG_ENABLED false


А вот здесь первые три параметра переносим из блокнота, четвёртый — наше имя домена узла Bluesky PDS (не аккаунта).

PDS_JWT_SECRET см. блокнот
PDS_ADMIN_PASSWORD см. блокнот
PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX см. блокнот
PDS_HOSTNAME social.example.com


Последние два ниже отвечают за отправку Email, подробнее почитать можно на GitHub. Не сказал бы, что это обязательные переменные, так как ничего кроме подтверждения почты аккаунта полезного они не делают. Писем с действиями учётных записей к сожалению, по крайней мере, пока нет. В любом случае, через копию контейнера эти переменные можно добавить и потом.

PDS_EMAIL_SMTP_URL smtps://login:password@smtp.mailserver.com:465/
PDS_EMAIL_FROM_ADDRESS bluesky@mailserver.com

Запускаем!

Полировка

Создаём аккаунт

sudo docker exec <имя контейнера> goat pds admin account create --admin-password <PDS_ADMIN_PASSWORD> --handle username.example.com --email email@mail.com --password new-password

где:

—admin-password PDS_ADMIN_PASSWORD из блокнота
—handle псевдоним
—email действующий почтовый ящик
—password пароль от аккаунта


При желании можно создать инвайт-код для регистрации аккаунтов, но уже из приложения

sudo docker exec <имя контейнера> goat pds admin --admin-password <PDS_ADMIN_PASSWORD> create-invites

И финальный штрих. Логинимся в приложение или на bsky.app если был первый вариант, регистрируемся с инвайтом если второй. Заходим в Настройки — Учётная запись — Псевдоним — У меня есть собственный домен. Там будут настройки для DNS. Если псевдоним будет корневым доменом, то у регистратора прописываем, что-то типа того:

Name Type TTL Value
_atproto. TEXT 600 «did=did:plc:pLq8mLPrDdSy2hfpnwshcmz4»


А если субдоменом(ами), то как-то так

Name Type TTL Value
_atproto.username1 TEXT 600 «did=did:plc:LLsdgL7Y3BSW73gVvzRQ5Crp»
_atproto.username2 TEXT 600 «did=did:plc:V4e3Amj4Zu8BvPB3hXw236GU»


Вот собственно и всё.

И не забудь подписаться на меня, username!