Skip to content

Commit 376968a

Browse files
committed
Use S3 for content and images
1 parent 5b03d11 commit 376968a

11 files changed

Lines changed: 135 additions & 66 deletions

File tree

.env

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
AWS_ACCESS_KEY_ID=
2+
AWS_SECRET_ACCESS_KEY=
3+
AWS_REGION=
4+
AWS_ENDPOINT_URL_S3=

api/content/fastdl.go

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,20 +31,14 @@ func FastDL(w http.ResponseWriter, r *http.Request) {
3131
return
3232
}
3333

34-
f, err := utils.GetContentFile(id)
34+
f, err := db.GetContentFile(id)
3535
if err != nil {
3636
utils.WriteError(w, r, fmt.Sprintf("failed to open content file: %s", err))
3737
return
3838
}
3939

40-
defer f.Close()
40+
defer f.Body.Close()
4141

42-
stat, err := f.Stat()
43-
if err != nil {
44-
utils.WriteError(w, r, fmt.Sprintf("failed to stat content file: %s", err))
45-
return
46-
}
47-
48-
w.Header().Set("Content-Length", strconv.Itoa(int(stat.Size())))
49-
io.Copy(w, f)
42+
w.Header().Set("Content-Length", strconv.Itoa(int(*f.ContentLength)))
43+
io.Copy(w, f.Body)
5044
}

api/content/get.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"net/http"
2525
"strconv"
2626

27+
"github.com/flatgrassdotnet/cloudbox/db"
2728
"github.com/flatgrassdotnet/cloudbox/utils"
2829
)
2930

@@ -34,13 +35,14 @@ func Get(w http.ResponseWriter, r *http.Request) {
3435
return
3536
}
3637

37-
f, err := utils.GetContentFile(id)
38+
o, err := db.GetContentFile(id)
3839
if err != nil {
3940
utils.WriteError(w, r, fmt.Sprintf("failed to open content file for reading: %s", err))
4041
return
4142
}
4243

43-
defer f.Close()
44+
defer o.Body.Close()
4445

45-
io.Copy(w, f)
46+
w.Header().Set("Content-Length", strconv.Itoa(int(*o.ContentLength)))
47+
io.Copy(w, o.Body)
4648
}

api/content/getzip.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"net/http"
99
"strconv"
1010

11+
"github.com/flatgrassdotnet/cloudbox/db"
1112
"github.com/flatgrassdotnet/cloudbox/utils"
1213
)
1314

@@ -18,13 +19,13 @@ func GetZIP(w http.ResponseWriter, r *http.Request) {
1819
return
1920
}
2021

21-
f, err := utils.GetContentFile(id)
22+
o, err := db.GetContentFile(id)
2223
if err != nil {
2324
utils.WriteError(w, r, fmt.Sprintf("failed to open content file for reading: %s", err))
2425
return
2526
}
2627

27-
defer f.Close()
28+
defer o.Body.Close()
2829

2930
// GM12 won't show download progress without Content-Length
3031
buf := new(bytes.Buffer)
@@ -37,7 +38,7 @@ func GetZIP(w http.ResponseWriter, r *http.Request) {
3738
return
3839
}
3940

40-
io.Copy(file, f)
41+
io.Copy(file, o.Body)
4142

4243
zw.Close()
4344

api/packages/getgma.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -153,15 +153,15 @@ func GetGMA(w http.ResponseWriter, r *http.Request) {
153153

154154
// file content
155155
for _, item := range content {
156-
f, err := utils.GetContentFile(item.ID)
156+
o, err := db.GetContentFile(item.ID)
157157
if err != nil {
158158
utils.WriteError(w, r, fmt.Sprintf("failed to get content file data: %s", err))
159159
return
160160
}
161161

162-
defer f.Close()
162+
defer o.Body.Close()
163163

164-
io.Copy(w, f)
164+
io.Copy(w, o.Body)
165165
}
166166

167167
// content crc (skipped)

db/init.go

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,19 @@
1919
package db
2020

2121
import (
22+
"context"
2223
"database/sql"
2324
"fmt"
2425

26+
"github.com/aws/aws-sdk-go-v2/config"
27+
"github.com/aws/aws-sdk-go-v2/service/s3"
2528
_ "github.com/go-sql-driver/mysql"
2629
)
2730

28-
var handle *sql.DB
31+
var (
32+
handle *sql.DB
33+
s3client *s3.Client
34+
)
2935

3036
func Init(username string, password string, address string, database string) error {
3137
db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s)/%s?parseTime=true", username, password, address, database))
@@ -35,5 +41,12 @@ func Init(username string, password string, address string, database string) err
3541

3642
handle = db
3743

44+
cfg, err := config.LoadDefaultConfig(context.TODO())
45+
if err != nil {
46+
return err
47+
}
48+
49+
s3client = s3.NewFromConfig(cfg)
50+
3851
return nil
3952
}

