Giter Site home page Giter Site logo

document-server-proxy's Introduction

ONLYOFFICE Document Server example configurations for proxy

Config Test Build Status

This reposotory contains the configuration files for the web-servers to proxy traffic to the ONLYOFFICE DocumentServer.

document-server-proxy's People

Contributors

agolybev avatar aknobloch avatar alexeybannov avatar danilapog avatar friedcircuits avatar konovalovsergey avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

document-server-proxy's Issues

Help for HAproxy virtual-path

I need the same config for HAproxy. I tried but my config do not work.

My haproxy.conf:

frontend cloud
bind *:80
mode http
acl is_oo path_beg /oo
option forwardfor header X-Real-IP
use_backend ooffice if is_oo
default_backend cloudnodes

backend cloudnodes
mode http
balance roundrobin
option forwardfor
http-request set-header X-Forwarded-Port %[dst_port]
cookie SERVERID insert indirect nocache
server own-01 1.2.3.40:80 check cookie own-01 check inter 1000 rise 1 fall 1
server own-02 1.2.3.41:80 check cookie own-02 check inter 1000 rise 1 fall 1

backend ooffice
mode http
option httpclose
option forwardfor header X-Real-IP
http-request set-header X-Forwarded-Port %[dst_port]
http-request add-header X-Forwarded-For %[src]
http-request set-header X-Client-IP %[src]
http-request set-header X-Forwarded-Proto http
http-request set-header Forwarded proto=http
http-request add-header Host %[src]
http-request add-header X-Forwarded-Host %[src]
http-request add-header X-Forwarded-Server %[src]
reqrep ^([^\ :])\ /oo(.) \1\ \2
server oo-01 1.2.3.4:80

It is working:

frontend default_port_80
mode http
bind :80
acl oo path_beg /oo
use_backend ooffice if oo
default_backend default_service

backend default_service
mode http
balance roundrobin
cookie SERVERID insert indirect nocache
server own-01 IP_ownc:80 check cookie own-01 check inter 1000 rise 1 fall 1

backend ooffice
mode http
acl existing-x-forwarded-host req.hdr(X-Forwarded-Host) -m found
http-request add-header X-Forwarded-Host %[req.hdr(Host)]/oo unless existing-x-forwarded-host
reqrep ^([^\ :])\ /oo/(.) \1\ /\2
server onlyoffice-documentserver IP_documentserver:80

ONLYOFFICE cannot be reached. Please contact admin

NextCloud and ONLYOFFICE can be used in the intranet behind a proxy, but cannot be connected to the Internet after a proxy.

I have two instances of Nextcloud on the same machine. I configured the connector of both cases to use the same settings. The configuring was successful - I saw the message with the green label:

Settings have been successfully updated (version 7.4.1.36)

However, one instance of Nextcloud opens files with ONLYOFFICE successfully whereas the other instance does not:

ONLYOFFICE cannot be reached. Please contact admin

NextCloud and ONLYOFFICE host ip:192.168.2.3
nginx ip:192.168.2.1

nextcloud config.php:

  array (
     "jwt_secret" => "xxxxxxx",
     "jwt_header" => "AuthorizationJwt",
     //'verify_peer_off' => TRUE,
  )

nginx:

upstream docservice {
  server xxx.xxx:9980;
}

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;
}

map $http_upgrade $proxy_connection {
  default upgrade;
  "" close;
}

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $proxy_connection;
proxy_set_header X-Forwarded-Host $the_host;
proxy_set_header X-Forwarded-Proto $the_scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

