Docker / Nextcloud (手动/自签名https + redis + 与samba等协同)完全体部署指南

之所以用自签名或者手动设置证书,是考虑国内环境下家用宽带公网IP不开放80和443等Web端口,所以无法使用nginx-proxy这类自动设置Let’s Encrypt证书的容器(可手动使用Let’s Encrypt的DNS Challenge获得证书),如果是正常公网环境,自然用自动的更方便。

关于docker hub上Nextcloud的容器,有官方版(nextcloud/nextcloud)和一些第三方版(比如接下来的linuxserver/nextcloud),官方版的默认功能比较单一,apache版仅提供一个HTTP的Nextcloud服务,fpm版更是需要其他的nginx容器来辅助,也默认也没有cron的功能。

所以我比较倾向于使用linuxserver/nextcloud这个镜像,这个镜像本身就可以提供自签名的HTTPS,之后也可以方便的手动替换别的证书。并且这个镜像还自带了cron服务,无需再手动配置Nextcloud的cron,在小型系统上,一个nginx同时承担nextcloud+https的功能也更高效一些。

为了让Nextcloud发挥最高效率,还需要MySQL和redis,下面给出我目前使用的docker-compose文件,和使用方法。以下操作在fedora server 33 + podman环境上测试无问题(podman是一个docker的替代品),请根据实际需要进行修改。

version: "2.1"
services:
  nextcloud:
    image: ghcr.io/linuxserver/nextcloud
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Shanghai
    volumes:
      - ./config:/config
      - ./data:/data
      # 如果你有其他路径下的文件数据需要让Nextcloud访问,添加在这里
      # 为了方便后续设置,请在容器内使用相同的路径,如:
      # - /srv:/srv
    ports:
      - 443:443
    restart: unless-stopped

  db:
    image: mariadb
    restart: unless-stopped
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
    volumes:
      - ./db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=1000%
      - MYSQL_PASSWORD=1000%
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud

  redis:
    image: redis:alpine
    restart: unless-stopped
    volumes:
      - ./redis:/data

使用指南:首先创建一个目录,后续Nextcloud应用所有的文件和数据都会存放在此文件夹下,然后进入目录,创建好之后用了存放容器数据的文件夹:

mkdir nextcloud
cd nextcloud
mkdir config data db redis

将上面给出的docker-compose内容保存为docker-compose.yaml,然后创建并启动所有容器:

docker-compose up -d      # 或podman-compose up -d

接下来进入https://<your_host>/进行设置,注意不要用默认的SQLite,需要输入刚才mysql容器的配置,为了降低安装失败的概率,可以取消勾选“安装推荐的应用”:

接下来启用redis,需要修改Nextcloud的配置文件(config/www/nextcloud/config/config.php),加入以下几行:

  'memcache.distributed' => '\\OC\\Memcache\\Redis',
  'memcache.locking' => '\\OC\\Memcache\\Redis',
  'redis' =>
  array (
    'host' => 'redis',
    'port' => 6379,
  ),

最后,如果你有其他路径下的文件数据需要让Nextcloud访问,比如你有一个已有的samba共享,希望它与Nextcloud协同,并不影响原有的文件结构,并表现的和Nextcloud原生的文件一样,那么可以使用在Nextcloud用户目录下建立符号连接的方式:

注:当然,如果你不想使用这种比较hack的方式,可以简单的通过Nextcloud自带的“外部存储”功能实现类似的效果,无须后续的操作,不过你的“外部存储”会和Nextcloud原生的文件表现地“略有差异”。

首先修改Nextcloud的配置文件,允许符号链接(多用户场景下请注意可能的安全性影响),和一些其他配置:

  'localstorage.allowsymlinks' => true,        // 允许符号连接
  'filesystem_check_changes' => 1,             // 实时检测文件系统变化
  'quota_include_external_storage' => true,    // 打开这个可避免容量限额识别问题

然后到Nextcloud用户的数据目录(data/<nextcloud_username>/files/),建立符号连接:

ln -s /srv my_smb_share

之后你可能还需要手动让Nextcloud执行一次文件扫描(视文件大小,可能会耗时较久):

docker exec -it <your_nextcloud_container> occ files:scan --all

然后就可以看到你新加进去的目录了:

最后附上一张容器的资源使用情况:(那个xxxxxxxx-infra的容器大概是podman用来实现容器间网络绑定的)

最后关于手机端数据同步,官方客户端在文件数量非常多的情况下可能会卡死,这是可以使用Nextcloud提供的Webdav服务配合第三方APP(如:安卓下的FolderSync)进行同步,甚至速度会更快。

作者:WuSiYu

学生,Web开发者,智能硬件&IOT爱好者

发表评论

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