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.

Booklore Template Support Thread

Featured Replies

In the Booklore config:

Use:

jdbc:mariadb://192.168.0.137:3307/booklore

Make sure your <password1> is the actual DB password, not the Root password

  • Replies 73
  • Views 17.9k
  • Created
  • Last Reply

Top Posters In This Topic

Most Popular Posts

  • So what you have to do now is add 2 variables to specify UID/GID for the container and chown the directory in appdata make a new variable: Name: User ID Key: USER_ID Value: 99 Default: 99 Description

  • almighty7lurch
    almighty7lurch

    while i don’t enjoy FOSS drama, schadenfreude, or rumors, i will post this recent Reddit discussion about BookLore here, because i believe it’s of interest to Unraid users who may be using BookLore or

  • jmztaylor
    jmztaylor

    I updated the template to include these.

Posted Images

3 hours ago, Rendo said:

In the Booklore config:

Use:

jdbc:mariadb://192.168.0.137:3307/booklore

Make sure your <password1> is the actual DB password, not the Root password

I tried this and unfortunately, the issue still persists. The only change in the logs is the following line:

2026-02-26 12:03:37 3 [Warning] Access denied for user 'booklore'@'172.17.0.1' (using password: YES)

  • Author
Just now, cambrionic said:

I tried this and unfortunately, the issue still persists. The only change in the logs is the following line:

2026-02-26 12:03:37 3 [Warning] Access denied for user 'booklore'@'172.17.0.1' (using password: YES)

Try using the lan IP instead of the docker IP

12 minutes ago, jmztaylor said:

Try using the lan IP instead of the docker IP

To clarify, I am using the lan IP of the maria-db container in the database url (192.0.. etc), the logs return 172.17.0.1 . For reference, when the container starts, the Container IP for booklore is 172.17.0.10 and the Container IP for maria-db is 172.17.0.4

Edited by cambrionic
spelling/grammar

So I think you got the port settings mixed up, since you have 2 MDB instances runnning.

If I look at your logging, you are trying to connect to 'the other instance' running on port 3306, but you want to connect to the one running on port 3307

Version: '12.2.2-MariaDB-ubu2404'  socket: '/run/mysqld/mysqld.sock'  port: 3306  mariadb.org binary distribution
2026-02-25 22:30:15 3 [Warning] Access denied for user 'booklore'@'172.17.0.1' (using password: YES)
12 hours ago, Rendo said:

So I think you got the port settings mixed up, since you have 2 MDB instances runnning.

If I look at your logging, you are trying to connect to 'the other instance' running on port 3306, but you want to connect to the one running on port 3307

Version: '12.2.2-MariaDB-ubu2404'  socket: '/run/mysqld/mysqld.sock'  port: 3306  mariadb.org binary distribution
2026-02-25 22:30:15 3 [Warning] Access denied for user 'booklore'@'172.17.0.1' (using password: YES)

I do have two instances set up, but I was under the impression that if I change the port in the new instance's docker template to 3307 and point with the lan IP:3307 on the booklore container, it should be fine. The container port does remain 3306, but I thought that was just internal to the container. Would there be additional steps to ensure that they're connecting on the correct port?

On 2/26/2026 at 12:47 AM, cambrionic said:

Booklore docker log: https://pastes.io/item-1772088002732

Maria-db docker log: https://pastes.io/2026-02-25

Screenshot 2026-02-25 at 22.42.48.png

Screenshot 2026-02-25 at 22.43.28.png

I had changed the database URL to point to my LAN ip (192.168.0.137:3307) before and it gave me the same error, with the address being [email protected] denied in the logs

your database URL should be the IP of the unraid server if you're using bridged, it should be possible to use the docker network too but im not certain. you will need to include the port number for either. I would blow away the folder for the database in your appdata folder and start over there. The fields on the DB container for DB name, user, and password are only executed on first run so if you changed those fields after, you're going to get errors. alternatively you could add the database to your existing mariadb instance with some relatively simple commands.

Edited by Adubs

6 minutes ago, Adubs said:

t should be possible to use the docker network too but im not certain.

I just tested this both ways and it does work, so I'm leaning towards whatever db name, user, or pass you initially put in is not what you have in there now and its not going to update that for you.

You probably still want to use the IP of the server rather than docker in case that happens to change down the road. The server should be static.

Your config is otherwise correct.

52 minutes ago, Adubs said:

I just tested this both ways and it does work, so I'm leaning towards whatever db name, user, or pass you initially put in is not what you have in there now and its not going to update that for you.

You probably still want to use the IP of the server rather than docker in case that happens to change down the road. The server should be static.

Your config is otherwise correct.

Blowing away the app data folder did it!! Thanks!

I had no idea the appdata folder persists even after you remove the container. Is this true for all CA docker containers?

30 minutes ago, cambrionic said:

Blowing away the app data folder did it!! Thanks!

I had no idea the appdata folder persists even after you remove the container. Is this true for all CA docker containers?

Yes, the folder stays behind in appdata. There is an 'Appdata Cleanup' plugin which can show you what folders are not currently assigned to a container and remove them. Tread carefully. The intent with these directories is the software is not persistent, but the data the software relies on is... so deleting one version of a container to use another version can be as simple as mapping the same paths.

  • 2 weeks later...

Hi everyone,

Version 2.1.0, using standard template.

Having this error, when trying to fetch a thumbnail for the book (under the spolier toggle, as error a bit long).

Anyone faced this issue?

Code Block

2026-03-11T16:08:08.134+08:00 ERROR 1 --- [booklore-api] [at-handler-1701] org.booklore.util.FileService : An error occurred while creating thumbnail from URL: Failed to create directory: /app/data/images/310

java.io.IOException: Failed to create directory: /app/data/images/310

at org.booklore.util.FileService.saveCoverImages(FileService.java:708) ~[!/:0.0.1-SNAPSHOT]

at org.booklore.util.FileService.createThumbnailFromUrl(FileService.java:457) ~[!/:0.0.1-SNAPSHOT]

at org.booklore.service.metadata.BookCoverService.updateCoverFromUrl(BookCoverService.java:117) ~[!/:0.0.1-SNAPSHOT]

at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source) ~[na:na]

at java.base/java.lang.reflect.Method.invoke(Unknown Source) ~[na:na]

at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) ~[spring-aop-7.0.5.jar!/:7.0.5]

at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) ~[spring-aop-7.0.5.jar!/:7.0.5]

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:158) ~[spring-aop-7.0.5.jar!/:7.0.5]

at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:133) ~[spring-tx-7.0.5.jar!/:7.0.5]

at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:371) ~[spring-tx-7.0.5.jar!/:7.0.5]

at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:130) ~[spring-tx-7.0.5.jar!/:7.0.5]

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-7.0.5.jar!/:7.0.5]

at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:719) ~[spring-aop-7.0.5.jar!/:7.0.5]

at org.booklore.service.metadata.BookCoverService$$SpringCGLIB$$0.updateCoverFromUrl(<generated>) ~[!/:0.0.1-SNAPSHOT]

at org.booklore.controller.BookCoverController.uploadCoverFromUrl(BookCoverController.java:51) ~[!/:0.0.1-SNAPSHOT]

at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source) ~[na:na]

at java.base/java.lang.reflect.Method.invoke(Unknown Source) ~[na:na]

at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) ~[spring-aop-7.0.5.jar!/:7.0.5]

at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) ~[spring-aop-7.0.5.jar!/:7.0.5]

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:158) ~[spring-aop-7.0.5.jar!/:7.0.5]

at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:57) ~[spring-aop-7.0.5.jar!/:7.0.5]

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168) ~[spring-aop-7.0.5.jar!/:7.0.5]

at org.springframework.security.authorization.method.AuthorizationManagerBeforeMethodInterceptor.proceed(AuthorizationManagerBeforeMethodInterceptor.java:271) ~[spring-security-core-7.0.3.jar!/:7.0.3]

at org.springframework.security.authorization.method.AuthorizationManagerBeforeMethodInterceptor.attemptAuthorization(AuthorizationManagerBeforeMethodInterceptor.java:266) ~[spring-security-core-7.0.3.jar!/:7.0.3]

at org.springframework.security.authorization.method.AuthorizationManagerBeforeMethodInterceptor.invoke(AuthorizationManagerBeforeMethodInterceptor.java:197) ~[spring-security-core-7.0.3.jar!/:7.0.3]

at org.springframework.security.config.annotation.method.configuration.DeferringMethodInterceptor.invoke(DeferringMethodInterceptor.java:44) ~[spring-security-config-7.0.3.jar!/:7.0.3]

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-7.0.5.jar!/:7.0.5]

at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:96) ~[spring-aop-7.0.5.jar!/:7.0.5]

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-7.0.5.jar!/:7.0.5]

at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:719) ~[spring-aop-7.0.5.jar!/:7.0.5]

at org.booklore.controller.BookCoverController$$SpringCGLIB$$0.uploadCoverFromUrl(<generated>) ~[!/:0.0.1-SNAPSHOT]

at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source) ~[na:na]

at java.base/java.lang.reflect.Method.invoke(Unknown Source) ~[na:na]

at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:252) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:184) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-7.0.5.jar!/:7.0.5]

at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:934) ~[spring-webmvc-7.0.5.jar!/:7.0.5]

at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:853) ~[spring-webmvc-7.0.5.jar!/:7.0.5]

at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:86) ~[spring-webmvc-7.0.5.jar!/:7.0.5]

at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) ~[spring-webmvc-7.0.5.jar!/:7.0.5]

at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:866) ~[spring-webmvc-7.0.5.jar!/:7.0.5]

at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1000) ~[spring-webmvc-7.0.5.jar!/:7.0.5]

at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:903) ~[spring-webmvc-7.0.5.jar!/:7.0.5]

at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:649) ~[tomcat-embed-core-11.0.18.jar!/:na]

at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:874) ~[spring-webmvc-7.0.5.jar!/:7.0.5]

at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:710) ~[tomcat-embed-core-11.0.18.jar!/:na]

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:128) ~[tomcat-embed-core-11.0.18.jar!/:na]

at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-11.0.18.jar!/:na]

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107) ~[tomcat-embed-core-11.0.18.jar!/:na]

at org.booklore.config.security.filter.KoreaderAuthFilter.doFilterInternal(KoreaderAuthFilter.java:33) ~[!/:0.0.1-SNAPSHOT]

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107) ~[tomcat-embed-core-11.0.18.jar!/:na]

at org.booklore.config.security.filter.KoboAuthFilter.doFilterInternal(KoboAuthFilter.java:41) ~[!/:0.0.1-SNAPSHOT]

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107) ~[tomcat-embed-core-11.0.18.jar!/:na]

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:110) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107) ~[tomcat-embed-core-11.0.18.jar!/:na]

at org.booklore.config.security.filter.ImageCachingFilter.doFilterInternal(ImageCachingFilter.java:25) ~[!/:0.0.1-SNAPSHOT]

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107) ~[tomcat-embed-core-11.0.18.jar!/:na]

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107) ~[tomcat-embed-core-11.0.18.jar!/:na]

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107) ~[tomcat-embed-core-11.0.18.jar!/:na]

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107) ~[tomcat-embed-core-11.0.18.jar!/:na]

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107) ~[tomcat-embed-core-11.0.18.jar!/:na]

at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:235) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$FilterObservation$SimpleFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:493) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:354) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator.lambda$wrapSecured$0(ObservationFilterChainDecorator.java:86) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:132) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:101) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:244) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:231) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:141) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:126) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:120) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:244) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:231) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:141) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:132) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:86) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:244) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:231) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:141) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:244) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:231) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:141) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:181) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:244) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:231) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:141) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:244) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:231) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:141) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.booklore.config.security.filter.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:70) ~[!/:0.0.1-SNAPSHOT]

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:244) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:231) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:141) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:96) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:244) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:231) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:141) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:244) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:231) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:141) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:244) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:231) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:141) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:244) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:231) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:141) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:244) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:231) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:141) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:244) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$0(ObservationFilterChainDecorator.java:337) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:141) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:237) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:195) ~[spring-security-web-7.0.3.jar!/:7.0.3]

at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.springframework.web.filter.ServletRequestPathFilter.doFilter(ServletRequestPathFilter.java:52) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebSecurityConfiguration.java:317) ~[spring-security-config-7.0.3.jar!/:7.0.3]

at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:355) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:272) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107) ~[tomcat-embed-core-11.0.18.jar!/:na]

at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107) ~[tomcat-embed-core-11.0.18.jar!/:na]

at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107) ~[tomcat-embed-core-11.0.18.jar!/:na]

at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107) ~[tomcat-embed-core-11.0.18.jar!/:na]

at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:199) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-7.0.5.jar!/:7.0.5]

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107) ~[tomcat-embed-core-11.0.18.jar!/:na]

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:165) ~[tomcat-embed-core-11.0.18.jar!/:na]

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:77) ~[tomcat-embed-core-11.0.18.jar!/:na]

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:492) ~[tomcat-embed-core-11.0.18.jar!/:na]

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:113) ~[tomcat-embed-core-11.0.18.jar!/:na]

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:83) ~[tomcat-embed-core-11.0.18.jar!/:na]

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:72) ~[tomcat-embed-core-11.0.18.jar!/:na]

at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:685) ~[tomcat-embed-core-11.0.18.jar!/:na]

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341) ~[tomcat-embed-core-11.0.18.jar!/:na]

at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397) ~[tomcat-embed-core-11.0.18.jar!/:na]

at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-11.0.18.jar!/:na]

at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903) ~[tomcat-embed-core-11.0.18.jar!/:na]

at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1779) ~[tomcat-embed-core-11.0.18.jar!/:na]

at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-11.0.18.jar!/:na]

at java.base/java.lang.VirtualThread.run(Unknown Source) ~[na:na]

while i don’t enjoy FOSS drama, schadenfreude, or rumors, i will post this recent Reddit discussion about BookLore here, because i believe it’s of interest to Unraid users who may be using BookLore or struggling with bugs and the like: https://www.reddit.com/r/selfhosted/comments/1rs275q/psa_think_hard_before_you_deploy_booklore/

edit: just to keep everyone in the loop, because this situation has been so volatile and confusing... today, a moderator in the BookLore discord sent a message to all users explaining that the original dev (ACX10/WorldTraveler101) was leaving the project and handing it off to other maintainers. that user included an invite to a new booklore server, named “booklore2.0”. there was about fifteen minutes of chatter in a channel in the server and everyone watched as all the other channels were slowly deleted in real time, including the channel containing the aforementioned invite link, and then the server was deleted or deactivated. around the same time, the BookLore github repository (https://github.com/booklore-app/booklore) was either deleted or taken private.

if you come to this thread trying to figure out what’s going on with your container, hope this helps.

Edited by almighty7lurch
add recent updates about the upstream app

  • 2 weeks later...

@jmztaylor any interest in changing this template to Grimmory? Or creating a new template? I was thinking about just mapping my current one to the new images, but I don't really know what I'm doing and want to avoid guessing.

GitHub
No image preview

GitHub - grimmory-tools/grimmory: Grimmory is the success...

Grimmory is the successor of booklore. Contribute to grimmory-tools/grimmory development by creating an account on GitHub.

Edited by ignitionnight

  • Author
2 minutes ago, ignitionnight said:

@jmztaylor any interest in changing this template to Grimmory?

GitHub
No image preview

GitHub - grimmory-tools/grimmory: Grimmory is the success...

Grimmory is the successor of booklore. Contribute to grimmory-tools/grimmory development by creating an account on GitHub.



Someone else is more than welcome. I needed more stability than Booklore and now a new one. I ended up writing my own opds server and mobile app as my needs are a lot less than booklore features.

Until it's changed or there is a replacement, you can edit the template yourself. I did it and it worked fine.

image.png

11 minutes ago, jmztaylor said:



Someone else is more than welcome. I needed more stability than Booklore and now a new one. I ended up writing my own opds server and mobile app as my needs are a lot less than booklore features.

Totally understandable! Thanks for your work on this one!

19 hours ago, jmztaylor said:



Someone else is more than welcome. I needed more stability than Booklore and now a new one. I ended up writing my own opds server and mobile app as my needs are a lot less than booklore features.

I can take care of this. Will need a few days. Once live, I can follow up here so this can one can be decommissioned.

I have added the template to my repo, and it should be available in a few hours.

The only thing I wasn't sure on was the support topic. Should a new one be created, or should this one remain for continuity purposes? I have left this thread as the path temporarily.

For those migrating: I see no immediately obvious method to backup/restore the data. You should be able to point to your existing booklore's data path, and use the same MariaDB url and credentials.

Edited by AcmePluto
Corrected verbiage

On 3/26/2026 at 2:08 AM, AcmePluto said:

I have added the template to my repo, and it should be available in a few hours.

The only thing I wasn't sure on was the support topic. Should a new one be created, or should this one remain for continuity purposes? I have left this thread as the path temporarily.

For those migrating: I see no immediately obvious method to backup/restore the data. You should be able to point to your existing booklore's data path, and use the same MariaDB url and credentials.

Tried it, literally copy pasted the settings from one to another and it's working fine, thanks.

On 3/25/2026 at 8:08 PM, AcmePluto said:

The only thing I wasn't sure on was the support topic. Should a new one be created, or should this one remain for continuity purposes? I have left this thread as the path temporarily.

I'd say create a new support thread for sure, otherwise jmztaylor gonna get spammed for a template that isn't his responsibility.

edit: maybe link to this one in the new thread just for historical references.

Edited by ignitionnight

A new support thread has been created:

grim.pngI changed the repository from Booklore to Grimmory and all seems to work except I cannot write covers it seems to /image folder:

2026-04-02T06:56:07.299-04:00 WARN 1 --- [booklore-api] [mcat-handler-79] o.b.s.metadata.BookMetadataUpdater : Failed to download cover for book 22414: Error reading files from path: Failed to create directory: /app/data/images/22414

2026-04-02T06:56:11.129-04:00 INFO 1 --- [booklore-api] [MessageBroker-1] o.s.w.s.c.WebSocketMessageBrokerStats : WebSocketSession[3 current WS(3)-HttpStream(0)-HttpPoll(0), 3 total, 0 closed abnormally (0 connect failure, 0 send limit, 0 transport error)], stompSubProtocol[processed CONNECT(3)-CONNECTED(3)-DISCONNECT(0)], stompBrokerRelay[null], inboundChannel[thread-per-task], outboundChannel[thread-per-task], sockJsScheduler[pool size = 1, active threads = 1, queued tasks = 0, completed tasks = 0]

I have added the group and user ID as instructed and performed the chown as instructed.

Any help would be appreciated.

Edited by goldbondx

Check your old setup for the uid and group id. For troubleshooting, you can also try removing those, as this is likely a local permissions issue.

51 minutes ago, AcmePluto said:

Check your old setup for the uid and group id. For troubleshooting, you can also try removing those, as this is likely a local permissions issue.

Would it be simpler to just chown on the image folder to allow writes given everything else seems to work? (at least that is what AI is suggesting) And if so, to what? The issue seems to be writing of book covers. (and other images)

Update: I deleted the 2 entries you suggested I remove and now it seems to work..messed up. mind boggling but happy nonetheless..

Edited by goldbondx

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.