A self-hosted app keeps using an old secret when the value you changed is not the same value the running process actually loaded.
On a home server, the same password, API token, or encryption key can exist in a Compose environment, an env file, a mounted secret file, a container-management UI, or the applicationโs own persistent database. Restarting the process is not enough when the container was never recreated, the app stores configuration internally, or a second service still authenticates with the old credential. Trace the secret from source to process before deleting volumes or rotating it again.
Prove the Running Container Still Has the Old Value
Start by identifying one safe fingerprint of the secret rather than printing the secret itself. Compare the configured source, the running containerโs environment or mounted secret file, and the application log or connection failure that proves which credential it is attempting to use.
A Compose troubleshooting write-up explains that restart keeps old config because restart reuses the existing container configuration instead of reconciling a changed service definition.
If the running container already exposes the new fingerprint, stop blaming Docker configuration and move upward into application persistence or the remote service that validates the secret. If it still exposes the old fingerprint, keep the repair at the deployment layer.
Trace Which Secret Source the App Actually Reads
Map every possible source for that credential: inline Compose environment, .env, env_file, a mounted file, Docker or Podman secret, application config file, container-manager UI, and any first-run wizard that saved the value into persistent storage.
A practical Compose configuration guide separates mounted configs from secrets, which is useful when an edited env file is not the source the application is currently reading.
Change only the source that is authoritative for this deployment. Editing three copies at once can make the app start successfully while leaving no evidence about which stale source caused the problem.
Recreate the Service When the Secret Is Part of Container Configuration
If the credential is injected as a container environment variable or a secret that is materialized only when the container is created, recreate the affected service with its persistent volumes preserved. A simple stop and start may leave the original container definition untouched.
A Podman rotation example notes that secret rotation updates services after a secret is replaced, making container lifecycle a separate step from updating the secret store.
Recreate only the consumer service first. Do not remove named volumes or database directories unless the application explicitly stores the obsolete credential there and you have a verified backup.
Check for Persistent App Configuration That Overrides the Environment
Some self-hosted apps treat environment variables as first-run defaults and then persist an editable configuration in a database or application data directory. In that design, the new environment value can be correct while the app intentionally keeps the stored value.
An Open WebUI troubleshooting guide demonstrates this exact boundary: persistent config can override env until the persistent setting is changed or that behavior is deliberately disabled.
Inspect the applicationโs supported admin settings or configuration database before touching files manually. If changing the stored setting makes the new secret active, document that setting as the authoritative source for future rotations.
Check Whether the App Loads a Secret File Instead
Applications may fall back from an environment variable to a generated or mounted secret file. A container recreation can therefore appear successful while the process still reads an older file from a persistent volume.
One Open WebUI installation example shows the app loading a saved secret file on later starts, illustrating why the live file path must be checked independently from the Compose YAML.
Confirm the fileโs path, modification time, ownership, and safe fingerprint. Replace it only through the applicationโs supported method because encryption keys and signing secrets can invalidate sessions or make already-encrypted data unreadable.
Rotate the Consumer and Provider as One Transaction
A database password, API token, or service credential has two sides: the app that presents it and the provider that validates it. Updating only one side creates an authentication failure that can be mistaken for the app caching an old value.
A secret-refresh workflow shows that applications must reload rotated secrets through restart, signal, or application-specific reload behavior rather than assuming the process notices every file change automatically.
Verify one real authenticated action, restart or recreate the service once more, and test again. The repair is complete when the new credential survives recreation and the old credential is rejected. The related ZimaSpace guide to a self-hosted app with a failing API path is the next boundary when the new secret is loaded but requests still fail.
Support & Tips
More to Read

Can Plex Share a GPU With Another Docker Container?
Plex and another container can often access the same GPU, but you must test driver support, device mapping, video-engine load, memory, and recovery behavior.

How to Tell Whether a Plex Error Comes From the Client or Server
Reproduce the same item on another client, compare the session path, then collect server evidence only after scope tells you where the failure actually...

How to Configure Plex Cache and Transcode Temporary Storage
Protect persistent Plex state while placing transcode temp files on suitable local storage, then verify cleanup, free space, and restart behavior.

