mirror of
https://github.com/cloudreve/cloudreve.git
synced 2026-03-04 20:07:02 +00:00
Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c31c77a089 | ||
|
|
6b15cae0b5 | ||
|
|
84d81f201f | ||
|
|
af4d9767c2 | ||
|
|
45597adcd3 | ||
|
|
762f0f9c68 | ||
|
|
c5074df1c7 |
10
Dockerfile
10
Dockerfile
@@ -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"]
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
|
||||
* :cloud: 支持本机、从机、七牛、阿里云 OSS、腾讯云 COS、又拍云、OneDrive (包括世纪互联版) 作为存储端
|
||||
* :outbox_tray: 上传/下载 支持客户端直传,支持下载限速
|
||||
* 💾 可对接 Aria2 离线下载
|
||||
* 💾 可对接 Aria2 离线下载,可使用多个从机机点分担下载任务
|
||||
* 📚 在线 压缩/解压缩、多文件打包下载
|
||||
* 💻 覆盖全部存储策略的 WebDAV 协议支持
|
||||
* :zap: 拖拽上传、目录上传、流式上传处理
|
||||
|
||||
2
assets
2
assets
Submodule assets updated: 691e82868d...88c1133306
@@ -15,7 +15,7 @@ func InitApplication() {
|
||||
fmt.Print(`
|
||||
___ _ _
|
||||
/ __\ | ___ _ _ __| |_ __ _____ _____
|
||||
/ / | |/ _ \| | | |/ _ | '__/ _ \ \ / / _ \
|
||||
/ / | |/ _ \| | | |/ _ | '__/ _ \ \ / / _ \
|
||||
/ /___| | (_) | |_| | (_| | | | __/\ V / __/
|
||||
\____/|_|\___/ \__,_|\__,_|_| \___| \_/ \___|
|
||||
|
||||
|
||||
15
docker-bootstrap.sh
Normal file
15
docker-bootstrap.sh
Normal 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
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 取消或删除下载任务
|
||||
|
||||
Reference in New Issue
Block a user