在windows上使用docker compose部署nextcloud
部署
创建一个nextcloud文件夹
创建.env文件
# --- 数据库配置 ---
DB_ROOT_PASSWORD=super_secure_root_password
DB_NAME=nextcloud
DB_USER=nextcloud_user
DB_PASSWORD=nextcloud_db_password
# --- Redis 配置 ---
REDIS_PASSWORD=redis_secure_password
# --- 端口配置 ---
NEXTCLOUD_PORT=18080
# 新增这两行,密码自己定
NEXTCLOUD_ADMIN_USER=admin
NEXTCLOUD_ADMIN_PASSWORD=your_secure_password
创建docker-compose.yml文件
services:
db:
image: mariadb:10.11
container_name: nextcloud-db
restart: always
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW --log-bin=binlog
volumes:
- ./db:/var/lib/mysql:delegated # 数据库保留在 D 盘,方便备份
environment:
- MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
- MYSQL_DATABASE=${DB_NAME}
- MYSQL_USER=${DB_USER}
- MYSQL_PASSWORD=${DB_PASSWORD}
networks:
- nextcloud-net
redis:
image: redis:alpine
container_name: nextcloud-redis
restart: always
command: redis-server --requirepass ${REDIS_PASSWORD}
volumes:
- redis_data:/data
networks:
- nextcloud-net
app:
image: nextcloud:29
container_name: nextcloud-app
user: "0:0" # 即使使用具名卷,Windows 环境下建议保留 root 运行以确保万无一失
restart: always
ports:
- "${NEXTCLOUD_PORT}:80"
volumes:
- nextcloud_html:/var/www/html # 程序文件改用具名卷,彻底根除 500 报错
- ./data:/var/www/html/data:delegated # 核心资产保留在 D 盘,备份无忧
environment:
- MYSQL_HOST=db
- MYSQL_DATABASE=${DB_NAME}
- MYSQL_USER=${DB_USER}
- MYSQL_PASSWORD=${DB_PASSWORD}
- REDIS_HOST=redis
- REDIS_HOST_PASSWORD=${REDIS_PASSWORD}
networks:
- nextcloud-net
cron:
image: nextcloud:29
container_name: nextcloud-cron
user: "0:0"
restart: always
volumes:
- nextcloud_html:/var/www/html
- ./data:/var/www/html/data:delegated
entrypoint: /cron.sh
networks:
- nextcloud-net
networks:
nextcloud-net:
driver: bridge
volumes:
nextcloud_html: # 自动管理的程序代码空间
redis_data: # 自动管理的缓存空间
附带:在Ubuntu上部署(此方法未尝试)
mkdir nextcloud
cd nextcloud
执行
# 创建数据文件夹
mkdir -p db data
# 将权限移交给容器内的 Web 用户 (UID 33)
sudo chown -R 33:33 ./data
# 将权限移交给容器内的数据库用户 (UID 999)
sudo chown -R 999:999 ./db
# 给目录标准的 Linux 权限
sudo chmod -R 755 ./data ./db
创建写入上述的.env文件
写入docker-compose.yml文件
services:
db:
image: mariadb:10.11
container_name: nextcloud-db
restart: always
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW --log-bin=binlog
volumes:
- ./db:/var/lib/mysql # 原生 Linux 文件系统,不需要 :delegated
environment:
- MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
- MYSQL_DATABASE=${DB_NAME}
- MYSQL_USER=${DB_USER}
- MYSQL_PASSWORD=${DB_PASSWORD}
networks:
- nextcloud-net
redis:
image: redis:alpine
container_name: nextcloud-redis
restart: always
command: redis-server --requirepass ${REDIS_PASSWORD}
volumes:
- redis_data:/data
networks:
- nextcloud-net
app:
image: nextcloud:29
container_name: nextcloud-app
restart: always # 删除了 user: "0:0",回归 www-data 安全运行
ports:
- "${NEXTCLOUD_PORT}:80"
volumes:
- nextcloud_html:/var/www/html
- ./data:/var/www/html/data # 删除了 :delegated
environment:
- MYSQL_HOST=db
- MYSQL_DATABASE=${DB_NAME}
- MYSQL_USER=${DB_USER}
- MYSQL_PASSWORD=${DB_PASSWORD}
- REDIS_HOST=redis
- REDIS_HOST_PASSWORD=${REDIS_PASSWORD}
# --- 性能优化参数 ---
- PHP_MEMORY_LIMIT=512M
- PHP_UPLOAD_LIMIT=10G
- OPCACHE_MEM_SIZE=256
networks:
- nextcloud-net
cron:
image: nextcloud:29
container_name: nextcloud-cron
restart: always # 同样删除了 user: "0:0"
volumes:
- nextcloud_html:/var/www/html
- ./data:/var/www/html/data
entrypoint: /cron.sh
networks:
- nextcloud-net
networks:
nextcloud-net:
driver: bridge
volumes:
nextcloud_html:
redis_data:
运行即可
sudo docker compose up -d
排障
遇到“修复数据库丢失的索引”问题
执行下述代码即可
docker exec -u www-data nextcloud-app php occ db:add-missing-indices
解决缓冲区满了的问题
在yml文件中追加
app:
...
environment:
- MYSQL_HOST=db
# (其他地方不变)
# --- 添加以下三行优化参数 ---
- PHP_MEMORY_LIMIT=512M # 默认通常较小,改为 512M 网页更顺滑
- PHP_UPLOAD_LIMIT=10G # 允许上传超大文件(默认很小)
- OPCACHE_MEM_SIZE=256 # 解决看到的 "OPcache 几乎已满" 警告
重新运行yml文件即可。
参考链接: