nump commited on
Commit
20d9d4f
1 Parent(s): 210735e

Upload 4 files

Browse files
Files changed (3) hide show
  1. Dockerfile +15 -15
  2. migration.go +218 -0
  3. start.sh +1 -1
Dockerfile CHANGED
@@ -1,35 +1,35 @@
1
  # 使用基础镜像
2
- FROM debian:latest
3
 
4
  # 安装必要的工具
5
  RUN apt-get update && apt-get install -y \
6
  wget \
7
- tar
8
- RUN apt-get update && apt-get install -y aria2
 
 
 
 
9
  # 设置工作目录
10
  WORKDIR /app
11
 
12
- # 下载并解压Cloudreve
13
- RUN wget https://github.com/cloudreve/Cloudreve/releases/download/3.8.3/cloudreve_3.8.3_linux_amd64.tar.gz \
14
- && tar -zxvf cloudreve_3.8.3_linux_amd64.tar.gz \
15
- && rm cloudreve_3.8.3_linux_amd64.tar.gz
16
 
17
  # 更改 /app 目录的权限
18
- RUN chmod 777 /app
19
- COPY conf.ini /app/conf.ini
20
- COPY aria2.conf /app/aria2.conf
21
  # 赋予执行权限
22
  RUN chmod +x ./cloudreve
23
- # 创建 /aria2/data 目录
24
  RUN mkdir -p /aria2/data
25
 
26
- # 更改 /aria2/data 目录的权限
27
  RUN chmod 777 /aria2/data
28
- # 暴露端口
29
  EXPOSE 7860
30
 
31
- # # 启动 Cloudreve
32
- # CMD ["./cloudreve","-c","/app/conf.ini"]
33
  COPY start.sh /app/start.sh
34
  RUN chmod +x /app/start.sh
35
  CMD ["/app/start.sh"]
 
1
  # 使用基础镜像
2
+ FROM golang:1.18
3
 
4
  # 安装必要的工具
5
  RUN apt-get update && apt-get install -y \
6
  wget \
7
+ tar \
8
+ git
9
+ RUN apt-get update && apt-get install -y aria2 \
10
+ && git clone https://github.com/cloudreve/Cloudreve.git /app
11
+ COPY aria2.conf /app/aria2.conf
12
+ COPY migration.go /app/models/migration.go
13
  # 设置工作目录
14
  WORKDIR /app
15
 
16
+
 
 
 
17
 
18
  # 更改 /app 目录的权限
19
+ RUN chmod 777 /app && go mod tidy && go build -o cloudreve
20
+
21
+
22
  # 赋予执行权限
23
  RUN chmod +x ./cloudreve
24
+
25
  RUN mkdir -p /aria2/data
26
 
27
+
28
  RUN chmod 777 /aria2/data
29
+
30
  EXPOSE 7860
31
 
32
+
 
33
  COPY start.sh /app/start.sh
34
  RUN chmod +x /app/start.sh
35
  CMD ["/app/start.sh"]