db/s3.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package db
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"io"
7+
"strconv"
8+
9+
"github.com/aws/aws-sdk-go-v2/aws"
10+
"github.com/aws/aws-sdk-go-v2/service/s3"
11+
"github.com/aws/aws-sdk-go-v2/service/s3/types"
12+
)
13+
14+
func GetContentFile(id int) (*s3.GetObjectOutput, error) {
15+
o, err := s3client.GetObject(context.TODO(), &s3.GetObjectInput{
16+
Bucket: aws.String("flatgrass-toybox-content"),
17+
Key: aws.String(strconv.Itoa(id)),
18+
})
19+
if err != nil {
20+
return nil, err
21+
}
22+
23+
return o, nil
24+
}
25+
26+
func PutThumbnail(id int, data io.Reader) error {
27+
_, err := s3client.PutObject(context.TODO(), &s3.PutObjectInput{
28+
Bucket: aws.String("flatgrass-toybox-image"),
29+
Key: aws.String(fmt.Sprintf("%d_thumb_128", id)),
30+
ACL: types.ObjectCannedACLPublicRead,
31+
Body: data,
32+
})
33+
if err != nil {
34+
return err
35+
}
36+
37+
return nil
38+
}

go.mod

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,31 @@
11
module github.com/flatgrassdotnet/cloudbox
22

3-
go 1.23
3+
go 1.24.0
44

55
require (
6+
github.com/aws/aws-sdk-go-v2/config v1.29.9
7+
github.com/aws/aws-sdk-go-v2/service/s3 v1.78.2
68
github.com/blezek/tga v0.0.0-20150626111426-80720cbc1017
79
github.com/go-sql-driver/mysql v1.8.1
810
)
911

1012
require (
1113
filippo.io/edwards25519 v1.1.0 // indirect
14+
github.com/aws/aws-sdk-go-v2 v1.36.3 // indirect
15+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10 // indirect
16+
github.com/aws/aws-sdk-go-v2/credentials v1.17.62 // indirect
17+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 // indirect
18+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 // indirect
19+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 // indirect
20+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect
21+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34 // indirect
22+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 // indirect
23+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.0 // indirect
24+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 // indirect
25+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.15 // indirect
26+
github.com/aws/aws-sdk-go-v2/service/sso v1.25.1 // indirect
27+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.29.1 // indirect
28+
github.com/aws/aws-sdk-go-v2/service/sts v1.33.17 // indirect
29+
github.com/aws/smithy-go v1.22.2 // indirect
1230
github.com/ftrvxmtrx/tga v0.0.0-20150524081124-bd8e8d5be13a // indirect
1331
)

