Code Monkey home page Code Monkey logo

docker-teedy's Introduction

Teedy multi-architecture Docker images

Teedy (formerly Sismics Docs) is an open source, lightweight document management system. The source code and project can be found here - https://github.com/sismics/docs.

Prebuilt images are available on Docker Hub as jdreinhardt/teedy

Default credentials are admin:admin Make sure to update the default password after login.

README

The build.sh is designed to simplify the generation of multi-architecture Docker images of Teedy. It also includes a number of safety checks and automations to simplify the build process. A few customizations are available as variables at the top of the build.sh script.

Currently supported architectures are

  • amd64 (x86_64)
  • arm32v7 (armhf)
  • arm64 (aarch64)

This list is not exhaustive and more can easily be added at the top of the script, or built manually.

The Dockerfile uses a builder image to reduce the overall size of the image while also building Teedy directly from source ensure the images stay up-to-date with the source project. Current image sizes are approximately half the size of the official images.

Build Pattern

The build.sh script is the easiest way to build images yourself. For manual builds you will need to enable buildx on your system. Once you enable buildx you will need to also run the following:

  • docker run --rm --privileged linuxkit/binfmt:v0.8 (This is only required if you want to build for architectures other than your build system)
  • docker buildx create --name xbuilder
  • docker buildx use xbuilder
  • docker buildx inspect --bootstrap

After running these commands you will have a new buildx builder running. You can use docker buildx ls to view all builders and their supported architectures.

One build argument is required: TEEDY_BRANCH which is used to specify the Git branch to use for the build. An example build command would be docker buildx build -f Dockerfile --build-arg TEEDY_BRANCH=master --platform=linux/arm/v7,linux/amd64,linux/arm64 --push -t jdreinhardt/teedy:latest .

Usage Pattern

The following parameters are available

  • -e JAVA_OPTIONS customize the Java Options (default: -Xmx512m)
  • -e OCR_LANGS (>= 1.10) add additional OCR language support. Only English by default
  • -p 8080 web interface internal port
  • -v /data Teedy data location

Supported OCR Languages

Specifying additional languages is only supported started with version 1.10. Version 1.9 and earlier include all languages by default.

ara, chi-sim, chi-tra, dan, deu, fin, fra, heb, hin, hun, ita, jpn, jpn, kor, lav, nld, nor, pol, por, rus, spa, swe, tha, tur, ukr

Multiple languages can be added by comma separating them.

Examples

Basic: docker run -p 80:8080 -v /mnt/teedy:/data jdreinhardt/teedy:latest

Advanced: docker run -e JAVA_OPTIONS=-Xmx1024m -e OCR_LANGS=spa,fra -p 80:8080 -v /mnt/teedy:/data jdreinhardt/teedy:latest

docker-teedy's People

Contributors

floli avatar jdreinhardt avatar

Stargazers

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

Watchers

 avatar  avatar  avatar

docker-teedy's Issues

Upgraded and now appear to have corrupted DB?

I suspect this is likely something to log with teedy directly but thought I'd also log it here in case other users of this image run into the same problem.

Updating to 1.10 from the other day resulted in my instance no longer being accessible. Looked in the logs and it appears the process of opening the database is now choking.

12 Feb 2021 14:19:49,248 WARN com.mchange.v2.log.slf4j.Slf4jMLog$Slf4jMLogger$WarnLogger.log(Slf4jMLog.java:220) Having failed to acquire a resource, com.mchange.v2.resourcepool.BasicResourcePool@60a19573 is interrupting all Threads waiting on a resource to check out. Will try again in response to new client requests.
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.sun.xml.bind.v2.runtime.reflect.opt.Injector (file:/tmp/jetty-0_0_0_0-8080-docs_war-_-any-16950265786861505824/webapp/WEB-INF/lib/jaxb-impl-2.3.0.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int)
WARNING: Please consider reporting this to the maintainers of com.sun.xml.bind.v2.runtime.reflect.opt.Injector
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
2021-02-12 14:19:52.046:WARN:oejw.WebAppContext:main: Failed startup of context o.e.j.w.WebAppContext@31190526{Teedy,/,file:///tmp/jetty-0_0_0_0-8080-docs_war-_-any-16950265786861505824/webapp/,UNAVAILABLE}{./webapps/docs.war}
org.hibernate.exception.GenericJDBCException: Unable to acquire JDBC Connection
        at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47)
        at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
        at org.eclipse.jetty.deploy.bindings.StandardStarter.processBinding(StandardStarter.java:46)
        at org.eclipse.jetty.start.Main.invokeMain(Main.java:218)
        at org.eclipse.jetty.start.Main.start(Main.java:491)
        at org.eclipse.jetty.start.Main.main(Main.java:77)