server {
  listen 9980 ssl;
  server_name xxx.xxx;

  ssl_certificate /etc/nginx/conf.d/xxx.xxx.crt;
  ssl_certificate_key /etc/nginx/conf.d/xxx.xxx.key;

  ssl_verify_client off;

  ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";

  ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
  #ssl_session_cache  builtin:1000  shared:SSL:10m;

  ssl_prefer_server_ciphers   on;

  ## [Optional] Before enabling Strict-Transport-Security headers, ensure your server is properly configured for SSL.
  ## This directive informs the browser to always use HTTPS. For more info see:
  ## - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security
  # add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
  # add_header X-Frame-Options SAMEORIGIN;
  add_header X-Content-Type-Options nosniff;

  ## [Optional] If your certficate has OCSP, enable OCSP stapling to reduce the overhead and latency of running SSL.
  ## Replace with your ssl_trusted_certificate. For more info see:
  ## - https://medium.com/devops-programming/4445f4862461
  ## - https://www.ruby-forum.com/topic/4419319
  ## - https://www.digitalocean.com/community/tutorials/how-to-configure-ocsp-stapling-on-apache-and-nginx
  # ssl_stapling on;
  # ssl_stapling_verify on;
  # ssl_trusted_certificate /etc/nginx/ssl/stapling.trusted.crt;
  # resolver 208.67.222.222 208.67.222.220 valid=300s; # Can change to your DNS resolver if desired
  # resolver_timeout 10s;

  ## [Optional] Generate a stronger DHE parameter:
  ##   cd /etc/ssl/certs
  ##   sudo openssl dhparam -out dhparam.pem 4096
  ##
  # ssl_dhparam /etc/ssl/certs/dhparam.pem;

  location / {
       proxy_pass http://192.168.2.3:9980;
       proxy_http_version 1.1;

  }
}

Nginx proxy manager

Anyone able to help with this issue?

Involves the following setup:
Nextcloud (docker).
OO Document Server (docker).
Nginx Proxy Manager (docker).

Nextcloud = https://cloud.domain.com
OO = https://office.domain.com

Visiting http://ip:port/example i am able to create a new document and edit it to my liking.
Visiting https://office.domain.com/example i am able to create a new document HOWEVER i am not able to edit it. Shows a blank screen.

The same is happening on nextcloud. Able to create document/spreadsheet, but it becomes blank/shows blank page.

I am assuming some issue with reverse proxy (using nginx proxy manager).

Thank you for all your input.

404 on nginx proxy_pass

This is my config. 10.0.0.121:3080 is my document servers ip/port.
It returns a 404 when I navigate to the url that the server is listening on and even adds the /welcome/ subdomain. This makes no sense. I have disabled all unnecessary options and even re wrote some of the parts verbatim from the example given as to rule out any errors. Any ideas? It is

This is the error given on the browser side:
Error loading this URI: Protocol error (unknownError): Could not load the source for https://office.pfaffe.me/welcome/. Error: Failed to fetch https://office.pfaffe.me/welcome/. Code 2153390067. Stack: onResponse@resource://devtools/shared/DevToolsUtils.js:544:16 onStopRequest@resource://gre/modules/NetUtil.jsm:123:17 Line: 544, column: 16

image

help for iis reverse proxy

