Table of Contents

Docker in OMV 8

Docker in OMV 8




Docker in OMV 8



Summary



Go to -> OMV forum This document establishes a method to successfully install any application on OMV using Docker.

The OMV forum is a bi-directional tool. Provides users with solutions to their problems. It provides developers with information about user problems and allows them to implement appropriate solutions in software and methods.

In the case of Docker, the forum has received numerous queries about very diverse problems. Based on that forum experience, this document offers a simple method for configuring Docker that fixes the vast majority of these problems before they arise.



Index:




What is Docker



Go to -> www.docker.com “ A container is a standard unit of software that packages up code and all its dependencies so the application runs quickly and reliably from one computing environment to another. A Docker container image is a lightweight, standalone, executable package of software that includes everything needed to run an application: code, runtime, system tools, system libraries and settings.

Container images become containers at runtime and in the case of Docker containers – images become containers when they run on Docker Engine. Available for both Linux and Windows-based applications, containerized software will always run the same, regardless of the infrastructure. Containers isolate software from its environment and ensure that it works uniformly despite differences for instance between development and staging. ”



That's all very well, but… :-) What the hell is docker? :-)


What? That definition is very good and very professional, but it is of little use to people on the street, so we will try to explain in an easier way what docker is and how it works. If you are an experienced docker user you will probably want to skip this part. If this is your first time using docker, keep reading.

Docker is a system that allows you to run an application within your server as if it were an independent and isolated system. It has its own processes, its own file system, and its own networking, all independent of the main (host) server. The container cannot access the host's file systems or network, and vice versa. This is why we say that it is isolated, and way it cannot damage your system. It is safe.

Docker is quite similar to a virtual machine, but with one key difference: a virtual machine includes a complete operating system, with its own kernel, drivers, and services. Docker, on the other hand, does not run a complete operating system. Instead, it uses the host's kernel and only isolates the container's processes, network, and file system.

Because of this, containers consume far fewer resources and start up in a matter of seconds, although their isolation is not as deep as that of a traditional virtual machine.

This makes containers designed for different architectures. A container designed for Raspberry PI (ARM architecture) will not work on an Intel/AMD system (amd64 architecture) and vice versa. You should keep this in mind when choosing a container to install on your system.

Many modern containers include multiple architectures, and Docker will automatically select the correct one. However, not all images support this, so it is important to verify that the image is compatible with your architecture.

At this point it is good to remember that the 32-bit architecture is obsolete, little by little 32-bit containers are disappearing. OMV 8 no longer works on 32-bit systems, so if you were able to install OMV 8, your system is 64-bit. When installing a container, always choose the 64-bit version. Docker will usually select the correct image automatically, but if multiple variants exist, choose the one labeled amd64 or x86_64. 32-bits

The operation of docker is very simple. Someone on the Internet packages a system into a file we call an image. This image contains the necessary packages for the application we want to use to work. Docker downloads that image, installs it on our server and runs it. We already have a container working.

Now the creator of that image does the corresponding maintenance and publishes a new updated image. Docker can download and apply the new image if you trigger an update. Tools like docker-compose make this easy by pulling the updated image and restarting the container. This way, your container can be kept up to date.

So far so good. But now we want to configure certain information in our application, for example a password to access that application. We could “enter” the container and make that configuration by writing to the /folderpass/password file inside the container. That would work, but on the next image update that /folderpass/password file will be overwritten and the settings will be lost. To solve this Docker allows folder mapping.

Mapping a folder means that Docker will make a configuration such that when the container writes to the /folderpass/password file it will actually be writing to an external folder, a folder located on our server file system. This way, when we update the container image, all its files will be overwritten except /folder/password, since this folder is not in the container but in the file system of the host server, and when the container is running it will be able to continue reading the password that we have stored in our server file system. As an added bonus, mapping a folder makes it easier to manipulate the files in that folder from the server without needing to enter the container.

In the same way that Docker maps folders it can also map network ports, we can map port 3800 that the container uses internally to any port on our server, for example 4100, the container will send data packets to port 3800 internally but Docker will that these packets be sent through port 4100 of our server. PUID Explained We can also map users. And this is important to understand. The container will work internally as root, but we can make that user be another user on the server, for example the user superman. From that moment on, everything the container does to the mapped files or ports will not be done by root, it will be done by superman. That allows us to restrict the permissions of that container, we only have to restrict the permissions of the superman user of our system. We will give the user superman write permissions to the /folderpass/password file on our system so that he can write or modify that file but we will not give him permissions to write to any other folders. In this way we ensure that the container remains isolated.

