快速开始
简介
轻阅读是一个全移动端可用的阅读应用,支持多端同步阅读进度,适配各种屏幕尺寸。
安装说明
Android 版本
下载 APK 文件后直接安装即可。
iOS 版本
从 GitHub 或网盘下载后使用爱思签名安装或者使用自签安装。
Windows 版本
下载安装包后运行安装程序。
服务端部署
Docker 一键部署
使用 Docker 可以快速部署轻阅读服务,无需手动安装 Java 环境。
1. 安装 Docker
Windows/macOS:下载并安装 Docker Desktop
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
访问 Java 22 下载页面,下载Windows版本的JDK安装包(选择 jdk-22.0.2_windows-x64_bin.exe
或 jdk-22.0.2_windows-x64_bin.msi
)。
运行下载的安装程序,按照向导完成安装。默认安装路径为 C:\Program Files\Java\jdk-22.0.2
设置环境变量:
- 新建系统变量
JAVA_HOME
,值为JDK安装路径:C:\Program Files\Java\jdk-22.0.2
- 编辑系统变量
Path
,添加:%JAVA_HOME%\bin
打开命令提示符,输入以下命令验证安装:
java -version
如果显示Java版本信息,则说明安装成功。
Linux 安装 Java
访问 Java 22 下载页面,下载Linux版本的JDK安装包(选择 jdk-22.0.2_linux-x64_bin.tar.gz
)。
打开终端,进入下载目录,解压文件到 /usr/lib/jvm/
目录:
sudo tar -xvf jdk-22.0.2_linux-x64_bin.tar.gz -C /usr/lib/jvm/
设置环境变量,编辑 ~/.bashrc
或 ~/.zshrc
文件:
- 添加以下内容:
export JAVA_HOME=/usr/lib/jvm/jdk-22.0.2
export PATH=$JAVA_HOME/bin:$PATH
使环境变量生效:
source ~/.bashrc
或 source ~/.zshrc
验证安装:
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 数据库
书源管理
功能说明
多端同步
支持在手机、平板、电脑等设备间同步阅读进度。
热键支持
- 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);
}
}
}
}