Nextcloud v35.0.2 with ffmpeg + ImageMagick extras for previews/transcoding
1.9K
A thin, drop-in wrapper on the official Nextcloud Apache image that adds FFmpeg — so Nextcloud's preview generator and apps that shell out to ffmpeg (preview_generator, memories, recognize, …) work out of the box. Nothing else is changed.
| Base image | nextcloud:35.0.2-apache (official Docker library) |
| Delta vs upstream | a single apt install ffmpeg — no config changes, no extra PHP extensions |
| Variant | Apache (mod_php) — the default upstream variant |
| Drop-in for | nextcloud:35.0.2-apache (same ports, volumes, env vars, entrypoint) |
| Recommended pin | :v0.4.0-nc35.0.2 |
| Also on | Forgejo git.quantweave.ca/quantweave-intelligence/qwi-nextcloud |
Contents: Quick start · Why this image · What's added · Configuration · Tags · Upgrading · Source
You need: a Linux host with Docker + the Compose plugin, an external PostgreSQL (recommended) or MySQL/MariaDB, and ideally external Redis. A TLS-terminating reverse proxy in front is strongly recommended.
Minimal docker-compose.yml (Postgres + Redis + Nextcloud):
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_DB: nextcloud
POSTGRES_USER: nextcloud
POSTGRES_PASSWORD: change-me
volumes:
- ./data/db:/var/lib/postgresql/data
redis:
image: redis:7-alpine
restart: unless-stopped
command: ["redis-server", "--save", "", "--appendonly", "no"]
app:
image: zuzupebbles/nextcloud-custom:v0.4.0-nc35.0.2 # pin both axes in production
restart: unless-stopped
depends_on: [db, redis]
ports:
- "8080:80"
environment:
POSTGRES_HOST: db
POSTGRES_DB: nextcloud
POSTGRES_USER: nextcloud
POSTGRES_PASSWORD: change-me
REDIS_HOST: redis
NEXTCLOUD_TRUSTED_DOMAINS: "localhost"
# Behind a proxy, also set OVERWRITEHOST / OVERWRITEPROTOCOL / TRUSTED_PROXIES.
volumes:
- ./data/nextcloud:/var/www/html
docker compose up -d
docker logs -n 200 $(docker compose ps -q app)
Open http://<host>:8080 and complete the install wizard on first run.
Real deployments want more: a TLS reverse proxy,
_FILE-suffixed env vars for credentials, background cron, the notify_push High-Performance Backend, and Collabora. A complete, hardened, multi-service reference (app+cron+notify_push+collabora+ Postgres + Redis, with Docker secrets) ships in the source repo atimages/qwi-nextcloud/examples/docker-compose.yml.
Nextcloud's preview generator needs ffmpeg for video thumbnails, and several popular apps (memories, recognize, preview_generator) shell out to it. The upstream image deliberately stays small and omits it. This wrapper is the minimal addition — nothing more.
If you don't need video previews, use the upstream nextcloud:*-apache image directly; you gain nothing from this wrapper.
Installed via apt:
ffmpegNo Nextcloud config defaults are changed, no extra PHP extensions are added, no ImageMagick extras are bundled. For HEIC / uncommon formats, install the relevant libmagickcore-*-extra package in a downstream layer.
Everything is inherited from the official Nextcloud image — see its Docker Hub page for the full env-var and volume contract. The essentials:
| Container path | Purpose |
|---|---|
/var/www/html | apps, config, custom_apps, themes, data — persist this |
| Key env vars | Purpose |
|---|---|
POSTGRES_HOST / POSTGRES_DB / POSTGRES_USER / POSTGRES_PASSWORD[_FILE] | database connection (_FILE reads a Docker secret) |
REDIS_HOST / REDIS_HOST_PASSWORD[_FILE] | Redis for file locking + APCu offload |
NEXTCLOUD_TRUSTED_DOMAINS | space-separated domains allowed to serve the instance |
OVERWRITEHOST / OVERWRITEPROTOCOL / TRUSTED_PROXIES / APACHE_DISABLE_REWRITE_IP | reverse-proxy awareness |
NEXTCLOUD_ADMIN_USER / NEXTCLOUD_ADMIN_PASSWORD[_FILE] | first-run admin (ignored after install) |
ffmpeg is on PATH inside the container. The upstream Apache variant ships no healthcheck — define one in your compose if you need it (the reference example does).
The wrapper version (this image's own SemVer) and the upstream Nextcloud version are independent axes — tags let you pin either or both. Every build publishes five tags:
| Tag | Example | Stability | Meaning |
|---|---|---|---|
:v<wrapper>-nc<upstream> | v0.4.0-nc35.0.2 | Immutable | Recommended production pin — both axes locked |
:v<wrapper> | v0.4.0 | Wrapper-axis pin | Accepts whatever upstream it was last built against |
:nc<upstream-minor> | nc35.0 | Moving | Stay within a Nextcloud minor; accept patches |
:<short-sha> | a1b2c3d4e5f6 | Immutable | Exact build commit (12-char git SHA) |
:latest | latest | Moving | Most recent build — dev/staging only |
See the Tags tab for the current list.
Same model as upstream Nextcloud:
/var/www/html and the database before any major upgrade.occ maintenance sequence (adjust the service name app to your compose):docker compose exec -u www-data app php occ upgrade
docker compose exec -u www-data app php occ db:add-missing-indices
docker compose exec -u www-data app php occ db:add-missing-columns
docker compose exec -u www-data app php occ db:add-missing-primary-keys
docker compose exec -u www-data app php occ maintenance:repair --include-expensive
docker compose exec -u www-data app php occ status
A same-minor patch bump (e.g. 34.0.3 → 34.0.4) needs only the routine maintenance above — no major-upgrade dance.
Build definitions, release notes, and the full reference compose live in the QWI qwi-system-tools repo (path images/qwi-nextcloud/): https://git.quantweave.ca/quantweave-intelligence/qwi-system-tools. Issues and contributions go there.
The wrapper tooling is QWI's; Nextcloud is the property of Nextcloud GmbH and the Nextcloud community — see https://nextcloud.com/ for product documentation and licensing.
Content type
Image
Digest
sha256:ca0ae2296…
Size
640 MB
Last updated
1 day ago
docker pull zuzupebbles/nextcloud-custom