migration.go ADDED
@@ -0,0 +1,218 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ package model
2
+
3
+ import (
4
+ "context"
5
+ "github.com/cloudreve/Cloudreve/v3/models/scripts/invoker"
6
+ "github.com/cloudreve/Cloudreve/v3/pkg/cache"
7
+ "github.com/cloudreve/Cloudreve/v3/pkg/conf"
8
+ "github.com/cloudreve/Cloudreve/v3/pkg/util"
9
+ "github.com/fatih/color"
10
+ "github.com/hashicorp/go-version"
11
+ "github.com/jinzhu/gorm"
12
+ "sort"
13
+ "strings"
14
+ )
15
+
16
+ // 是否需要迁移
17
+ func needMigration() bool {
18
+ var setting Setting
19
+ return DB.Where("name = ?", "db_version_"+conf.RequiredDBVersion).First(&setting).Error != nil
20
+ }
21
+
22
+ // 执行数据迁移
23
+ func migration() {
24
+ // 确认是否需要执行迁移
25
+ if !needMigration() {
26
+ util.Log().Info("Database version fulfilled, skip schema migration.")
27
+ return
28
+
29
+ }
30
+
31
+ util.Log().Info("Start initializing database schema...")
32
+
33
+ // 清除所有缓存
34
+ if instance, ok := cache.Store.(*cache.RedisStore); ok {
35
+ instance.DeleteAll()
36
+ }
37
+
38
+ // 自动迁移模式
39
+ if conf.DatabaseConfig.Type == "mysql" {
40
+ DB = DB.Set("gorm:table_options", "ENGINE=InnoDB")
41
+ }
42
+
43
+ DB.AutoMigrate(&User{}, &Setting{}, &Group{}, &Policy{}, &Folder{}, &File{}, &Share{},
44
+ &Task{}, &Download{}, &Tag{}, &Webdav{}, &Node{}, &SourceLink{})
45
+
46
+ // 创建初始存储策略
47
+ addDefaultPolicy()
48
+
49
+ // 创建初始用户组
50
+ addDefaultGroups()
51
+
52
+ // 创建初始管理员账户
53
+ addDefaultUser()
54
+
55
+ // 创建初始节点
56
+ addDefaultNode()
57
+
58
+ // 向设置数据表添加初始设置
59
+ addDefaultSettings()
60
+
61
+ // 执行数据库升级脚本
62
+ execUpgradeScripts()
63
+
64
+ util.Log().Info("Finish initializing database schema.")
65
+
66
+ }
67
+
68
+ func addDefaultPolicy() {
69
+ _, err := GetPolicyByID(uint(1))
70
+ // 未找到初始存储策略时,则创建
71
+ if gorm.IsRecordNotFoundError(err) {
72
+ defaultPolicy := Policy{
73
+ Name: "Default storage policy",
74
+ Type: "local",
75
+ MaxSize: 0,
76
+ AutoRename: true,
77
+ DirNameRule: "uploads/{uid}/{path}",
78
+ FileNameRule: "{uid}_{randomkey8}_{originname}",
79
+ IsOriginLinkEnable: false,
80
+ OptionsSerialized: PolicyOption{
81
+ ChunkSize: 25 << 20, // 25MB
82
+ },
83
+ }
84
+ if err := DB.Create(&defaultPolicy).Error; err != nil {
85
+ util.Log().Panic("Failed to create default storage policy: %s", err)
86
+ }
87
+ }
88
+ }
89
+
90
+ func addDefaultSettings() {
91
+ for _, value := range defaultSettings {
92
+ DB.Where(Setting{Name: value.Name}).Create(&value)
93
+ }
94
+ }
95
+
96
+ func addDefaultGroups() {
97
+ _, err := GetGroupByID(1)
98
+ // 未找到初始管理组时,则创建
99
+ if gorm.IsRecordNotFoundError(err) {
100
+ defaultAdminGroup := Group{
101
+ Name: "Admin",
102
+ PolicyList: []uint{1},
103
+ MaxStorage: 1 * 1024 * 1024 * 1024,
104
+ ShareEnabled: true,
105
+ WebDAVEnabled: true,
106
+ OptionsSerialized: GroupOption{
107
+ ArchiveDownload: true,
108
+ ArchiveTask: true,
109
+ ShareDownload: true,
110
+ Aria2: true,
111
+ SourceBatchSize: 1000,
112
+ Aria2BatchSize: 50,
113
+ RedirectedSource: true,
114
+ AdvanceDelete: true,
115
+ },
116
+ }
117
+ if err := DB.Create(&defaultAdminGroup).Error; err != nil {
118
+ util.Log().Panic("Failed to create admin user group: %s", err)
119
+ }
120
+ }
121
+
122
+ err = nil
123
+ _, err = GetGroupByID(2)
124
+ // 未找到初始注册会员时,则创建
125
+ if gorm.IsRecordNotFoundError(err) {
126
+ defaultAdminGroup := Group{
127
+ Name: "User",
128
+ PolicyList: []uint{1},
129
+ MaxStorage: 1 * 1024 * 1024 * 1024,
130
+ ShareEnabled: true,
131
+ WebDAVEnabled: true,
132
+ OptionsSerialized: GroupOption{
133
+ ShareDownload: true,
134
+ SourceBatchSize: 10,
135
+ Aria2BatchSize: 1,
136
+ RedirectedSource: true,
137
+ },
138
+ }
139
+ if err := DB.Create(&defaultAdminGroup).Error; err != nil {
140
+ util.Log().Panic("Failed to create initial user group: %s", err)
141
+ }
142
+ }
143
+
144
+ err = nil
145
+ _, err = GetGroupByID(3)
146
+ // 未找到初始游客用户组时,则创建
147
+ if gorm.IsRecordNotFoundError(err) {
148
+ defaultAdminGroup := Group{
149
+ Name: "Anonymous",
150
+ PolicyList: []uint{},
151
+ Policies: "[]",
152
+ OptionsSerialized: GroupOption{
153
+ ShareDownload: true,
154
+ },
155
+ }
156
+ if err := DB.Create(&defaultAdminGroup).Error; err != nil {
157
+ util.Log().Panic("Failed to create anonymous user group: %s", err)
158
+ }
159
+ }
160
+ }
161
+
162
+ func addDefaultUser() {
163
+ _, err := GetUserByID(1)
164
+ password := util.RandStringRunes(8)
165
+
166
+ // 未找到初始用户时,则创建
167
+ if gorm.IsRecordNotFoundError(err) {
168
+ defaultUser := NewUser()
169
+ defaultUser.Email = "[email protected]"
170
+ defaultUser.Nick = "admin"
171
+ defaultUser.Status = Active
172
+ defaultUser.GroupID = 1
173
+ err := defaultUser.SetPassword(password)
174
+ if err != nil {
175
+ util.Log().Panic("Failed to create password: %s", err)
176
+ }
177
+ if err := DB.Create(&defaultUser).Error; err != nil {
178
+ util.Log().Panic("Failed to create initial root user: %s", err)
179
+ }
180
+
181
+ c := color.New(color.FgWhite).Add(color.BgBlack).Add(color.Bold)
182
+ util.Log().Info("Admin user name: " + c.Sprint("[email protected]"))
183
+ util.Log().Info("Admin password: " + c.Sprint(password))
184
+ }
185
+ }
186
+
187
+ func addDefaultNode() {
188
+ _, err := GetNodeByID(1)
189
+
190
+ if gorm.IsRecordNotFoundError(err) {
191
+ defaultAdminGroup := Node{
192
+ Name: "Master (Local machine)",
193
+ Status: NodeActive,
194
+ Type: MasterNodeType,
195
+ Aria2OptionsSerialized: Aria2Option{
196
+ Interval: 10,
197
+ Timeout: 10,
198
+ },
199
+ }
200
+ if err := DB.Create(&defaultAdminGroup).Error; err != nil {
201
+ util.Log().Panic("Failed to create initial node: %s", err)
202
+ }
203
+ }
204
+ }
205
+
206
+ func execUpgradeScripts() {
207
+ s := invoker.ListPrefix("UpgradeTo")
208
+ versions := make([]*version.Version, len(s))
209
+ for i, raw := range s {
210
+ v, _ := version.NewVersion(strings.TrimPrefix(raw, "UpgradeTo"))
211
+ versions[i] = v
212
+ }
213
+ sort.Sort(version.Collection(versions))
214
+
215
+ for i := 0; i < len(versions); i++ {
216
+ invoker.RunDBScript("UpgradeTo"+versions[i].String(), context.Background())
217
+ }
218
+ }
start.sh CHANGED
@@ -2,4 +2,4 @@
2
  # 启动 aria2
3
  aria2c --conf-path=/app/aria2.conf &
4
  # 启动 Cloudreve
5
- ./cloudreve -c /app/conf.ini
 
2
  # 启动 aria2
3
  aria2c --conf-path=/app/aria2.conf &
4
  # 启动 Cloudreve
5
+ ./cloudreve