Compare commits

...

7 Commits
3.4.1 ... 3.4.2

Author SHA1 Message Date
HFO4
c31c77a089 Merge remote-tracking branch 'origin/master' 2021-11-30 19:31:48 +08:00
HFO4
6b15cae0b5 Update version number 2021-11-30 19:27:09 +08:00
HFO4
84d81f201f Fix: refresh interval not working 2021-11-30 19:26:35 +08:00
HFO4
af4d9767c2 Fix: slave node cannot transfer files to other slave node 2021-11-30 19:26:07 +08:00
milkice
45597adcd3 Integrate aria2c support & fix unintended behavior for docker image (#1073)
* Update Dockerfile

* Create docker-bootstrap.sh

In addition to spawn cloudreve, this script generates password for aria2 so that users can take advantage of aria2 more conveniently instead of configuring aria2 by themselves.
2021-11-29 17:45:33 +08:00
AaronLiu
762f0f9c68 Update app.go 2021-11-26 15:48:19 +08:00
AaronLiu
c5074df1c7 Update README.md 2021-11-26 11:17:19 +08:00
11 changed files with 53 additions and 22 deletions

View File

@@ -46,13 +46,17 @@ ARG TZ="Asia/Shanghai"
ENV TZ ${TZ}
COPY --from=be-builder /go/bin/Cloudreve /cloudreve/cloudreve
COPY docker-bootstrap.sh /cloudreve/bootstrap.sh
RUN apk upgrade \
&& apk add bash tzdata \
&& apk add bash tzdata aria2 \
&& ln -s /cloudreve/cloudreve /usr/bin/cloudreve \
&& ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \
&& echo ${TZ} > /etc/timezone \
&& rm -rf /var/cache/apk/*
&& rm -rf /var/cache/apk/* \
&& mkdir /etc/cloudreve \
&& ln -s /etc/cloudreve/cloureve.db /cloudreve/cloudreve.db \
&& ln -s /etc/cloudreve/conf.ini /cloudreve/conf.ini
# cloudreve use tcp 5212 port by default
EXPOSE 5212/tcp
@@ -65,4 +69,4 @@ VOLUME /etc/cloudreve
VOLUME /data
ENTRYPOINT ["cloudreve"]
ENTRYPOINT ["sh", "/cloudreve/bootstrap.sh"]

View File

@@ -37,7 +37,7 @@
* :cloud: 支持本机、从机、七牛、阿里云 OSS、腾讯云 COS、又拍云、OneDrive (包括世纪互联版) 作为存储端
* :outbox_tray: 上传/下载 支持客户端直传,支持下载限速
* 💾 可对接 Aria2 离线下载
* 💾 可对接 Aria2 离线下载,可使用多个从机机点分担下载任务
* 📚 在线 压缩/解压缩、多文件打包下载
* 💻 覆盖全部存储策略的 WebDAV 协议支持
* :zap: 拖拽上传、目录上传、流式上传处理

2
assets

Submodule assets updated: 691e82868d...88c1133306

View File

@@ -15,7 +15,7 @@ func InitApplication() {
fmt.Print(`
___ _ _
/ __\ | ___ _ _ __| |_ __ _____ _____
/ / | |/ _ \| | | |/ _ | '__/ _ \ \ / / _ \
/ / | |/ _ \| | | |/ _ | '__/ _ \ \ / / _ \
/ /___| | (_) | |_| | (_| | | | __/\ V / __/
\____/|_|\___/ \__,_|\__,_|_| \___| \_/ \___|

15
docker-bootstrap.sh Normal file
View File

@@ -0,0 +1,15 @@
#!/bin/sh
GREEN='\033[0;32m'
RESET='\033[0m'
if [ ! -f /etc/cloudreve/aria2c.conf ]; then
echo -e "[${GREEN}aria2c${RESET}] aria2c config not found. Generating..."
secret=$(tr -dc A-Za-z0-9 </dev/urandom | head -c 13)
echo -e "[${GREEN}aria2c${RESET}] Generated port: 6800, secret: $secret"
cat <<EOF > /etc/cloudreve/aria2c.conf
enable-rpc=true
rpc-listen-port=6800
rpc-secret=$secret
EOF
fi
aria2c --conf-path /etc/cloudreve/aria2c.conf -D
cloudreve

View File

@@ -1,13 +1,13 @@
package conf
// BackendVersion 当前后端版本号
var BackendVersion = "3.4.1"
var BackendVersion = "3.4.2"
// RequiredDBVersion 与当前版本匹配的数据库版本
var RequiredDBVersion = "3.4.0"
// RequiredStaticVersion 与当前版本匹配的静态资源版本
var RequiredStaticVersion = "3.4.0"
var RequiredStaticVersion = "3.4.2"
// IsPro 是否为Pro版本
var IsPro = "false"

View File

@@ -247,9 +247,6 @@ func (fs *FileSystem) SwitchToSlaveHandler(node cluster.Node) {
// SwitchToShadowHandler 将负责上传的 Handler 切换为从机节点转存使用的影子处理器
func (fs *FileSystem) SwitchToShadowHandler(master cluster.Node, masterURL, masterID string) {
switch fs.Policy.Type {
case "remote":
fs.Policy.Type = "local"
fs.DispatchHandler()
case "local":
fs.Policy.Type = "remote"
fs.Policy.Server = masterURL

View File

@@ -292,17 +292,17 @@ func TestFileSystem_SwitchToShadowHandler(t *testing.T) {
Model: &model.Node{},
}
// remote to local
{
fs.Policy.Type = "remote"
fs.SwitchToShadowHandler(mockNode, "", "")
a.IsType(&masterinslave.Driver{}, fs.Handler)
}
// local to remote
{
fs.Policy.Type = "local"
fs.SwitchToShadowHandler(mockNode, "", "")
a.IsType(&masterinslave.Driver{}, fs.Handler)
}
// onedrive
{
fs.Policy.Type = "onedrive"
fs.SwitchToShadowHandler(mockNode, "", "")
a.IsType(&masterinslave.Driver{}, fs.Handler)
}
}

View File

@@ -76,9 +76,8 @@ func BuildFinishedListResponse(tasks []model.Download) Response {
}
// BuildDownloadingResponse 构建正在下载的列表响应
func BuildDownloadingResponse(tasks []model.Download) Response {
func BuildDownloadingResponse(tasks []model.Download, intervals map[uint]int) Response {
resp := make([]DownloadListResponse, 0, len(tasks))
interval := model.GetIntSetting("aria2_interval", 10)
for i := 0; i < len(tasks); i++ {
fileName := ""
@@ -92,6 +91,11 @@ func BuildDownloadingResponse(tasks []model.Download) Response {
tasks[i].StatusInfo.Files[i2].Path = path.Base(tasks[i].StatusInfo.Files[i2].Path)
}
interval := 10
if actualInterval, ok := intervals[tasks[i].ID]; ok {
interval = actualInterval
}
resp = append(resp, DownloadListResponse{
UpdateTime: tasks[i].UpdatedAt,
UpdateInterval: interval,

View File

@@ -82,10 +82,12 @@ func TestBuildDownloadingResponse(t *testing.T) {
},
}
tasks[1].StatusInfo.BitTorrent.Info.Name = "name.txt"
tasks[1].ID = 1
res := BuildDownloadingResponse(tasks).Data.([]DownloadListResponse)
res := BuildDownloadingResponse(tasks, map[uint]int{1: 5}).Data.([]DownloadListResponse)
asserts.Len(res, 2)
asserts.Equal("name1.txt", res[1].Name)
asserts.Equal(5, res[1].UpdateInterval)
asserts.Equal("name.txt", res[0].Name)
asserts.Equal("name.txt", res[0].Info.Files[0].Path)
asserts.Equal("name1.txt", res[1].Info.Files[0].Path)

View File

@@ -34,7 +34,16 @@ func (service *DownloadListService) Finished(c *gin.Context, user *model.User) s
func (service *DownloadListService) Downloading(c *gin.Context, user *model.User) serializer.Response {
// 查找下载记录
downloads := model.GetDownloadsByStatusAndUser(service.Page, user.ID, common.Downloading, common.Paused, common.Ready)
return serializer.BuildDownloadingResponse(downloads)
intervals := make(map[uint]int)
for _, download := range downloads {
if _, ok := intervals[download.ID]; !ok {
if node := cluster.Default.GetNodeByID(download.GetNodeID()); node != nil {
intervals[download.ID] = node.DBModel().Aria2OptionsSerialized.Interval
}
}
}
return serializer.BuildDownloadingResponse(downloads, intervals)
}
// Delete 取消或删除下载任务