Caused by:
java.sql.SQLException: Connections could not be acquired from the underlying database!
        at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:118)
        at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:692)
        at org.eclipse.jetty.deploy.providers.ScanningAppProvider.fileAdded(ScanningAppProvider.java:173)
        at org.eclipse.jetty.deploy.providers.WebAppProvider.fileAdded(WebAppProvider.java:447)
        at org.eclipse.jetty.deploy.providers.ScanningAppProvider$1.fileAdded(ScanningAppProvider.java:66)
        at org.eclipse.jetty.util.Scanner.reportAddition(Scanner.java:785)
        at org.eclipse.jetty.util.Scanner.reportDifferences(Scanner.java:754)
        at org.eclipse.jetty.util.Scanner.scan(Scanner.java:641)
        at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:644)
        at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:554)
        at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutAndMarkConnectionInUse(C3P0PooledConnectionPool.java:758)
        at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:206)
        at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:203)
        at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1176)
        at com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1163)
        at com.mchange.v2.resourcepool.BasicResourcePool.access$700(BasicResourcePool.java:44)
        at com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1908)
        at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:696)
Caused by:
java.lang.IllegalStateException: Unsupported type 17 [1.4.200/3]
        at org.h2.mvstore.DataUtils.newIllegalStateException(DataUtils.java:950)
        at org.h2.mvstore.type.ObjectDataType.newType(ObjectDataType.java:165)
        at org.h2.mvstore.type.ObjectDataType.read(ObjectDataType.java:229)
        at org.h2.mvstore.type.ObjectDataType.read(ObjectDataType.java:114)
        at org.h2.mvstore.Page.read(Page.java:605)
        at org.h2.mvstore.Page.read(Page.java:239)
        at org.h2.mvstore.MVStore.readPage(MVStore.java:2211)
        at org.h2.mvstore.MVMap.readPage(MVMap.java:672)
        at org.h2.mvstore.MVMap.readOrCreateRootPage(MVMap.java:688)
        at org.h2.mvstore.MVMap.setRootPos(MVMap.java:682)
        at org.h2.mvstore.MVStore.openMap(MVStore.java:576)
        at org.h2.mvstore.MVStore.openMap(MVStore.java:535)
        at org.h2.mvstore.MVStore.openMap(MVStore.java:516)
        at org.h2.mvstore.MVStore.removeMap(MVStore.java:2742)
        at org.h2.engine.Database.handleUpgradeIssues(Database.java:866)
        at org.h2.engine.Database.open(Database.java:742)
        at org.h2.engine.Database.openDatabase(Database.java:307)
        at org.h2.engine.Database.<init>(Database.java:301)
        at org.h2.engine.Engine.openSession(Engine.java:74)
        at org.h2.engine.Engine.openSession(Engine.java:192)
        at org.h2.engine.Engine.createSessionAndValidate(Engine.java:171)
        at org.h2.engine.Engine.createSession(Engine.java:166)
        at org.h2.engine.Engine.createSession(Engine.java:29)

Appears to be known when upgrading to 1.4.200 of the h2database.

h2database/h2database#2078

The proposed solution is to drop back to the old driver, export the database, load the new library and recreate from backup.