To define all these container configurations the openmediavault-compose plugin uses docker-compose for its simplicity. Using a configuration file of a few lines we define the mappings and other configurations of a container and then we execute it.

To map a user we define the PUID value, the user's identifier, and to map the group it will be the PGID value, the group's identifier. In the OMV GUI we can see the PUID value for each user in the USERS > USERS tab by opening the UID and GID columns using the icon at the top right. So if the user superman has the values ​​1004 and 100, in the compose file we would do something like this:

- PUID=1004

- PGID=100

The way to map a folder (volume) in docker-compose is something like this:

- /srv/dev-disk-by-uuid-9d43cda9-20e5-474f-b38b-6b2b6c03211a/appdata/folderpass:/folderpass

That could be one of the lines in the compose file that defines a container. This line is divided into two parts. To the left of the : we have /srv/dev-disk-by-uuid-9d43cda9-20e5-474f-b38b-6b2b6c03211a/appdata/folderpass which is the path of a real folder on our server, in our file system. On the right of the : we have /folderpass which is the path of a folder within the container, in its own file system.

  Beginners Info
All that long string of numbers is the path of one of our disks on the server and inside that disk we have an appdata folder and inside we create the folderpass folder
Filesystem mount paths are usually in the /srv folder and the following folder contains a uuid to uniquely identify that drive. That folder is the mount folder for that hard drive. You should never modify the permissions of that folder or use it to create a shared folder. Create a folder inside to use as a shared folder.

From now on, every time the root user of the container writes to its /folderpass folder, what will really be happening is that the superman user will be writing to our /srv/dev-disk-by-uuid-9d43cda9-20e5-474f-b38b-6b2b6c03211a/appdata/folderpass folder from our server. The content of that folder is what we call persistent data. Naturally we must give permission to the superman user on our server to write to that folder or the container will throw an error.

The advantage of all this is that the container is limited to writing to that folder. We could be unlucky enough to download an image that has harmful code inside. Or if that container was exposed to the internet and had a security hole, perhaps it could be hacked. In this case the hacker could take control of the root user of the container. The advantage is that that root user on our system is actually the superman user, and in this case, no matter how superman he is, he can only write to the /folderpass folder, so he cannot access our server in any way. The user superman does not have permissions to write or read any other files on our server. Contained threat.

Conclusion. Never map the container user to the root user of the server, unless it is absolutely necessary and the container developer is fully trusted. If there were a security hole in that container, your server would be at the mercy of the hacker, since they would have permissions for everything. Related to this, never include the user running a container in the docker group, this is another story but any user in the docker group can gain root access to the system by escalating permissions.

If you're reading this, it's probably your first time using Docker. Docker may seem complicated at first glance, but once you get over the initial learning curve, setting up and installing a container literally takes less than 30 seconds. Keep going.



User and permission management in Docker and OMV. Improved security.



  Note
You should read this even if you are an experienced Docker user but have no experience with OMV.

Hacker

Docker’s security model is based on a simple principle: a container has exactly the same permissions as the user (UID/GID) it is executed with.

The easiest way to manage this in OMV is to create a dedicated user —for example, appuser— and use it to run all your containers. Simply grant it read/write access only to the folders required by your containers. This prevents containers from accessing other parts of the system and provides a solid level of security.

How OMV manages users and shared folders

In OMV, all users created through the GUI belong by default to the primary group users (GID=100). Shared folders are also created with ownership set to root:users (user=root, group=users), with read/write permissions for both. This is the standard Linux filesystem permission layer.

This means that any user created from the GUI automatically has read/write access to any shared folder, since they belong to the users group —unless you explicitly restrict it using OMV’s permission management, which is a higher-level Samba layer.

OMV applies a Samba permission layer on top of the filesystem permissions. These are the permissions you manage from the OMV GUI.

Implications for Docker

If you use a single user like appuser, it will have access to all the folders you allowed through the GUI. This works well for most containers, but not for every scenario. For example, if the Jellyfin container should only access /Media, but Nextcloud requires /Documents as well, both containers would need to run under a user with access to /Documents.

This may not be desirable if one of the containers is exposed to the Internet.

