February 26Feb 26 In the Booklore config:Use:jdbc:mariadb://192.168.0.137:3307/bookloreMake sure your <password1> is the actual DB password, not the Root password
February 26Feb 26 3 hours ago, Rendo said:In the Booklore config:Use:jdbc:mariadb://192.168.0.137:3307/bookloreMake sure your <password1> is the actual DB password, not the Root passwordI 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)
February 26Feb 26 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
February 26Feb 26 12 minutes ago, jmztaylor said:Try using the lan IP instead of the docker IPTo 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 February 26Feb 26 by cambrionic spelling/grammar
February 27Feb 27 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 3307Version: '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)
February 27Feb 27 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 3307Version: '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?
February 27Feb 27 On 2/26/2026 at 12:47 AM, cambrionic said:Booklore docker log: https://pastes.io/item-1772088002732Maria-db docker log: https://pastes.io/2026-02-25I 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 logsyour 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 February 27Feb 27 by Adubs
February 27Feb 27 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.
February 28Feb 28 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?
February 28Feb 28 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.
March 11Mar 11 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 Block2026-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/310java.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]
March 12Mar 12 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 March 16Mar 16 by almighty7lurch add recent updates about the upstream app
March 23Mar 23 @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.GitHubGitHub - 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 March 23Mar 23 by ignitionnight
March 23Mar 23 Author 2 minutes ago, ignitionnight said:@jmztaylor any interest in changing this template to Grimmory?GitHubGitHub - 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.
March 23Mar 23 Until it's changed or there is a replacement, you can edit the template yourself. I did it and it worked fine.
March 23Mar 23 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!
March 23Mar 23 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.
March 26Mar 26 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 March 26Mar 26 by AcmePluto Corrected verbiage
March 27Mar 27 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.
March 27Mar 27 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 March 27Mar 27 by ignitionnight
April 2Apr 2 I 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/224142026-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 April 2Apr 2 by goldbondx
April 2Apr 2 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.
April 2Apr 2 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 April 2Apr 2 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.