Развёртывание · s5w

Обновление с 1.0.x

Новый образ ставится поверх того же тома: данные, токены и выданные ссылки сохраняются. Но три вещи для тех, кто стоит на 1.0.x, меняются.

Что остаётся как было

  • Том — тот же путь /var/lib/s5w и та же раскладка внутри.
  • PostgreSQL — та же мажорная версия 18, pg_upgrade не нужен.
  • Схема базы — без изменений, новых миграций нет.
  • WINTER_KEY — читается из того же .runtime_secrets, временные ссылки остаются рабочими.
  • Токены — хеш считается так же, выпущенные токены продолжают работать.
  • Клиентский API и раздача — контракты /v1, /o, /p, /t не менялись.

Что меняется

Панель — на отдельном порту

Старая панель на :9090/admin удалена, новая работает на 9091. Опубликуйте порт (-p 9091:9091) или заведите для неё отдельный домен на прокси. Старый адрес отвечает 404.

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

Admin API по умолчанию локальный

Раньше /admin/… на 9090 был доступен снаружи. Теперь при включённой панели он отвечает снаружи 404. Если скрипты обращаются к нему извне, верните прежнее поведение:

bash
-e ADMIN_API=public

Код — в /app

Код приложения в контейнере теперь лежит в /app, а не в /var/www/html. Это касается только тех, кто монтирует дерево исходников: ./:/var/www/html/ → ./:/app/. Готового образа это не касается.

Время в ответах — RFC 3339

Все отметки времени теперь в одном формате: 2026-11-08T17:10:44+00:00. Раньше их было три — 2026-11-08 17:10:44 +00:00 у только что созданных объектов и 2026-11-08 17:10:44+00 (иногда с долями секунды) у прочитанных из базы. Если клиент разбирал время своим шаблоном под формат с пробелом, его нужно поправить; стандартные функции разбора дат (new Date(), DateTimeImmutable, datetime.fromisoformat) новый формат понимают сами.

Мелочи

  • TRUSTED_PROXIES по умолчанию private. За прокси в частной сети блокировка входа после неудачных попыток теперь считается по реальному адресу клиента, а не по адресу прокси.
  • sha256 вместе с опциями обработки картинки. Раньше POST /v1/uploads с хешем находил исходник в бакете и создавал файл без обработки. Теперь такая загрузка идёт обычным путём и возвращает обработанный файл.