User isolation (optional, for those who need it)

If you need maximum separation, you can create one user per container —but this only works properly if you avoid the users group (GID=100). To do so, you must create the users from the CLI:

sudo useradd -U jellyfin

This creates:

When you return to the GUI, you will see the user and can manually add it to its own group. This way, all files created by the container will belong to the jellyfin user/group, and no other container will be able to access them unless you explicitly add that container’s user to the group. You also retain full control to grant permissions to your shared folders individually.

Practical conclusion

In this document, we will use a single appuser created from the GUI. This is sufficient for 99% of users.

If your use case requires stronger isolation between containers, apply the techniques described to create users outside of GID=100 and assign them individually.



Install and configure Docker



1. Installation

Expand image -> Installation In OMV8's GUI:
Under SYSTEM > OMV-EXTRAS, click the DOCKER REPO button and then click SAVE. This activates the Docker repository so you can install Docker and the Compose plugin.
Next, go to SYSTEM > PLUGINS, find and select openmediavault-compose 8.X, and click INSTALL.


  Warning
Do not uninstall the openmediavault-sharerootfs plugin. It is a dependency of the openmediavault-compose. Uninstalling openmediavault-sharerootfs while openmediavault-compose is installed will also remove the openmediavault-compose plugin.


2. Plugin Settings

The first step is to define the folders where the different data is stored. To do this, we go to SERVICES > COMPOSE > SETTINGS.

There are many possible NAS layouts. First we will look a simple setup, and then a more advanced configuration.

  Beginners Info
Installing OMV on a USB flash drive may seem unusual to newcomers, but you may be surprised to learn that many professional-grade servers boot directly from USB devices.
This approach provides several advantages and no drawbacks:
  • System performance is unaffected, since almost all operations run in RAM.
  • The openmediavault-writecache plugin protects the USB drive by minimizing unnecessary write operations, greatly extending its lifespan.
  • Backups become extremely simple: just create an image of the USB drive using usbimager on your PC.
  • Restoring the system is even easier: clone the image onto a new USB drive in minutes.
  • Docker benefits because the SSD/NVMe storage remains free for containers, where high speed actually matters.
  • Using a USB drive also frees valuable SATA or NVMe ports on the motherboard.
If your system is already installed on a disk, you can easily migrate OMV to a USB flash drive using omv-regen.


2.1 SIMPLE OMV NAS SYSTEM

In this simple setup, the OMV operating system runs from a USB stick, and there is a single data drive that stores all NAS data. On this drive we will configure Docker and all related folders.

The following diagram shows a schematic example of this layout:

Expand image -> Docker folders - Simple NAS

In this case, all required folders are located on the same drive, which makes the configuration very straightforward. All folders will live under the mount point of that drive, for example: /srv/dev-disk-by-uuid…/appdata

Create these shared folders from the OMV GUI, then follow the explanations in section 2.3. Just keep in mind that, in this simple scenario, all paths will be inside the same mount folder—for example:

Since there is only one data drive, everything lives under the same location.


2.2 ADVANCED OMV NAS SYSTEM

In more advanced setups, your system may look similar to the following example.

The diagram below represents a typical OMV NAS layout. From this point onward, all explanations in the document will be based on this example system. Your own system will probably differ — simply adapt the configuration logic to match your real setup.

On the right side, you can see how the plugin’s SETTINGS tab may look after applying this configuration. If your system is simpler or more complex, adjust the folder paths accordingly. Expand image -> Docker folders - Typical NAS


2.3 CONFIGURATION

In any case, the main recommendation here is to keep Docker data separate from the OMV operating system.

You can name these folders however you prefer. In this document we use the names shown in the diagrams for clarity. The example folders are:

(These names match the diagrams in this document. You can create the shared folder with any name you prefer; the plugin will work the same.)

We will review them one by one below.

  Beginners Info
Why you should keep Docker off the OS drive (this may surprise Windows users — Linux handles storage differently):
  • If Docker lives on the same disk as the OS, a reinstallation of OMV will remove Docker data. Keeping Docker data on a separate drive makes recovery as simple as remounting that drive.
  • Installing Docker on the OS disk can fill the root filesystem (rootfs). Depending on the number and type of containers, you can run out of rootfs space and cause system problems.
  • Placing Docker on a faster drive (SSD or NVMe) improves container performance. OMV itself can run well from a USB flash drive (use openmediavault-writecache), while Docker benefits from high-speed storage.
  • Do not put Docker on the OMV USB flash drive: Docker does continuous writes and will reduce the flash drive’s lifespan even with write caching enabled.
  • If you don't have a fast spare drive, putting Docker on one of your data drives is better than keeping it on the OS disk — performance is lower, but rootfs remains protected.


  Beginners Info
