Deployment · s5w

Upgrading from 1.0.x

The new image goes on top of the same volume: data, tokens and issued links are kept. But a few things change for those running 1.0.x.

What stays the same

  • The volume — the same /var/lib/s5w path and the same layout inside.
  • PostgreSQL — the same major version 18, no pg_upgrade needed.
  • The database schema — unchanged, no new migrations.
  • WINTER_KEY — read from the same .runtime_secrets, temporary links keep working.
  • Tokens — the hash is computed the same way, issued tokens keep working.
  • The client API and delivery — the /v1, /o, /p, /t contracts did not change.

What changes

The panel is on its own port

The old panel at :9090/admin is removed; the new one runs on 9091. Publish the port (-p 9091:9091) or set up a separate domain for it on the proxy. The old address answers 404.

After the upgrade you need to sign in to the panel again: it lives at another address, and the old cookie does not reach it.

The admin API is local by default

Previously /admin/… on 9090 was reachable from outside. Now, with the panel on, it answers 404 from outside. If scripts call it from outside, bring back the old behaviour:

bash
-e ADMIN_API=public

The code is in /app

The application code in the container now lives in /app, not in /var/www/html. This only matters to those who mount the source tree: ./:/var/www/html/ → ./:/app/. The ready-made image is not affected.

Time in responses is RFC 3339

Every timestamp now has one format: 2026-11-08T17:10:44+00:00. There used to be three — 2026-11-08 17:10:44 +00:00 for freshly created objects and 2026-11-08 17:10:44+00 (sometimes with fractions of a second) for those read back from the database. If a client parsed time with its own pattern for the format with a space, it needs fixing; standard date parsing functions (new Date(), DateTimeImmutable, datetime.fromisoformat) understand the new format by themselves.

Smaller changes

  • TRUSTED_PROXIES defaults to private. Behind a proxy in a private network, the login lockout after failed attempts is now counted by the real client address, not by the proxy’s address.
  • sha256 together with image processing options. Previously POST /v1/uploads with a hash found the source in the bucket and created the file without processing. Now such an upload goes the normal way and returns the processed file.