Software Engineer's Blog

Fixing Bitwarden Extension Login Failures on Self-Hosted Vaultwarden (Synology Docker)

Fixing Bitwarden Extension Login Failures on Self-Hosted Vaultwarden (Synology Docker)

One evening the Bitwarden extension in Chrome simply stopped letting me in. I pointed it at my self-hosted server URL, typed my email and master password, hit unlock — and got a flat login failed message. Nothing had changed on my side. I hadn’t touched my Vaultwarden container on my Synology DS916+ in well over a year. That, it turned out, was exactly the problem: the client kept updating itself while my server quietly rotted in place.

If your self-hosted Vaultwarden suddenly refuses Bitwarden logins, this is almost always version skew between an auto-updating client and a stale backend. On a Synology NAS, it takes about five minutes to fix. Here’s what actually broke for me and the exact steps that brought it back.

Bitwarden vs. Vaultwarden: what’s actually talking to what

Quick clarification, because it changes the fix:

  • Bitwarden is the official password manager — the browser extensions, mobile apps, and the official server.
  • Vaultwarden is a separate, community project that reimplements the Bitwarden server API in Rust. It’s lightweight enough to run happily on a NAS, which is why so many homelabs use it instead of the official server.

The key thing: you run the official Bitwarden client against an unofficial server. Those two pieces ship on completely different schedules.

Why login breaks (version skew, plainly)

Chrome updates the Bitwarden extension on Bitwarden’s schedule, not yours. New crypto and API expectations land in the client automatically. Your Vaultwarden container, meanwhile, only moves when you pull a new image. Leave it untouched long enough and the gap widens until the new client makes a request the old server doesn’t understand — and you get a login failure that looks like a password problem but isn’t.

My day job is backend systems, and this is a pattern I’ve seen a hundred times in a different costume: a client and server drift apart in version, and the symptom surfaces at the boundary as a vague error. Self-hosting just hands you both ends of that contract to maintain.

The detour I’d skip if I were you

I didn’t reach the obvious fix first. Not realizing I simply needed a newer image, I went looking for a replacement and stood up Passbolt (Community Edition) instead:

passbolt/passbolt   latest-ce   5a321326f137   2 months ago   362MB

Passbolt is a solid project, but for my day-to-day it felt clunky compared to the Bitwarden client I was used to, and I didn’t want to migrate my whole vault to find out if it stuck. So I backed out and decided to give Vaultwarden a proper update instead — which is what I should have done in the first place. If your only complaint is “login broke after months of neglect,” you almost certainly don’t need a new password manager. You need a newer image.

Confirming the image was the problem

Before changing anything, I checked how old my running image actually was. Over SSH:

docker images --filter "reference=vaultwarden/*"
REPOSITORY           TAG       IMAGE ID       CREATED         SIZE
vaultwarden/server   latest    3e3ce0360c32   7 weeks ago     256MB
vaultwarden/server   <none>    3fd653bdae09   2 months ago    252MB
vaultwarden/server   <none>    ad9923f8f6a7   16 months ago   237MB
vaultwarden/server   <none>    f42de042ac89   4 years ago     197MB

The <none> rows are old pulls left behind. The telling one is 16 months old — that’s roughly the vintage of the server I’d been asking a freshly-updated 2026 extension to talk to. No wonder the handshake fell apart.

The fix on Synology

I originally did this on DSM 7.1 with the old Docker package. On DSM 7.2 and later it’s renamed Container Manager, but the flow is the same — only the labels moved. (I’m now on DSM 7.4 with Container Manager, and the updated container has run cleanly since.)

GUI method (Docker / Container Manager)

  1. Stop the container. Open Docker / Container Manager → Container tab → select your Vaultwarden container → Action → Stop.
  2. Pull the latest image. Registry tab → search vaultwarden/server → download the latest tag. This fetches the new image without touching your data.
  3. Reset the container. Back in the Container tab, with the container selected, click Reset. This rebuilds the container against the new image while keeping your existing settings — port mappings, volume mounts, environment variables. Your vault lives in the mounted volume, not the container, so it’s untouched.
  4. Start it. Action → Start, then try logging in from the extension again.

CLI alternative (version-agnostic)

If you, like me, keep your stack under something like /volume1/docker/vaultwarden, the command-line path is the same idea and survives every DSM rename:

docker pull vaultwarden/server:latest
# then recreate the container from your compose file or run command
docker compose up -d   # if you use docker-compose

Either way, the principle is identical: new image, same volume. Your encrypted vault is in the data volume, so updating the container doesn’t risk it — but a backup of that volume before any maintenance is still cheap insurance.

After the update: when login still sticks

Updating the image fixed it for me immediately. If yours still won’t connect, the cause has usually moved one layer out:

  • Browser cache. Try an Incognito window or clear the extension’s cache; a stale client-side state can outlive the server fix.
  • Reverse proxy and HTTPS. I run Vaultwarden behind a reverse proxy over HTTPS. Bitwarden clients refuse to talk to a self-hosted server over anything but a valid TLS endpoint. So if your certificate has expired — or your proxy is misrouting /api or /notifications (the WebSocket path) — login breaks for reasons that have nothing to do with the image. Check the certificate and the proxy rules before blaming Vaultwarden.

Takeaways

  • A self-hosted Bitwarden login failure is usually version skew, not a bad password — the official client auto-updates while your Vaultwarden image sits still.
  • Updating the Docker image fixes it, and on Synology a Reset rebuilds the container while preserving your config and data volume.
  • Don’t jump ship (I briefly tried Passbolt and came back); update the container on a schedule and you avoid both the lockout and the security drift.

Sources