一、docker+Docker Compose 安装

docker+dockercompose 安装不过多赘述,教程有很多。

二、配置

大于 等于 2 核 2g

centos7

docker 版本是 24.0.9

centos 官方已经停止更新了,docker 版本不易使用过高版本!

三、docker-compose.yml与 nginx.conf配置文件编写

注意 nextcloud 是 fpm 版本的。注意修改 image,用自己的镜像,我此处用的是已经下载好的镜像。

version: '3'
services:
  app:
    container_name: app-server
    image: nextcloud:32.0.5-fpm
    stdin_open: true
    tty: true
    restart: always
    # 修复:增加 DNS 以解决应用商店连接超时问题
    # dns:
    #   - 8.8.8.8
    #   - 223.5.5.5
    expose:
      - '9000' 
      - '80' 
    networks:
      - onlyoffice
    volumes:
      - app_data:/var/www/html
    environment:
      # 新增:仅添加数据库连接变量(核心修复,其余不变)
      - MYSQL_HOST=mysql-server  # 对应db的container_name
      - MYSQL_PASSWORD=Msql123
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
    depends_on:
      - db  # 新增:先启动数据库,再启动Nextcloud

  onlyoffice-document-server:
    container_name: onlyoffice-document-server
    # 修复:镜像名补全(仅改这处,标签9.2.1保留)
    image: onlyoffice:9.2.1
    stdin_open: true
    tty: true
    restart: always
    networks:
      - onlyoffice
    expose:
      - '80'
      - '443'
    volumes:
      - document_data:/var/www/onlyoffice/Data
      - document_log:/var/log/onlyoffice
      - ./fonts:/usr/share/fonts/truetype/custom
    ports:
      - 2280:80
      - 4423:443
    environment:
      - JWT_ENABLED=true
      - JWT_SECRET=root123456
    depends_on:
      - app  # 新增:先启动Nextcloud,再启动OnlyOffice

  nginx:
    container_name: nginx-server
    image: nginx:stable-alpine
    stdin_open: true
    tty: true
    restart: always
    ports:
      - 2380:80
      - 4433:443
    networks:
      - onlyoffice
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - app_data:/var/www/html
    depends_on:
      - app  # 新增:先启动FPM,再启动Nginx

  db:
    container_name: mysql-server
    image: mysql:8.0.37
    restart: always
    volumes:
      - mysql_data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=Mysql123
      - MYSQL_PASSWORD=Msql123
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
    # 新增:添加字符集+认证插件(兼容Nextcloud)
    command: 
      - --default-authentication-plugin=mysql_native_password
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    networks:
      - onlyoffice

networks:
  onlyoffice:
    driver: bridge
    driver_opts:
      com.docker.network.driver.mtu: 1400
volumes:
  document_data:
  document_log:
  app_data:
  mysql_data:

nginx 配置文件编写

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {

    upstream backend {
      server app-server:9000;
    }


    include       /etc/nginx/mime.types;
    types {
        application/javascript mjs;
        image/svg+xml svg svgz;
        application/wasm wasm;
    }
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    map $http_host $this_host {
        "" $host;
        default $http_host;
    }

    map $http_x_forwarded_proto $the_scheme {
        default $http_x_forwarded_proto;
        "" $scheme;
    }

    map $http_x_forwarded_host $the_host {
       default $http_x_forwarded_host;
       "" $this_host;
    }

    server {
   	listen 80;

        # Add headers to serve security related headers
        add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
        add_header X-Content-Type-Options nosniff;
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Robots-Tag none;
        add_header X-Download-Options noopen;
        add_header X-Permitted-Cross-Domain-Policies none;

        root /var/www/html;
        client_max_body_size 10G; # 0=unlimited - set max upload size
        fastcgi_buffers 64 4K;

        gzip off;

        index index.php;
        error_page 403 /core/templates/403.php;
        error_page 404 /core/templates/404.php;

        rewrite ^/.well-known/carddav /remote.php/dav/ permanent;
        rewrite ^/.well-known/caldav /remote.php/dav/ permanent;

        location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
        }

        location ~ ^/(build|tests|config|lib|3rdparty|templates|data)/ {
            deny all;
        }

        location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
            deny all;
        }

        location / {
            rewrite ^/remote/(.*) /remote.php last;
            rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;
            try_files $uri $uri/ =404;
        }

	location ~* ^/ds-vpath/ {
		rewrite /ds-vpath/(.*) /$1  break;
                proxy_pass http://onlyoffice-document-server;
                proxy_redirect     off;

                client_max_body_size 100m;

                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";

                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Host $the_host/ds-vpath;
                proxy_set_header X-Forwarded-Proto $the_scheme;
        }

        location ~ \.php(?:$|/) {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
            fastcgi_param HTTPS off;
            fastcgi_param modHeadersAvailable true; #Avoid sending the security headers twice
            fastcgi_pass backend;
            fastcgi_intercept_errors on;
        }

        # Adding the cache control header for js and css files
        # Make sure it is BELOW the location ~ \.php(?:$|/) { block
        location ~* \.(?:css|js)$ {
            add_header Cache-Control "public, max-age=7200";
            # Add headers to serve security related headers
            add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
            add_header X-Content-Type-Options nosniff;
            add_header X-Frame-Options "SAMEORIGIN";
            add_header X-XSS-Protection "1; mode=block";
            add_header X-Robots-Tag none;
            add_header X-Download-Options noopen;
            add_header X-Permitted-Cross-Domain-Policies none;
            # Optional: Don't log access to assets
            access_log off;
        }

        # Optional: Don't log access to other assets
        location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|swf)$ {
            access_log off;
        }

    }
}

