在windows上使用docker compose部署nextcloud

在windows上使用docker compose部署nextcloud

Table of Contents

部署

创建一个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文件即可。

参考链接:

https://blog.leihub.cn/archives/956

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注