Nextcloud开源免费的私有云存储网盘项目

官网 Github Docker Hub Android客户端 iOS客户端

安装

首先安装Docker和Docker-Compose,安装教程请看Docker文章
创建一个存放docker-compose文件夹并进入

1
mkdir nextcloud && cd nextcloud

创建docker-compose文件

1
nano docker-compose.yml

选择Docker compose并Ctrl + XYEnter保存

适合本地测试或内部网络使用(无 HTTPS 加密,需注意安全边界)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
services:
# 注:MariaDB 是一个外部服务。你可以在以下链接找到更多关于其配置的信息:
# https://hub.docker.com/_/mariadb
db:
# 注:请在以下链接查看推荐的数据库版本:https://docs.nextcloud.com/server/latest/admin_manual/installation/system_requirements.html#server
image: mariadb:lts # 使用 MariaDB 的长期支持版本镜像
restart: always # 容器退出时总是自动重启
command: --transaction-isolation=READ-COMMITTED # 设置数据库事务隔离级别为 READ-COMMITTED,适配 Nextcloud 需求
volumes:
- db:/var/lib/mysql # 将数据库数据目录 /var/lib/mysql 挂载到名为 db 的数据卷,实现数据持久化
environment:
- MYSQL_ROOT_PASSWORD= # 数据库 root 用户的密码(必须填写,例如:myrootpass123)
- MYSQL_PASSWORD= # Nextcloud 专用数据库用户的密码(必须填写,需与 app 服务中的对应参数一致,例如:myncpass456)
- MYSQL_DATABASE=nextcloud # Nextcloud 使用的数据库名称(固定为 nextcloud)
- MYSQL_USER=nextcloud # Nextcloud 专用的数据库用户名(固定为 nextcloud)

# 注:Redis 是一个外部服务。你可以在以下链接找到更多关于其配置的信息:
# https://hub.docker.com/_/redis
redis:
image: redis:alpine # 使用 Redis 的轻量 alpine 版本镜像
restart: always # 容器退出时总是自动重启

app:
image: nextcloud # 使用 Nextcloud 官方镜像(默认是 apache 版本,包含 web 服务器)
restart: always # 容器退出时总是自动重启
ports:
- 8080:80 # 将容器内的 80 端口映射到主机的 8080 端口,可通过 http://主机IP:8080 访问 Nextcloud
depends_on:
- redis # 依赖 redis 服务,确保 redis 启动后再启动 app
- db # 依赖 db 服务,确保数据库启动后再启动 app
volumes:
- nextcloud:/var/www/html # 将 Nextcloud 数据目录 /var/www/html 挂载到名为 nextcloud 的数据卷,持久化应用数据(文件、配置等)
environment:
- MYSQL_PASSWORD= # 需与 db 服务中的 MYSQL_PASSWORD 保持一致(例如:myncpass456)
- MYSQL_DATABASE=nextcloud # 数据库名称,与 db 服务中的保持一致
- MYSQL_USER=nextcloud # 数据库用户名,与 db 服务中的保持一致
- MYSQL_HOST=db # 数据库主机地址(容器名,因同一网络内可通过容器名访问)

volumes:
nextcloud: # 定义名为 nextcloud 的数据卷,用于存储 Nextcloud 应用数据
db: # 定义名为 db 的数据卷,用于存储 MariaDB 数据库数据

无 HTTPS,适合本地测试或反向代理后使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
services:
# 注:MariaDB 是一个外部服务。你可以在以下链接找到更多关于其配置的信息:
# https://hub.docker.com/_/mariadb
db:
# 注:请在以下链接查看推荐的数据库版本:https://docs.nextcloud.com/server/latest/admin_manual/installation/system_requirements.html#server
image: mariadb:lts # 使用 MariaDB 的长期支持版本镜像
restart: always # 容器退出时总是自动重启
command: --transaction-isolation=READ-COMMITTED # 设置数据库事务隔离级别为 READ-COMMITTED,适配 Nextcloud 需求
volumes:
- db:/var/lib/mysql # 将数据库数据目录 /var/lib/mysql 挂载到名为 db 的数据卷,实现数据持久化
environment:
- MYSQL_ROOT_PASSWORD= # 数据库 root 用户的密码(必须填写,例如:myrootpass123)
- MYSQL_PASSWORD= # Nextcloud 专用数据库用户的密码(必须填写,需与 app 服务中的对应参数一致,例如:myncpass456)
- MYSQL_DATABASE=nextcloud # Nextcloud 使用的数据库名称(固定为 nextcloud)
- MYSQL_USER=nextcloud # Nextcloud 专用的数据库用户名(固定为 nextcloud)