Recommended capacity for the Docker drive
Required size depends on the number and type of containers. A sensible minimum is **60–100 GB**. If you run media servers (Jellyfin, Plex) with very large libraries, consider **250–500 GB** or more. Nextcloud can also require significant storage depending on your usage.


  Note
If your NAS already contains data, you probably already have a data folder (it may use a different name). Select that folder in the plugin settings if appropriate.


2.3.1 appdata folder

appdata

(This name matches the diagrams in this document. You can create the shared folder with any name you prefer; the plugin will work the same.)



2.3.2 data folder

data

(This name matches the diagrams in this document. You can create the shared folder with any name you prefer; the plugin will work the same.)



2.3.3 backup_compose folder

backup_compose

(This name matches the diagrams in this document. You can create the shared folder with any name you prefer; the plugin will work the same.)



2.3.4 docker folder

docker

(This name matches the diagrams in this document. You can create the shared folder with any name you prefer; the plugin will work the same.)



3. Create appuser

If you read the introduction, you already know whether the appuser user is sufficient for your needs or if you should create a custom user.

If you are happy with this user for some or all containers, proceed; otherwise, customize it as explained earlier.

Expand image -> UID-GID

  Warning
Except in very controlled special cases, never assign the admin user (UID=998) or root (UID=0) to manage a container. This is a serious security flaw.
Doing so gives the container unrestricted access to your system. Consider carefully what the container is capable of doing before assigning elevated privileges.



Configuring a container step by step (Jellyfin)



1. Choose a container


Go to -> https://hub.docker.com/

Go to -> https://www.linuxserver.io/

  Beginners Info
Some containers do not provide a compose file. They can be run from the CLI using a docker command. The plugin uses docker-compose for easy setup, but you still need the compose file. If you can't find it, you can generate one using Composerize starting from the container's docker command. There is a prepared Composerize container in the plugin's examples list.
Go to -> https://jellyfin.org/

# Date: 2025-06-01
# https://hub.docker.com/r/linuxserver/jellyfin
# https://jellyfin.org/docs/
services:
  jellyfin:
    image: lscr.io/linuxserver/jellyfin:latest
    container_name: jellyfin
    environment:
      - PUID=1000
      - PGID=100
      - TZ=Etc/UTC
      - JELLYFIN_PublishedServerUrl=192.168.0.5 #optional
    volumes:
      - CHANGE_TO_COMPOSE_DATA_PATH/jellyfin/library:/config
      - CHANGE_TO_COMPOSE_DATA_PATH/jellyfin/tvseries:/data/tvshows
      - CHANGE_TO_COMPOSE_DATA_PATH/jellyfin/movies:/data/movies
    ports:
      - 8096:8096
      - 8920:8920 #optional
      - 7359:7359/udp #optional
      - 1900:1900/udp #optional
    restart: unless-stopped

  Note
Verify on the official page that this compose file has not changed before installing it

  Beginners Info
WHAT A COMPOSE FILE LOOKS LIKE
A compose file is a YAML file that defines the configuration that Docker will apply to the downloaded image to create the container.

The parts of this compose file for Jellyfin are as follows:
  • services: Always the first line. It begins the definition of services.
  • jellyfin: The name of a service in this compose file. In this example there is only one, but there could be more.
  • image: Defines where the container image is downloaded from. In this case, LinuxServer. The value may specify different image versions. Here, latest means the newest version will always be used.
  • container_name: The name we assign to the container, in this case jellyfin.
  • environment: Defines environment variables such as user, timezone, and other settings.
  • volumes: Defines folder mappings between the host and the container.
  • ports: Defines port mappings.
  • restart: Indicates how Docker should behave when the server restarts. unless-stopped means the container will always start unless you manually stop it.


2. Customize the compose file


The next step is to adapt the container configuration so that it works correctly on our system. We will go through this process step by step.

The first few lines of each composition file typically contain a link to the container developer's documentation. This is useful for quickly verifying any aspect of the container that might affect us.

  Note
