用自己的服务器搭建nextcloud网盘方案

本文最后更新于 2023年9月22日。

背景

最近换了服务器,准备再搭建一下网盘用于以后的使用。
以前用的cloudreve,功能比较简单,由于用得少,渐渐停用了。
这次尝试了nextcloud和seafile。
这次搭建网盘花费了不少时间,因为总是不太顺利。这可能和我对docker不够熟悉有关,另外网盘的搭建教程多少有点不完善。
单单是搭建LNMP环境找合适的dockerfile和yml文件就很不容易。要找到适合自己的只能一步一步学习探索。幸运的是最后终于写出了适合自己的php8.0的dockerfile文件,并且可以正常使用。该文件也已经附在文章当中。希望对你有用。
虽然nextcloud用户比较多,但自己去搭建网盘服务的毕竟是少数。所以有很多问题找不到答案。
因此我把我的搭建过程写下来,给后来的人一些参考,少走一些弯路。不过需要说明的是,本片文章是我对探索出来可用的配置做一个记录,方便今后直接使用。内容比较简单,因此不适合新手当作教程用,因为可能会遇到其他问题不知道怎么解决。这篇文章供有一定基础的人参考,作用在于提供一个核心配置和一点思路。
seafile直接使用官方的方法搭建成功了。但是再启用https的时候又坑,虽然官方说新版本已经解决,但实际上并没有。并且官方给的解决办法不起作用。
seafile整体功能还可以,不过它会创建很多数据库,还有不少服务,再加上界面我也不太喜欢,所以就没用。
nextcloud功能很丰富,界面比较喜欢,不过用了很多方法去搭建,只有一种能完全成功的运行,并且还不确定如果让我再搭建一次还能不能成功。其他的都会有部分功能不正常。已经查明的原因有:

  1. 权限设置不符合程序要求,
  2. nginx配置设置不完善。
    还有些也不知道具体原因,感觉程序日志不完善。
    下面是我安装nextcloud安装方式中的两种方案,一个是使用官方的应用镜像,一个是自己搭好LNMP环境用单文件脚本装的。
    两种方式都是用到docker-compose工具。
    第一种方案所有功能可以正常使用,但是不确定是否可以复现。
    第二种方案基本功能可以正常使用,但是有写功能不能正常加载,目前不清楚原因。

利用官方镜像安装

docker-compose使用的yml文件:

version: "3.4"
services:
  mysql:
    hostname: mysql
    restart: always
    image: mysql:5.6
    container_name: mysql
    ports:
      - "3306:3306"
    volumes:
      - mysql-config:/etc/mysql
      - mysql-log:/var/log/mysql
      - mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: rootpw
      MYSQL_DATABASE: nextcloud
      MYSQL_USER: user
      MYSQL_PASSWORD: user123
      # sort_buffer_size : 524288 #220920add no use
  cache:
    image: redis
    restart: unless-stopped
    expose:
     - "6379"
    volumes:
     - ./cache:/data
    command: redis-server --requirepass 'redis_password' # 这里的redis_password换成你要配置的redis密码
    # command指的是启动容器后代替默认启动指令来启动服务的指令
  app:
    image: nextcloud:fpm
    restart: unless-stopped
    expose:
     - "9000"
    volumes:
     - ./app/html:/var/www/html
     - ./app/data:/var/www/html/data
     - ./app/config:/var/www/html/config
     - ./app/custom_apps:/var/www/html/custom_apps
    links:
    # links将容器与当前容器链接起来,以使得当前容器可以访问目标容器expose的端口
    # 格式为 容器的原名:映射到当前容器中的名称
     - mysql:mysql
     - cache:cache
    depends_on:
    # 依赖的容器列表,只有这些容器都成功启动了,才会启动当前容器
     - mysql
     - cache
  nginx:
    hostname: nginx
    restart: always
    container_name: nginx
    image: nginx:1.17.0
    ports:
      - "80:80"
      - "443:443"
    links:
      #- "php:php"
      - app:app
    volumes:
      - nginx-config:/etc/nginx
      - nginx-log:/var/log/nginx
      - nginx-html:/usr/share/nginx/html    
      - ./app/html:/var/www/html
      - ./proxy/conf.d:/etc/nginx/conf.d:ro
      - ./proxy/ssl_certs:/etc/nginx/ssl_certs:ro
    depends_on:
     - app
volumes:
  mysql-config:
  mysql-log:
  mysql-data:
  nginx-html:
  php-config:
  nginx-config:
  nginx-log:

搭建LNMP环境后再安装Nextcloud

搭建LNMP环境使用的yml:

version: "3.4"
services:
  mysql:
    hostname: mysql
    restart: always
    image: mysql:5.6
    container_name: mysql
    ports:
      - "3306:3306"
    volumes:
      - /home/mysql-config:/etc/mysql
      - /home/mysql-log:/var/log/mysql
      - /home/mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: rootpw
      MYSQL_USER: user
      MYSQL_PASSWORD: user123
  php:
    hostname: php
    restart: always
    image: php:8.0
    container_name: php
    build:
      context: ./php
      dockerfile: Dockerfile
    ports:
      - "9000:9000"
    links:
      - mysql:mysql
    volumes:
      - /home/nginx-html:/var/www/html
      - /home/php-workspace:/workspace
      - /home/php-config:/usr/local/etc
    depends_on:
        # 依赖的容器列表,只有这些容器都成功启动了,才会启动当前容器
        - mysql
        - redis      
  nginx:
    hostname: nginx
    restart: always
    container_name: nginx
    image: nginx:1.17.0
    ports:
      - "80:80"
      - "443:443"
    links:
      - "php:php"
    volumes:
      - /home/nginx-config:/etc/nginx
      - /home/nginx-log:/var/log/nginx
      - /home/nginx-html:/usr/share/nginx/html
      # - /home/nginx-config/conf.d:/etc/nginx/conf.d:ro
      # - /home/nginx-config/ssl_certs:/etc/nginx/ssl_certs:ro      
    depends_on:
     - php
  redis:
    image: redis
    restart: unless-stopped
    expose:
      - "6379"
    volumes:
      - /home/redis:/data
    command: redis-server --requirepass 'redis_password' # 这里的redis_password换成你要配置的redis密码
    # command指的是启动容器后代替默认启动指令来启动服务的指令

