PWA, Sync Mode, Apache or Nginx reverse proxy

Some time ago, sync mode stopped working on my (Android) mobile (Firefox, Vivaldi). It syncs but the content is not available offline.

In many case when something is not working as it should, I learned, it is a good idea to have a look at the reverse proxy. And often I run into trouble because I am one of the few who are still using Apache.

So my question: Is thsi basic reverse proxy ok? What should be changed? Or could you provide a Nginx reverse proxy? I could move Silverbullet to another server where Nginx is running. I have no experience with Caddy (the SB manual mentions Caddy only).

I suppose this is too basic? Thanks a lot?

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName silverbullet.myserver.com
    AllowEncodedSlashes On
    ProxyPreserveHost On
    ProxyPass "/"  "http://localhost:8300/"


SSLCertificateFile /etc/letsencrypt/live/silverbullet.myserver.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/silverbullet.myserver.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

This is my Nginx Proxy Manager setup for SilverBullet, however, please keep in mind that I also use Authelia for authentication.

Also please note the places that need to be edited
AUTHELIAURL:PORT
SBURL:PORT
auth.MYDOMAIN.com

location /authelia {
    internal;
    set $upstream_authelia http://AUTHELIAURL:PORT/api/verify; #ADD YOUR IP AND PORT OF AUTHELIA
    proxy_pass_request_body off;
    proxy_pass $upstream_authelia;
    proxy_set_header Content-Length "";

    # Timeout if the real server is dead
    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
    client_body_buffer_size 128k;
    proxy_set_header Host $host;
    proxy_set_header X-Original-URL $scheme://$http_host$request_uri;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr; 
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Host $http_host;
    proxy_set_header X-Forwarded-Uri $request_uri;
    proxy_set_header X-Forwarded-Ssl on;
    proxy_redirect  http://  $scheme://;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    proxy_cache_bypass $cookie_session;
    proxy_no_cache $cookie_session;
    proxy_buffers 4 32k;

    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Methods *;
    add_header Access-Control-Allow-Headers x-sync-mode;

    send_timeout 5m;
    proxy_read_timeout 240;
    proxy_send_timeout 240;
    proxy_connect_timeout 240;
}

    location / {
        set $upstream_silverbullet http://SBURL:PORT;  #ADD IP AND PORT OF SERVICE
        proxy_pass $upstream_silverbullet;  #change name of the service

        auth_request /authelia;
        auth_request_set $target_url $scheme://$http_host$request_uri;
        auth_request_set $user $upstream_http_remote_user;
        auth_request_set $groups $upstream_http_remote_groups;
        proxy_set_header Remote-User $user;
        proxy_set_header Remote-Groups $groups;
        error_page 401 =302 https://auth.MYDOMAIN.com/?rd=$target_url;

        client_body_buffer_size 128k;

        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;

        send_timeout 5m;
        proxy_read_timeout 360;
        proxy_send_timeout 360;
        proxy_connect_timeout 360;

        proxy_set_header Host $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-Proto $scheme;
        proxy_set_header X-Forwarded-Host $http_host;
        proxy_set_header X-Forwarded-Uri $request_uri;
        proxy_set_header X-Forwarded-Ssl on;
        proxy_redirect  http://  $scheme://;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_cache_bypass $cookie_session;
        proxy_no_cache $cookie_session;
        proxy_buffers 64 256k;

        # add your ip range here, and remove this comment!
        set_real_ip_from 192.168.0.0/16;
        real_ip_header X-Forwarded-For;
        real_ip_recursive on;
    }
1 Like

Thanks a lot @paletochen for your help! It did not make a difference, so it might not be related to the proxy.

Do you know if there is something else to do before the content is available offline. I can continue browsing SB when Airplane mode is turned on, but when I close the browser and restart it, then I only see a blank page when I start the PWA (just the top menu visible)

I guess you’ll have to change your setup to Synced mode

I am using sync mode. Weird, but not the biggest problem either!

I’m having the exact same issue. When starting the PWA in airplane mode (android, with Google Chrome), I only get a blank page, even if sync mode is turned on.

I’m also using a reverse proxy, but it’s caddy with tailscale. And SB is running as a docker container.

The least I can say is that I’m running other software with the same setup, and they can handle offline stuff (actual budget, for example). So I’m not sure what the issue is…

What if you do the same on Chrome on a desktop OS? It’d be interested in the browser JavaScript logs. Perhaps there is hints of what’s going on there.

So after some testing, I noticed the following things:

  1. the same issue happens on desktop (Fedora Linux 40, Chrome): sync mode is turned on, but the PWA opens to a blank page when offline;
  2. I figured that SB does eventually load when offline, both on android and desktop, but it takes a good while. I measured more than 2 minutes (from opening the PWA to SB correctly loading my space) on mobile. I noticed it when I was messing around with the Chrome console.
  3. Here are the logs. I’m not sure if that’s what you need. Please ask if something else is required.

Thank you!

EDIT: giving more information: when the PWA is first loaded, the logs stop at “Rebuilding editor state”. After this, there’s a 2 minute gap before the next messages.

Interesting. Same here. It takes around 40 sec in my case, maybe because of less content?

Bump

Issue still occurring for me. I am running on docker, nginx chrome and Android chrome for the PWA.