Important change for OMV 8

Older versions of this document relied heavily on global variables to manage:
  • user IDs (PUID, PGID),
  • time zone,
  • paths to shared folders such as appdata or data.
This is no longer necessary.

The Compose plugin now supports automatic substitutions directly in the compose file.
  • ${{ uid:"USERNAME" }} → resolves to the UID of that user
  • ${{ gid:"USERNAME" }} → resolves to the GID of that user
  • ${{ tz }} → resolves to the system time zone
  • ${{ sf:"SHARENAME" }} → resolves to the full path of a shared folder
This makes compose files simpler, cleaner, and easier to share.

Following the system example used in the previous section of this document, we will customize this compose file as follows:


# Date: 2025-06-01
# https://hub.docker.com/r/linuxserver/jellyfin
# https://jellyfin.org/docs/
services:
  jellyfin:
    image: lscr.io/linuxserver/jellyfin:latest
    container_name: jellyfin
    environment:
      - PUID=${{ uid:"appuser" }}  # See Comment 1 – PUID and PGID
      - PGID=${{ gid:"appuser" }}  # See Comment 1 – PUID and PGID
      - TZ=${{ tz }}   # See Comment 2 – Time zone
      #- JELLYFIN_PublishedServerUrl=192.168.0.5   # See Comment 3 – Optional Jellyfin parameter
    volumes:
      - ${{ sf:"appdata" }}/jellyfin/config:/config   # See Comment 4 – Volumes
      - ${{ sf:"media" }}:/media   # See Comment 4 – Volumes
    devices:   # See Comment 5 - Devices
      - /dev/dri:/dev/dri   # See Comment 5 - Devices
    ports:
      - 8096:8096   # See Comment 6 - Ports
    restart: unless-stopped


  Beginners Warning
How to manage a compose file

This file is in Yaml format, indentations are important.
If you do not respect the indentations, Docker will not be able to interpret the configuration file and the container will give an error and will not start.
Whenever you ask for help on the forum, post the compose file in a code box so the indentations are visible and you can receive proper help. Hide sensitive data such as passwords, email addresses, etc.

Environment

Expand image -> Users

Volumes

Devices

Ports

When you run that container, the plugin will perform the substitutions and execute the following:


services:
  jellyfin:
    image: lscr.io/linuxserver/jellyfin:latest
    container_name: jellyfin
    environment:
      - PUID=1000
      - PGID=100
      - TZ=Europe/Madrid
    volumes:
      - /srv/dev-disk-by-uuid-9d43cda9-20e5-474f-b38b-6b2b6c03211a/system/appdata/jellyfin/config:/config
      - /srv/mergerfs/pool/data/media:/media
    devices:
      - /dev/dri:/dev/dri
    ports:
      - 8096:8096
    restart: unless-stopped

If you don't want to use automatic substitutions, you can define the values ​​one by one in the compose file. It will work the same way.


3. Deploy the Container and Access the Application

Expand image -> Deploy the compose file


4. Help request on the OMV forum

Expand image -> Forum help



Examples of configuration of some containers



The variable substitutions performed by the plugin greatly simplify the configuration of containers. Below are a few examples.

In each case, the container has been configured following the system and folder layout described in this document. Adapt it to your own server configuration if it differs.


Duplicati

A useful application to create encrypted, versioned, compressed, and deduplicated backups, either locally or remotely. Go to -> https://www.duplicati.com/


# https://hub.docker.com/r/linuxserver/duplicati
services:
  duplicati:
    image: lscr.io/linuxserver/duplicati:latest
    container_name: duplicati
    environment:
      - PUID=${{ uid:"appuser" }}
      - PGID=${{ gid:"appuser" }}
      - TZ=${{ tz }}
      #- CLI_ARGS= #optional
    volumes:
      - ${{ sf:"appdata" }}/duplicati/config:/config
      - ${{ sf:"data" }}/duplicati/backups:/backups
      - ${{ sf:"documents" }}:/source/documents:ro   # :ro makes this volume read-only inside the container
      - ${{ sf:"photos" }}:/source/photos:ro
    ports:
      - 8200:8200
    restart: unless-stopped
###########################
# This compose file is customized according to the document:
# "Docker in OMV" from the OMV-Extras wiki.
# Adapt it to your server if the configuration is different.
# https://wiki.omv-extras.org/doku.php?id=omv8:docker_in_omv
###########################


