Skip to content

Commit 35720c2

Browse files
feat(jobs): add database backup example
1 parent 87c9569 commit 35720c2

File tree

4 files changed

+160
-0
lines changed

4 files changed

+160
-0
lines changed

jobs/databases-backup/Dockerfile

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
FROM golang:1.23-alpine
2+
3+
# Set destination for COPY
4+
WORKDIR /app
5+
6+
COPY go.mod ./
7+
COPY go.sum ./
8+
COPY *.go ./
9+
10+
# Build
11+
RUN go build -o /server-image
12+
13+
# Run
14+
CMD [ "/server-image" ]

jobs/databases-backup/go.mod

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module gitlab.infra.online.net/ttacquet/jobs-demo
2+
3+
go 1.23
4+
5+
require github.com/scaleway/scaleway-sdk-go v1.0.0-beta.30
6+
7+
require gopkg.in/yaml.v2 v2.4.0 // indirect

jobs/databases-backup/go.sum

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.30 h1:yoKAVkEVwAqbGbR8n87rHQ1dulL25rKloGadb3vm770=
2+
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.30/go.mod h1:sH0u6fq6x4R5M7WxkoQFY/o7UaiItec0o1LinLCJNq8=
3+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
4+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
5+
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
6+
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=

jobs/databases-backup/main.go

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"strconv"
7+
"time"
8+
9+
"github.com/scaleway/scaleway-sdk-go/api/rdb/v1"
10+
"github.com/scaleway/scaleway-sdk-go/scw"
11+
)
12+
13+
const (
14+
// Defining variable or secret readings.
15+
VAR_ORG_ID = "SCW_DEFAULT_ORGANIZATION_ID"
16+
VAR_AK = "SCW_ACCESS_KEY"
17+
VAR_SK = "SCW_SECRET_KEY"
18+
VAR_REGION = "REGION"
19+
VAR_RDB_ID = "INSTANCE_ID"
20+
21+
// optional, never expires if not definied.
22+
VAR_EXPIRE_AT_DAYS = "EXPIRE_AT_DAYS"
23+
)
24+
25+
func main() {
26+
fmt.Println("creating backup of managed database...")
27+
28+
// Create a Scaleway client with credentials from environment variables.
29+
client, err := scw.NewClient(
30+
// Get your organization ID at https://console.scaleway.com/organization/settings
31+
scw.WithDefaultOrganizationID(os.Getenv(VAR_ORG_ID)),
32+
33+
// Get your credentials at https://console.scaleway.com/iam/api-keys
34+
scw.WithAuth(os.Getenv(VAR_AK), os.Getenv(VAR_SK)),
35+
36+
// Get more about our availability zones at https://www.scaleway.com/en/docs/console/my-account/reference-content/products-availability/
37+
scw.WithDefaultRegion(scw.RegionFrPar),
38+
)
39+
if err != nil {
40+
panic(err)
41+
}
42+
43+
rdbAPI := rdb.NewAPI(client)
44+
45+
if err := createRdbSnapshot(rdbAPI); err != nil {
46+
panic(err)
47+
}
48+
}
49+
50+
func createRdbSnapshot(rdbAPI *rdb.API) error {
51+
rdbInstance, err := rdbAPI.GetInstance(&rdb.GetInstanceRequest{
52+
Region: scw.Region(os.Getenv(VAR_REGION)),
53+
InstanceID: os.Getenv(VAR_RDB_ID),
54+
})
55+
if err != nil {
56+
return fmt.Errorf("error while getting database instance %w", err)
57+
}
58+
59+
databasesList, err := rdbAPI.ListDatabases(&rdb.ListDatabasesRequest{
60+
Region: scw.Region(os.Getenv(VAR_REGION)),
61+
InstanceID: rdbInstance.ID,
62+
})
63+
if err != nil {
64+
return fmt.Errorf("error while listing databases %w", err)
65+
}
66+
67+
expiresAt, err := getExpirationDate()
68+
if err != nil {
69+
return fmt.Errorf("error while getting expiration date %w", err)
70+
}
71+
72+
tn := time.Now()
73+
backupName := fmt.Sprintf("backup_%s_%d%d%d", rdbInstance.Name, tn.Year(), tn.Month(), tn.Day())
74+
75+
for _, database := range databasesList.Databases {
76+
77+
backup, err := rdbAPI.CreateDatabaseBackup(&rdb.CreateDatabaseBackupRequest{
78+
Region: scw.Region(os.Getenv(VAR_REGION)),
79+
InstanceID: rdbInstance.ID,
80+
Name: backupName,
81+
DatabaseName: database.Name,
82+
ExpiresAt: expiresAt,
83+
})
84+
if err != nil {
85+
return fmt.Errorf("error while creating database backup request %w", err)
86+
}
87+
88+
fmt.Println("Created backup ", backup.Name)
89+
}
90+
91+
return nil
92+
}
93+
94+
func getExpirationDate() (*time.Time, error) {
95+
var expiresAt *time.Time
96+
expireDays := os.Getenv(VAR_EXPIRE_AT_DAYS)
97+
98+
if expireDays != "" {
99+
expireDaysInt, err := strconv.Atoi(expireDays)
100+
if err != nil {
101+
return nil, fmt.Errorf("error while getting %w", err)
102+
}
103+
104+
if expireDaysInt > 0 {
105+
expiration := time.Now().AddDate(0, 0, expireDaysInt)
106+
expiresAt = &expiration
107+
}
108+
}
109+
110+
return expiresAt, nil
111+
}
112+
113+
func init() {
114+
if os.Getenv(VAR_ORG_ID) == "" {
115+
panic("missing " + VAR_ORG_ID)
116+
}
117+
118+
if os.Getenv(VAR_AK) == "" {
119+
panic("missing " + VAR_AK)
120+
}
121+
122+
if os.Getenv(VAR_SK) == "" {
123+
panic("missing " + VAR_SK)
124+
}
125+
126+
if os.Getenv(VAR_RDB_ID) == "" {
127+
panic("missing " + VAR_RDB_ID)
128+
}
129+
130+
if os.Getenv(VAR_REGION) == "" {
131+
panic("missing " + VAR_REGION)
132+
}
133+
}

0 commit comments

Comments
 (0)