Skip to content
View in the app

A better way to browse. Learn more.

Unraid

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (โ‹ฎ) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

StirlingPDF + Tailscale = ๐Ÿ’”

Featured Replies

Hey Unraiders, new member here! ๐Ÿ‘‹

ย 

The new native ZFS support plus the Tailscale integration pushed me to try Unraid and so far I'm loving it!

ย 

I have installed a couple of Docker containers and they all play nice with Tailscale, so I can access them privately from anywhere with the qualified domain name of my Tailnet. It's glorious.

ย 

When I install StirlingPDFย without Tailscale it works perfectly locally. But when I enable Tailscale (after authenticating it) the GUI stops working both locally (ERR_CONNECTION_REFUSED) and via Tailscale (HTTP ERROR 502).ย 

ย 

The logs are different in each case, but I don't see anything actionable.

ย 

Working logs (without Tailscale)

ย 

cp: can't stat '/usr/share/tesseract-ocr/5/tessdata/*': No such file or directory
Picked up JAVA_TOOL_OPTIONS: -XX:+UnlockExperimentalVMOptions     -XX:MaxRAMPercentage=75     -XX:InitiatingHeapOccupancyPercent=20     -XX:+G1PeriodicGCInvokesConcurrent     -XX:G1PeriodicGCInterval=10000     -XX:+UseStringDeduplication     -XX:G1PeriodicGCSystemLoadThreshold=70
INFO:unoserver:Starting unoserver 3.1.
INFO:unoserver:Command: /usr/bin/soffice --headless --invisible --nocrashreport --nodefault --nologo --nofirststartwizard --norestore -env:UserInstallation=file:///tmp/tmpe0yo30od --accept=socket,host=127.0.0.1,port=2002,tcpNoDelay=1;urp;StarOffice.ComponentContext
Invalid APP_LOCALE environment variable value. Falling back to default Locale.UK.
INFO:unoserver:Starting UnoConverter.
INFO:unoserver:Starting UnoComparer.
INFO:unoserver:Server PID: 48
Copying original files without overwriting existing files
Running Stirling PDF with DOCKER_ENABLE_SECURITY=false and VERSION_TAG=0.44.2
Setting permissions and ownership for necessary directories...
19:55:41.347 [main] INFO  s.s.SPDF.config.ConfigInitializer - Settings file updated based on template changes.
19:55:41.362 [main] INFO  s.software.SPDF.SPDFApplication - Settings file: ./configs/settings.yml
19:55:41.365 [main] INFO  s.software.SPDF.SPDFApplication - Custom settings file: ./configs/custom_settings.yml
 ____ _____ ___ ____  _     ___ _   _  ____       ____  ____  _____
/ ___|_   _|_ _|  _ \| |   |_ _| \ | |/ ___|     |  _ \|  _ \|  ___|
\___ \ | |  | || |_) | |    | ||  \| | |  _ _____| |_) | | | | |_
 ___) || |  | ||  _ <| |___ | || |\  | |_| |_____|  __/| |_| |  _|
|____/ |_| |___|_| \_\_____|___|_| \_|\____|     |_|   |____/|_|
Powered by Spring Boot 3.4.3
19:55:41.910 [main] INFO  s.software.SPDF.SPDFApplication - Starting SPDFApplication v0.44.2 using Java 21.0.6 with PID 21 (/app.jar started by stirlingpdfuser in /)
19:55:41.911 [main] INFO  s.software.SPDF.SPDFApplication - The following 1 profile is active: "default"
19:55:43.984 [main] INFO  s.software.SPDF.SPDFApplication - Running configs ApplicationProperties(legal=ApplicationProperties.Legal(termsAndConditions=https://www.stirlingpdf.com/terms-and-conditions, privacyPolicy=https://www.stirlingpdf.com/privacy-policy, accessibilityStatement=, cookiePolicy=, impressum=), security=ApplicationProperties.Security(enableLogin=false, csrfDisabled=false, initialLogin=ApplicationProperties.Security.InitialLogin(username=), oauth2=ApplicationProperties.Security.OAUTH2(enabled=false, issuer=, clientId=, autoCreateUser=true, blockRegistration=false, useAsUsername=email, scopes=[openid, profile, email], provider=google, client=ApplicationProperties.Security.OAUTH2.Client(google=Google [clientId=, clientSecret=NULL, scopes=[email, profile], useAsUsername=EMAIL], github=GitHub [clientId=, clientSecret=NULL, scopes=[read:user], useAsUsername=LOGIN], keycloak=Keycloak [issuer=, clientId=, clientSecret=NULL, scopes=[openid, profile, email], useAsUsername=PREFERRED_USERNAME]), logoutUrl=null), saml2=ApplicationProperties.Security.SAML2(provider=, enabled=false, autoCreateUser=true, blockRegistration=false, registrationId=stirling, idpSingleLogoutUrl=https://dev-XXXXXXXX.okta.com/app/dev-XXXXXXXX_stirlingpdf_1/externalKey/slo/saml, idpSingleLoginUrl=https://dev-XXXXXXXX.okta.com/app/dev-XXXXXXXX_stirlingpdf_1/externalKey/sso/saml, idpIssuer=, idpCert=class path resource [okta.cert]), loginAttemptCount=5, loginResetTimeMinutes=120, loginMethod=all, customGlobalAPIKey=null), system=ApplicationProperties.System(defaultLocale=en_GB, googlevisibility=false, showUpdate=false, showUpdateOnlyAdmin=false, customHTMLFiles=false, tessdataDir=/usr/share/tessdata, enableAlphaFunctionality=false, enableAnalytics=false, datasource=ApplicationProperties.Datasource(enableCustomDatabase=false, customDatabaseUrl=, type=postgresql, hostName=localhost, port=5432, name=postgres, username=postgres), disableSanitize=false, customPaths=ApplicationProperties.CustomPaths(pipeline=ApplicationProperties.CustomPaths.Pipeline(watchedFoldersDir=, finishedFoldersDir=, webUIConfigsDir=null), operations=ApplicationProperties.CustomPaths.Operations(weasyprint=, unoconvert=))), ui=ApplicationProperties.Ui(appName=null, homeDescription=null, appNameNavbar=null, languages=[]), endpoints=ApplicationProperties.Endpoints(toRemove=[], groupsToRemove=[]), metrics=ApplicationProperties.Metrics(enabled=false), automaticallyGenerated=ApplicationProperties.AutomaticallyGenerated(UUID=184dfeec-d0dd-4451-b1aa-cf7003677954, appVersion=0.44.2), enterpriseEdition=ApplicationProperties.EnterpriseEdition(enabled=false, maxUsers=0, ssoAutoLogin=false, customMetadata=ApplicationProperties.EnterpriseEdition.CustomMetadata(autoUpdateMetadata=false, author=username, creator=Stirling-PDF, producer=Stirling-PDF)), autoPipeline=ApplicationProperties.AutoPipeline(outputFolder=null), processExecutor=ApplicationProperties.ProcessExecutor(sessionLimit=ApplicationProperties.ProcessExecutor.SessionLimit(libreOfficeSessionLimit=1, pdfToHtmlSessionLimit=1, pythonOpenCvSessionLimit=8, weasyPrintSessionLimit=16, installAppSessionLimit=1, calibreSessionLimit=1, qpdfSessionLimit=4, tesseractSessionLimit=1), timeoutMinutes=ApplicationProperties.ProcessExecutor.TimeoutMinutes(libreOfficeTimeoutMinutes=30, pdfToHtmlTimeoutMinutes=20, pythonOpenCvTimeoutMinutes=30, weasyPrintTimeoutMinutes=30, installAppTimeoutMinutes=60, calibreTimeoutMinutes=30, tesseractTimeoutMinutes=30, qpdfTimeoutMinutes=30)))
19:55:45.031 [main] INFO  s.s.S.c.api.SplitPdfBySizeController - SplitPdfBySizeController initialized with pdfDocumentFactory: CustomPDFDocumentFactory
19:55:45.106 [main] INFO  s.software.SPDF.utils.FileMonitor - Monitoring directory: ./pipeline/watchedFolders
19:55:46.575 [main] INFO  s.software.SPDF.SPDFApplication - Started SPDFApplication in 5.206 seconds (process running for 6.575)
19:55:46.583 [scheduling-1] WARN  s.software.SPDF.utils.FileMonitor - not monitoring any directory, even the root directory itself: ./pipeline/watchedFolders
19:55:46.584 [scheduling-1] INFO  s.software.SPDF.utils.FileMonitor - Registered directory: ./pipeline/watchedFolders
19:55:46.587 [main] INFO  s.software.SPDF.SPDFApplication - Stirling-PDF Started.
19:55:46.587 [main] INFO  s.software.SPDF.SPDFApplication - Navigate to http://localhost:8080

ย 

Non-working logs (with Tailscale active)

ย 

    -cp <class search path of directories and zip/jar files>
    -classpath <class search path of directories and zip/jar files>
    --class-path <class search path of directories and zip/jar files>
                  A : separated list of directories, JAR archives,
                  and ZIP archives to search for class files.
    -p <module path>
    --module-path <module path>...
                  A : separated list of elements, each element is a file path
                  to a module or a directory containing modules. Each module is either
                  a modular JAR or an exploded-module directory.
    --upgrade-module-path <module path>...
                  A : separated list of elements, each element is a file path
                  to a module or a directory containing modules to replace
                  upgradeable modules in the runtime image. Each module is either
                  a modular JAR or an exploded-module directory.
    --add-modules <module name>[,<module name>...]
                  root modules to resolve in addition to the initial module.
                  <module name> can also be ALL-DEFAULT, ALL-SYSTEM,
                  ALL-MODULE-PATH.
    --enable-native-access <module name>[,<module name>...]
                  modules that are permitted to perform restricted native operations.
                  <module name> can also be ALL-UNNAMED.
    --list-modules
                  list observable modules and exit
    -d <module name>
    --describe-module <module name>
                  describe a module and exit
    --dry-run     create VM and load main class but do not execute main method.
                  The --dry-run option may be useful for validating the
                  command-line options such as the module system configuration.
    --validate-modules
                  validate all modules and exit
                  The --validate-modules option may be useful for finding
                  conflicts and other errors with modules on the module path.
    -D<name>=<value>
                  set a system property
    -verbose:[class|module|gc|jni]
                  enable verbose output for the given subsystem
    -version      print product version to the error stream and exit
    --version     print product version to the output stream and exit
    -showversion  print product version to the error stream and continue
    --show-version
                  print product version to the output stream and continue
    --show-module-resolution
                  show module resolution output during startup
    -? -h -help
                  print this help message to the error stream
    --help        print this help message to the output stream
    -X            print help on extra options to the error stream
    --help-extra  print help on extra options to the output stream
    -ea[:<packagename>...|:<classname>]
    -enableassertions[:<packagename>...|:<classname>]
                  enable assertions with specified granularity
    -da[:<packagename>...|:<classname>]
    -disableassertions[:<packagename>...|:<classname>]
                  disable assertions with specified granularity
    -esa | -enablesystemassertions
                  enable system assertions
    -dsa | -disablesystemassertions
                  disable system assertions
    -agentlib:<libname>[=<options>]
                  load native agent library <libname>, e.g. -agentlib:jdwp
                  see also -agentlib:jdwp=help
    -agentpath:<pathname>[=<options>]
                  load native agent library by full pathname
    -javaagent:<jarpath>[=<options>]
                  load Java programming language agent, see java.lang.instrument
    -splash:<imagepath>
                  show splash screen with specified image
                  HiDPI scaled images are automatically supported and used
                  if available. The unscaled image filename, e.g. image.ext,
                  should always be passed as the argument to the -splash option.
                  The most appropriate scaled image provided will be picked up
                  automatically.
                  See the SplashScreen API documentation for more information
    @argument files
                  one or more argument files containing options
    --disable-@files
                  prevent further argument file expansion
    --enable-preview
                  allow classes to depend on preview features of this release
To specify an argument for a long option, you can use --<name>=<value> or
--<name> <value>.

INFO:unoserver:Starting unoserver 3.1.
INFO:unoserver:Command: /usr/bin/soffice --headless --invisible --nocrashreport --nodefault --nologo --nofirststartwizard --norestore -env:UserInstallation=file:///tmp/tmpigv1_62i --accept=socket,host=127.0.0.1,port=2002,tcpNoDelay=1;urp;StarOffice.ComponentContext
INFO:unoserver:Starting UnoConverter.
INFO:unoserver:Starting UnoComparer.
INFO:unoserver:Server PID: 154

ย 

Does anyone else have the same problem?ย 

  • 3 weeks later...

Same hereย 

  • 1 month later...

any solution yet?

  • Author

Not really, but since then I came to the realization that Stirling is not the only Docker container that has similar issues with native Tailscale.

So I opted for TSDProxy with Label Manager, which works reliably. Hope it works for you too!

10 hours ago, argiris said:

Not really, but since then I came to the realization that Stirling is not the only Docker container that has similar issues with native Tailscale.

So I opted for TSDProxy with Label Manager, which works reliably. Hope it works for you too!

I didn't ask the question but had the same issue, this solution works perfectly! I used the default settings in Label Manager and Stirling is working with TS.

Thanks for your advice! Got it working

Screenshot 2025-05-29 071844.png

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions โ†’ Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.