Skip to content

Commit 43bcaa6

Browse files
authored
Merge pull request #8 from traPtitech/feat/s3
2 parents 4b955a8 + 1299702 commit 43bcaa6

File tree

6 files changed

+180
-76
lines changed

6 files changed

+180
-76
lines changed

docker-compose.yml

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,28 @@ services:
2020
interval: 10s
2121
timeout: 5s
2222
retries: 3
23+
s3:
24+
image: minio/minio
25+
restart: unless-stopped
26+
ports:
27+
- '9000:9000'
28+
- '9001:9001'
29+
environment:
30+
MINIO_ROOT_USER: admin
31+
MINIO_ROOT_PASSWORD: password
32+
MINIO_ACCESS_KEY: minio_access_key
33+
MINIO_SECRET_KEY: minio_secret_key
34+
volumes:
35+
- booq-s3:/data
36+
s3-init:
37+
image: minio/mc
38+
depends_on:
39+
- s3
40+
entrypoint: >
41+
/bin/sh -c "
42+
mc alias set s3-local http://s3:9000 admin password;
43+
mc mb s3-local/booq-v3;
44+
"
2345
booq-server:
2446
build: .
2547
environment:
@@ -28,12 +50,18 @@ services:
2850
MYSQL_USER: root
2951
MYSQL_PASSWORD: password
3052
MYSQL_DATABASE: booq-v3
31-
UPLOAD_DIR: /app/data
53+
S3_BUCKET: booq-v3
54+
S3_REGION: ap-northeast-1
55+
S3_ENDPOINT: http://s3:9000
56+
S3_ACCESS_KEY: minio_access_key
57+
S3_SECRET_KEY: minio_secret_key
3258
ports:
3359
- '8080:3001'
3460
depends_on:
3561
db:
3662
condition: service_healthy
63+
s3-init:
64+
condition: service_completed_successfully
3765
develop:
3866
watch:
3967
- path: ./Dockerfile
@@ -56,3 +84,4 @@ services:
5684

5785
volumes:
5886
booq-db:
87+
booq-s3:

go.mod

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,24 @@ require (
1818
github.com/ClickHouse/clickhouse-go/v2 v2.18.0 // indirect
1919
github.com/andybalholm/brotli v1.1.0 // indirect
2020
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
21+
github.com/aws/aws-sdk-go-v2 v1.32.6 // indirect
22+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 // indirect
23+
github.com/aws/aws-sdk-go-v2/config v1.28.6 // indirect
24+
github.com/aws/aws-sdk-go-v2/credentials v1.17.47 // indirect
25+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21 // indirect
26+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25 // indirect
27+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25 // indirect
28+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect
29+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.25 // indirect
30+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 // indirect
31+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.6 // indirect
32+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6 // indirect
33+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.6 // indirect
34+
github.com/aws/aws-sdk-go-v2/service/s3 v1.71.0 // indirect
35+
github.com/aws/aws-sdk-go-v2/service/sso v1.24.7 // indirect
36+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6 // indirect
37+
github.com/aws/aws-sdk-go-v2/service/sts v1.33.2 // indirect
38+
github.com/aws/smithy-go v1.22.1 // indirect
2139
github.com/davecgh/go-spew v1.1.1 // indirect
2240
github.com/go-faster/city v1.0.1 // indirect
2341
github.com/go-faster/errors v0.6.1 // indirect
@@ -26,6 +44,7 @@ require (
2644
github.com/google/uuid v1.6.0 // indirect
2745
github.com/jinzhu/inflection v1.0.0 // indirect
2846
github.com/jinzhu/now v1.1.5 // indirect
47+
github.com/jmespath/go-jmespath v0.4.0 // indirect
2948
github.com/klauspost/compress v1.16.7 // indirect
3049
github.com/mattn/go-colorable v0.1.13 // indirect
3150
github.com/mattn/go-isatty v0.0.20 // indirect

go.sum

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,42 @@ github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer5
77
github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg=
88
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
99
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
10+
github.com/aws/aws-sdk-go-v2 v1.32.6 h1:7BokKRgRPuGmKkFMhEg/jSul+tB9VvXhcViILtfG8b4=
11+
github.com/aws/aws-sdk-go-v2 v1.32.6/go.mod h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U=
12+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 h1:lL7IfaFzngfx0ZwUGOZdsFFnQ5uLvR0hWqqhyE7Q9M8=
13+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7/go.mod h1:QraP0UcVlQJsmHfioCrveWOC1nbiWUl3ej08h4mXWoc=
14+
github.com/aws/aws-sdk-go-v2/config v1.28.6 h1:D89IKtGrs/I3QXOLNTH93NJYtDhm8SYa9Q5CsPShmyo=
15+
github.com/aws/aws-sdk-go-v2/config v1.28.6/go.mod h1:GDzxJ5wyyFSCoLkS+UhGB0dArhb9mI+Co4dHtoTxbko=
16+
github.com/aws/aws-sdk-go-v2/credentials v1.17.47 h1:48bA+3/fCdi2yAwVt+3COvmatZ6jUDNkDTIsqDiMUdw=
17+
github.com/aws/aws-sdk-go-v2/credentials v1.17.47/go.mod h1:+KdckOejLW3Ks3b0E3b5rHsr2f9yuORBum0WPnE5o5w=
18+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21 h1:AmoU1pziydclFT/xRV+xXE/Vb8fttJCLRPv8oAkprc0=
19+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21/go.mod h1:AjUdLYe4Tgs6kpH4Bv7uMZo7pottoyHMn4eTcIcneaY=
20+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25 h1:s/fF4+yDQDoElYhfIVvSNyeCydfbuTKzhxSXDXCPasU=
21+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25/go.mod h1:IgPfDv5jqFIzQSNbUEMoitNooSMXjRSDkhXv8jiROvU=
22+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25 h1:ZntTCl5EsYnhN/IygQEUugpdwbhdkom9uHcbCftiGgA=
23+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25/go.mod h1:DBdPrgeocww+CSl1C8cEV8PN1mHMBhuCDLpXezyvWkE=
24+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ=
25+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc=
26+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.25 h1:r67ps7oHCYnflpgDy2LZU0MAQtQbYIOqNNnqGO6xQkE=
27+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.25/go.mod h1:GrGY+Q4fIokYLtjCVB/aFfCVL6hhGUFl8inD18fDalE=
28+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y=
29+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE=
30+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.6 h1:HCpPsWqmYQieU7SS6E9HXfdAMSud0pteVXieJmcpIRI=
31+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.6/go.mod h1:ngUiVRCco++u+soRRVBIvBZxSMMvOVMXA4PJ36JLfSw=
32+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6 h1:50+XsN70RS7dwJ2CkVNXzj7U2L1HKP8nqTd3XWEXBN4=
33+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6/go.mod h1:WqgLmwY7so32kG01zD8CPTJWVWM+TzJoOVHwTg4aPug=
34+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.6 h1:BbGDtTi0T1DYlmjBiCr/le3wzhA37O8QTC5/Ab8+EXk=
35+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.6/go.mod h1:hLMJt7Q8ePgViKupeymbqI0la+t9/iYFBjxQCFwuAwI=
36+
github.com/aws/aws-sdk-go-v2/service/s3 v1.71.0 h1:nyuzXooUNJexRT0Oy0UQY6AhOzxPxhtt4DcBIHyCnmw=
37+
github.com/aws/aws-sdk-go-v2/service/s3 v1.71.0/go.mod h1:sT/iQz8JK3u/5gZkT+Hmr7GzVZehUMkRZpOaAwYXeGY=
38+
github.com/aws/aws-sdk-go-v2/service/sso v1.24.7 h1:rLnYAfXQ3YAccocshIH5mzNNwZBkBo+bP6EhIxak6Hw=
39+
github.com/aws/aws-sdk-go-v2/service/sso v1.24.7/go.mod h1:ZHtuQJ6t9A/+YDuxOLnbryAmITtr8UysSny3qcyvJTc=
40+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6 h1:JnhTZR3PiYDNKlXy50/pNeix9aGMo6lLpXwJ1mw8MD4=
41+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6/go.mod h1:URronUEGfXZN1VpdktPSD1EkAL9mfrV+2F4sjH38qOY=
42+
github.com/aws/aws-sdk-go-v2/service/sts v1.33.2 h1:s4074ZO1Hk8qv65GqNXqDjmkf4HSQqJukaLuuW0TpDA=
43+
github.com/aws/aws-sdk-go-v2/service/sts v1.33.2/go.mod h1:mVggCnIWoM09jP71Wh+ea7+5gAp53q+49wDFs1SW5z8=
44+
github.com/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro=
45+
github.com/aws/smithy-go v1.22.1/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
1046
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
1147
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
1248
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -58,6 +94,9 @@ github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD
5894
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
5995
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
6096
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
97+
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
98+
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
99+
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
61100
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
62101
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
63102
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
@@ -176,6 +215,7 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8
176215
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
177216
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
178217
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
218+
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
179219
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
180220
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
181221
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

main.go

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,14 @@ func main() {
4040
}
4141

4242
func setStorage() {
43-
if os.Getenv("OS_CONTAINER") != "" {
44-
// Swiftオブジェクトストレージ
45-
err := storage.SetSwiftStorage(
46-
os.Getenv("OS_CONTAINER"),
47-
os.Getenv("OS_USERNAME"),
48-
os.Getenv("OS_PASSWORD"),
49-
os.Getenv("OS_TENANT_NAME"),
50-
os.Getenv("OS_TENANT_ID"),
51-
os.Getenv("OS_AUTH_URL"),
43+
if os.Getenv("S3_BUCKET") != "" {
44+
// S3
45+
err := storage.SetS3Storage(
46+
os.Getenv("S3_BUCKET"),
47+
os.Getenv("S3_REGION"),
48+
os.Getenv("S3_ENDPOINT"),
49+
os.Getenv("S3_ACCESS_KEY"),
50+
os.Getenv("S3_SECRET_KEY"),
5251
)
5352
if err != nil {
5453
log.Fatal(err)

storage/s3.go

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package storage
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"io"
7+
8+
"github.com/aws/aws-sdk-go-v2/aws"
9+
"github.com/aws/aws-sdk-go-v2/config"
10+
"github.com/aws/aws-sdk-go-v2/credentials"
11+
"github.com/aws/aws-sdk-go-v2/service/s3"
12+
)
13+
14+
type S3Storage struct {
15+
bucket string
16+
client *s3.Client
17+
}
18+
19+
// S3 (互換) オブジェクトストレージをカレントストレージに設定する
20+
func SetS3Storage(bucket, region, endpoint, apiKey, apiSecret string) error {
21+
cfg, err := config.LoadDefaultConfig(context.Background(),
22+
config.WithRegion(region),
23+
config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(apiKey, apiSecret, "")),
24+
)
25+
if err != nil {
26+
return fmt.Errorf("failed to load configuration: %w", err)
27+
}
28+
29+
client := s3.NewFromConfig(cfg, func(o *s3.Options) {
30+
o.UsePathStyle = true
31+
o.BaseEndpoint = &endpoint
32+
})
33+
34+
current = &S3Storage{
35+
bucket: bucket,
36+
client: client,
37+
}
38+
39+
return nil
40+
}
41+
42+
func (s *S3Storage) Save(filename string, src io.Reader) error {
43+
input := &s3.PutObjectInput{
44+
Bucket: aws.String(s.bucket),
45+
Key: aws.String(filename),
46+
Body: src,
47+
}
48+
49+
_, err := s.client.PutObject(context.Background(), input)
50+
if err != nil {
51+
return fmt.Errorf("failed to put object: %w", err)
52+
}
53+
54+
return nil
55+
}
56+
57+
func (s *S3Storage) Open(filename string) (io.ReadCloser, error) {
58+
input := &s3.GetObjectInput{
59+
Bucket: aws.String(s.bucket),
60+
Key: aws.String(filename),
61+
}
62+
63+
output, err := s.client.GetObject(context.Background(), input)
64+
if err != nil {
65+
return nil, fmt.Errorf("failed to get object: %w", err)
66+
}
67+
68+
return output.Body, nil
69+
}
70+
71+
func (s *S3Storage) Delete(filename string) error {
72+
input := &s3.DeleteObjectInput{
73+
Bucket: aws.String(s.bucket),
74+
Key: aws.String(filename),
75+
}
76+
77+
_, err := s.client.DeleteObject(context.Background(), input)
78+
if err != nil {
79+
return fmt.Errorf("failed to delete object: %w", err)
80+
}
81+
82+
return nil
83+
}

storage/swift.go

Lines changed: 0 additions & 66 deletions
This file was deleted.

0 commit comments

Comments
 (0)