Rolling back to 1.9 of this docker container does appear to fix the issue (I'm assuming because it uses an older version of the h2database lib).

Document Search isn't working

It doesn't find anything inside the document. I'm using v1.9. The error persists even when I reindex documents.

This is the error

11 Oct 2020 13:40:44,785 ERROR com.sismics.rest.exception.ServerException.(ServerException.java:36) SearchError: Error searching in documents
org.apache.lucene.store.AlreadyClosedException: this IndexReader is closed
at org.apache.lucene.index.IndexReader.ensureOpen(IndexReader.java:257)
at org.apache.lucene.index.StandardDirectoryReader.doOpenIfChanged(StandardDirectoryReader.java:264)
at org.apache.lucene.index.StandardDirectoryReader.doOpenIfChanged(StandardDirectoryReader.java:259)
at org.apache.lucene.index.DirectoryReader.openIfChanged(DirectoryReader.java:140)
at com.sismics.docs.core.util.indexing.LuceneIndexingHandler.getDirectoryReader(LuceneIndexingHandler.java:571)
at com.sismics.docs.core.util.indexing.LuceneIndexingHandler.search(LuceneIndexingHandler.java:436)
at com.sismics.docs.core.util.indexing.LuceneIndexingHandler.findByCriteria(LuceneIndexingHandler.java:272)
at com.sismics.docs.rest.resource.DocumentResource.list(DocumentResource.java:381)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.lambda$static$0(ResourceMethodInvocationHandlerFactory.java:76)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:148)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:191)
at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:200)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:103)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:493)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:415)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:104)
at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:277)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:272)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:268)
at org.glassfish.jersey.internal.Errors.process(Errors.java:316)
at org.glassfish.jersey.internal.Errors.process(Errors.java:298)
at org.glassfish.jersey.internal.Errors.process(Errors.java:268)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:289)
at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:256)
at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:703)
at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:416)
at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:370)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:389)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:342)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:229)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:865)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1655)
at org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:215)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
at com.sismics.util.filter.SecurityFilter.doFilter(SecurityFilter.java:134)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
at com.sismics.util.filter.SecurityFilter.doFilter(SecurityFilter.java:134)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
at com.sismics.util.filter.RequestContextFilter.doFilter(RequestContextFilter.java:89)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
at com.sismics.util.filter.CorsFilter.doFilter(CorsFilter.java:39)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:533)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1595)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1340)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1564)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1242)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:220)
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:126)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
at org.eclipse.jetty.server.Server.handle(Server.java:503)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:364)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:260)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126)
at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:765)
at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:683)
at java.lang.Thread.run(Thread.java:748)

500 Error for Admin login

Good morning,

I attempted to login to my Teedy installation this morning using my admin username and password (stored in 1Password) and am getting a loading bar at the top then after about 5 seconds or so I receive a 500 error response.

When attempting to login with obviously wrong pw while still using the correct username it returns almost instantly. This feels like there is possibly an issue with the install/code?

Few additional details below:

Teedy Version 1.10
Running as docker container through Synology

Any help here would be greatly appretiated.

Unable to delete documents with latest/v1.10

Hi,

I'm not sure if this is an issue with this image or with the actual teedy application, but with the latest image (v1.10) I cannot delete documents in teedy. I switched to the 1.9 version of the image and I can delete documents just fine.

If I check the logs of the containers, in v1.9 when I click the delete button I can see the event happen in the docker logs.
05 Mar 2021 17:00:36,941 INFO com.sismics.docs.core.listener.async.DocumentDeletedAsyncListener.on(DocumentDeletedAsyncListener.java:31) Document deleted event: DocumentDeletedAsyncEvent{documentId=cf669163-2a31-4509-9291-512ea8cc7675}
However on v1.10 it doesn't register the delete event in the logs

This is running on an RPi4 so that is why I'm using this image rather than the official one. If this is an issue on the teedy side then I'll try going to their repo but I'm not sure how far I will get when they don't officially support ARM on their image.

Error on Upload - Guess webserver is limited

Hello,
I use Teedy with Docker on a Raspi4 with Ubuntu Server. The /data directory is mounted to a usb-memory with enough space free.

For a .pdf with 1400 KB always a upload-error occures. Like other files with bit bigger filesize. I don't know the exact limit but i seems that there is one near to 781 KB. Can this be true? And if yes, is there a possibility to increase the limit via ''docker exec bash'' (easy way)?

Thanks for helping me.

Recommend Projects

  • React photo React

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

  • Vue.js photo Vue.js

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

  • Typescript photo Typescript

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

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

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

  • web

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

  • server

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

  • Machine learning

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

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

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

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.