docker搭建owncloud和onlyoffice并使用caddy反代,实现在线编辑文档

前置条件:Intel(R) Xeon(R) CPU E5-2690 v4 @ 2.60GHz 1 Virtual Core;Debian 12 bookworm;Caddy v2;docker 和 docker compose
owncloud使用docker compose部署,首先创建一个你自己喜欢的目录,等下我们把这个docker容器中的文件映射到这个目录。命令:mkdir whatever/path/to/owncloud && cd whatever/path/to/owncloud
编辑一下dockerfile:nano docker-compose.yml,模板来自官方

  volumes:
    files:
      driver: local
    mysql:
      driver: local
    redis:
      driver: local
  
  services:
    owncloud:
      image: owncloud/server:latest
      container_name: owncloud_server
      restart: always
      ports:
        - 8080:8080 #左边改成你自己喜欢的端口
      depends_on:
        - mariadb
        - redis
      environment:
        - OWNCLOUD_DOMAIN=owncloud.mydomain.org
        - OWNCLOUD_TRUSTED_DOMAINS=owncloud.mydomain.org,my_ip_address 
        #注意,如果要添加多个信任域名/ip,用半角逗号分隔,不要加空格,不要加端口号。
        - OWNCLOUD_DB_TYPE=mysql
              - OWNCLOUD_DB_NAME=owncloud
        - OWNCLOUD_DB_USERNAME=owncloud
        - OWNCLOUD_DB_PASSWORD=owncloud
        - OWNCLOUD_DB_HOST=mariadb
        - OWNCLOUD_ADMIN_USERNAME=admin
        - OWNCLOUD_ADMIN_PASSWORD=Th1sPa$$wordIs$uper$ecret!
        - OWNCLOUD_MYSQL_UTF8MB4=true
        - OWNCLOUD_REDIS_ENABLED=true
        - OWNCLOUD_REDIS_HOST=redis
      healthcheck:
        test: ["CMD", "/usr/bin/healthcheck"]
        interval: 30s
        timeout: 10s
        retries: 5
      volumes:
        - files:/mnt/data
            
    mariadb:
      image: mariadb:10.11 # minimum required ownCloud version is 10.9
      container_name: owncloud_mariadb
          restart: always
      environment:
        - MYSQL_ROOT_PASSWORD=owncloud
        - MYSQL_USER=owncloud
        - MYSQL_PASSWORD=owncloud
        - MYSQL_DATABASE=owncloud
        - MARIADB_AUTO_UPGRADE=1
      command: ["--max-allowed-packet=128M", "--innodb-log-file-size=64M"]
      healthcheck:
        test: ["CMD", "mysqladmin", "ping", "-u", "root", "--password=owncloud"]
        interval: 10s
        timeout: 5s
        retries: 5
      volumes:
        - mysql:/var/lib/mysql
  
    redis:
      image: redis:6
      container_name: owncloud_redis
      restart: always
      command: ["--databases", "1"]
      healthcheck:
        test: ["CMD", "redis-cli", "ping"]
        interval: 10s
        timeout: 5s
        retries: 5
      volumes:
        - redis:/data
  

然后 docker 启动! docker compose up -d
接下来就是把域名owncloud.mydomain.org解析到服务器ip地址,(这个时候编辑caddyfile并重启caddy也可以,不过我们装完onlyoffice再一起改)等下的onlyoffice也需要一个域名,所以解析的时候顺便把office.mydomain.org也解析到服务器的ip地址吧。
可以使用docker ps查看owncloud和依赖有没有正常运行,如果不行,看一下docker compose logs -f,排查原因。如果行,登录你刚刚在docker-compose.yml里面设置的owncloud管理员账户,进行基础设置,然后到owncloud的应用市场market里面下载onlyoffice这个应用。
owncloud设置大功告成,可以开始设置onlyoffice了:
我们在你喜欢的端口(比如12345)上面跑一个onlyoffice的docker 容器:

docker run -i -t -d -p 12345:80 --restart=always onlyoffice/documentserver

这个时候运行一下docker ps,查看刚刚创建的这个容器id,然后运行:

  docker exec <onlyoffice-container-id> /var/www/onlyoffice/documentserver/npm/json -f /etc/onlyoffice/documentserver/local.json '
  - services.CoAuthoring.secret.session.string'

可能就有人要问了:这个命令是干嘛的呢?
运行之后返回的字符串是我们onlyoffice的JWT secret key,等下在owncloud里面设置要用。把这个字符串记下来,下文中我们会用<JWT_secret>指代它。
好了,现在我们来设置Caddy吧。之所以在这一步设置Caddy,是因为onlyoffice(以及collabora online)要求服务端和客户端使用同样的协议,比如同为https或者同为http。我们使用Caddy进行反代,Caddy会自动给域名申请证书,这样owncloud客户端和onlyoffice服务端都是https协议的了。
如果你用的是nginx或者apache,也是一样的,如果需要https,请给两个域名手动申请证书,这里就不详细展开了。
我们编辑一下caddyfile吧:nano /etc/caddy/Caddyfile
加上下面这两行:

  owncloud.mydomain.org {
      reverse_proxy localhost:8080
  }
  
  office.mydomain.org {
      reverse_proxy localhost:12345
  }

保存并退出,重载一下caddy:systemctl reload caddy
现在通过owncloud.mydomain.org可以以https访问我们的owncloud实例了。
进入owncloud设置,左菜单栏下滑到底部选择“额外的”,在这里你可以设置onlyoffice服务器。
我们在ONLYOFFICE Docs地址那里填入office.mydomain.org,在秘钥那里填入<JWT_secret>。
点击保存,大功告成!
尝试在owncloud文件中打开一个.docx结尾的文档,你会看到onlyoffice加载并启动。
好了,结束了!

吐槽一下:
这篇文章是在Logseq上面写的。Logseq也太难用了吧,这个块状排版真的不适合习惯普通段落式的人……尤其是代码块难用得蛋疼,一旦把一个块变为代码块就无法回到文本编辑模式了……
Logseq的多端同步也很糟糕,使用git自动commit让我不得不每分钟看见一次错误信息,而且iOS的git客户端Working Copy也比较贵。目前我的做法是Syncthing 在 Android手机和Linux PC之间同步,38块钱买一个iOS的Syncthing客户端Möbius Sync高级版(当然由于iOS的后台机制,功能是残废的)把iPad也加入同步链。Syncthing没有中心服务器,我又不能保证有一台设备24小时运行且可访问(这个问题在我整了台小主机之后解决了。我要试试用小主机当中心服务器看看是否改善),所以经常在同步后出现文件冲突,非常烦人。
iOS用户需要注意:Logseq只能打开本地文件夹,而且是在Logseq的iOS应用沙盒中的文件夹,这个问题没办法通过挂载云存储解决。要想和其他设备同步,只能在你的同步软件上面下功夫,让同步软件能够访问Logseq的应用沙盒,Möbius Sync如此,Working Copy应该也是如此(没用过)。

docker搭建owncloud和onlyoffice并使用caddy反代,实现在线编辑文档
https://obsp.de/index.php/archives/5.html
本文作者 神木友希
发布时间 2025-02-10
许可协议 CC BY-NC-SA 4.0
发表新评论