如果你家里有一台群晖或者可以安装docker的服务器,不妨跟我一起从零开始搭建一个电子书图书馆,这个图书馆使用了开源项目calibre-web,这个项目是基于calibre这个单机版图书馆做出来的,这也是为什么下面需要在相应目录下存放一个calibre的数据库文件的原因。

calibre-web的功能很强大主要有以下几大功能点:

1、无缝集成calibre单机版图书馆,只要将calibre的数据库文件和相应的图书复制进calibre-web指定目录,calibre的所有书籍就可以通过web端管理阅读推送了。

2、支持上传下载图书、建立编辑书架功能(上传的时候可从互联网获取完善书籍信息并保存)

3、在线阅读pdf、epub等格式,支持的电子书格式众多。

3、支持电子书格式在线转换,如pdf--->epub等等

4、支持图书推送到自己的kindle设备

5、支持在线注册用户,用户权限管理(如管理员可指定用户是否拥有上传、阅读、下载等权限)

下面就开始一步步来搭建calibre-web:

打开群晖docker

在docker注册表中搜索calibre,出现很多镜像,星星最多的是linuxserver/calibre-web,为什么这个镜像星星最多,因为这个开发团队一直在维护更新,目前的版本已经非常完善了,所以选择这个镜像没有错,在下载之前我们需要了解这个镜像,点击这个镜像右上角的箭头去docker-hub看这个镜像的使用方法,群晖的镜像启动配置都要去看官方的说明文档而不要去参照网上博客的参数生搬硬套,一旦版本变了官方文档会变化,博客几乎不会更新。
来到镜像的说明网址:
https://registry.hub.docker.com/r/linuxserver/calibre-web/ 翻到参数一栏

这里我们可以看到需要配置的完整内容,-p 代表端口映射是8083,-e代表环境变量配置 ,PUID\PGID是处理权限的,DOCKER_MODS是电子书转换功能需要配置的,OAUTHLIB_RELAX_TOKEN_SCOPE是谷歌登录所需的(当然如果要实现这个肯定要去google申请应用),-v表示目录挂载 需要挂载两个目录分别是/config /books

当我们分析了官方文档后就知道下载完成后启动容器需要配置哪些内容了,这个无论是群晖内的docker还是其他系统的docker,查看官网说明文档是最直接的,切记不要盲目去看别人博客中写的。

前面我们看到要挂载两个目录,我们在群晖docker目录中建一个文件夹linuxserver-cabibre-books,这个文件夹名称根据自己喜好来定,在文件夹里边建立books,config文件夹,文件名也是根据喜欢来写,没必要和我写的一样。
下完镜像后我们点击启动
勾选使用高权限执行容器
在存储空间中添加要挂载的两个文件夹,装载路径是根据官网文档的固定写法,不可变,左侧的文件夹是刚自己建立的两个文件夹。
容器端口8083是官方文档要求的不可变,本地端口只要是没占用的,可以自己定,这边填9000,这个是一会访问需要用到的。

把官网要求加的环境变量全部加上,因为我们要使用全功能的容器,需要添加以下四个环境变量,如上图

PUID $(id -u) 这个写法是指用户的uid是当前用户,也就是哪个用户启动了这个容器,这个容器就使用哪个用户的权限,这个直接关系到挂载的文件夹是否可以读写,很重要。

PGID $(id -g) 这是指定当前用户组的id,保持这个写法即可

OAUTHLIB_RELAX_TOKEN_SCOPE 1 开启谷歌auth

DOCKER_MODS linuxserver/calibre-web:calibre 开启电子书格式转换的能力

补充:官方文档写的GUID\PGID 都填1000 这边不能按照官方的来,因为你不知道你系统的用户id是多少,如果要填写具体数据,就要开启ssh 在群晖中执行 id 用户名 来查看具体的GUID PGID,这里使用$(id -u) $(id -g)是一劳永逸的写法,实际上在读到这边的时候就是执行命令获取相应的id。

检查下各项参数有没有问题
点应用启动,后面在我的网盘中下载一个空白的数据库文件

链接: https://pan.baidu.com/s/13Y-DSQGvezoQiNyLXZW6tg 提取码: cjmt
--来自百度网盘超级会员v5的分享 如下图

