From c5cd1a4399950332f7ef68a6853329f1c379d51e Mon Sep 17 00:00:00 2001 From: ION606 Date: Mon, 24 Feb 2025 18:53:25 -0500 Subject: [PATCH] moved to Docker --- .dockerignore | 1 + Dockerfile.batched | 19 +++++++++++++++++++ Dockerfile.sqldb | 19 +++++++++++++++++++ Makefile | 34 +++++++++++++++++++++++----------- Makefile.old | 15 +++++++++++++++ batched-server/go.mod | 7 +++++++ batched-server/main.go | 20 ++++++++++---------- shared/go.mod | 3 +++ shared/utils.go | 31 +++++++++++++++++++++++++++++++ sqlite-server/go.mod | 3 +++ sqlite-server/main.go | 14 ++++---------- test/batched.sh | 2 +- test/sqlite.sh | 2 +- 13 files changed, 137 insertions(+), 33 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile.batched create mode 100644 Dockerfile.sqldb create mode 100644 Makefile.old create mode 100644 batched-server/go.mod create mode 100644 shared/go.mod create mode 100644 shared/utils.go diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..68682a4 --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +*.sum diff --git a/Dockerfile.batched b/Dockerfile.batched new file mode 100644 index 0000000..797c0d9 --- /dev/null +++ b/Dockerfile.batched @@ -0,0 +1,19 @@ +FROM golang:1.23.6-alpine + +WORKDIR /app + +RUN mkdir -p /app/data + +COPY batched-server/ ./ +COPY shared/ ./shared/ + +RUN go mod edit -replace shared=/app/shared + +# Download dependencies +RUN go mod tidy +RUN go mod download + +RUN go build -o batched-server . + +EXPOSE 15521 +CMD ["./batched-server", "15521"] \ No newline at end of file diff --git a/Dockerfile.sqldb b/Dockerfile.sqldb new file mode 100644 index 0000000..50ef695 --- /dev/null +++ b/Dockerfile.sqldb @@ -0,0 +1,19 @@ +FROM golang:1.23.6-alpine + +WORKDIR /app + +RUN mkdir -p /app/data + +COPY sqlite-server/ ./ +COPY shared/ ./shared/ + +RUN go mod edit -replace shared=/app/shared + +# Download dependencies +RUN go mod tidy +RUN go mod download + +RUN go build -o sqlite-server . + +EXPOSE 15521 +CMD ["./sqlite-server", "15521"] \ No newline at end of file diff --git a/Makefile b/Makefile index 15ea234..9b92051 100644 --- a/Makefile +++ b/Makefile @@ -1,15 +1,27 @@ PORT=15521 +VOLUME_NAME=mailpocket-data -.PHONY: run-batched run-sqlite setup-sqlite +.PHONY: run-batched run-sqlite stop reset -run-batched: - cd batched-server && go run main.go $(PORT) - -run-sqlite: setup-sqlite - cd sqlite-server && go run main.go $(PORT) - -setup-sqlite: - @if [ ! -f sqlite-server/go.mod ]; then \ - cd sqlite-server && go mod init sqlite-server; \ +test-vol: + @if ! docker volume ls -q | grep -q "^$(VOLUME_NAME)$$"; then \ + echo "Creating volume $(VOLUME_NAME)..."; \ + docker volume create $(VOLUME_NAME); \ fi - cd sqlite-server && go get modernc.org/sqlite \ No newline at end of file + +run-batched: test-vol stop + docker build -t batched-server -f Dockerfile.batched . + docker run -p $(PORT):$(PORT) --name batched-server -v $(VOLUME_NAME):/app/data batched-server + +run-sqlite: test-vol stop + docker build -t sqlite-server -f Dockerfile.sqldb . + docker run -d -p $(PORT):$(PORT) --name sqlite-server -v $(VOLUME_NAME):/app/data sqlite-server + +stop: + docker stop batched-server || true + docker stop sqlite-server || true + docker rm batched-server || true + docker rm sqlite-server || true + +reset: stop + docker volume rm $(VOLUME_NAME) || true \ No newline at end of file diff --git a/Makefile.old b/Makefile.old new file mode 100644 index 0000000..15ea234 --- /dev/null +++ b/Makefile.old @@ -0,0 +1,15 @@ +PORT=15521 + +.PHONY: run-batched run-sqlite setup-sqlite + +run-batched: + cd batched-server && go run main.go $(PORT) + +run-sqlite: setup-sqlite + cd sqlite-server && go run main.go $(PORT) + +setup-sqlite: + @if [ ! -f sqlite-server/go.mod ]; then \ + cd sqlite-server && go mod init sqlite-server; \ + fi + cd sqlite-server && go get modernc.org/sqlite \ No newline at end of file diff --git a/batched-server/go.mod b/batched-server/go.mod new file mode 100644 index 0000000..644babe --- /dev/null +++ b/batched-server/go.mod @@ -0,0 +1,7 @@ +module batched-server + +go 1.23.6 + +replace shared => ../shared + +require shared v0.0.0-00010101000000-000000000000 diff --git a/batched-server/main.go b/batched-server/main.go index 3be398a..462d2b9 100644 --- a/batched-server/main.go +++ b/batched-server/main.go @@ -6,6 +6,8 @@ import ( "log" "net/http" "os" + "path/filepath" + "shared" "strings" "sync" "time" @@ -14,6 +16,9 @@ import ( var ( emailQueue []string queueLock sync.Mutex + dbdir string + PORT string + fpath string ) func saveEmails() { @@ -25,11 +30,11 @@ func saveEmails() { } fileExists := true - if _, err := os.Stat("emails.csv"); os.IsNotExist(err) { + if _, err := os.Stat(fpath); os.IsNotExist(err) { fileExists = false } - f, err := os.OpenFile("emails.csv", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + f, err := os.OpenFile(fpath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { log.Println("Failed to open file:", err) return @@ -101,14 +106,9 @@ func submitHandler(w http.ResponseWriter, r *http.Request) { json.NewEncoder(w).Encode(map[string]string{"message": "data received"}) } - func main() { - var PORT string - if len(os.Args) > 1 { - PORT = os.Args[1] - } else { - PORT = "15521" - } + PORT, dbdir = shared.GetArgs() + fpath = filepath.Join(dbdir, "emails.csv") http.HandleFunc("/submit", submitHandler) http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { @@ -118,4 +118,4 @@ func main() { log.Println("Starting server on port", PORT) log.Fatal(http.ListenAndServe(":"+PORT, nil)) -} \ No newline at end of file +} diff --git a/shared/go.mod b/shared/go.mod new file mode 100644 index 0000000..2131a02 --- /dev/null +++ b/shared/go.mod @@ -0,0 +1,3 @@ +module shared + +go 1.23.6 diff --git a/shared/utils.go b/shared/utils.go new file mode 100644 index 0000000..4a272c1 --- /dev/null +++ b/shared/utils.go @@ -0,0 +1,31 @@ +package shared + +import ( + "log" + "os" +) + + +func GetArgs() (string, string) { + var PORT string + if len(os.Args) > 1 { + PORT = os.Args[1] + } else { + PORT = "15521" + } + + dbdir := "data" + + isDocker := os.Getenv("container") == "docker" || os.Getenv("DOCKER") == "true" || func() bool { _, err := os.Stat("/.dockerenv"); return err == nil }() + if isDocker { + dbdir = "/app/data" + } + + if _, err := os.Stat(dbdir); os.IsNotExist(err) { + if err := os.MkdirAll(dbdir, 0755); err != nil { + log.Fatalf("Failed to create directory: %v", err) + } + } + + return PORT, dbdir +} \ No newline at end of file diff --git a/sqlite-server/go.mod b/sqlite-server/go.mod index 963bce2..cfc9113 100644 --- a/sqlite-server/go.mod +++ b/sqlite-server/go.mod @@ -14,4 +14,7 @@ require ( modernc.org/mathutil v1.7.1 // indirect modernc.org/memory v1.8.2 // indirect modernc.org/sqlite v1.35.0 // indirect + shared v0.0.0-00010101000000-000000000000 // indirect ) + +replace shared => ../shared diff --git a/sqlite-server/main.go b/sqlite-server/main.go index 04deec5..40a518c 100644 --- a/sqlite-server/main.go +++ b/sqlite-server/main.go @@ -5,21 +5,15 @@ import ( "encoding/json" "log" "net/http" - "os" + "path/filepath" "strings" - + "shared" _ "modernc.org/sqlite" ) func main() { - var PORT string - if len(os.Args) > 1 { - PORT = os.Args[1] - } else { - PORT = "15521" - } - - db, _ := sql.Open("sqlite", "emails.db") + PORT, dbdir := shared.GetArgs() + db, _ := sql.Open("sqlite", filepath.Join(dbdir, "emails.db")) db.Exec(`CREATE TABLE IF NOT EXISTS emails ( email TEXT PRIMARY KEY, created TIMESTAMP DEFAULT CURRENT_TIMESTAMP diff --git a/test/batched.sh b/test/batched.sh index a15e015..060d23b 100644 --- a/test/batched.sh +++ b/test/batched.sh @@ -1,6 +1,6 @@ #!/bin/bash -SERVER_URL="http://localhost:3000" +SERVER_URL="http://localhost:15521" test_server_running() { echo "Testing if the server is running..." diff --git a/test/sqlite.sh b/test/sqlite.sh index d53fb94..7f1bf4a 100644 --- a/test/sqlite.sh +++ b/test/sqlite.sh @@ -1,6 +1,6 @@ #!/bin/bash -SERVER_URL="http://localhost:3000" +SERVER_URL="http://localhost:15521" test_server_running() { # testing if the server is running...