go.sum

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,41 @@
11
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
22
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
3+
github.com/aws/aws-sdk-go-v2 v1.36.3 h1:mJoei2CxPutQVxaATCzDUjcZEjVRdpsiiXi2o38yqWM=
4+
github.com/aws/aws-sdk-go-v2 v1.36.3/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg=
5+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10 h1:zAybnyUQXIZ5mok5Jqwlf58/TFE7uvd3IAsa1aF9cXs=
6+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10/go.mod h1:qqvMj6gHLR/EXWZw4ZbqlPbQUyenf4h82UQUlKc+l14=
7+
github.com/aws/aws-sdk-go-v2/config v1.29.9 h1:Kg+fAYNaJeGXp1vmjtidss8O2uXIsXwaRqsQJKXVr+0=
8+
github.com/aws/aws-sdk-go-v2/config v1.29.9/go.mod h1:oU3jj2O53kgOU4TXq/yipt6ryiooYjlkqqVaZk7gY/U=
9+
github.com/aws/aws-sdk-go-v2/credentials v1.17.62 h1:fvtQY3zFzYJ9CfixuAQ96IxDrBajbBWGqjNTCa79ocU=
10+
github.com/aws/aws-sdk-go-v2/credentials v1.17.62/go.mod h1:ElETBxIQqcxej++Cs8GyPBbgMys5DgQPTwo7cUPDKt8=
11+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 h1:x793wxmUWVDhshP8WW2mlnXuFrO4cOd3HLBroh1paFw=
12+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30/go.mod h1:Jpne2tDnYiFascUEs2AWHJL9Yp7A5ZVy3TNyxaAjD6M=
13+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 h1:ZK5jHhnrioRkUNOc+hOgQKlUL5JeC3S6JgLxtQ+Rm0Q=
14+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34/go.mod h1:p4VfIceZokChbA9FzMbRGz5OV+lekcVtHlPKEO0gSZY=
15+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 h1:SZwFm17ZUNNg5Np0ioo/gq8Mn6u9w19Mri8DnJ15Jf0=
16+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34/go.mod h1:dFZsC0BLo346mvKQLWmoJxT+Sjp+qcVR1tRVHQGOH9Q=
17+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo=
18+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo=
19+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34 h1:ZNTqv4nIdE/DiBfUUfXcLZ/Spcuz+RjeziUtNJackkM=
20+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34/go.mod h1:zf7Vcd1ViW7cPqYWEHLHJkS50X0JS2IKz9Cgaj6ugrs=
21+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 h1:eAh2A4b5IzM/lum78bZ590jy36+d/aFLgKF/4Vd1xPE=
22+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3/go.mod h1:0yKJC/kb8sAnmlYa6Zs3QVYqaC8ug2AbnNChv5Ox3uA=
23+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.0 h1:lguz0bmOoGzozP9XfRJR1QIayEYo+2vP/No3OfLF0pU=
24+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.0/go.mod h1:iu6FSzgt+M2/x3Dk8zhycdIcHjEFb36IS8HVUVFoMg0=
25+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 h1:dM9/92u2F1JbDaGooxTq18wmmFzbJRfXfVfy96/1CXM=
26+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15/go.mod h1:SwFBy2vjtA0vZbjjaFtfN045boopadnoVPhu4Fv66vY=
27+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.15 h1:moLQUoVq91LiqT1nbvzDukyqAlCv89ZmwaHw/ZFlFZg=
28+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.15/go.mod h1:ZH34PJUc8ApjBIfgQCFvkWcUDBtl/WTD+uiYHjd8igA=
29+
github.com/aws/aws-sdk-go-v2/service/s3 v1.78.2 h1:jIiopHEV22b4yQP2q36Y0OmwLbsxNWdWwfZRR5QRRO4=
30+
github.com/aws/aws-sdk-go-v2/service/s3 v1.78.2/go.mod h1:U5SNqwhXB3Xe6F47kXvWihPl/ilGaEDe8HD/50Z9wxc=
31+
github.com/aws/aws-sdk-go-v2/service/sso v1.25.1 h1:8JdC7Gr9NROg1Rusk25IcZeTO59zLxsKgE0gkh5O6h0=
32+
github.com/aws/aws-sdk-go-v2/service/sso v1.25.1/go.mod h1:qs4a9T5EMLl/Cajiw2TcbNt2UNo/Hqlyp+GiuG4CFDI=
33+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.29.1 h1:KwuLovgQPcdjNMfFt9OhUd9a2OwcOKhxfvF4glTzLuA=
34+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.29.1/go.mod h1:MlYRNmYu/fGPoxBQVvBYr9nyr948aY/WLUvwBMBJubs=
35+
github.com/aws/aws-sdk-go-v2/service/sts v1.33.17 h1:PZV5W8yk4OtH1JAuhV2PXwwO9v5G5Aoj+eMCn4T+1Kc=
36+
github.com/aws/aws-sdk-go-v2/service/sts v1.33.17/go.mod h1:cQnB8CUnxbMU82JvlqjKR2HBOm3fe9pWorWBza6MBJ4=
37+
github.com/aws/smithy-go v1.22.2 h1:6D9hW43xKFrRx/tXXfAlIZc4JI+yQe6snnWcQyxSyLQ=
38+
github.com/aws/smithy-go v1.22.2/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
339
github.com/blezek/tga v0.0.0-20150626111426-80720cbc1017 h1:TWk6m6k3qegbUZsdsHk/ix22ANqPgLau40bPwiNQN40=
440
github.com/blezek/tga v0.0.0-20150626111426-80720cbc1017/go.mod h1:WnX8JiQN+UtyUPq/1EIUaB2WVX3wdAmOBH5K52NyOO0=
541
github.com/ftrvxmtrx/tga v0.0.0-20150524081124-bd8e8d5be13a h1:eSqaRmdlZ9JsJ7JuWfDr3ym3monToXRczohBOL+heVQ=

ingame/publishsave/publish.go

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@ import (
2626
"html/template"
2727
"image/png"
2828
"net/http"
29-
"os"
30-
"path/filepath"
3129
"strconv"
3230

3331
"github.com/blezek/tga"
@@ -121,14 +119,8 @@ func Publish(w http.ResponseWriter, r *http.Request) {
121119
return
122120
}
123121

124-
f, err := os.OpenFile(filepath.Join("data", "img", strconv.Itoa(pkgID)+"_thumb_128.png"), os.O_CREATE|os.O_TRUNC|os.O_RDWR, 0644)
125-
if err != nil {
126-
utils.WriteError(w, r, fmt.Sprintf("failed to open thumbnail for writing: %s", err))
127-
}
128-
129-
defer f.Close()
130-
131-
err = png.Encode(f, img)
122+
buf := new(bytes.Buffer)
123+
err = png.Encode(buf, img)
132124
if err != nil {
133125
utils.WriteError(w, r, fmt.Sprintf("failed to encode thumbnail png: %s", err))
134126
return
@@ -140,6 +132,12 @@ func Publish(w http.ResponseWriter, r *http.Request) {
140132
return
141133
}
142134

135+
err = db.PutThumbnail(id, buf)
136+
if err != nil {
137+
utils.WriteError(w, r, fmt.Sprintf("failed to upload thumbnail: %s", err))
138+
return
139+
}
140+
143141
err = tp.Execute(w, nil)
144142
if err != nil {
145143
utils.WriteError(w, r, fmt.Sprintf("failed to execute template: %s", err))

0 commit comments

Comments
 (0)