ZeroNet Blogs

Static ZeroNet blogs mirror

Infonesy.Blog

Мысли по проекту децентрализованной социальной системы. И вообще по p2p-социальным сетям.

PixelFed

- Posted in Infonesy.Blog by with comments

Опять немного сегодня поковырялся с PixelFed (кто пропустил — это ранняя альфа федеративной фотогалереи на ActivePub). Сумел зарегистрироваться и запостить пару картинок. Но у Laravel какое-то полное безумие с определением HTTPS и роутингом. Я уже как только потроха вручную не патчил (перепробовав все штатные нагугленные методы), но до сих пор дофига ресурсов пытается грузиться по http, из-за чего на https-страница не работает. Не понимаю, как можно было нагородить такую кривь.

2018-10-23_19-40-21.jpg (977x507)

IPFS-cluster

- Posted in Infonesy.Blog by with comments

Я уже несколько раз писал про сабж. Пора вынести в отдельную заметку. Основная идея проста и изящна — связываем несколько IPFS-нод воедино инструментом распределения pin'ов. Чтобы можно было пинить файлы на разных нодах и они с нужными параметрами реплицировались на других узлах кластера.

Главная проблема была и есть в том, что IPFS-кластер, вешается на все доступные интерфейсы и это никак не регулируется. На жирном сервере с полудюжиной LXC и десятком-других Docker'ов IPFS-кластер получает эти же десятки адресов. Он их передаёт другим участникам кластера. Они потом безрезультатно пытаются достучаться до других узлов по липовым адресам и, через небольшой период времени, не достигнув успеха, завершают работу не найдя других участников.

Проблему удалось побороть, сделав Restart=always в  ipfs-cluster.service. Теперь нода, даже вылетая, перезапускается снова и снова, пока, наконец, не достучится хоть до кого-то. Через некоторое время кластер благополучно собирается и работает уже безотказно :)

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

И об атмосфере

- Posted in Infonesy.Blog by with comments

Во! Кто-то помнит, может, как я в прошлом году писал про типичную аудиторию разных распределённых соцсетей. Писал я и про агрессивных пацифистов в SSB Patchwork. На днях снова начал щупать этот движок, что там поменялось и запостил сегодня в #military фотки МиГ-31. Реакция мгновенная: Blocked [мой ID] for glorifying the military :)

New blog post

- Posted in Infonesy.Blog by with comments

Blog post body

И об атмосфере

- Posted in Infonesy.Blog by with comments

Во! Кто-то помнит, может, как я в прошлом году писал про типичную аудиторию разных распределённых соцсетей. Писал я и про агрессивных пацифистов в SSB Patchwork. На днях снова начал щупать этот движок, что там поменялось и запостил сегодня в #military фотки МиГ-31. Реакция мгновенная: Blocked [мой ID] for glorifying the military :)

Скрипт из командной строки принимает имя файла или ссылку на файл, если нужно, делает превью 800x, кладёт всё в IPFS и даёт Markdown-код итоговой картинки.

Пример:

┌─( ✔ 11:36:07 +00:00:07.498):~/Изображения/Export/экспорт-1511-4
└balancer@home-server─> ipfs-add-md 20140519-1729-img_8955.jpg
[![](https://gateway.ipfs.io/ipfs/QmezLi4DX7z5wYGP1VWUiamJFcdGiraHLvVKL4fNPFAoif/20140519-1729-img_8955-800x.jpg)](https://gateway.ipfs.io/ipfs/QmbhCfcffn5Ub8SBcA6Te8sPrbqFHZaEn5bXgxabECnYLb/20140519-1729-img_8955.jpg)

Результат:


#!/bin/bash

SWARM=`ipfs swarm peers`
#GATE=https://gw-ipfs.tk/ipfs
GATE=https://gateway.ipfs.io/ipfs

if [[ ! $SWARM ]]; then
        echo "IPFS not running"
        exit
fi

if [[ "$1" =~ ^https?: ]]; then
    BASE=$(basename "$1")
    EXT="${BASE##*.}"
    FILE=$(tempfile --suffix=.$EXT)
    wget -q "$1" -O "$FILE"
    UNLINK=1
else
    FILE="$1"
    UNLINK=0
fi

BASENAME=`basename "$FILE"`

ID=$(ipfs add -qw "$FILE" | tail -n1)

WIDTH=`identify -format %W "$FILE"`
ID=$(ipfs add -qw "$FILE" | tail -n1)

if [[ "$ID" != "" ]]; then
        echo $ID > /var/sync/Infonesy/Infonesy-balancer-commands/pin-add-$ID
fi

if [[ $WIDTH -gt 800 ]]; then
        THUMB="$(echo "$FILE" | sed -re 's/(\.[a-z]+)$/-800x\1/i')"

        if [[ "$THUMB" == "$FILE" ]]; then
                echo Can not get thumbnail name for $FILE
                exit
        fi

        convert "$FILE" -geometry 800x "$THUMB"

        THUMB_ID=$(ipfs add -qw "$THUMB" | tail -n1)

        echo "[![]($GATE/${THUMB_ID}/`basename "$THUMB"`)]($GATE/${ID}/${BASENAME})"

        if [[ "$THUMB_ID" != "" ]]; then
                echo $THUMB_ID > /var/sync/Infonesy/Infonesy-balancer-commands/pin-add-$THUMB_ID
        fi

        unlink "$THUMB"
else
        echo "![]($GATE/${ID}/${BASENAME})"
fi

if [[ "$UNLINK" == "1" ]]; then
    unlink "$FILE"
fi

У нас было 2 мешка травы, 75 таблеток мескалина, 5 марок мощнейшей кислоты, полсолонки кокаина и гора возбудителей, успокоительных и всего такого, всех цветов, а ещё литр текилы, литр рома, ящик пива, пол-литра эфира и две дюжины амила. Не то, чтобы это всё было нужно в поездке, но раз начал коллекционировать наркоту, то иди в своём увлечении до конца. Единственное, что меня беспокоило — это эфир. В мире нет никого более беспомощного, безответственного и безнравственного, чем человек в эфирном запое. И я знал, что довольно скоро мы в это окунёмся.

Как я ранее писал, разочарование в IPFS заставило искать иные способы георепликации. Плюс к этому — глюки Cloudflare, из-за которых пришлось отказаться от их кеширования, что привело к росту нагрузки на сервер и необходимости растаскивать нагрузку по нескольким серверам. Очевидное решение — Round Robin DNS. Но вылезает несколько мелких проблем:

  • Файлы, которые аплоадятся только на одну ноду, не появляются мгновенно на других при использовании любых средств синхронизации.
  • Автоматика получения и обновления сертификатов Let's Encrypt на Round Robin начинает буксовать.

Итак, у нас было три сервера:


  • Быстрый, основной, на Hetzner, с древними HDD, которых не хватает на высокую нагрузку
  • Быстрый, новый, на Scaleway. С SSD, но с малым объёмом диска, куда все аттачи тупо не влезут.
  • Тормозной, очень медленный VPS у Time4VPS, но с самым дешёвым терабайтом места.

​​​​​​​тут я замечу, что это [пока ещё?] не статья с точными инструкциями, а что-то типа блог-записи с мыслями. Может быть, со временем, доведу и до уровня статьи.

Задача.

Это позволит раскидать нагрузку по разным серверам и задействовать Round Robin DNS, когда одному доменному имени отвечают несколько IP.

Это решается, конечно, элементарно. Например, на NginX:

location ~ ^/forums/attaches/(\w\w/\w\w.*)$ {
    rewrite ^/forums/attaches/(\w\w/\w\w.*)$ <https://archive.attaches.forums.a0z.ru/$1> permanent;
}

location ~ ^/forums/attaches/((\d\d\d\d).*)$ {
    rewrite ^/forums/attaches/(\d\d\d\d)/(.+)$ <https://$1.f.a0z.ru/$2> permanent;
}

Вот дальше было хитрее.

Во-первых, синхронизация файлов между серверами. Я задействовал для этого Syncthing. Хотя он и тормозит при пересканировании, но его можно поставить очень редким (оставив свежее обновление по syncthing-inotify).

Во-вторых, syncthing даже при хорошей работе срабатывает не мгновенно. Задержка синхронизации бывает от секунд до десятков секунд. В это время обращения к серверам, куда файл ещё не пришёл, будет возвращать 404-ю ошибку.

Это проблему я решил NginX-проксированием на вторичных серверах. Если файл существует, то он показывается. Если нет, то идёт прокси-запрос к мастер-серверу:

server_name 2018.f.a0z.ru;
location / {
# ...
    try_files $uri @htz;
}

location @htz {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_pass <http://htz.wrk.ru;>
}

# ...

Таким образом, с любого вторичного сервера файл доступе даже когда синхронизация ещё не произошла.

Дальше — вопрос сертификата Let's Encrypt при использовании Round Robin DNS. Тут пришлось много возиться и экспериментировать. Я опущу все промежуточные проблемы и эксперименты и поделюсь итоговым решением.

На всех вторичных серверах нужно направить запросы с подкаталогу /.well-known/acme-challenge на мастер-сервер:

location /.well-known/acme-challenge/ {
    proxy_set_header    Host                $host;
    proxy_pass          <http://htz.wrk.ru;>
}

На мастер-сервере отправляем отдачу этого подкаталога из конкретного места сервера:

location ^~ /.well-known/acme-challenge/ {
    default_type "text/plain";
    root /var/www/html/letsencrypt;
}

Прописываем этот путь в настройках /etc/letsencrypt/cli.ini:

authenticator = webroot
webroot-path = /var/www/html/letsencrypt
post-hook = service nginx reload
text = True

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

./certbot-auto certonly -d 2016.f.a0z.ru

(продолжение следует)

Продолжая тему Проблемы с IPFS.

Разочарован :-/

Сделал несколько экспериментов по раздаче сколь-нибудь больших репозиториев (десятки гигабайт) и не смог обуздать аппетиты к памяти и процессору. Сервер, типа 32Гб оперативки и i7-4770 начинает жрать LA больше 20, всё тормозит:

load-week-ipfs-on.png (497x280)

cpu-week-ipfs-on.png (497x376)

Придётся искать для синхронизации файлов в Infonesy более традиционные методы :-/

Update 2018-2401:

anotherneko: Оно течет, если рестаровать периодически то более-менее юзабельно.

Оно само крешиться и перезапускается, если память в контейнере урезать (зелёненькое):

docker_memory-day.png (497x424)

Увы, всё равно жрёт ресурсов чрезмерно по отношению к отдаче. При чём когда-то давно раньше такого явно не было. Хоть экспериментируй с откатами на старые версии :)

Проблемы с IPFS

- Posted in Infonesy.Blog by with comments

IPFS в последнее время что-то совсем вразнос пошла. Сперва памяти стала жрать как не в себя. При чём в нескольких версиях, в последних из которых прямо пишут, что уменьшили потребление памяти. Ага, щаз, на машине с 16Гб мгновенно выжирает 8Гб. На VPS с 1Гб выжирает 700Мб, отправляя в аут MySQL и PHP. Ладно, эту проблему решил, засунув Docker-конейнер. Теперь на одном из серверов (VPS, 2Гб) и только на нём непрерывно занимается дисковым чтением на 50..100Мб/с. При чём в сеть это всё не идёт, сетевой трафик измеряется десятками килобайт в секунду. Думал, сперва, мало ли, переиндексация какая-то или оптимизация — но нет, уже половина дня прошла...

Затравка, буду понемногу расширять запись в рамках подхода «блоги как сайты».

Mastodon

Много японских (и японоговорящих) анимешников. Говорят, таким способом уходят от японских возможных проблем с законом.

RetroShare

Огромная масса параноиков. Каждый второй обвиняет друг друга в работе на ФСБ. Каждое четвёртое сообщение заканчивается припиской «товарищ майор, перелогиньтесь». Очень много мата и ругани. Правда, там есть функция игнора и после зачистки самых агрессивных пользователей, сеть становится заметно чище. Но и почти мёртвой. Хотя, поскольку это сеть f2f, можно формировать собственные круги друзей, «только для своих».

SSB Patchwork

Пользуюсь сетью мало. Но когда начал там размещать фотографии боевых самолётов, получил лёгкий наезд в духе «зачем Вы тут постите фотографии оружия — оно убивает людей, это не этично!». Иных, более активных конфликтов или культурных особенностей пока не встречал.

Update 2018-09-30: почти год спустя полез посмотреть, чем живёт сеть. Запостил фотки МиГ-31 в #military. Реакция мгновенная: Blocked [мой ID] for glorifying the military :)

Позже метко охарактеризовал аудиторию товарищ StaLeg @BVc+1q3069UJ/CWqM7w41E6qE9gnCd/ka5K1T7dtnYY=.ed25519: «Здесь, в ссб, в основном соларпанки и природолюбы, а ще паще технари». Действительно, я это заметил, но не сформулировал в голове классификацию. Очень «зелёная» публика :)

ZeroNet

Аудитория в целом очень усреднённая, без заметных перекосов. Почему лично я её и предпочитаю :) В основном относительно культурный IT-шный контингент, чем-то похоже на старое FIDO. Исключение — очень много китайцев. Похоже, для них это хороший способ выбраться за GFW. Ну и их просто в абсолютных числах много. Вот у них с технической культурой не очень. Например, они так и не восприняли идею, что заводить в общем англоязычном ZeroTalk массовые темы на китайском — не хорошо :)

Ссылки