php的dockerfile:
此文件放入上面yml文件的同级目录的php文件夹下。

FROM php:8.0-fpm
#docker中php扩展安装方式
#1、PHP源码文件目录自带扩展 docker-php-ext-install直接安装
#2、pecl扩展 因为一些扩展不包含在PHP源码文件中,PHP 的扩展库仓库中存在。用 pecl install 安装扩展,再用 docker-php-ext-enable 命令 启用扩展
#3、其他扩展 一些既不在 PHP 源码包,也不再 PECL 扩展仓库中的扩展,可以通过下载扩展程序源码,编译安装的方式安装
#redis扩展 仓库地址 https://pecl.php.net/package/redis
ENV PHPREDIS_VERSION 5.3.4
#memcached扩展 仓库地址 https://pecl.php.net/package/memcached
ENV MEMCACHED_VERSION 3.1.5
#mongodb扩展 https://pecl.php.net/package/mongodb
ENV MONGODB_VERSION 1.11.1
# 设置时间
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo 'Asia/Shanghai' > /etc/timezone
# #更换源
# RUN    sed -i "s/deb.debian.org/mirrors.aliyun.com/g" /etc/apt/sources.list
RUN apt-get update && apt-get install -y \
    vim \
    wget \
    git \
    bzip2 \
    zip \
    libz-dev \
    libssl-dev \
    libnghttp2-dev \
    libpcre3-dev \
    libmemcached-dev \
    libzip-dev \
    libbz2-dev \
    libjpeg-dev \
    libpng-dev \
    curl \
    libcurl4-openssl-dev \
    libonig-dev \
    libxml2-dev \
    supervisor  \
    libfreetype6-dev \
    libjpeg62-turbo-dev \
    zlib1g-dev \
#    && docker-php-ext-install -j$(nproc) gd \
#        && docker-php-ext-install zip \
#        && docker-php-ext-install pdo_mysql \
#        && docker-php-ext-install opcache \
#        && docker-php-ext-install mysqli \
    && docker-php-ext-install mbstring \
    && docker-php-ext-install bz2 \
    && docker-php-ext-install soap \
    && rm -r /var/lib/apt/lists/*\
    && usermod -u 1000 www-data\
    && groupmod -g 1000 www-data    
#编译安装核心扩展 gd
RUN apt-get update &&\
    apt-get install -y     libfreetype6-dev libjpeg62-turbo-dev libpng-dev \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) gd\
    && docker-php-ext-install pdo_mysql \
    && docker-php-ext-install opcache \
    && docker-php-ext-install mysqli
# 安装zip扩展所需的依赖扩展
RUN  apt-get update \
    && apt-get install -y zlib1g-dev && apt-get install -y libzip-dev\
    # 安装并启动zip扩展
    && docker-php-ext-install zip
# # Composer安装
# RUN curl -sS https://getcomposer.org/installer | php \
#     && mv composer.phar /usr/local/bin/composer \
#     && composer self-update --clean-backups
# # Mysqli 扩展 自带 直接安装即可(当前数据库使用的mysqli查询的)
# RUN docker-php-ext-install mysqli
# # PDO 扩展 自带 直接安装即可
# RUN docker-php-ext-install pdo_mysql
# # Bcmath 扩展 自带 直接安装即可
# RUN docker-php-ext-install bcmath
# #pecl 安装扩展 redis
# RUN pecl install redis-5.3.2 \
#     && docker-php-ext-enable redis
# Redis 扩展下载 pecl本地安装 开启扩展
RUN wget http://pecl.php.net/get/redis-${PHPREDIS_VERSION}.tgz -O /tmp/redis.tgz \
    && pecl install /tmp/redis.tgz \
    && rm -rf /tmp/redis.tgz \
    && docker-php-ext-enable redis
# memcached 扩展下载 pecl本地安装 开启扩展 前面已经通过 apt-get安装了libmemcached-dev依赖
RUN wget http://pecl.php.net/get/memcached-${MEMCACHED_VERSION}.tgz -O /tmp/memcached.tgz \
    && pecl install /tmp/memcached.tgz \
    && rm -rf /tmp/memcached.tgz \
    && docker-php-ext-enable memcached
# mongodb 扩展下载 pecl本地安装 开启扩展 前面已经通过
RUN wget http://pecl.php.net/get/mongodb-${MONGODB_VERSION}.tgz -O /tmp/mongodb.tgz \
    && pecl install /tmp/mongodb.tgz \
    && rm -rf /tmp/mongodb.tgz \
    && docker-php-ext-enable mongodb
# 开启php-fpm
# RUN php-fpm
CMD ["php-fpm", "-F"]

搭建好LNMP环境后在这里下载安装包。

https://download.nextcloud.com/server/releases/

我下载的是

nextcloud-24.0.5.zip

也可以去官网下载安装脚本文件

https://download.nextcloud.com/server/installer/setup-nextcloud.php
setup-nextcloud.php

用浏览器访问该文件根据提示进行安装。