快速开始
简介
轻阅读是一个全移动端可用的阅读应用,支持多端同步阅读进度,适配各种屏幕尺寸。
安装说明
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. 拉取镜像并运行
- 上传后端到服务器:
/root/read 为后端程序所在目录
- 拉取最新镜像:
docker pull docker-0.unsee.tech/bitnami/java
- 运行容器:
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
Docker Compose 部署方式(感谢Lin-max1032制作的镜像)
你也可以使用 docker-compose
更方便地管理和启动服务。请在你的服务器上新建一个 docker-compose.yml
文件,内容如下:
version: '3.8'
services:
qread:
image: linmax/read:latest
container_name: qread
restart: unless-stopped
ports:
- "8080:8080" # 根据需求设置
volumes:
- ./appdata:/app
environment:
TZ: Asia/Shanghai # 设置时区为上海
# =========== 数据库设置 ===========
DB_TYPE: sqlite # 设置为mysql时数据库设置生效,设置为sqlite时数据库设置不生效
DB_JDBCURL: jdbc:mysql://127.0.0.1:3306/数据库名?characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=UTC
DB_USERNAME: 用户名
DB_PASSWORD: 密码
# =========== admin 用户设置 ===========
ADMIN_USERNAME: admin # 后台管理员账户
ADMIN_PASSWORD: adminadmin # 后台管理员密码
#ADMIN_CODE: myadmincode # 可选:如果需要 code 参数
# =========== user 设置 ===========
USER_ALLOWUPTXT: "false" # 是否允许上传txt 允许 true 不允许 false
USER_ALLOWCACHE: "false" # 是否允许添加缓存 允许 true 不允许 false
USER_ALLOWIMG: "false" # 是否使用图片解密 允许 true 不允许 false
USER_ALLOWCHECK: "false" # 是否允许检验书源 允许 true 不允许 false
USER_SOURCE: "0" # 0: 不允许修改书源, 1: 允许后台修改, 2: 独立书源
USER_MAXSOURCE: "0" # 最大书源数量,0 表示不限制
USER_TIMEOUT: "0" # 10分钟内触发多少次timeout禁用书源 0 为不限制
# =========== SMTP 邮件设置 ===========
#SMTP_HOST: # smtp邮箱host
#SMTP_PROTOCOLS: TLSv1.2 # 通讯协议
#SMTP_PORT: # 端口
#SMTP_ACCOUNT: # 邮箱账号
#SMTP_PASSWORD: # 邮箱密码,部分邮箱是安全码
#SMTP_PERSONAL: # 发送人的昵称
#SMTP_CODESUBJECT: 验证码 # 验证码邮件的主题
# =========== 默认设置 ===========
#DEFAULT_TTS: # 默认tts链接
#DEFAULT_RULE: # 默认净化链接
# =========== HTTP 线程设置 ===========
SERVER_HTTP_CORETHREADS: x5 # 默认线程
SERVER_HTTP_MAXTHREADS: x10 # 最大线程
# =========== 启动命令(必填:二选一)===========
JAVA_CMD: java -jar /app/read.jar # 不使用代理启动
#JAVA_CMD: java -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=1080 -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=1080 -jar /app/read.jar # 使用代理启动
使用步骤
- 安装
docker-compose
(大多数新版本 Docker 已自带)。 - 将上面的内容保存为
docker-compose.yml
。 - 在该目录下执行:
docker-compose up -d
- 查看日志:
docker-compose logs -f
- 停止服务:
docker-compose down
代理设置(可选)
如需设置代理,可修改 command
字段,例如:
command: java -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=1080 -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=1080 -jar /app/read.jar
更多信息可参考 linmax/read Docker Hub。
环境要求
服务端需要 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);
}
}
}
}