- Alpine Linux 系统.
- nginx and PHP 7.4 (tutu20120501/nginx-php image).
- 使用环境变量自动安装.
- 编译过程进行安装包SHA512和PGP完整性校验.
- 数据和app可持久化.
- OPCache (opcocde)和APCu (local)默认支持.
- cron系统任务.
- 支持MySQL, PostgreSQL (未内置)和 sqlite3.
- 支持Redis, FTP, SMB, LDAP, IMAP.
- php采用GNU Libiconv扩展(避免某些app错误).
- 无root进程.
- 提供环境变量.
- latest : 最新稳定版.
- 19.0 : 19.0.x 最新稳定版
- NEXTCLOUD_VERSION : nextcloud版本
- GPG_nextcloud : signing key fingerprint
- UID : nextcloud user id (默认值: 1024)
- GID : nextcloud group id (默认值: 101)
- UPLOAD_MAX_SIZE : maximum upload size (default : 10G)
- APC_SHM_SIZE : apc memory size (default : 128M)
- OPCACHE_MEM_SIZE : opcache memory size in megabytes (default : 128)
- MEMORY_LIMIT : php memory limit (default : 512M)
- CRON_PERIOD : time interval between two cron tasks (default : 15m)
- CRON_MEMORY_LIMIT : memory limit for PHP when executing cronjobs (default : 1024m)
- TZ : the system/log timezone (default : Etc/UTC)
- ADMIN_USER : username of the admin account (default : none, web configuration)
- ADMIN_PASSWORD : password of the admin account (default : none, web configuration)
- DOMAIN : domain to use during the setup (default : localhost)
- DB_TYPE : database type (sqlite3, mysql or pgsql) (default : mysql)
- DB_NAME : name of database (default : none)
- DB_USER : username for database (default : none)
- DB_PASSWORD : password for database user (default : none)
- DB_HOST : database host (default : none)
Don't forget to use a strong password for the admin account!
- 8888 : HTTP Nextcloud port.
- /data : Nextcloud data.
- /config : config.php location.
- /apps2 : Nextcloud downloaded apps.
- /nextcloud/themes : Nextcloud themes location.
- /php/session : php session files.
Basically, you can use a database instance running on the host or any other machine. An easier solution is to use an external database container. I suggest you to use MariaDB, which is a reliable database server. You can use the official mariadb
image available on Docker Hub to create a database container, which must be linked to the Nextcloud container. PostgreSQL can also be used as well.
Pull the image and create a container. /docker
can be anywhere on your host, this is just an example. Change MYSQL_ROOT_PASSWORD
and MYSQL_PASSWORD
values (mariadb). You may also want to change UID and GID for Nextcloud, as well as other variables (see Environment Variables).
docker pull wonderfall/nextcloud && docker pull mariadb
docker run -d --name db_nextcloud \
-v /docker/nextcloud/db:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=supersecretpassword \
-e MYSQL_DATABASE=nextcloud -e MYSQL_USER=nextcloud \
-e MYSQL_PASSWORD=supersecretpassword \
mariadb:10
docker run -d --name nextcloud \
--link db_nextcloud:db_nextcloud \
-v /docker/nextcloud/data:/data \
-v /docker/nextcloud/config:/config \
-v /docker/nextcloud/apps:/apps2 \
-v /docker/nextcloud/themes:/nextcloud/themes \
-e UID=1000 -e GID=1000 \
-e UPLOAD_MAX_SIZE=10G \
-e APC_SHM_SIZE=128M \
-e OPCACHE_MEM_SIZE=128 \
-e CRON_PERIOD=15m \
-e TZ=Etc/UTC \
-e ADMIN_USER=mrrobot \
-e ADMIN_PASSWORD=supercomplicatedpassword \
-e DOMAIN=cloud.example.com \
-e DB_TYPE=mysql \
-e DB_NAME=nextcloud \
-e DB_USER=nextcloud \
-e DB_PASSWORD=supersecretpassword \
-e DB_HOST=db_nextcloud \
wonderfall/nextcloud
You are not obliged to use ADMIN_USER
and ADMIN_PASSWORD
. If these variables are not provided, you'll be able to configure your admin acccount from your browser.
In the admin panel, you should switch from AJAX cron
to cron
(system cron).
Pull a newer image, then recreate the container as you did before (Setup step). None of your data will be lost since you're using external volumes. If Nextcloud performed a full upgrade, your apps could be disabled, enable them again (starting with 12.0.x, your apps are automatically enabled after an upgrade).
I advise you to use docker-compose, which is a great tool for managing containers. You can create a docker-compose.yml
with the following content (which must be adapted to your needs) and then run docker-compose up -d nextcloud-db
, wait some 15 seconds for the database to come up, then run everything with docker-compose up -d
, that's it! On subsequent runs, a single docker-compose up -d
is sufficient!
Don't copy/paste without thinking! It is a model so you can see how to do it correctly.
version: '3'
networks:
nextcloud_network:
external: false
services:
nextcloud:
image: wonderfall/nextcloud
depends_on:
- nextcloud-db # If using MySQL
- redis # If using Redis
environment:
- UID=1000
- GID=1000
- UPLOAD_MAX_SIZE=10G
- APC_SHM_SIZE=128M
- OPCACHE_MEM_SIZE=128
- CRON_PERIOD=15m
- TZ=Europe/Berlin
- DOMAIN=localhost
- DB_TYPE=mysql
- DB_NAME=nextcloud
- DB_USER=nextcloud
- DB_PASSWORD=supersecretpassword
- DB_HOST=nextcloud-db
volumes:
- /docker/nextcloud/data:/data
- /docker/nextcloud/config:/config
- /docker/nextcloud/apps:/apps2
- /docker/nextcloud/themes:/nextcloud/themes
networks:
- nextcloud_network
# If using MySQL
nextcloud-db:
image: mariadb
volumes:
- /docker/nextcloud/db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=supersecretpassword
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD=supersecretpassword
networks:
- nextcloud_network
# If using Redis
redis:
image: redis:alpine
container_name: redis
volumes:
- /docker/nextcloud/redis:/data
networks:
- nextcloud_network
You can update everything with docker-compose pull
followed by docker-compose up -d
.
Redis can be used for distributed and file locking cache, alongside with APCu (local cache), thus making Nextcloud even more faster. As PHP redis extension is already included, all you have to is to deploy a redis server (you can do as above with docker-compose) and bind it to nextcloud in your config.php file :
'memcache.distributed' => '\OC\Memcache\Redis',
'memcache.locking' => '\OC\Memcache\Redis',
'memcache.local' => '\OC\Memcache\APCu',
'redis' => array(
'host' => 'redis',
'port' => 6379,
),
There is a script for that, so you shouldn't bother to log into the container, set the right permissions, and so on. Just use docker exec -ti nexcloud occ command
.