快速开始

简介

轻阅读是一个全移动端可用的阅读应用,支持多端同步阅读进度,适配各种屏幕尺寸。

安装说明

Android 版本

下载 APK 文件后直接安装即可。

iOS 版本

从 GitHub 或网盘下载后使用爱思签名安装或者使用自签安装。

Windows 版本

下载安装包后运行安装程序。

服务端部署

Docker 一键部署

使用 Docker 可以快速部署轻阅读服务,无需手动安装 Java 环境。

1. 安装 Docker

1

Windows/macOS:下载并安装 Docker Desktop

2

Linux:使用包管理器安装 Docker

  • Ubuntu/Debian:sudo apt-get install docker.io
  • CentOS:sudo yum install docker

2. 拉取镜像并运行

  • 拉取最新镜像:
  • docker pull autobcb/read:latest
  • 运行容器:
  • docker run -tid -e TZ=Asia/Shanghai --name read -v /root/read:/app -p 8080:8080 --restart=always docker-0.unsee.tech/bitnami/java java -jar /app/read.jar

3. 参数说明

  • -tid:后台运行并分配伪终端
  • -e TZ=Asia/Shanghai:设置时区为上海
  • --name read:容器名称
  • -v /root/read:/app:数据持久化(主机目录:容器目录)
  • -p 8080:8080:端口映射(主机端口:容器端口)
  • --restart=always:容器退出时自动重启

4. 代理设置(可选)

  • 如果需要使用代理,可以将启动命令修改为:
  • docker run -tid -e TZ=Asia/Shanghai --name read -v /root/read:/app -p 8080:8080 --restart=always docker-0.unsee.tech/bitnami/java java -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=1080 -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=1080 -jar /app/read.jar

5. 常用命令

  • 查看日志:docker logs read
  • 停止服务:docker stop read
  • 启动服务:docker start read
  • 重启服务:docker restart read
  • 删除容器:docker rm read

环境要求

服务端需要 Java 22 或更高版本。

Windows 安装 Java

1

访问 Java 22 下载页面,下载Windows版本的JDK安装包(选择 jdk-22.0.2_windows-x64_bin.exejdk-22.0.2_windows-x64_bin.msi)。

2

运行下载的安装程序,按照向导完成安装。默认安装路径为 C:\Program Files\Java\jdk-22.0.2

3

设置环境变量:

  • 新建系统变量 JAVA_HOME,值为JDK安装路径:C:\Program Files\Java\jdk-22.0.2
  • 编辑系统变量 Path,添加:%JAVA_HOME%\bin
4

打开命令提示符,输入以下命令验证安装:

java -version

如果显示Java版本信息,则说明安装成功。

Linux 安装 Java

1

访问 Java 22 下载页面,下载Linux版本的JDK安装包(选择 jdk-22.0.2_linux-x64_bin.tar.gz)。

2

打开终端,进入下载目录,解压文件到 /usr/lib/jvm/ 目录:

sudo tar -xvf jdk-22.0.2_linux-x64_bin.tar.gz -C /usr/lib/jvm/
3

设置环境变量,编辑 ~/.bashrc~/.zshrc 文件:

  • 添加以下内容:
  • export JAVA_HOME=/usr/lib/jvm/jdk-22.0.2
  • export PATH=$JAVA_HOME/bin:$PATH

使环境变量生效:

source ~/.bashrcsource ~/.zshrc
4

验证安装:

java -version

如果显示Java版本信息,则说明安装成功。

运行服务

完成Java安装后,按照以下步骤运行轻阅读服务:

1. 准备工作

  • 下载最新版本的 read.jar 文件
  • 创建一个工作目录,例如 D:\read/home/user/read
  • read.jar 复制到工作目录中
  • 在工作目录中创建 conf.yml 配置文件(可选)

2. 运行方式

Windows系统:

  • 命令行直接运行:
  • java -jar read.jar
  • 后台运行(创建 run.vbs 文件):
  • Set ws = CreateObject("Wscript.Shell") ws.run "cmd /c java -jar read.jar", vbhide

Linux/macOS系统:

  • 前台运行:
  • java -jar read.jar
  • 后台运行:
  • nohup java -jar read.jar > read.log 2>&1 &
  • 查看运行日志:
  • tail -f read.log

