Compare commits
9 commits
Author | SHA1 | Date | |
---|---|---|---|
1ed22ba9a6 | |||
112b994638 | |||
c28dc06816 | |||
98c58363d9 | |||
6e62c3728a | |||
d1b821a8c7 | |||
42ad22bf74 | |||
f0031af763 | |||
c086b0d660 |
5 changed files with 50 additions and 21 deletions
|
@ -16,4 +16,3 @@ BACKUP_S3_ACCESS_ID=0000000000000000000000000
|
||||||
BACKUP_S3_SECRET_ID=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
BACKUP_S3_SECRET_ID=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
BACKUP_S3_ENDPOINT=https://s3.us-east-005.backblazeb2.com
|
BACKUP_S3_ENDPOINT=https://s3.us-east-005.backblazeb2.com
|
||||||
BACKUP_S3_REGION=us-east-005
|
BACKUP_S3_REGION=us-east-005
|
||||||
BACKUP_SOURCE_PATH=/backups/guestbooky_$(date +\%Y-\%m-\%d)
|
|
|
@ -66,7 +66,7 @@ services:
|
||||||
--username ${GUESTBOOKY_USER}
|
--username ${GUESTBOOKY_USER}
|
||||||
--password ${GUESTBOOKY_USER}
|
--password ${GUESTBOOKY_USER}
|
||||||
--authenticationDatabase ${GUESTBOOKY_DB_NAME}
|
--authenticationDatabase ${GUESTBOOKY_DB_NAME}
|
||||||
--out ${BACKUP_SOURCE_PATH} && touch /backups/backup_done"
|
--out /backups/guestbooky_$(date +\%Y-\%m-\%d) && touch /backups/backup_done"
|
||||||
volumes:
|
volumes:
|
||||||
- ./backups:/backups
|
- ./backups:/backups
|
||||||
depends_on:
|
depends_on:
|
||||||
|
@ -88,10 +88,9 @@ services:
|
||||||
BACKUP_S3_SECRET_ID: ${BACKUP_S3_SECRET_ID}
|
BACKUP_S3_SECRET_ID: ${BACKUP_S3_SECRET_ID}
|
||||||
BACKUP_S3_ENDPOINT: ${BACKUP_S3_ENDPOINT}
|
BACKUP_S3_ENDPOINT: ${BACKUP_S3_ENDPOINT}
|
||||||
BACKUP_S3_REGION: ${BACKUP_S3_REGION}
|
BACKUP_S3_REGION: ${BACKUP_S3_REGION}
|
||||||
BACKUP_SOURCE_PATH: ${BACKUP_SOURCE_PATH}
|
|
||||||
BACKUP_DESTINATION_PATH: ${BACKUP_SOURCE_PATH}.gzip
|
|
||||||
volumes:
|
volumes:
|
||||||
- ./backups:/backups
|
- ./backups:/backups
|
||||||
|
command: sh -c "export BACKUP_SOURCE_PATH=/backups/guestbooky_$(date +\%Y-\%m-\%d) && export BACKUP_DESTINATION_PATH=/backups/guestbooky_$(date +\%Y-\%m-\%d).gzip && /root/guestbooky-backup"
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
mongodata:
|
mongodata:
|
||||||
|
|
|
@ -7,13 +7,13 @@ COPY ../../src/Guestbooky-backup/ .
|
||||||
|
|
||||||
RUN go mod download
|
RUN go mod download
|
||||||
|
|
||||||
RUN go build -o guestbooky-backup cmd/guestbooky-backup/guestbooky-backup.go
|
RUN CGO_ENABLED=0 go build -o guestbooky-backup cmd/guestbooky-backup/guestbooky-backup.go
|
||||||
|
|
||||||
FROM alpine:latest
|
FROM alpine:latest
|
||||||
|
|
||||||
WORKDIR /root/
|
WORKDIR /root
|
||||||
|
|
||||||
COPY --from=builder /app/guestbooky-backup .
|
COPY --from=builder /app/guestbooky-backup .
|
||||||
RUN chmod +x guestbooky-backup
|
RUN chmod +x /root/guestbooky-backup
|
||||||
|
|
||||||
CMD ["./guestbooky-backup"]
|
CMD ["./guestbooky-backup"]
|
|
@ -1,12 +1,14 @@
|
||||||
package compactor
|
package compactor
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"archive/tar"
|
||||||
"compress/gzip"
|
"compress/gzip"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/fs"
|
"io/fs"
|
||||||
"os"
|
"os"
|
||||||
|
"path/filepath"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Compact(source, destination string) error {
|
func Compact(source, destination string) error {
|
||||||
|
@ -15,15 +17,9 @@ func Compact(source, destination string) error {
|
||||||
)
|
)
|
||||||
|
|
||||||
if _, err := os.Stat(source); errors.Is(err, fs.ErrNotExist) {
|
if _, err := os.Stat(source); errors.Is(err, fs.ErrNotExist) {
|
||||||
return errors.New("source file does not exist")
|
return errors.New("source does not exist")
|
||||||
}
|
}
|
||||||
|
|
||||||
originFileHandle, err := os.Open(source)
|
|
||||||
if err != nil {
|
|
||||||
return errors.New("failed to open source file")
|
|
||||||
}
|
|
||||||
defer originFileHandle.Close()
|
|
||||||
|
|
||||||
destinationFileHandle, err := os.Create(destination)
|
destinationFileHandle, err := os.Create(destination)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.New("failed to create destination file")
|
return errors.New("failed to create destination file")
|
||||||
|
@ -33,8 +29,43 @@ func Compact(source, destination string) error {
|
||||||
zipWriter := gzip.NewWriter(destinationFileHandle)
|
zipWriter := gzip.NewWriter(destinationFileHandle)
|
||||||
defer zipWriter.Close()
|
defer zipWriter.Close()
|
||||||
|
|
||||||
if _, err := io.Copy(zipWriter, originFileHandle); err != nil {
|
err = filepath.Walk(source, func(path string, info fs.FileInfo, err error) error {
|
||||||
return errors.New("failed to copy file")
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if info.IsDir() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
originFileHandle, err := os.Open(path)
|
||||||
|
if err != nil {
|
||||||
|
return errors.New("failed to open origin file: " + err.Error())
|
||||||
|
}
|
||||||
|
defer originFileHandle.Close()
|
||||||
|
|
||||||
|
header, err := tar.FileInfoHeader(info, "")
|
||||||
|
if err != nil {
|
||||||
|
return errors.New("failed to create gzip file info header: " + err.Error())
|
||||||
|
}
|
||||||
|
header.Name = path
|
||||||
|
|
||||||
|
tarWriter := tar.NewWriter(zipWriter)
|
||||||
|
defer tarWriter.Close()
|
||||||
|
|
||||||
|
if err := tarWriter.WriteHeader(header); err != nil {
|
||||||
|
return errors.New("failed to write gzip header: " + err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := io.Copy(tarWriter, originFileHandle); err != nil {
|
||||||
|
return errors.New("failed to copy zip to destination file: " + err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return errors.New("failed to walk source directory: " + err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -24,12 +24,12 @@ func Upload(compactedFile string) error {
|
||||||
|
|
||||||
s3Client, err := createS3Client()
|
s3Client, err := createS3Client()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.New("failed to create S3 client")
|
return errors.New("failed to create S3 client: " + err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
file, err := os.Open(compactedFile)
|
file, err := os.Open(compactedFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.New("failed to open file")
|
return errors.New("failed to open file: " + err.Error())
|
||||||
}
|
}
|
||||||
defer file.Close()
|
defer file.Close()
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ func Upload(compactedFile string) error {
|
||||||
Body: file,
|
Body: file,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.New("failed to upload file")
|
return errors.New("failed to upload file: " + err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -62,7 +62,7 @@ func createS3Client() (*S3Client, error) {
|
||||||
|
|
||||||
awsSession, err := session.NewSession(s3Config)
|
awsSession, err := session.NewSession(s3Config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.New("failed to create S3 session")
|
return nil, errors.New("failed to create S3 session: " + err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
s3Client := s3.New(awsSession)
|
s3Client := s3.New(awsSession)
|
||||||
|
|
Loading…
Add table
Reference in a new issue