# 注:Redis 是一个外部服务。你可以在以下链接找到更多关于其配置的信息:
# https://hub.docker.com/_/redis
redis:
image: redis:alpine # 使用 Redis 的轻量 alpine 版本镜像,用于缓存提升 Nextcloud 性能
restart: always # 容器退出时总是自动重启

app:
image: nextcloud:fpm # 使用 Nextcloud 的 FPM 版本镜像(仅提供 PHP 处理,需配合 web 服务器使用)
restart: always # 容器退出时总是自动重启
depends_on:
- redis # 依赖 redis 服务,确保 redis 启动后再启动 app
- db # 依赖 db 服务,确保数据库启动后再启动 app
volumes:
- nextcloud:/var/www/html # 将 Nextcloud 应用目录 /var/www/html 挂载到名为 nextcloud 的数据卷,持久化应用数据(文件、配置等)
environment:
- MYSQL_PASSWORD= # 需与 db 服务中的 MYSQL_PASSWORD 保持一致(例如:myncpass456)
- MYSQL_DATABASE=nextcloud # 数据库名称,与 db 服务中的保持一致
- MYSQL_USER=nextcloud # 数据库用户名,与 db 服务中的保持一致
- MYSQL_HOST=db # 数据库主机地址(容器名,同一网络内可通过容器名访问)

# 注:Nginx 是一个外部服务。你可以在以下链接找到更多关于其配置的信息:
# https://hub.docker.com/_/nginx/
web:
image: nginx:alpine-slim # 使用轻量的 Nginx alpine 版本镜像,作为 web 服务器处理 HTTP 请求
restart: always # 容器退出时总是自动重启
ports:
- 8080:80 # 将容器内的 80 端口映射到主机的 8080 端口,可通过 http://主机IP:8080 访问 Nextcloud
depends_on:
- app # 依赖 app 服务,确保 FPM 容器启动后再启动 Nginx
volumes:
# 挂载自定义的 Nginx 配置文件(需提前创建 ./nginx.conf,参考 Nextcloud 官方 Nginx 配置文档)
- ./nginx.conf:/etc/nginx/nginx.conf:ro # :ro 表示只读,防止容器内修改配置
volumes_from:
- app # 共享 app 容器的卷,确保 Nginx 能访问 Nextcloud 的静态文件(如 CSS、JS 等)

volumes:
nextcloud: # 定义名为 nextcloud 的数据卷,用于存储 Nextcloud 应用数据(文件、配置、插件等)
db: # 定义名为 db 的数据卷,用于存储 MariaDB 数据库数据

安全存储和传递敏感信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
services:
# 注:PostgreSQL 是一个外部服务。你可以在以下链接找到更多关于其配置的信息:
# https://hub.docker.com/_/postgres
db:
# 注:请在以下链接查看推荐的数据库版本:https://docs.nextcloud.com/server/latest/admin_manual/installation/system_requirements.html#server
image: postgres:alpine # 使用 PostgreSQL 的轻量 alpine 版本镜像
restart: always # 容器退出时总是自动重启
volumes:
- db:/var/lib/postgresql/data # 将 PostgreSQL 数据目录 /var/lib/postgresql/data 挂载到名为 db 的数据卷,实现数据持久化
environment:
# 通过文件读取数据库配置(避免敏感信息明文暴露),文件路径由 secrets 定义
- POSTGRES_DB_FILE=/run/secrets/postgres_db # 从指定路径的文件中读取数据库名称
- POSTGRES_USER_FILE=/run/secrets/postgres_user # 从指定路径的文件中读取数据库用户名
- POSTGRES_PASSWORD_FILE=/run/secrets/postgres_password # 从指定路径的文件中读取数据库用户密码
secrets:
- postgres_db # 引用名为 postgres_db 的 secret(存储数据库名称)
- postgres_password # 引用名为 postgres_password 的 secret(存储数据库密码)
- postgres_user # 引用名为 postgres_user 的 secret(存储数据库用户名)

