5

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

 3 years ago
source link: https://wusiyu.me/docker-nextcloud-self-sign-https-redis-with-samba-depoly-guide/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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用来实现容器间网络绑定的)

image-3.png

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK