<chore>: Update port 3000 & update makefile
Change port and update makefile for Windows
This commit is contained in:
parent
86cff0489e
commit
d4c11c12be
@ -90,7 +90,7 @@ jobs:
|
||||
--name ${{ secrets.CONTAINER_NAME || 'ulflow-api-container' }} \
|
||||
--network ${{ secrets.DOCKER_NETWORK || 'ulflow-network' }} \
|
||||
--restart always \
|
||||
-p ${{ secrets.APP_PORT || '8080' }}:8080 \
|
||||
-p ${{ secrets.APP_PORT || '3000' }}:3000 \
|
||||
-e APP_ENV=${{ secrets.APP_ENV || 'production' }} \
|
||||
-e DB_HOST=${{ secrets.DB_HOST }} \
|
||||
-e DB_USER=${{ secrets.DB_USER }} \
|
||||
@ -100,7 +100,7 @@ jobs:
|
||||
-e REFRESH_TOKEN_SECRET=${{ secrets.REFRESH_TOKEN_SECRET }} \
|
||||
-e API_KEY=${{ secrets.API_KEY }} \
|
||||
-e ENCRYPTION_KEY=${{ secrets.ENCRYPTION_KEY }} \
|
||||
--health-cmd "${{ secrets.HEALTH_CMD || 'curl -f http://localhost:8080/health || exit 1' }}" \
|
||||
--health-cmd "${{ secrets.HEALTH_CMD || 'curl -f http://localhost:3000/health || exit 1' }}" \
|
||||
--health-interval ${{ secrets.HEALTH_INTERVAL || '30s' }} \
|
||||
--memory ${{ secrets.CONTAINER_MEMORY || '1g' }} \
|
||||
--cpus ${{ secrets.CONTAINER_CPU || '1' }} \
|
||||
@ -121,7 +121,7 @@ jobs:
|
||||
fi
|
||||
|
||||
# Check health endpoint
|
||||
curl -f http://localhost:${{ secrets.APP_PORT || '8080' }}/health || (echo "::error::Health check failed" && exit 1)
|
||||
curl -f http://localhost:${{ secrets.APP_PORT || '3000' }}/health || (echo "::error::Health check failed" && exit 1)
|
||||
|
||||
echo "::notice::Deployment successful!"
|
||||
|
||||
|
||||
18
Dockerfile
18
Dockerfile
@ -16,11 +16,14 @@ COPY go.mod go.sum* ./
|
||||
# Download dependencies
|
||||
RUN go mod download
|
||||
|
||||
# Copy the entire project
|
||||
# Copy source code
|
||||
COPY . .
|
||||
# Create the configs directory in the build context
|
||||
RUN mkdir -p /build/configs && \
|
||||
cp -r configs/* /build/configs/ 2>/dev/null || :
|
||||
|
||||
# Build the application with optimizations
|
||||
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s" -o /build/bin/api ./cmd/api
|
||||
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s" -o /build/bin/app ./cmd/app
|
||||
|
||||
# Final stage
|
||||
FROM alpine:3.19
|
||||
@ -38,10 +41,9 @@ RUN adduser -D -g '' appuser
|
||||
RUN mkdir -p /app/config /app/logs /app/storage
|
||||
WORKDIR /app
|
||||
|
||||
# Copy binary from builder stage
|
||||
COPY --from=builder /build/bin/api /app/
|
||||
COPY --from=builder /build/config /app/config
|
||||
|
||||
# Copy binary and configs
|
||||
COPY --from=builder /build/bin/app /app/
|
||||
COPY --from=builder /build/configs /app/configs
|
||||
# Set ownership
|
||||
RUN chown -R appuser:appuser /app
|
||||
|
||||
@ -49,10 +51,10 @@ RUN chown -R appuser:appuser /app
|
||||
USER appuser
|
||||
|
||||
# Expose port
|
||||
EXPOSE 8080
|
||||
EXPOSE 3000
|
||||
|
||||
# Set environment variable for production
|
||||
ENV APP_ENV=production
|
||||
|
||||
# Command to run the application
|
||||
ENTRYPOINT ["/app/api"]
|
||||
ENTRYPOINT ["./app"]
|
||||
|
||||
@ -23,7 +23,7 @@ RUN go mod download
|
||||
COPY . .
|
||||
|
||||
# Expose port
|
||||
EXPOSE 8080
|
||||
EXPOSE 3000
|
||||
|
||||
# Set environment variable for development
|
||||
ENV APP_ENV=development
|
||||
|
||||
41
Makefile
41
Makefile
@ -61,14 +61,14 @@ lint:
|
||||
# Build the application binary
|
||||
build:
|
||||
@echo "Building application..."
|
||||
go build -o bin/api cmd/api/main.go
|
||||
go build -o bin/app cmd/app/main.go
|
||||
|
||||
# Clean temporary files, build artifacts, and cache
|
||||
clean:
|
||||
@echo "Cleaning project..."
|
||||
rm -rf tmp/
|
||||
rm -rf bin/
|
||||
rm -rf logs/*.log
|
||||
if exist tmp rmdir /s /q tmp
|
||||
if exist bin rmdir /s /q bin
|
||||
if exist logs rmdir /s /q logs
|
||||
go clean -cache -testcache -modcache
|
||||
@echo "Project cleaned!"
|
||||
|
||||
@ -80,13 +80,18 @@ docker-build:
|
||||
# Run application in Docker container
|
||||
docker-run:
|
||||
@echo "Running application in Docker container..."
|
||||
docker run -p 8080:8080 --env-file .env ulflow-starter-kit:latest
|
||||
@if not exist .env (
|
||||
@echo "Warning: .env file not found. Running with default environment variables..."
|
||||
docker run -p 3000:3000 ulflow-starter-kit:latest
|
||||
) else (
|
||||
docker run -p 3000:3000 --env-file .env ulflow-starter-kit:latest
|
||||
)
|
||||
|
||||
# Run Docker Compose for local development
|
||||
docker-compose-up:
|
||||
@echo "Starting all services with Docker Compose for local development..."
|
||||
docker-compose up -d
|
||||
@echo "Services started! API is available at http://localhost:8080"
|
||||
@echo "Services started! API is available at http://localhost:3000"
|
||||
|
||||
# Stop Docker Compose services for local development
|
||||
docker-compose-down:
|
||||
@ -97,7 +102,7 @@ docker-compose-down:
|
||||
docker-compose-prod-up:
|
||||
@echo "Starting all services with Docker Compose for production..."
|
||||
docker-compose -f docker-compose.prod.yml up -d
|
||||
@echo "Production services started! API is available at http://localhost:8080"
|
||||
@echo "Production services started! API is available at http://localhost:3000"
|
||||
|
||||
# Stop Docker Compose services for production
|
||||
docker-compose-prod-down:
|
||||
@ -105,19 +110,19 @@ docker-compose-prod-down:
|
||||
docker-compose -f docker-compose.prod.yml down
|
||||
|
||||
# Setup Git configuration
|
||||
setup-git:
|
||||
@echo "Setting up Git configuration..."
|
||||
setup-git-hooks:
|
||||
@echo "Setting up Git hooks..."
|
||||
git config --local commit.template .gitea/commit-template.txt
|
||||
cp .gitea/hooks/pre-commit .git/hooks/
|
||||
cp .gitea/hooks/prepare-commit-msg .git/hooks/
|
||||
chmod +x .git/hooks/pre-commit
|
||||
chmod +x .git/hooks/prepare-commit-msg
|
||||
if not exist .git/hooks mkdir .git/hooks
|
||||
copy /Y .gitea\hooks\pre-commit .git\hooks\ >nul
|
||||
copy /Y .gitea\hooks\prepare-commit-msg .git\hooks\ >nul
|
||||
git config --local core.hooksPath .git/hooks
|
||||
@echo "Git setup complete!"
|
||||
|
||||
# Create git message template
|
||||
setup-git-message:
|
||||
@echo "Creating Git commit message template..."
|
||||
if not exist .gitea mkdir .gitea
|
||||
mkdir -p .gitea
|
||||
echo "# <type>: <subject>\n\n# <body>\n\n# <footer>\n\n# Types:\n# feat (new feature)\n# fix (bug fix)\n# docs (documentation changes)\n# style (formatting, no code change)\n# refactor (refactoring code)\n# test (adding tests, refactoring tests)\n# chore (updating tasks etc; no production code change)" > .gitea/commit-template.txt
|
||||
git config --local commit.template .gitea/commit-template.txt
|
||||
@ -126,7 +131,9 @@ setup-git-message:
|
||||
# Clean Docker containers related to this project
|
||||
docker-clean:
|
||||
@echo "Cleaning Docker containers..."
|
||||
docker ps -a | grep ulflow-starter-kit | awk '{print $$1}' | xargs -r docker rm -f
|
||||
@if [ -x "$$(command -v docker)" ]; then \
|
||||
docker ps -aq --filter "name=ulflow-starter-kit" | xargs -r docker rm -f; \
|
||||
fi
|
||||
@echo "Docker containers cleaned!"
|
||||
|
||||
# Prune all unused Docker resources
|
||||
@ -143,8 +150,6 @@ ci:
|
||||
make build
|
||||
make docker-build
|
||||
@echo "CI simulation completed!"
|
||||
@echo "Cleaning up after CI..."
|
||||
make docker-clean
|
||||
|
||||
# Run everything (lint, test, build)
|
||||
all: lint test build
|
||||
@ -165,7 +170,3 @@ migrate-down:
|
||||
# Run application (default: without hot reload)
|
||||
run:
|
||||
go run ./cmd/app/main.go
|
||||
|
||||
# Run application with hot reload
|
||||
dev:
|
||||
air -c .air.toml
|
||||
|
||||
@ -9,7 +9,7 @@ logger:
|
||||
|
||||
server:
|
||||
host: "localhost"
|
||||
port: 8080
|
||||
port: 3000
|
||||
read_timeout: 15
|
||||
write_timeout: 15
|
||||
shutdown_timeout: 30
|
||||
|
||||
@ -9,7 +9,7 @@ services:
|
||||
container_name: ulflow-api
|
||||
restart: always
|
||||
ports:
|
||||
- "8080:8080"
|
||||
- "3000:3000"
|
||||
env_file:
|
||||
- .env
|
||||
environment:
|
||||
@ -27,7 +27,7 @@ services:
|
||||
condition: on-failure
|
||||
max_attempts: 3
|
||||
healthcheck:
|
||||
test: ["CMD", "wget", "--spider", "-q", "http://localhost:8080/health"]
|
||||
test: ["CMD", "wget", "--spider", "-q", "http://localhost:3000/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
|
||||
@ -9,7 +9,7 @@ services:
|
||||
container_name: ulflow-api
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "8080:8080"
|
||||
- "3000:3000"
|
||||
volumes:
|
||||
- .:/app
|
||||
- go-modules:/go/pkg/mod
|
||||
|
||||
@ -58,11 +58,11 @@ Bao gồm các job:
|
||||
|--------|-------|----------|
|
||||
| `CONTAINER_NAME` | Tên container | `ulflow-api-container` |
|
||||
| `DOCKER_NETWORK` | Tên network Docker | `ulflow-network` |
|
||||
| `APP_PORT` | Port để expose | `8080` |
|
||||
| `APP_PORT` | Port để expose | `3000` |
|
||||
| `APP_ENV` | Môi trường ứng dụng | `production` |
|
||||
| `CONTAINER_MEMORY` | Giới hạn bộ nhớ | `1g` |
|
||||
| `CONTAINER_CPU` | Giới hạn CPU | `1` |
|
||||
| `HEALTH_CMD` | Command kiểm tra health | `curl -f http://localhost:8080/health || exit 1` |
|
||||
| `HEALTH_CMD` | Command kiểm tra health | `curl -f http://localhost:3000/health || exit 1` |
|
||||
| `HEALTH_INTERVAL` | Khoảng thời gian kiểm tra health | `30s` |
|
||||
|
||||
### Secrets cho Database
|
||||
|
||||
4
go.sum
4
go.sum
@ -294,7 +294,7 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl
|
||||
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
|
||||
golang.org/x/lint v0.0.0-20191125130003-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
|
||||
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||
golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||
@ -406,7 +406,7 @@ golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.1-0.20130007135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
|
||||
@ -64,7 +64,9 @@ func (l *ViperConfigLoader) Load() (*Config, error) {
|
||||
|
||||
// Set default logger level
|
||||
if os.Getenv("LOG_LEVEL") == "" {
|
||||
os.Setenv("LOG_LEVEL", "info")
|
||||
if err := os.Setenv("LOG_LEVEL", "info"); err != nil {
|
||||
return nil, fmt.Errorf("failed to set LOG_LEVEL: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
// Bind cấu hình vào struct
|
||||
@ -92,7 +94,7 @@ func setDefaultValues(v *viper.Viper) {
|
||||
|
||||
// Server defaults
|
||||
v.SetDefault("server.host", "0.0.0.0")
|
||||
v.SetDefault("server.port", 8080)
|
||||
v.SetDefault("server.port", 3000)
|
||||
v.SetDefault("server.read_timeout", 15) // seconds
|
||||
v.SetDefault("server.write_timeout", 15) // seconds
|
||||
v.SetDefault("server.shutdown_timeout", 30) // seconds
|
||||
|
||||
@ -3,6 +3,7 @@ package logger
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"strings"
|
||||
@ -47,7 +48,9 @@ func captureOutput(f func()) string {
|
||||
f()
|
||||
|
||||
// Close the writer
|
||||
w.Close()
|
||||
if err := w.Close(); err != nil {
|
||||
panic(fmt.Sprintf("failed to close writer: %v", err))
|
||||
}
|
||||
|
||||
// Read the output
|
||||
var buf bytes.Buffer
|
||||
|
||||
@ -9,7 +9,7 @@ APP_LOGGER_LEVEL=info # debug, info, warn, error
|
||||
|
||||
# Server Configuration
|
||||
APP_SERVER_HOST=0.0.0.0
|
||||
APP_SERVER_PORT=8080
|
||||
APP_SERVER_PORT=3000
|
||||
APP_SERVER_READ_TIMEOUT=15
|
||||
APP_SERVER_WRITE_TIMEOUT=15
|
||||
APP_SERVER_SHUTDOWN_TIMEOUT=30
|
||||
|
||||
@ -9,7 +9,7 @@ logger:
|
||||
|
||||
server:
|
||||
host: "0.0.0.0"
|
||||
port: 8080
|
||||
port: 3000
|
||||
read_timeout: 15
|
||||
write_timeout: 15
|
||||
shutdown_timeout: 30
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user