Compare commits

..

9 commits
backup ... main

Author SHA1 Message Date
1ed22ba9a6 Don't hide errors from the uploader.
Some checks failed
CI/CD / build-backup-job (push) Has been cancelled
CI/CD / build-and-test-backend (push) Has been cancelled
2025-01-27 02:48:38 -03:00
112b994638 We must needs traverse everything file by file.
Some checks are pending
CI/CD / build-backup-job (push) Waiting to run
CI/CD / build-and-test-backend (push) Waiting to run
2025-01-27 02:41:45 -03:00
c28dc06816 Now it works - except it doesn't. Maybe I shouldn't hide the error in the compactor.
Some checks are pending
CI/CD / build-backup-job (push) Waiting to run
CI/CD / build-and-test-backend (push) Waiting to run
2025-01-27 02:31:12 -03:00
98c58363d9 Oh, is it because of musl...?
Some checks are pending
CI/CD / build-backup-job (push) Waiting to run
CI/CD / build-and-test-backend (push) Waiting to run
2025-01-27 02:16:00 -03:00
6e62c3728a Let's go with root folder.
Some checks are pending
CI/CD / build-backup-job (push) Waiting to run
CI/CD / build-and-test-backend (push) Waiting to run
2025-01-27 02:14:26 -03:00
d1b821a8c7 Gee, Go.
Some checks are pending
CI/CD / build-backup-job (push) Waiting to run
CI/CD / build-and-test-backend (push) Waiting to run
2025-01-27 02:11:13 -03:00
42ad22bf74 Merge pull request 'Chmod, please. Also, fix environment variables. Hopefully.' (#4) from backup into main
Some checks are pending
CI/CD / build-backup-job (push) Waiting to run
CI/CD / build-and-test-backend (push) Waiting to run
Reviewed-on: #4
2025-01-27 05:55:25 +01:00
f0031af763 Merge pull request 'Please don't forget how go goes.' (#3) from backup into main
Some checks are pending
CI/CD / build-backup-job (push) Waiting to run
CI/CD / build-and-test-backend (push) Waiting to run
Reviewed-on: #3
2025-01-27 05:31:36 +01:00
c086b0d660 Merge pull request 'Backup capabilities using a S3-compatible API.' (#2) from backup into main
Some checks are pending
CI/CD / build-backup-job (push) Waiting to run
CI/CD / build-and-test-backend (push) Waiting to run
Reviewed-on: #2
2025-01-27 05:29:01 +01:00
5 changed files with 50 additions and 21 deletions

View file

@ -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)

View file

@ -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:

View file

@ -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"]

View file

@ -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

View file

@ -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)