Syncthing

An application to synchronize folders between different devices and the server, such as smartphones or PCs. Go to -> https://syncthing.net/


# https://hub.docker.com/r/linuxserver/syncthing
services:
  syncthing:
    image: lscr.io/linuxserver/syncthing:latest
    container_name: syncthing
    hostname: syncthing #optional
    environment:
      - PUID=${{ uid:"appuser" }}
      - PGID=${{ gid:"appuser" }}
      - TZ=${{ tz }}
    volumes:
      - ${{ sf:"appdata" }}/syncthing/config:/config
      - ${{ sf:"documents" }}/mary/syncthing:/mary     # If your name is not Mary, change this path
      - ${{ sf:"documents" }}/peter/syncthing:/peter   # If your name is not Peter, change this path
    ports:
      - 8384:8384
      - 22000:22000/tcp
      - 22000:22000/udp
      - 21027:21027/udp
    restart: unless-stopped
###########################
# This compose file is customized according to the document:
# "Docker in OMV" from the OMV-Extras wiki.
# Adapt it to your server if the configuration is different.
# https://wiki.omv-extras.org/doku.php?id=omv8:docker_in_omv
###########################


Nginx Proxy Manager

This container allows you to securely publish services (for example, Jellyfin) on the Internet using Let’s Encrypt certificates.

It provides a very intuitive web-based administration interface.

  Advanced configuration.
NPM requires ports 80 and 443 on the router to validate Let's Encrypt certificates.
There are two possible approaches:
1. Free ports 80 and 443 on the server
This is done by changing the OMV GUI ports as described above.
This is the simplest and recommended option.
2. Use port forwarding on the router
If you prefer to keep OMV using ports 80 and 443, you can forward different external ports on the router to the container.
Example:
Forward external port 80 → server port 30080
Forward external port 443 → server port 30443
In the compose file, NPM would then use:
- 30080:80
- 30443:443
The result is the same: the container receives traffic on ports 80 and 443 internally, while OMV keeps ports 80 and 443 on the local network.

Go to -> https://nginxproxymanager.com/


# https://nginxproxymanager.com
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80' # Public HTTP Port
      - '443:443' # Public HTTPS Port
      - '81:81' # Admin web interface
      # Add any other Stream ports you want to expose
      # - '21:21' # FTP
    environment:
      TZ: ${{ tz }}
      # Mysql/MariaDB connection parameters:
      DB_MYSQL_HOST: "db"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "npm"
      DB_MYSQL_NAME: "npm"
      # Optional SSL (see NPM website)
      # DB_MYSQL_SSL: 'true'
      # DB_MYSQL_SSL_REJECT_UNAUTHORIZED: 'true'
      # DB_MYSQL_SSL_VERIFY_IDENTITY: 'true'
      # Uncomment this if IPv6 is not enabled on your host
      # DISABLE_IPV6: 'true'
    volumes:
      - ${{ sf:"appdata" }}/nginxproxymanager/data:/data
      - ${{ sf:"appdata" }}/nginxproxymanager/letsencrypt:/etc/letsencrypt
    depends_on:
      - db
  db:
    image: 'jc21/mariadb-aria:latest'
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: 'npm'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'npm'
      MARIADB_AUTO_UPGRADE: '1'
    volumes:
      - ${{ sf:"appdata" }}/nginxproxymanager/mysql:/var/lib/mysql
###########################
# This compose file is customized according to the document:
# "Docker in OMV" from the OMV-Extras wiki.
# Adapt it to your server if the configuration is different.
# https://wiki.omv-extras.org/doku.php?id=omv8:docker_in_omv
###########################


To access the Nginx Proxy Manager GUI, use port 81. Example: http://192.168.1.50:81

Default credentials:

You will be prompted to change these credentials on first login.


Nextcloud AIO (All In One)

Nextcloud is a private cloud platform that allows you to access your files securely over the Internet.

This container is the official Nextcloud AIO (All-In-One) distribution.

It provides a web-based configuration interface that installs and manages several containers automatically.

PREREQUISITES

Before installing Nextcloud AIO, you must first install a reverse proxy, such as Nginx Proxy Manager described in the previous section.

You may use any proxy supported by Nextcloud AIO, but in this document we assume Nginx Proxy Manager.