补充:为什么要这个数据库文件,因为calibre-web是基于calibre的,它并不负责图书库的创建,所以需要有一个数据仓库,metadata.db就是这个数据仓库,john schember是这个数据仓库中的一本指南书。如果你不使用我的这个空库文件,你也可以去电脑本地安装一个calibre软件,官方下载地址:https://calibre-ebook.com/download,下载安装会让你指定一个数据库存放目录,安装完成后就会自动生成这个数据库文件和第一本一本指南书,去这个目录下拿文件即可。

将文件拖动到群晖linuxserver-calibre-books/books目录中,这一步是calibre-web需要有一个数据库文件,没有后面会报错,做完以后可以登录,根据上面一步步下来,后面的配置会相当顺滑,所有的坑都不复存在了。
输入群晖nas ip:9000 上面配置的端口号访问网站即可登录,登录用户默认是admin, 密码admin123

搭建完毕需要对calibre-web进行详细的配置,可以移步我的另一片博文:

71 thoughts on “群晖nas搭建个人图书馆一(calibre-web环境搭建)”
  1. 大佬按你的方法安装完后,上传图书后点击获取元数据,然后点保存会网页假死,后来查了下说是获取元数据的时候应用了google的链接,不知道有没有解决方法

    1. 我能想到的是第一个方法1、: 你点击元数据后把google的两个不勾选,然后再试试
      2、第二个方法,让整个网络环境可以访问谷歌,也就是在路由器上装科学插件。

      1. DOCKER_MODS linuxserver/calibre-web:calibre 开启电子书格式转换的能力
        大佬,我只要配置了这个参数 网页端就会打不开 不配置就可以正常打开 是什么原因?

        1. 遇到了同样的问题,已解决供参考
          关闭容器修改为DOCKER_MODS=linuxserver/calibre-web:calibre `#optional`
          启动容器等30秒就可以了

  2. 大哥,在群晖里安装了,也配置了,上传图书的时候会不成功,显示数据库错误:(sqlite3.OperationalError) attempt to write a readonly database [SQL: INSERT INTO authors (name, sort, link) VALUES (?, ?, ?)] [parameters: (‘未知’, ‘未知’, ”)] (Background on this error at: https://sqlalche.me/e/14/e3q8)。这个怎么破?

        1. 你群晖是管理员账号登的吗?如果不行就打开群晖的ssh功能,用ssh登录群晖,然后输入 id 用户名 查看puid和pgid,这两个配置成具体数值。

        1. 我也是这样,无法上传临时目录,不知道哪里出了问题,刚开始安装的时候是可以了,穿了四本书,突然又不行了,不知道是哪里出了问题!

          1. 你这问题我遇到了。填写正确的PGID和PUID也不行后来我安装以下方式填写就好了
            PGID填写$(id -g)
            PUID填写$(id -u)

      1. 一样的问题,找到解决方法了:

        I just ran into this issue and was able to solve it in case you haven’t figured it out (running in Docker on Synology NAS).

        I believe it’s an issue with the temp directory being on a different drive than the library/upload directory. (https://github.com/Technosoft2000/docker-calibre-web/issues/89)

        I created two new directories in my calibre folder (docker/calibre/temp and docker/calibre/upload) and put the mount points as /tmp and /upload respectively. This allowed me to upload files to my calibre library from calibre-web.

        Edit: only creating one of the above directories did not fix it.

        https://www.reddit.com/r/Calibre/comments/odgkb1/error_when_uploading_via_calibreweb/

  3. 上传书籍报错,calibre(sqlite3.OperationalError) attempt to write a readonly database [SQL: INSERT INTO authors (name, sort, l

  4. 您好,我设置后报如下的错误,请问是哪方面出了问题
    The above exception was the direct cause of the following exception:
    Traceback (most recent call last):
    File “/app/calibre-web/cps.py”, line 34, in
    from cps import create_app
    File “/app/calibre-web/cps/__init__.py”, line 94, in
    ub.init_db(cli.settingspath)
    —-此处省略很多类似上面的说明,最后面有
    sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) unable to open database file
    (Background on this error at: https://sqlalche.me/e/14/e3q8)
    麻烦您帮忙看看

        1. 我的也是同样的问题,你的是咋解决的?我的数据库文件放到/books映射的文件里了,还是报错

  5. 请教一下,我在环境里面添加了DOCKER_MODS=linuxserver/calibre-web:calibre这个参数打开容器后,网页就打不开了,去掉这个参数,网页就能打开了,什么原因呢?
    还有我的电子书转换格式总是失败,是不是就是因为没有这个参数呢?我看官方文档说的格式转换需要这个参数

      1. 一样也是添加环境DOCKER_MODS=linuxserver/calibre-web:calibre
        以后网页打不开,去掉就可以,看了下日志下面这一条,不确定是不是需要梯子才行
        [mod-init] Applying linuxserver/calibre-web:calibre files to container

        设备是DS220+

    1. 关闭容器修改为DOCKER_MODS=linuxserver/calibre-web:calibre `#optional`
      启动容器等30秒就可以了

  6. 大佬,我的DSM7,顺利安装,开启在线阅读,有个小问题,PDF无法下线阅读,提示以外的服务器响应,pdf.js Unexpected server response 204。

    1. 解决了,谢谢,IDM的锅,网上给了思路,打开时唤醒了IDM下载,关闭IDM不自动下载列表解决。

  7. 你好,安装完成,在线阅读PDF提示错误,然后弹出下载,是不支持PDF在线阅读吗(开启了在线阅读) ,我就安装其他calibre,验证可以正常打开PDF。是哪里配置问题吗,求助。

    1. 解决了,谢谢,IDM的锅,网上给了思路,打开时唤醒了IDM下载,关闭IDM不自动下载列表解决。

  8. 大佬你好,想要请教一下:我因为误删了config下面的配置文件,因为没有开启垃圾箱,无法找回。然后删除重装容器也找不回被删除的文件,请问有什么办法找回配置文件嘛

  9. 按您的步骤,config里面配置文件被误删,重装也没有自动重新安装,请问有什么解决办法

  10. calibre-web 无法设置context-root,默认是/;然后和我其他的应用很多路径重复。比如calibre-web的login和其他系统的/login,重复。

  11. nginx反向代理8083端口,用域名访问80端口后登录系统后怎么要再次登录,会话失效?

  12. 您好,我按照您的方法一步步成功配置好后,发现电子书格式转换总是失败,看日志里有如下错误:
    [2022-11-25 16:03:15,501] INFO {cps.editbooks:318} converting: book id: 83 from: MOBI to: EPUB
    [2022-11-25 16:03:15,519] INFO {cps.tasks.convert:142} Book id 83 – target format of .epub does not exist. Moving forward with convert.
    [2022-11-25 16:03:16,421] INFO {cps.tasks.convert:188} ebook converter failed with error while converting book
    [2022-11-25 16:03:16,421] ERROR {cps.tasks.convert:192} Calibre failed with error: ImportError: cannot import name ‘QBuffer’ from ‘qt.core’ (/app/calibre/lib/calibre-extensions/python-lib.bypy.frozen/qt/core.pyc)
    [2022-11-25 16:10:51,099] ERROR {cps.db:796} Author not found to display name in right order
    [2022-11-25 16:11:22,289] INFO {cps.editbooks:318} converting: book id: 87 from: PDF to: MOBI
    [2022-11-25 16:11:22,832] INFO {cps.tasks.convert:142} Book id 87 – target format of .mobi does not exist. Moving forward with convert.
    [2022-11-25 16:12:20,055] ERROR {cps.db:796} Author not found to display name in right order
    [2022-11-25 16:12:34,783] INFO {cps.editbooks:318} converting: book id: 68 from: EPUB to: MOBI
    [2022-11-25 16:12:48,551] ERROR {cps.db:796} Author not found to display name in right order
    [2022-11-25 16:16:08,738] INFO {cps.tasks.convert:188} ebook converter failed with error while converting book
    [2022-11-25 16:16:08,739] ERROR {cps.tasks.convert:192} Calibre failed with error: ImportError: cannot import name ‘QBuffer’ from ‘qt.core’ (/app/calibre/lib/calibre-extensions/python-lib.bypy.frozen/qt/core.pyc)
    [2022-11-25 16:16:08,742] INFO {cps.tasks.convert:142} Book id 68 – target format of .mobi does not exist. Moving forward with convert.
    [2022-11-25 16:16:11,155] INFO {cps.tasks.convert:188} ebook converter failed with error while converting book
    [2022-11-25 16:16:11,156] ERROR {cps.tasks.convert:192} Calibre failed with error: ImportError: cannot import name ‘QBuffer’ from ‘qt.core’ (/app/calibre/lib/calibre-extensions/python-lib.bypy.frozen/qt/core.pyc)
    [2022-11-25 16:17:05,846] ERROR {cps.db:796} Author not found to display name in right order
    [2022-11-25 16:17:21,645] INFO {cps.editbooks:318} converting: book id: 72 from: EPUB to: MOBI
    [2022-11-25 16:17:21,656] INFO {cps.tasks.convert:142} Book id 72 – target format of .mobi does not exist. Moving forward with convert.
    [2022-11-25 16:17:25,951] INFO {cps.tasks.convert:188} ebook converter failed with error while converting book
    [2022-11-25 16:17:25,952] ERROR {cps.tasks.convert:192} Calibre failed with error: ImportError: cannot import name ‘QBuffer’ from ‘qt.core’ (/app/calibre/lib/calibre-extensions/python-lib.bypy.frozen/qt/core.pyc)
    ———————-
    请教,如何解决?

    1. 到底是GUID还是PUID,官方文档是PUID,是LZ写错了?
      配置和LZ的一模一样?我这边怎么连网页都打不开

  13. 想请教一下大佬,按照您的步骤和评论区的补充意见设置完以后貌似服务能够启动,但很快报错说无法连接,报错信息如下:
    ———-
    Traceback (most recent call last):
    File “/usr/local/lib/python3.8/dist-packages/fake_useragent/utils.py”, line 64, in get
    with contextlib.closing(urlopen(
    File “/usr/lib/python3.8/urllib/request.py”, line 222, in urlopen
    return opener.open(url, data, timeout)
    File “/usr/lib/python3.8/urllib/request.py”, line 525, in open
    response = self._open(req, data)
    File “/usr/lib/python3.8/urllib/request.py”, line 542, in _open
    result = self._call_chain(self.handle_open, protocol, protocol +
    File “/usr/lib/python3.8/urllib/request.py”, line 502, in _call_chain
    result = func(*args)
    File “/usr/lib/python3.8/urllib/request.py”, line 1397, in https_open
    return self.do_open(http.client.HTTPSConnection, req,
    File “/usr/lib/python3.8/urllib/request.py”, line 1357, in do_open
    raise URLError(err)
    urllib.error.URLError:
    During handling of the above exception, another exception occurred:
    Traceback (most recent call last):
    File “/app/calibre-web/cps.py”, line 34, in
    from cps.about import about
    File “/app/calibre-web/cps/about.py”, line 61, in
    from scholarly import scholarly
    File “/usr/local/lib/python3.8/dist-packages/scholarly/__init__.py”, line 4, in
    scholarly = _Scholarly()
    File “/usr/local/lib/python3.8/dist-packages/scholarly/_scholarly.py”, line 27, in __init__
    self.__nav = Navigator()
    File “/usr/local/lib/python3.8/dist-packages/scholarly/_navigator.py”, line 45, in __call__
    cls._instances[cls] = super(Singleton, cls).__call__(*args,
    File “/usr/local/lib/python3.8/dist-packages/scholarly/_navigator.py”, line 59, in __init__
    self.pm = ProxyGenerator()
    File “/usr/local/lib/python3.8/dist-packages/scholarly/_proxy_generator.py”, line 54, in __init__
    self._new_session()
    File “/usr/local/lib/python3.8/dist-packages/scholarly/_proxy_generator.py”, line 368, in _new_session
    ‘User-Agent’: UserAgent().random,
    File “/usr/local/lib/python3.8/dist-packages/fake_useragent/fake.py”, line 69, in __init__
    self.load()
    File “/usr/local/lib/python3.8/dist-packages/fake_useragent/fake.py”, line 75, in load
    self.data = load_cached(
    File “/usr/local/lib/python3.8/dist-packages/fake_useragent/utils.py”, line 250, in load_cached
    update(path, use_cache_server=use_cache_server, verify_ssl=verify_ssl)
    File “/usr/local/lib/python3.8/dist-packages/fake_useragent/utils.py”, line 245, in update
    write(path, load(use_cache_server=use_cache_server, verify_ssl=verify_ssl))
    File “/usr/local/lib/python3.8/dist-packages/fake_useragent/utils.py”, line 187, in load
    ret = json.loads(get(
    File “/usr/local/lib/python3.8/dist-packages/fake_useragent/utils.py”, line 84, in get
    raise FakeUserAgentError(‘Maximum amount of retries reached’)
    ———
    机器是群晖DS920+,烦请大佬不吝赐教~

  14. 大佬您好,文件夹设置everyone权限,端口号8083,guid和puid也是对的,但是登录网址总是提示【拒绝了我们的连接请求。】 亲问下有可能是出了什么情况呢

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注