diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..be44689 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,28 @@ +# Binaries for programs and plugins +*.exe +*.ogg +*.m4a +*.zip +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Dependency directories (remove the comment below to include it) +# vendor/ + +# Go workspace file +go.work +**/songs +.vscode + +package-lock.json + +*sqlite3 +.env \ No newline at end of file diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..bc65741 --- /dev/null +++ b/.env.example @@ -0,0 +1,7 @@ +DB_TYPE=mongo +DB_USER=user +DB_PASS=password +DB_NAME=seek-tune +DB_HOST=192.168.0.1 +DB_PORT=27017 +REACT_APP_BACKEND_URL=http://localhost:5000 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 1342004..da3548d 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,5 @@ go.work .vscode package-lock.json +*sqlite3 +.env \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..44c8845 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,33 @@ +# build react +FROM node:20-alpine AS build_react_stage + +RUN mkdir -p /home/react +WORKDIR /home/react + +COPY client/package.json ./ +RUN npm install + +COPY client/ ./ +ARG REACT_APP_BACKEND_URL +ENV REACT_APP_BACKEND_URL=${REACT_APP_BACKEND_URL} +RUN npm run build + +# build go +FROM golang:1.21.6 + +WORKDIR /home/seek-tune + +COPY server/go.mod server/go.sum ./ +RUN go mod download + +COPY server/ ./ +ENV ENV=production + +RUN mkdir -p static +COPY --from=build_react_stage /home/react/build static + +RUN go build -o seek-tune + +EXPOSE 5000 + +CMD [ "/home/seek-tune/seek-tune", "serve" ] \ No newline at end of file diff --git a/README.md b/README.md index 733c855..0c257f6 100644 --- a/README.md +++ b/README.md @@ -25,22 +25,35 @@ Additionally, it currently only supports song files in WAV format. - NPM: To run the client (frontend). ### Steps -Clone the repository: +📦 Clone the repository: ``` git clone https://github.com/cgzirim/seek-tune.git +cd seek-tune ``` +#### 🐳 Set Up with Docker +Prerequisites: [Docker](https://docs.docker.com/get-docker/) and [Docker Compose](https://docs.docker.com/compose/install/) +1. Build and run the application: + ```Bash + docker-compose up --build + ``` + Visit the app at http://localhost:8080 +2. To stop the application: + ```Bash + docker-compose down + ``` +#### 💻 Set Up Natively Install dependencies for the backend ``` -cd seek-tune +cd server go get ./... ``` Install dependencies for the client ``` -cd seek-tune/client +cd client npm install ``` -## Usage :bicyclist: +## Usage (Native Setup) :bicyclist: #### ▸ Start the Client App 🏃‍♀️‍➡️ ``` @@ -51,7 +64,7 @@ npm start #### ▸ Start the Backend App 🏃‍♀️ In a separate terminal window: ``` -cd seek-tune +cd server go run *.go serve [-proto (default: http)] [-port (default: 5000)] ``` #### ▸ Download a Song 📥 diff --git a/appspec.yml b/appspec.yml index fd70996..64ee399 100644 --- a/appspec.yml +++ b/appspec.yml @@ -1,7 +1,7 @@ version: 0.0 os: linux files: - - source: / + - source: server/ destination: /home/ubuntu/song-recognition hooks: BeforeInstall: diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..9601c8f --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,31 @@ +version: '3.1' + +volumes: + seek-tune-db: + seek-tune-songs: + +services: + seek-tune: + image: 'seek-tune' + restart: unless-stopped + ports: + - 8080:5000 + + environment: + DB_TYPE: ${DB_TYPE:-sqlite} + DB_USER: ${DB_USER:-root} + DB_PASSWORD: ${DB_PASSWORD:-password} + DB_NAME: ${DB_NAME:-seek_tune_db} + DB_HOST: ${DB_HOST:-localhost} + DB_PORT: ${DB_PORT:-27017} + + REACT_APP_BACKEND_URL: ${REACT_APP_BACKEND_URL:-http://localhost:8080} + + build: + context: . + args: + REACT_APP_BACKEND_URL: ${REACT_APP_BACKEND_URL:-http://localhost:8080} + + volumes: + - seek-tune-db:/home/seek-tune/db + - seek-tune-songs:/home/seek-tune/songs \ No newline at end of file diff --git a/scripts/start_server.sh b/scripts/start_server.sh index 5d13171..8d5d9e7 100644 --- a/scripts/start_server.sh +++ b/scripts/start_server.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash start_server() { - cd /home/ubuntu/song-recognition + cd /home/ubuntu/song-recognition/server export SERVE_HTTPS="true" export CERT_KEY="/etc/letsencrypt/live/localport.online/privkey.pem" diff --git a/cmdHandlers.go b/server/cmdHandlers.go similarity index 99% rename from cmdHandlers.go rename to server/cmdHandlers.go index 105d46d..b04ede5 100644 --- a/cmdHandlers.go +++ b/server/cmdHandlers.go @@ -160,6 +160,7 @@ func serve(protocol, port string) { func serveHTTP(socketServer *socketio.Server, serveHTTPS bool, port string) { http.Handle("/socket.io/", socketServer) + http.Handle("/", http.FileServer(http.Dir("static"))) if serveHTTPS { httpsAddr := ":" + port diff --git a/db/client.go b/server/db/client.go similarity index 97% rename from db/client.go rename to server/db/client.go index 00fb725..2b7dc6d 100644 --- a/db/client.go +++ b/server/db/client.go @@ -46,7 +46,7 @@ func NewDBClient() (DBClient, error) { return NewMongoClient(dbUri) case "sqlite": - return NewSQLiteClient("db.sqlite3") + return NewSQLiteClient("db/db.sqlite3") default: return nil, fmt.Errorf("unsupported database type: %s", DBtype) diff --git a/db/mongo.go b/server/db/mongo.go similarity index 100% rename from db/mongo.go rename to server/db/mongo.go diff --git a/db/sqlite.go b/server/db/sqlite.go similarity index 100% rename from db/sqlite.go rename to server/db/sqlite.go diff --git a/go.mod b/server/go.mod similarity index 100% rename from go.mod rename to server/go.mod diff --git a/go.sum b/server/go.sum similarity index 100% rename from go.sum rename to server/go.sum diff --git a/main.go b/server/main.go similarity index 100% rename from main.go rename to server/main.go diff --git a/models/models.go b/server/models/models.go similarity index 100% rename from models/models.go rename to server/models/models.go diff --git a/shazam/fft.go b/server/shazam/fft.go similarity index 100% rename from shazam/fft.go rename to server/shazam/fft.go diff --git a/shazam/fingerprint.go b/server/shazam/fingerprint.go similarity index 100% rename from shazam/fingerprint.go rename to server/shazam/fingerprint.go diff --git a/shazam/image.go b/server/shazam/image.go similarity index 100% rename from shazam/image.go rename to server/shazam/image.go diff --git a/shazam/shazam.go b/server/shazam/shazam.go similarity index 100% rename from shazam/shazam.go rename to server/shazam/shazam.go diff --git a/shazam/spectrogram.go b/server/shazam/spectrogram.go similarity index 100% rename from shazam/spectrogram.go rename to server/shazam/spectrogram.go diff --git a/socketHandlers.go b/server/socketHandlers.go similarity index 100% rename from socketHandlers.go rename to server/socketHandlers.go diff --git a/server/songs/Chiquitita.wav b/server/songs/Chiquitita.wav new file mode 100644 index 0000000..508ceb7 Binary files /dev/null and b/server/songs/Chiquitita.wav differ diff --git a/server/songs/Dancing Queen.wav b/server/songs/Dancing Queen.wav new file mode 100644 index 0000000..61b05a6 Binary files /dev/null and b/server/songs/Dancing Queen.wav differ diff --git a/server/songs/Jolene.wav b/server/songs/Jolene.wav new file mode 100644 index 0000000..c9df3d5 Binary files /dev/null and b/server/songs/Jolene.wav differ diff --git a/spotify/downloader.go b/server/spotify/downloader.go similarity index 100% rename from spotify/downloader.go rename to server/spotify/downloader.go diff --git a/spotify/spotify.go b/server/spotify/spotify.go similarity index 100% rename from spotify/spotify.go rename to server/spotify/spotify.go diff --git a/spotify/utils.go b/server/spotify/utils.go similarity index 100% rename from spotify/utils.go rename to server/spotify/utils.go diff --git a/spotify/youtube.go b/server/spotify/youtube.go similarity index 100% rename from spotify/youtube.go rename to server/spotify/youtube.go diff --git a/utils/helpers.go b/server/utils/helpers.go similarity index 100% rename from utils/helpers.go rename to server/utils/helpers.go diff --git a/utils/logger.go b/server/utils/logger.go similarity index 100% rename from utils/logger.go rename to server/utils/logger.go diff --git a/utils/utils.go b/server/utils/utils.go similarity index 100% rename from utils/utils.go rename to server/utils/utils.go diff --git a/wasm/wasm_main.go b/server/wasm/wasm_main.go similarity index 100% rename from wasm/wasm_main.go rename to server/wasm/wasm_main.go diff --git a/wav/convert.go b/server/wav/convert.go similarity index 100% rename from wav/convert.go rename to server/wav/convert.go diff --git a/wav/wav.go b/server/wav/wav.go similarity index 100% rename from wav/wav.go rename to server/wav/wav.go