Install NPM first and configure it by following these instructions: NPM configuration for Nextcloud AIO (Click on “click to expand” in the Nginx-Proxy-Manager section)

REQUIREMENTS FOR THIS CONTAINER

For this container to work correctly, you must do the following:

Go to -> https://github.com/nextcloud/all-in-one?tab=readme-ov-file#nextcloud-all-in-one


# https://github.com/nextcloud/all-in-one
# For custom configuration consult see:
# https://github.com/nextcloud/all-in-one/blob/main/compose.yaml
services:
  nextcloud-aio-mastercontainer:
    image: nextcloud/all-in-one:latest
    init: true
    restart: always
    container_name: nextcloud-aio-mastercontainer
    volumes:
      - nextcloud_aio_mastercontainer:/mnt/docker-aio-config
      - /var/run/docker.sock:/var/run/docker.sock:ro
    ports:
      - 8080:8080
    environment:
      - APACHE_PORT=11000
      - NEXTCLOUD_DATADIR=${{ sf:data }}/nextcloud_data
volumes:
  nextcloud_aio_mastercontainer:
    name: nextcloud_aio_mastercontainer
###########################
# This compose file is customized according to the document:
# "Docker in OMV" from the OMV-Extras wiki.
# Adapt it to your server if your configuration is different.
# https://wiki.omv-extras.org/doku.php?id=omv8:docker_in_omv
###########################


INITIAL SETUP

Start the container and perform the initial configuration.

Follow the instructions starting from point 4 in the official documentation → How to install the Nextcloud All In One on linux

ABOUT THE NEXTCLOUD DATA DIRECTORY

Notice that the Nextcloud data directory has been configured inside the appdata folder. This is intentional, for the following reasons:

RECOMMENDED APROACH FOR LARGE DATA SETS

These limitations can be easily avoided by using the Nextcloud External Storage plugin.

With this plugin, you can mount shared folders from the OMV system (for example via SMB) directly from the Nextcloud GUI. This allows you to:

As a result, the internal data directory remains small and can be safely stored on a fast disk.

IMPORTANT NOTE ABOUT BACKUPS

Nextcloud AIO spawns and manages multiple containers, which are stored internally in Docker’s own directories.

The openmediavault-compose plugin backup feature does not back up these internal containers.

If you want reliable backups, you must use the built-in Nextcloud AIO backup system.

From the Nextcloud AIO GUI you can:

Everything is handled internally by Nextcloud AIO.


Other containers

Expand image -> Add from example

  Beginners Info
Most of the example compose files will work out of the box if you run them without any modifications.
However, it is strongly recommended to adapt them to your own system configuration, following the guidelines explained in this document.
Doing so will help you avoid unexpected behaviour and permission-related issues.


Create your own custom container


Go to -> Dockerfiles If you cannot find a container that fits your needs—either in the plugin’s example list or on the Internet—you can create your own image and run a container from it using a Dockerfile.

The openmediavault-compose plugin makes it easy to build Docker images directly from a Dockerfile.

You can see how to use this feature here → Dockerfiles



Some basic procedures for container management



How to schedule container updates and/or backups

Go to -> Schedule (Updates and Backups) This is one of the most useful features of the Compose plugin. It allows you to:

You can learn how to configure this feature in the corresponding section of the plugin documentation in this wiki → Schedule (Updates and Backups)


How to modify the configuration of a container

If for any reason you need to modify a container configuration—for example, to change a volume path or adjust any other parameter—follow these steps:

The container will now be running with the updated configuration.


How to reset a container's settings

If you want to restore a container to its initial state, proceed as follows (Warning: this will remove all configuration made inside the container):


Other procedures

Go to -> Usual procedures
You can find several additional and very useful procedures in the corresponding section of the openmediavault-compose plugin documentation.

Among them, you will find:

See → Usual procedures



Note on global environment variables


With OMV 8 and the current Compose plugin, the global environment variables system is no longer required. The plugin performs automatic substitutions for users, groups, time zones, and shared folders directly in the compose file.

If you are migrating from OMV 6 or 7 and want to keep using global variables, it is still possible, but it is optional.




A Closing Note

We, who support the openmediavault project, hope that you’ll find your openmediavault server to be enjoyable, efficient, and easy to use.

If you found this guide to be helpful, please consider a modest donation to support the hosting costs of this server (OMV-Extras) and the project (Openmediavault).

OMV-Extras.org



www.openmediavault.org