# 注:Redis 是一个外部服务。你可以在以下链接找到更多关于其配置的信息:
# https://hub.docker.com/_/redis
redis:
image: redis:alpine # 使用 Redis 的轻量 alpine 版本镜像,用于缓存提升 Nextcloud 性能
restart: always # 容器退出时总是自动重启

app:
image: nextcloud # 使用 Nextcloud 官方镜像(默认是 apache 版本,包含 web 服务器)
restart: always # 容器退出时总是自动重启
ports:
- 8080:80 # 将容器内的 80 端口映射到主机的 8080 端口,可通过 http://主机IP:8080 访问 Nextcloud
volumes:
- nextcloud:/var/www/html # 将 Nextcloud 应用目录 /var/www/html 挂载到名为 nextcloud 的数据卷,持久化应用数据(文件、配置等)
environment:
- POSTGRES_HOST=db # PostgreSQL 数据库主机地址(容器名,同一网络内可通过容器名访问)
# 通过文件读取数据库连接信息(与 db 服务的 secrets 对应,确保信息一致)
- POSTGRES_DB_FILE=/run/secrets/postgres_db # 从 secret 文件中读取数据库名称
- POSTGRES_USER_FILE=/run/secrets/postgres_user # 从 secret 文件中读取数据库用户名
- POSTGRES_PASSWORD_FILE=/run/secrets/postgres_password # 从 secret 文件中读取数据库密码
# 通过文件读取 Nextcloud 管理员账号信息(避免明文暴露)
- NEXTCLOUD_ADMIN_PASSWORD_FILE=/run/secrets/nextcloud_admin_password # 从 secret 文件中读取管理员密码
- NEXTCLOUD_ADMIN_USER_FILE=/run/secrets/nextcloud_admin_user # 从 secret 文件中读取管理员用户名
depends_on:
- redis # 依赖 redis 服务,确保 redis 启动后再启动 app
- db # 依赖 db 服务,确保数据库启动后再启动 app
secrets:
- nextcloud_admin_password # 引用管理员密码的 secret
- nextcloud_admin_user # 引用管理员用户名的 secret
- postgres_db # 引用数据库名称的 secret(与 db 服务共享)
- postgres_password # 引用数据库密码的 secret(与 db 服务共享)
- postgres_user # 引用数据库用户名的 secret(与 db 服务共享)

volumes:
db: # 定义名为 db 的数据卷,用于存储 PostgreSQL 数据库数据
nextcloud: # 定义名为 nextcloud 的数据卷,用于存储 Nextcloud 应用数据(文件、配置、插件等)

secrets:
nextcloud_admin_password:
file: ./nextcloud_admin_password.txt # 管理员密码存储路径(需手动创建该文件并填写密码,例如:myadminpass123)
nextcloud_admin_user:
file: ./nextcloud_admin_user.txt # 管理员用户名存储路径(需手动创建该文件并填写用户名,例如:admin)
postgres_db:
file: ./postgres_db.txt # PostgreSQL 数据库名称存储路径(需手动创建该文件,通常填写 nextcloud)
postgres_password:
file: ./postgres_password.txt # PostgreSQL 用户密码存储路径(需手动创建该文件并填写密码,例如:mydbpass456)
postgres_user:
file: ./postgres_user.txt # PostgreSQL 用户名存储路径(需手动创建该文件,通常填写 nextcloud)

启动部署

1
sudo docker compose up -d

获取WebDav地址


映射到Windows本地请看Windows文章中基础操作映射磁盘