created ... ago
updated ... ago
#project
#archive

Создание api.snlx.net

Требования

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

Сейчас в процессе публикации заметок слишком много трения, поэтому и получается, что я и обновляю сайт раз в 500 лет. Цель этого проекта - избавиться от этого трения самым простым способом, т.е.

  1. прийти к единой системе для всех заметок и документов, см. ru-why-obsi
  2. доделать свои инструменты для этой системы

Самый простой набор своих инструментов, который я смог придумать

  1. мост для obsidian для загрузки публичных заметок на github и закрытых на мой сервер, см. mk-bridge
  2. сервер для хранения этих самых закрытых заметок, подробнее ниже

Основное требование к серверу - простота, поэтому он должен

Управляющее приложение должно

Эндпоинты

Обновления статуса это карточка с "Currently..." на главной странице (ну когда я её доделаю).

Подробнее про сервер как бэкап: он им как бы является, но как бы нет. Он хранит копию obsidian vault'а, но удаляет её при перезагрузке и не должен отличаться от других устройств (перезагрузки гарантируют это).

Подробнее про GET /file?id=...: UI для этого это https://snlx.net/secret. Захóдите на страницу, вводите UUID закрытой заметки, страница идёт на сервер, запрашивает оттуда кучу HTML'а, он может содержать ссылки на другие закрытые файлы, которые тогда тоже доступны Вам. Это всё нужно для того, чтобы я мог делать заметки для работы и универа доступными им, но при этом не публичными.

Создание проекта

Я хотел использовать gleam, но для сборки и запуска ему нужны:

И сборка происходит в несколько команд. Я хотел простую систему, поэтому остановлюсь вместо этого на deno. Основное, что я теряю, это масштабируемость, но сейчас у меня 0 пользователей, так что это не проблема. Вместо того, чтобы оптимизировать под будущее, которое может не наступить, делаем простую штуку, которая будет работает сейчас.

Deno.serve достаточно приятно использовать для простых проектов вроде этого, я сделал auth очень быстро. На сервере не будет SSH, так что нужно придумать удобный способ вытащить из него ключ API. Один из вариантов это сделать - сгенерить для ключа QR код, вывести его в терминал и отсканировать оттуда. Для deno достаточно моного библиотек, которые могут это делать, я просто взял первую попавшуюся, которая нормально работала.

С загрузкой файлов было веселее, потому что я долго не мог понять, может ли

Потом, чтобы это протестировать, я сделал для него UI (на который потратил слишком много времени).

Куда делось полдня?

Я изначально вообще не планировал делать UI, но... https://api.snlx.net делает отладку чуть удобнее.

Вечер 2026-01-06 - обновление

Сам сервер готов, но я его ещё не деплоил. Попробую вернуться к этому 2026-01-10.

Деплой сервера (2026-01-10)

Скрипт первоначальной настройки уже есть, остался от прошлой попытки. Последний раз проверяю это всё в виртуалке на моей системе, потом ставлю на реальный сервер.

Вообщем наткнулся на то, что github давал старую версию скрипта вместо последнего коммита, это известная проблема и самым простым решением в моём случае было перемещение скрипта на статический сайт (этот). Ещё я добавил ему немного стилизации, в ash можно делать многострочные комменты. Интересный вариант получился, страница /api это файл, который интерпретируется по-разному разными средами, базовая структура:

: '
<h1>Html here</h1>
'

echo "and bash here"

Текстовое сообщение сгенерено figlet api.snlx.net -f cybermedium.

Теперь осталось только настроить caddy:

api.snlx.net {
    reverse_proxy localhost:4242
}

Оно работает

Честно говоря, я приятно удивлён caddy. Не, я, конечно, проверял, что оно будет работать на ВМ, но в прошлый раз я поставил NGINX и потом день разбирался, как заставить HTTPS работать, здесь же он просто заработал из коробки.

На данный момент (2026-01-10) система работает в бездисковом режиме, т.е. весь процесс установки выглядит очень близко к:

Sidenote: последне 2 часа я воевал с asciinema standalone плеером, потому что вначале мои базовые стили с ним не работали, а потом я пытался подогнать его по стилю под остальной сайт.

Уточнение: докер на видео используется для создания тестовой машины, в реальности это VPS и на ней нет движка контейнеров.

Что дальше?

Этот проект завершён, теперь нужно добавить поддержку закрытых заметок и статуса в mk-bridge, потом доделать фронт.

Подробнее о закрытых заметках в mk-secret.