3. 常用参数

  • 指定端口(默认8080):
  • java -Dserver.port=8080 -jar read.jar
  • 指定内存大小:
  • java -Xms512m -Xmx2g -jar read.jar
  • 设置HTTP代理:
  • java -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=1080 -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=1080 -jar read.jar
  • 组合使用(设置内存、端口和代理):
  • java -Xms512m -Xmx2g -Dserver.port=8080 -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=1080 -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=1080 -jar read.jar

4. 访问服务

  • 服务启动后,打开浏览器访问:http://localhost:8080
  • 如需外网访问,请确保防火墙已开放对应端口
  • 建议配置域名和SSL证书以支持HTTPS访问

5. 注意事项

  • 首次运行时会自动创建必要的目录和文件
  • 建议使用8G或以上内存的服务器运行
  • 如遇到内存不足,可适当调整JVM参数
  • 生产环境建议配置外部数据库和Redis

配置说明

  • 确保 read.jar 和libs文件夹存在
  • 确保 conf.yml 与 jar 文件在同一目录
  • 可在 conf.yml 中修改后台管理账号密码
  • 默认端口为 8080

快捷获取注册码

服务端提供了快捷获取注册码的接口,方便用户快速获取注册码:

  • 接口地址:/getcode?code=$code
  • 参数说明:
  • code参数在conf.yml文件中设置

示例:

  • 假设服务地址为:http://localhost:8080
  • conf.yml 中设置的code为:123456
  • 则访问:http://localhost:8080/getcode?code=123456
  • 即可获取注册码

注意事项

  • 建议使用 2G 或以上内存的服务器
  • 如果使用云服务器,请确保开放相应端口
  • 生产环境建议使用 MySQL 数据库

书源管理

推荐书源

推荐使用"晴天"书源。

书源安全

注意:书源可以直接调用 java 代码,请谨慎使用未知来源的书源!

功能说明

多端同步

支持在手机、平板、电脑等设备间同步阅读进度。

热键支持

  • ESC:返回
  • 左右方向键:翻页
  • F11:无边框(仅 Windows)
  • F12:恢复边框(仅 Windows)

常见问题

Web 端限制

  • 不支持保存 cookie
  • 部分不允许跨域的资源会出错

已知问题

RSA 加密:安卓端和 JAVA 端加密标准不同,可能会导致解密问题。如遇到此类问题,请参考以下代码进行修改。

参考如下:

var javaImport = new JavaImporter();
javaImport.importPackage(
Packages.java.lang,
Packages.java.security,
Packages.org.bouncycastle.jce.provider,
Packages.java.security.interfaces,
Packages.java.security.spec,
Packages.java.io,      
Packages.javax.crypto,
Packages.javax.crypto.spec
);
with(javaImport){
function Decode(str){
       jmkey="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjYFYoMbA0uW8by6+YIghxxsvibS9YW4yKVSulykAzZZwZ/+dNTkZ4inY7Pj08aksm6RCGKS6+WfvVQo/EdkcS5p2LY2/76qVzapyHsyQf/Pud6ATPKnwxNt/DaqjL35Z9K0NI/RF9x732RdIEOTKXppfRdzCa/1Ctm/5ZFilY8UmZsppkjDd3XkuPr3n3wVC8WFvqmdJ1N55prRlnaRaO+mIOXo3OsOzIxE5EdcE0TLT9OFZ3Wlbi3E0iI0v/ZsrWoL57YvLwo7BsARp7BansDCx8NZg6ObGQN/tNrE/nKqQTXeJjnFWXdLfhI7xivPPphkj5fNpiufIsIUEd7eXBwIDAQAB";
       publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(Base64.decode(jmkey, 0)));

       instance = Cipher.getInstance("RSA",new BouncyCastleProvider());
        instance.init(2, publicKey);
        decode = Base64.decode(str,0);
        blockSize = instance.getBlockSize();
        byteArrayOutputStream = new ByteArrayOutputStream(64);
         i = 0;
        while (true) {
             i2 = i * blockSize;
            if (decode.length - i2 > 0) {
                byteArrayOutputStream.write(instance.doFinal(decode, i2, blockSize));
                i++;
            } else {
                decode = byteArrayOutputStream.toByteArray();
                byteArrayOutputStream.close();
                return new String(decode);
            }
        }
    }
}