Stop the SQLite volume from hiding new migrations

Uploads on share.kadenpartner.ch failed with 409 on every chunk after
the update to 2.1. The example docker-compose.yml mounts the SQLite
volume over all of /app/database. Docker fills a volume from the image
only when it is created, so the container kept the 2.0 migrations and
never saw the 2.1 one. share_files.uploaded_chunks was never created,
so the chunk endpoint read null and answered 409. SQLite takes the
unknown "completed_at" in whereNull() as a string, so nothing failed
earlier.

- The image keeps a copy of its migrations in docker/migrations. On
  startup the entrypoint adds the ones missing from database/migrations
  before migrating, so installs with the old mount recover by pulling
  the new image.
- docker-compose.example.yml and docker-compose.yml mount
  sealshare_database at /app/database/sqlite and set DB_DATABASE to the
  file in it. An existing volume can be moved there without losing
  data: its database.sqlite lands at exactly that path.
- Tested with a locally built image: a volume created by 2.0.1 with the
  old mount gets the migration once (not again on restart) and keeps
  its settings; the same volume moved to the new path keeps its data;
  a fresh volume with the new layout starts healthy.
- README and CHANGELOG (Unreleased) describe the new path and how to
  switch.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Andreas Reinhold / reini
2026-09-17 10:53:27 +02:00
co-authored by Claude Opus 5
parent 7ffc1c1ead
commit c1906d2009
6 changed files with 37 additions and 9 deletions
+4 -4
View File
@@ -11,7 +11,7 @@ services:
- "443:443/udp"
volumes:
- sealshare_storage:/app/storage/app
- sealshare_database:/app/database
- sealshare_database:/app/database/sqlite
- caddy_data:/data
- caddy_config:/config
environment:
@@ -24,7 +24,7 @@ services:
DB_CONNECTION: ${DB_CONNECTION:-sqlite}
DB_HOST: ${DB_HOST:-}
DB_PORT: ${DB_PORT:-}
DB_DATABASE: ${DB_DATABASE:-/app/database/database.sqlite}
DB_DATABASE: ${DB_DATABASE:-/app/database/sqlite/database.sqlite}
DB_USERNAME: ${DB_USERNAME:-}
DB_PASSWORD: ${DB_PASSWORD:-}
LOG_CHANNEL: ${LOG_CHANNEL:-stderr}
@@ -56,7 +56,7 @@ services:
entrypoint: ["php", "artisan", "schedule:work"]
volumes:
- sealshare_storage:/app/storage/app
- sealshare_database:/app/database
- sealshare_database:/app/database/sqlite
environment:
APP_KEY: ${APP_KEY:?Set APP_KEY in .env or environment}
APP_URL: ${APP_URL:-http://localhost}
@@ -65,7 +65,7 @@ services:
DB_CONNECTION: ${DB_CONNECTION:-sqlite}
DB_HOST: ${DB_HOST:-}
DB_PORT: ${DB_PORT:-}
DB_DATABASE: ${DB_DATABASE:-/app/database/database.sqlite}
DB_DATABASE: ${DB_DATABASE:-/app/database/sqlite/database.sqlite}
DB_USERNAME: ${DB_USERNAME:-}
DB_PASSWORD: ${DB_PASSWORD:-}
LOG_CHANNEL: ${LOG_CHANNEL:-stderr}