step 1 .i have setup a nextcloud with onlyoffice docker.
step 2. i set a reverse proxy server with iis 10.
if i use local ip ,everything is fine.
but if i access from internet , nextcloud is all right (except some small problem like:
tim 20180313175054, online office documents can't open.

iis 10 config:
iis.zip

onlyoffice :
tim 20180313175424

What is backendserver-address?

I have a question about https://github.com/ONLYOFFICE/document-server-proxy/blob/master/nginx/proxy-https-to-http.conf

For me, docservice in
proxy_pass http://docservice;
is the local ip address
it looks like
proxy_pass http://xxx.xxx.xxx.xxx;

but I don't understand what should be backendserver-address in
upstream docservice {
server backendserver-address;
}

should it be the same IP adress
upstream docservice {
server xxx.xxx.xxx.xxx;
}

or docservice and backendserver-address are different?

Proxy with virtual path doesn't work

The document server's nginx conf has this settting:

#script caching protection
rewrite ^(\/web-apps\/apps\/(?!api\/).*)$ $the_scheme://$the_host/5.4.2-46/$1 redirect;

Because of above setting, a virtual path proxy will give 404

Caddy v2

Hi.
Could you please add Caddyfile example for Caddy v2 reverse proxy.

The Chinese font is selected and no Chinese is shown on the toolbar.

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABXIAAAC6CAIAAACMUyKxAAAgAElEQVR4Ae2dB5xVxb3HL00QQViKSxcpAnZBTVQwKGJLsEeeaGJ5STRqEkt8seQRQzTqsyaxplgiEjG2iDUoUUFUFOwCUkSqCLKLFEVE3vfc2Z0dTttbzr3c3f3dD59lzpyZ/8x8z7n3nPnNf2Yabd68OaWPCIiACIiACIiACIiACIiACIiACIiACGRPoHH2WZRDBERABERABERABERABERABERABERABDwCkhV0H4iACIiACIiACIiACIiACIiACIiACORIQLJCjuCUTQREQAREQAREQAREQAREQAREQAREoGkUguMveCrqlOJFIFkC22zbuknT5snalDUREAEREAEREAEREAEREAEREIEiEJC3QhEgq4haCGz8cu3mzd/UkkinRUAEREAEREAEREAEREAEREAESo+AZIXSuyYNr0ZsR7JxwzptStLwrrxaLAIiIAIiIAIiIAIiIAIiUOcJRE6CyKdlO3Zu/d2Deh64d+dvvtk85c1lT7z40ZJP1+VjUHnrPYFNGzc0bty06Tbb1vuWqoEiIAIiIAIiIAIiIAIiIAIiUJ8INIoaIs5hbYVGjRoN2qXj9w7qucfOHVxGmzen3py1YsKLH73z4UrC+ohAKIFGjRs3a96qSdNtQs8qUgREQAREQAREQAREQAREQAREoAQJJOOt0KJ5k4P37Yag0LnjdsFGNmqUGjigI/8WfbL2iZc+evGNpV9t3BRMppgGTmDzN99s2vglPgvoCw0chZovAiIgAiIgAiIgAiIgAiIgAnWFQDLeCn+69KCuO7TKsM3zFq2++MaX3cQ9u2w/8og+u/Zu36xp4wVLP3/8hY9eefsTEvz+5/t3K2819a1ld/zzPQ533rHtr3+y74P/njPptcV3/O/BpLn9wXfRLC45c9CAXu3G3Dlt7sLVJNuldztinpy8YPwzc7p3ajV0n67dO7Vu3LjR0k/XTp6xbM7CyubbNLnwh3vbClCf9+d+dvTBvWzMsy9/vEO7bfcesMOtD7zz+dqvtm3edOi+XfvvVNam1TZff7153uLVjzw/z7VAxqv/+obN7g+U9xo5tKytjV1TMeGp+UvtYbEDnY88atu3t6hA5yNHdunhVmP50jtfWFYTQf0HpSY/Nb/90EG7rJs7/vXUkKM6Vz41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CLgEmjTdplnzVo0aJ+NE41rOIeytLGg2ksghs7KIgAiIgAiIgAiIgAiIgAiIQMMgkIy3gmHFuons6cC/7bfbBnGhvP22xLDYAR4KOBc0DJ5qZe4EUBNwVSgRTSH3ZiinCIiACIiACIiACIiACIiACDQkAkl6KzQkbmpr8gSaNd+u6TbbJm9XFkVABERABERABERABERABERABApGoCS8zQvWOhmuMwRwVJCmUGeulioqAiIgAiIgAiIgAiIgAiIgAtUEJCtUk9D/W48Auz9ss23rrVe+ShYBERABERABERABERABERABEciRgGSFHMEpW4IEmrVo1aiRbsUEicqUCIiACIiACIiACIiACIiACBSJQOTaCp9//nmRqqBiREAEREAEREAEREAEREAEREAEREAE6iYBDRHXzeumWouACIiACIiACIiACIiACIiACIhACRCQrFACF0FVEAEREAEREAEREAEREAEREAEREIG6SUCyQt28bqq1CIiACIiACIiACIiACIiACIiACJQAAckKJXARVAUREAEREAEREAEREAEREAEREAERqJsEJCvUzeumWouACIiACIiACIiACIiACIiACIhACRCQrFACF0FVEAEREAEREAEREAEREAEREAEREIG6SUCyQt28bqq1CIiACIiACIiACIiACIiACIiACJQAAckKJXARVAUREAEREAEREAEREAEREAEREAERqJsEJCvUzeumWouACIiACIiACIiACIiACIiACIhACRBoWgJ1iKzChx9+uPPOO0eeLu0TLQ8/vLQrqNrVbQLv3X57QRvQsmXLTp06UcTy5cvXrVuXc1mJ24mqydb9uXjsqYlz5y+IqlsO8Tv16HbC0UfmkFFZciCwdW+eHCqsLKVDoN7fPPW+gfH30vz58+MT6KwIiIAIiIAhUNKyQl2/SOuffTamCRk+qj/55JPy8vI2bdrEmNKp+kHgrbfe6tWrF22p9aJ/vf/+e+21V0FbTWWMfTQFU6vcirPvZEnZya0ahc6VrKZAbT9auLjQdZZ9ERABERCBWgkU+mlbawXqTQLeKwQzqaspmEmRxA4wn3zyyQQNNlhTmgRR6pd+/fr10hRK/SIlXT9d9KSJyp4IiIAIiIAIiIAIiIAIiEChCMhboVBkZVcEREAEREAEREAERCBZAqNHj37//fexueuuu44ZMyZZ47Im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y1qcmKCYHiw3h43ZQs36eoY5mGWPOqpn7CSlKfjay+xCoyy48b71Gt1TDTwceqFhksPFdUkGv2XBGDd9QcNWWZCmUFDOMi4CIiACJUIgGVkhpjHf//73WSURZeFXv/pVTDKdEgEREAEREIG6QiBGTM+nCQUyS5VQFoy4kE/14vOiLGzFTmx83UrtbPyFrjcYURaMuFBq/FUfERABEQgS8C00G0ygmHgCBZcVKJ7dGdnLKr4eOisCIpAhgaymNmRok2RZTW3I3GzxpzZkXjelFAEREAEREAEREAEREAERyJ9AMWSF/GspCyIgAiIgAkkR2KlHt48WLs7BGhlzyKUsIiACIlB3CbA1Zt2tfKnVXDATvCKCmSDM+G3UEyyofptqxBaMoS3UGGMoFkWKgAiIgAiIgAiIgAiIgAiIgAiIgAhYAo1tSAEREAEREAEREAEREAEREAEREAEREAERyIqAZIWscCmxCIiACIiACIiACIiACIiACIiACIhADQHJCjUsFBIBERABERABERABERABERABERABEciKgGSFrHApsQiIgAiIgAiIgAiIgAiIgAiIgAiIQA0ByQo1LBQSAREQAREQAREQAREQAREQAREQARHIioBkhaxwKbEIiIAIiIAIiIAIiIAIiIAIiIAIiEANAckKNSwUEgEREAEREAEREAEREAEREAEREAERyIqAZIWscCmxCIiACIiACIiACIiACIiACIiACIhADQHJCjUsFBIBERABERABERABERABERABERABEciKQNOo1B9++GHUKcWLgAiIgAiIgAiIgAiIgAiIgAiIgAiIAAQabd68ORTEunXrQuMLGjlz5szy8vKCFiHjIiACIiACIiACIiACIiACIiACIiACSRHQJIikSMqOCIiACIiACIiACIiACIiACIiACDQ4ApIVGtwlV4NFQAREQAREQAREQAREQAREQAREICkCkWsrJFWA7IiACIiACIhA/gTuvv/hKCNnnHJC1CnFi4AIiIAIiIAIiIAIFJqAZIVCE5Z9ERABERCBZAiMvuT8oKEx19wcjFSMCIiACIiACIiACIhA0QhoEkTRUKsgERABERABERABERABERABERABEahvBErUW2H23AWZk+7Xp2fmiZVSBERABApKIKufr4LWpJ4Zb9q06crPVnVo385tV+Xqz5s0aSzmLhOFRUAEREAE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mhtvPXzYd5AS3Lzvz5w94ennLrnwXDdSYREQAREQgQZO4P9uvn34wUN8jwyYvPPezCeeef6oQwc3cD6FaD7Pd7cbWIgiZLMQBOStUAiqsikCIiACIlCiBHBnDb4g7jqgn7t2Y4lWXdUSAREQAREoLgEW4gk+MqjCHrsN+Prrr4tbF5UmAiVNoGlJ1666ctY3oTpC/4uACIiACDRoAu3L2jTo9qvxIiACIiACIiACIlAyBOqGrFAyuFQRERABEaidAP57tSdSirwJPPefybnZGHPNzaEZczYYak2RIiACIiAC9YBA1CODpulxXw+ur5qQFIHSlRWYn5xUI2VHBERABIpGQBMCi4Y6t4KmvjZ99CXnB/Py4pj4tXvznQ/23mOXYFn5xMhmPvSCecUzyCSfGPHMh14wr3gGmeQTkwPPxJ8L+dRfeUWglAmU6NoKfIcz/1fKfFU3ERABERCBBkvgrXe9LQaT/cimeCZFQPdSUiSNHfFsmDyTbbWsiUDdJVCiskLdBaqai4AIiIAIiIAIiIAIiIAIiIAIiEDDIdDkiiuuCG3txo0bQ+MLGrly5cpWrVoVtAgZFwEREAERaMgEGFH8zuBvBwm8OOXVxCcsUErn8o7BsvKMkc08Afqyi6cPSJ6H4pknQF928fQByfOwEDzzrJKyi0D9INBo8+bNoS1Zt25daHww8tJLL505sxY/zwEDBlx99dXBvL4Y7JSXl/sidSgCIiACIiACSRG4+/6Ho0ydccoJUacULwIiIAIiIAIiIAIiEEUggSUb0QIee+yxqAJM/LHHHhufQGdFQAREQAREoAgEpB0UAbKKEAEREAEREAERaFAEtLZCg7rcaqwIiIAIiIAIiIAIiIAIiIAIiIAIJEkgAW8FW51Ql4RaHRlsdgVEQAREQAREQAREQAREQAREQAREQATqFoEkZQUpCHXr2qu2IiACIiACIiACIiACIiACIiACIpAngSRlBXkr5HkxlF0EREAEREAEREAEREAEREAEREAE6haBJGUFeSvUrWuv2oqACIiACIiACIiACIiACIiACIhAngSSlBXkrZDnxVB2ERABERABERABERABERABERABEahbBJKUFeStULeuvWorAiIgAiIgAiIgAiIgAiIgAiIgAnkSSFJWkLdCnhdD2UVABERABERABERABERABERABESgbhFIUlaQt0LduvaqrQiIgAiIgAiIgAiIgAiIgAiIgAjkSSBJWUHeCnleDGUXAREQAREQAREQAREQAREQAREQgbpFIElZQd4Kdevaq7YiIAIiIAIiIAIiIAIiIAIiIAIikCeBxnnmV3YREAEREAEREAEREAEREAEREAEREIEGSyABb4UBAwaETn9wmfbv3989VFgEREAEREAEREAEREAEREAEREAERKAeEGi0efPm0GasW7cuNL6gkTNnziwvLy9oETIuAiIgAiIgAiIgAiIgAiIgAiIgAiKQFAFNgkiKpOyIgAiIgAiIgAiIgAiIgAiIgAiIQIMjIFmhwV1yNVgEREAEREAEREAEREAEREAEREAEkiIgWSEpkrIjAiIgAiIgAiIgAiIgAiIgAiIgAg2OgGSFBnfJ1WAREAEREAEREAEREAEREAEREAERSIqAZIWkSMqOCIiACIiACIiACIhIGm1kAAAIJElEQVSACIiACIiACDQ4AglsMNngmKnBIiACIhBBYPbcBRFnFC0CIiACIiACIiACIpApgX59emaaVOlKgEDpygoZvp3rhiuBu0hVEAERqCFw6MFDag4UEgEREAEREAEREAERyJLAc/+ZnGUOJd/KBEpXVgBMh7LW/J0y9dWXp75iOR14wP6DD/i2OVxZscbGKyACIiACIiACIiACIiACIiACIiACIlBkAiUtKxgWiAhWRygyHRUnAiIgAiIgAiIgAiIgAiIgAiIgAiIQQ0BLNsbA0SkREAEREAEREAEREAEREAEREAEREIE4ApIV4ujonAiIgAiIgAiIgAiIgAiIgAiIgAiIQAwByQoxcHRKBERABERABERABERABERABERABEQgjoBkhTg6OicCIiACIiACIiACIiACIiACIiACIhBDQLJCDBydEgEREAEREAEREAEREAEREAEREAERiCMgWSGOjs6JgAiIgAiIgAiIgAiIgAiIgAiIgAjEEJCsEANHp0RABERABERABERABERABERABERABOII1BlZ4drrb+JfXFN0TgREQAREQAREQAREQAREQAREQAREoLgEmha3uNxL+9UvL8g9s3KKgAiIgAiIgAiIgAiIgAiIgAiIgAgUgECd8VYoQNtlUgREQAREQAREQAREQAREQAREQAREIC8CkhXywqfMIiACIiACIiACIiACIiACIiACItCQCUhWaMhXX20XAREQAREQAREQAREQAREQAREQgbwISFbIC58yi4AIiIAIiIAIiIAIiIAIiIAIiEBDJiBZoSFffbVdBERABERABERABERABERABERABPIikMxOECtWrHj44YffeOONysrKtm3b7rPPPscff/wOO+yQV9WUWQREQAREQAREQAREQAREQAREQAREoLQJJOCtMGPGjIsuuqisrOzKK6984IEH+Ev44osvJj6RtleuXv3Ka9P4Z639+7lJNqyACIiACIiACIiACIiACIiACIiACIjA1iKQr6ywfPnym2+++bLLLhs5cmSnTp2aNm3KX8KXXnrpn/70p08//TT/hj0+4cmPP160Zs3aBx58eO68+Rh886238zcrCyIgAiIgAiIgAiIgAiIgAiIgAiIgAnkSyHcSxKOPPnrkkUf279/fVw9ijjjiiEceeeTss8/2ncr2cNkny3/1ywvIhdsCEkO22ZVeBERABERABERABERABERABERABESgQATy9VaYPn36d77zndDKEc/Z0FNZRXbuVP7i5ClkadumzdEjvjv1lVezyq7EIiACIiACIiACIiACIiACIiACIiACBSKQr6ywcuXKDh06hFauffv2FRUVoaeyikRK2LDhK5MFZeGA/b+9Y48eWVlQYhEQAREQAREQAREQAREQAREQAREQgUIQyHcSBJrCZ5991rlz52DliGftxmB8tjFICYcdeojN1ad3L/7ZQwVEQAREQAREQAREQAREQAREQAREQAS2FoF8vRUGDRr04osvhtZ+8uTJnA09pUgREAEREAEREAEREAEREAEREAEREIF6QCBfWeG444576qmnZs+e7WMxZ86chx56aMcdd/TF61AEREAEREAEREAEREAEREAEREAERKDeEMhXVigvLz///PN///vfjx8/ns0m4cLfBx988Ne//vWGDRv++te/Tp06td7AUkNEQAREQAREQAREQAREQAREQAREQARcAvnKCtgaOHDg9ddfz+qMl19++YknnsjfVatWnX766Y0bN960adMNN9wgZcElrrAIiIAIiIAIiIAIiIAIiIAIiIAI1BsC+S7ZaEB07Njx7LPP9kFp3br1jTfeaJQFTh1wwAG+BDoUAREQAREQAREQAREQAREQAREQARGo0wQS8FaIav/gwYMvvPBC47Pwpz/9KSpZhvHXXn8T/zJMrGQiIAIiIAIiIAIiIAIiIAIiIAIiIAJFIJCMt0JURVEWOHXLLbcce+yxUWkyjP/VLy/IMKWSiYAIiIAIiIAIiIAIiIAIiIAIiIAIFIdAYWUF2oCyYMSF4rRHpYiACIiACIiACIiACIiACIiACIiACBSNQAEnQRStDSpIBERABERABERABERABERABERABERgqxCQrLBVsKtQERABERABERABERABERABERABEagPBCQr1IerqDaIgAiIgAiIgAiIgAiIgAiIgAiIwFYhIFlhq2BXoSIgAiIgAiIgAiIgAiIgAiIgAiJQHwhIVqgPV1FtEAEREAEREAEREAEREAEREAEREIGtQkCywlbBrkJFQAREQAREQAREQAREQAREQAREoD4QkKxQH66i2iACIiACIiACIiACIiACIiACIiACW4VA061SalaFTpn66stTX7FZDjxg/8EHfNseKiACIiACIiACIiACIiACIiACIiACIrC1CNQBWQERQTrC1ro/VK4IiIAIiIAIiIAIiIAIiIAIiIAIxBDQJIgYODolAiIgAiIgAiIgAiIgAiIgAiIgAiIQR0CyQhwdnRMBERABERABERABERABERABERABEYghIFkhBo5OiYAIiIAIiIAIiIAIiIAIiIAIiIAIxBGQrBBHR+dEQAREQAREQAREQAREQAREQAREQARiCEhWiIGjUyIgAiIgAiIgAiIgAiIgAiIgAiIgAnEEJCvE0dE5ERABERABERABERABERABERABERCBGAKSFWLg6JQIiIAIiIAIiIAIiIAIiIAIiIAIiEAcgTojK1x7/U38i2uKzomACIiACIiACIiACIiACIiACIiACBSXwP8DqYEITsYOi9MAAAAASUVORK5CYII=" />

Configuration does not account for cache invalidation on Document Server upgrades

When there's a Document Server upgrade, web browsers have to download newer versions of JavaScript files. In the .deb file that ONLYOFFICE distributes, they add a "redirect trick" in the web server (Nginx) to make sure that a request for those files will redirect to a URL that the browser has never seen before, thus ensuring that a fresh file is downloaded.

If someone doesn't use that .deb and serves directly from node.js (my case), and if they come to this repository for aid on how to configure a proxy, then they'll bump into that issue and the users will have trouble using their servers after an upgrade.

For example, this is what upstream distributes in the Nginx configuration in their .deb:

#script caching protection
rewrite ^(\/web-apps\/apps\/(?!api\/).*)$ $the_scheme://$the_host/5.4.0-21/$1 redirect;

#disable caching for api.js
location ~ ^(\/[\d]+\.[\d]+\.[\d]+[\.|-][\d]+)?\/(web-apps\/apps\/api\/documents\/api\.js)$ {
  expires -1;
  # gzip_static on;
  alias  /var/www/onlyoffice/documentserver/$2;
}

Shouldn't the proxy config in this repo account for that use case, and thus include whatever cache invalidation configs should be in place?

Loading Document and curl timeouts with NextCloud VPath solution

I was having a curl timeout on my NextCloud instance and upgraded to v7.3, updated the WS proxy settings for VPath under Apache and still had the same error.

I had to add the following line to my config RequestHeader setifempty X-Forwarded-Proto https. Along with RequestHeader setifempty X-Forwarded-Proto http. I have no clue why but this worked now as expected.

I'll open and close this issue just for having a record here.

issues setting up apache config for reverse proxy

I'm trying to set up a document server behind a apache reverse proxy and I'm really stuck. I've tried the configs that's here: https://helpcenter.onlyoffice.com/server/document/document-server-proxy.aspx but to no avail.
I'll just post my config here and maybe someone can point out what I'm doing wrong... all I'm getting when I'm accessing mysite.com/documents is the default page of nextcloud...

nextcloud is hosted on 192.168.0.100:9999 and onlyoffice is working when accessing it on 192.168.0.100:8888

help :(

<IfModule mod_ssl.c>
	<VirtualHost *:80>
		ServerName mysite.com
		ServerAdmin admin
		
		RewriteEngine On

		ProxyRequests     Off
		ProxyPreserveHost On

		ProxyPass "/" "http://127.0.0.1:9999/"
		ProxyPassReverse "/" "http://127.0.0.1:9999/"

		RewriteEngine On
		RewriteCond %{SERVER_PORT} !443
		#RewriteCond %{REQUEST_URI} !^\/login\/flow
		RewriteRule ^(/(.*))?$ https://%{HTTP_HOST}/$1 [R=301,L]
	</VirtualHost>

	<VirtualHost *:443>
		ServerName mysite.com
		ServerAdmin admin

		SSLCertificateFile /filepath/fullchain.pem
		SSLCertificateKeyFile /filepath/privkey.pem
		Include /etc/letsencrypt/options-ssl-apache.conf

		ProxyRequests     Off
		ProxyPreserveHost On

		ProxyPass "/" "http://127.0.0.1:9999/"
		ProxyPassReverse "/" "http://127.0.0.1:9999/"

		<Location /sabnzbd>
			order deny,allow
			deny from all
			allow from all
			ProxyPass http://localhost:8080/sabnzbd
			ProxyPassReverse http://localhost:8080/sabnzbd
		</Location>

		Define VPATH /documents
		Define DS_ADDRESS 192.168.0.100:8888

		<Location ${VPATH}>
			Require all granted
			SetEnvIf Host "^(.*)$" THE_HOST=$1
			RequestHeader setifempty X-Forwarded-Proto http
			RequestHeader edit X-Forwarded-Host (.*) $1${VPATH}
			ProxyAddHeaders Off
		</Location>

		ProxyPassMatch ^\${VPATH}(.*)(\/websocket)$ "ws://${DS_ADDRESS}/$1$2"
		ProxyPass ${VPATH} "http://${DS_ADDRESS}"
		ProxyPassReverse ${VPATH} "http://${DS_ADDRESS}"

	</VirtualHost>
</IfModule>

This setup makes my nextcloud instance unreachable

Hi,
someone please help me out here:
I have Ubuntu and apache, nextcloud running already via a nextcloud.conf containing this:
nextcloud.conf

Alias /nextcloud "/var/www/nextcloud/"

<Directory /var/www/nextcloud/>
  Require all granted
  AllowOverride All
  Options FollowSymLinks MultiViews

  <IfModule mod_dav.c>
    Dav off
  </IfModule>
</Directory>

But when adding this code given here into an onlyoffice.conf, I will get an "Internal Server Error" in Nextcloud, other sites are still working fine.
If I comment following lines, no error appears:

#  User daemon
#  Group daemon

Are these lines necessary? How can I go on?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.