四、配置文件上传到服务器用进入配置文件目录 dockercompose 启动服务

#执行命令
docker compose up -d

#或者,根据dockercompose 版本选择命令
docker-compose up -d

查看服务启动状况,都呈现 up 启动服务成功。

五、访问 nextcloud 与 onlyoffice 页面

http://你的服务 IP:2380/

http://你的服务 IP:2280/

nextcloud 页面大致如下摸样,不过第一次进入需要填信息,账户和密码你自由填写会自己创建管理员账户比如 admin/admin@123,2面的数据库信息在前面的 dockercompose.yml 文件中有,一般已经填好了不需要有变化除非你有更改填写自己对应的信息便可。填写完后点击进入会加载一段时间需要等待,长时间没反应可以刷新页面。

onlyoffice 页面如下图所示,能进入说明部署成功。你也可以执行下面红色框的内容点击 goto example 看能够进去。

六、nextcloud 配置

(1)nextcloud 应用商店直接添加 onlyoffice

登录进入 nextcloud 页面、点击右上角头像选择应用按钮

点击左侧 Files 在右边搜索 onlyoffice 点击下载并启用即可

点击头像进入管理设置找到左侧 onlyoffice,在服务器设置里填入 onlyoffice 地址

http://你的服务器 IP:2280/

密钥在 docker-compose.yml文件 的 onlyoffice 配置里。填写完成后点击保存即可

(2)去 nextcloud 网站https://apps.nextcloud.com/apps/onlyoffice往下翻下载对应 nextcloud(我这里是 32)版本的 onlyoffice 包,用命令移动到custom_apps里文件里去,之后同样的方式启用 onlyoffice 保存。

# 用 docker cp 传进去
docker cp onlyoffice.tar.gz app-server:/var/www/html/custom_apps/

# 进入容器解压
docker exec -u www-data app-server tar -xzf /var/www/html/custom_apps/onlyoffice.tar.gz -C /var/www/html/custom_apps/

现在打开文件处就可以新建 word、pdf、ppt 等文件了,点击即可用 onlyoffice 打开

七、常见问题

1、nextcloud 能访问、onlyoffice 的页面无法访问且 docker ps 显示 onlyoffice 是 up 状态

可能是 onlyoffice 容器内的 nginx (并不是外部 nginx)没有启动,执行以下命令可直接启动,ctrl +f5 再次尝试刷新页面进入 onlyoffice 尝试。如果nginx 起不起来

#启动容器内nginx
docker exec -d onlyoffice-document-server service nginx start

#启动不起来手动打补丁或者先看日志有没有一个说cache_tag相关错误的日志
#以下代码执行
docker exec -it onlyoffice-document-server bash
# 在 http { 里面加一行 map
sed -i '/http {/a \    map $http_host $cache_tag { default ""; }' /etc/nginx/nginx.conf
service nginx start

2、应用页面进不去

个人头像点击应用一直转圈进不去页面过一会就报nginx502 错误了刷新进去了左边下面的东西比如 files 没有也没有可显示应用,你的配置文件里可能少了下面这个配置。容器内的 mtu 必须小于宿主机。

八、在onlyoffice中安装字体

在 docker-compose.yml 中添加字体文件挂载文件,输入命令刷新字体配置,重启 onlyoffice。

重启后 ctrl+F5 刷新 nextcloud,可能需要重新连接一下 onlyoffice。可能要多等几分钟加载字体。

docker exec onlyoffice-document-server /usr/bin/documentserver-generate-allfonts.sh

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