diff --git a/Makefile b/Makefile index 43ec50c5..f7c5f30f 100644 --- a/Makefile +++ b/Makefile @@ -1,54 +1,64 @@ -# TODO: add commands for build and run in dev/produciton mode +# --- Variables --- +BINARY_NAME ?= niki +BUILD_DIR ?= bin -ROOT=$(realpath $(dir $(lastword $(MAKEFILE_LIST)))) +# ==================================================================================== +# General Go Commands +# ==================================================================================== +.PHONY: start test build clean mod-tidy lint install-linter help format swagger watch -.PHONY: help confirm lint test format build run docker swagger watch migrate/status migrate/new migrate/up migrate/down - -confirm: - @echo -n 'Are you sure? [y/N] ' && read ans && [ $${ans:-N} = y ] - -lint: - which golangci-lint || (go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.54.0) - golangci-lint run --config=$(ROOT)/.golangci.yml $(ROOT)/... +start: build + $(BUILD_DIR)/$(BINARY_NAME) test: go test -v ./... +build: + @mkdir -p $(BUILD_DIR) + go build -o $(BUILD_DIR)/$(BINARY_NAME) main.go + +clean: + rm -rf $(BUILD_DIR)/ + +mod-tidy: + go mod tidy + +lint: + golangci-lint run + +install-linter: + go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest + format: @which gofumpt || (go install mvdan.cc/gofumpt@latest) - @gofumpt -l -w $(ROOT) + @gofumpt -l -w . @which gci || (go install github.com/daixiang0/gci@latest) - @gci write $(ROOT) --skip-generated --skip-vendor - @which golangci-lint || (go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.54.0) + @gci write . --skip-generated --skip-vendor @golangci-lint run --fix -build: - go build -o niki main.go - -run: - go run main.go --migrate - -docker: - sudo docker compose up -d - swagger: swag init # Live Reload watch: @if command -v CompileDaemon > /dev/null; then \ - CompileDaemon -exclude-dir=.git -exclude=".#*" -command="./niki"; \ + CompileDaemon -exclude-dir=.git -exclude=".#*" -command="./$(BUILD_DIR)/$(BINARY_NAME)"; \ else \ - read -p "Go's 'CompileDaemon' is not installed on your machine. Do you want to install it? [Y/n] " choice; \ + read -p "Go's 'CompileDaemon' is not installed. Do you want to install it? [Y/n] " choice; \ if [ "$$choice" != "n" ] && [ "$$choice" != "N" ]; then \ go install github.com/githubnemo/CompileDaemon@latest; \ - CompileDaemon -exclude-dir=.git -exclude=".#*" -command="./niki"; \ + CompileDaemon -exclude-dir=.git -exclude=".#*" -command="./$(BUILD_DIR)/$(BINARY_NAME)"; \ else \ echo "You chose not to install CompileDaemon. Exiting..."; \ exit 1; \ fi; \ fi +# ==================================================================================== +# Database Migration Commands (legacy niki-core) +# ==================================================================================== +.PHONY: migrate/status migrate/new migrate/up migrate/down + migrate/status: @sql-migrate status -env="production" -config=repository/mysql/dbconfig.yml @@ -63,4 +73,63 @@ migrate/up: confirm migrate/down: confirm @echo 'Tearing down last migration...' - @sql-migrate down -env="production" -config=repository/mysql/dbconfig.yml -limit=1 \ No newline at end of file + @sql-migrate down -env="production" -config=repository/mysql/dbconfig.yml -limit=1 + +confirm: + @echo -n 'Are you sure? [y/N] ' && read ans && [ $${ans:-N} = y ] + +# ==================================================================================== +# Productapp Service Commands +# ==================================================================================== +.PHONY: productapp-up productapp-up-logs + +PRODUCTAPP_ENV = deploy/productapp/development/.env +PRODUCTAPP_COMPOSE = deploy/productapp/development/docker-compose.yml + +productapp-up: + @echo "Building and starting productapp full stack..." + docker compose --env-file $(PRODUCTAPP_ENV) -f $(PRODUCTAPP_COMPOSE) up --build -d + @echo "productapp stack is up." + +productapp-up-logs: + @echo "Building and starting productapp full stack..." + docker compose --env-file $(PRODUCTAPP_ENV) -f $(PRODUCTAPP_COMPOSE) up --build + +# ==================================================================================== +# Docker Commands (legacy) +# ==================================================================================== +.PHONY: docker + +docker: + docker compose up -d + +# ==================================================================================== +# Help Target +# ==================================================================================== +help: + @echo "Available targets:" + @echo "" + @echo "General Go Commands:" + @echo " start - Build and run niki-core locally" + @echo " test - Run tests" + @echo " build - Compile binary" + @echo " clean - Remove build artifacts" + @echo " mod-tidy - Clean up dependencies" + @echo " format - Format code (gofumpt + gci + lint fix)" + @echo " lint - Run linters" + @echo " install-linter - Install golangci-lint" + @echo " swagger - Generate swagger docs" + @echo " watch - Live reload with CompileDaemon" + @echo "" + @echo "Database Migration (niki-core):" + @echo " migrate/status - Show migration status" + @echo " migrate/new - Create new migration (name=)" + @echo " migrate/up - Run migrations up" + @echo " migrate/down - Rollback last migration" + @echo "" + @echo "Productapp Service:" + @echo " productapp-up - Build and start full stack in background" + @echo " productapp-up-logs - Build and start full stack with logs" + @echo "" + @echo "Docker (legacy):" + @echo " docker - Start docker-compose services" diff --git a/deploy/productapp/development/Dockerfile b/deploy/productapp/development/Dockerfile new file mode 100644 index 00000000..bbcc42a4 --- /dev/null +++ b/deploy/productapp/development/Dockerfile @@ -0,0 +1,18 @@ +ARG GO_IMAGE_NAME +ARG GO_IMAGE_VERSION + +FROM ${GO_IMAGE_NAME}:${GO_IMAGE_VERSION} +ENV GOPROXY=https://package-mirror.liara.ir/repository/go/ +ENV GOSUMDB=off + + + +WORKDIR /home/app + +COPY go.mod go.sum ./ +RUN go mod download + +COPY . . +RUN go build -mod=mod -o /bin/productapp cmd/productapp/main.go + +CMD ["/bin/productapp", "serve"] \ No newline at end of file diff --git a/deploy/productapp/development/docker-compose.no-service.yml b/deploy/productapp/development/docker-compose.no-service.yml new file mode 100644 index 00000000..7b69ee94 --- /dev/null +++ b/deploy/productapp/development/docker-compose.no-service.yml @@ -0,0 +1,20 @@ +services: + productapp-mysql: + image: mirror2.chabokan.net/mysql:8.0 + container_name: productapp-mysql + restart: always + ports: + - "3307:3306" + volumes: + - productapp-mysql-data:/var/lib/mysql + environment: + MYSQL_DATABASE: niki_db + MYSQL_ROOT_PASSWORD: secret + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] + interval: 10s + timeout: 5s + retries: 5 + +volumes: + productapp-mysql-data: diff --git a/deploy/productapp/development/docker-compose.yml b/deploy/productapp/development/docker-compose.yml new file mode 100644 index 00000000..eef94489 --- /dev/null +++ b/deploy/productapp/development/docker-compose.yml @@ -0,0 +1,42 @@ +services: + productapp-app: + build: + context: ../../.. + dockerfile: deploy/productapp/development/Dockerfile + args: + GO_IMAGE_NAME: ${GO_IMAGE_NAME} + GO_IMAGE_VERSION: ${GO_IMAGE_VERSION} + container_name: productapp-app + ports: + - "8080:8080" + command: /bin/sh -c "/bin/productapp migrate --up && /bin/productapp serve" + environment: + DB_HOST: productapp-mysql + DB_USERNAME: root + DB_PASSWORD: secret + DB_NAME: niki_db + MIGRATION_PATH: /home/app/productapp/repository/migrations + depends_on: + productapp-mysql: + condition: service_healthy + restart: unless-stopped + + productapp-mysql: + image: mirror2.chabokan.net/mysql:8.0 + container_name: productapp-mysql + restart: always + ports: + - "3307:3306" + volumes: + - productapp-mysql-data:/var/lib/mysql + environment: + MYSQL_DATABASE: niki_db + MYSQL_ROOT_PASSWORD: secret + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] + interval: 10s + timeout: 5s + retries: 5 + +volumes: + productapp-mysql-data: diff --git a/productapp/repository/migrations/1775595705_create_products_table.sql b/productapp/repository/migrations/1775595705_create_products_table.sql index 23e210c1..5a061b8d 100644 --- a/productapp/repository/migrations/1775595705_create_products_table.sql +++ b/productapp/repository/migrations/1775595705_create_products_table.sql @@ -9,8 +9,7 @@ CREATE TABLE `products` ( `is_active` BOOLEAN DEFAULT TRUE, `features` JSON DEFAULT NULL, `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - `deleted_at` TIMESTAMP DEFAULT NULL, - FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE SET NULL + `deleted_at` TIMESTAMP DEFAULT NULL ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_persian_ci; -- +migrate Down