From 787f579c1cb820aa204f366f5ae209e5d9c4d9b8 Mon Sep 17 00:00:00 2001 From: toki Date: Tue, 19 May 2026 22:12:50 +0900 Subject: [PATCH] update project configuration and build scripts --- Makefile | 7 ++++-- README.md | 10 ++++---- bin/migrate-up | 12 ++++++++- bin/run | 20 +++++++++++++-- docker-compose.yml | 51 +++++++++------------------------------ goose.env.example | 2 +- internal/config/config.go | 2 ++ 7 files changed, 53 insertions(+), 51 deletions(-) diff --git a/Makefile b/Makefile index fdeb191..b776e46 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,10 @@ export APP_ENV ?= local export HTTP_ADDR ?= :8080 -export DATABASE_URL ?= postgres://nomadcode:nomadcode@localhost:5432/nomadcode?sslmode=disable -export REDIS_URL ?= redis://localhost:6379/0 +export DATABASE_URL ?= postgres://nomadcode:nomadcode@code-server-postgres:5432/nomadcode-core-local?sslmode=disable +export REDIS_URL ?= redis://code-server-redis:6379/3 +export REDIS_KEY_PREFIX ?= nomadcode-core:local +export DEV_REDIS_URL ?= redis://code-server-redis:6379/4 +export DEV_REDIS_KEY_PREFIX ?= nomadcode-core:dev export AUTH_USERNAME ?= nomadcode export GOOSE_DRIVER ?= postgres export GOOSE_DBSTRING ?= $(DATABASE_URL) diff --git a/README.md b/README.md index b1d2587..b7b2e5d 100644 --- a/README.md +++ b/README.md @@ -60,13 +60,13 @@ NomadCode Core는 사용자 요청을 작업 단위로 받고, 작업 상태를 ## 실행 방법 -로컬 실행은 호스트에 Go와 PostgreSQL이 설치되어 있다는 전제로 진행합니다. 기본 `DATABASE_URL`은 `postgres://nomadcode:nomadcode@localhost:5432/nomadcode?sslmode=disable` 입니다. Redis는 이후 event fan-out / realtime push 경로를 위한 선택 구성으로, Docker Compose에서는 `redis://redis:6379/0`로 노출합니다. `AUTH_PASSWORD`를 설정하면 `/readyz`와 `/api/*`에 HTTP Basic Auth가 적용됩니다. +로컬 실행은 현재 개발 호스트의 Go와 `code-server` compose에 붙은 PostgreSQL/Redis가 있다는 전제로 진행합니다. local 기본 `DATABASE_URL`은 `postgres://nomadcode:nomadcode@code-server-postgres:5432/nomadcode-core-local?sslmode=disable` 이고, local 기본 `REDIS_URL`은 `redis://code-server-redis:6379/3`, `REDIS_KEY_PREFIX`는 `nomadcode-core:local` 입니다. dev 배포는 Docker Compose로 실행하며, 같은 `code-server-postgres` Postgres와 `code-server-redis` Redis를 사용합니다. dev DB명은 `nomad-core-dev` 이고, dev 기본 `REDIS_URL`은 `redis://code-server-redis:6379/4`, `REDIS_KEY_PREFIX`는 `nomadcode-core:dev` 입니다. `AUTH_PASSWORD`를 설정하면 `/readyz`와 `/api/*`에 HTTP Basic Auth가 적용됩니다. -PostgreSQL 사용자와 DB 생성 예시: +`code-server` PostgreSQL 컨테이너에 DB를 생성하는 예시: ```bash -psql postgres -c "CREATE USER nomadcode WITH PASSWORD 'nomadcode';" -psql postgres -c "CREATE DATABASE nomadcode OWNER nomadcode;" +docker exec code-server-postgres psql -U nomadcode -d postgres -c 'CREATE DATABASE "nomadcode-core-local" OWNER nomadcode;' +docker exec code-server-postgres psql -U nomadcode -d postgres -c 'CREATE DATABASE "nomad-core-dev" OWNER nomadcode;' ``` Migration 실행: @@ -109,7 +109,7 @@ sqlc 실행: DB 접근 코드는 `migrations/`의 스키마와 `queries/`의 SQL을 기준으로 `internal/db/`에 생성합니다. `internal/db/db.go`, `internal/db/models.go`, `internal/db/tasks.sql.go`는 생성 파일이므로 직접 수정하지 않습니다. -Docker Compose 실행은 PostgreSQL과 Redis를 함께 띄워 통합 확인이 필요할 때 선택적으로 사용합니다. 외부 노출 테스트에서는 `AUTH_PASSWORD`를 함께 지정합니다. +Docker Compose 실행은 dev 배포용입니다. compose는 외부 Docker 네트워크 `net_nginx`에 붙고, 같은 네트워크의 `code-server-postgres`에 `nomad-core-dev` DB로, `code-server-redis`의 Redis DB 4번과 `nomadcode-core:dev` key prefix로 접속합니다. dev Redis 주소나 prefix를 바꿀 때는 local 실행용 `REDIS_URL`, `REDIS_KEY_PREFIX`와 분리된 `DEV_REDIS_URL`, `DEV_REDIS_KEY_PREFIX`를 사용합니다. 외부 노출 테스트에서는 `AUTH_PASSWORD`를 함께 지정합니다. ```bash AUTH_PASSWORD="change-me" ./bin/docker-up diff --git a/bin/migrate-up b/bin/migrate-up index a7a6ad8..4e8ce12 100755 --- a/bin/migrate-up +++ b/bin/migrate-up @@ -5,8 +5,18 @@ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "$ROOT_DIR" GOOSE_DRIVER="${GOOSE_DRIVER:-postgres}" -DATABASE_URL="${DATABASE_URL:-postgres://nomadcode:nomadcode@localhost:5432/nomadcode?sslmode=disable}" +default_database_url="postgres://nomadcode:nomadcode@code-server-postgres:5432/nomadcode-core-local?sslmode=disable" +legacy_code_server_database_url="postgres://nomadcode:nomadcode@code-server-postgres:5432/nomadcode?sslmode=disable" +# code-server exports a shared DATABASE_URL; remap that default to this project's local DB. +if [[ "${DATABASE_URL:-}" == "$legacy_code_server_database_url" ]]; then + DATABASE_URL="$default_database_url" +else + DATABASE_URL="${DATABASE_URL:-$default_database_url}" +fi GOOSE_DBSTRING="${GOOSE_DBSTRING:-$DATABASE_URL}" +if [[ "$GOOSE_DBSTRING" == "$legacy_code_server_database_url" ]]; then + GOOSE_DBSTRING="$DATABASE_URL" +fi if [[ -n "${GOOSE_BIN:-}" ]]; then goose_cmd=("$GOOSE_BIN") diff --git a/bin/run b/bin/run index a02d319..d7e8248 100755 --- a/bin/run +++ b/bin/run @@ -6,8 +6,24 @@ cd "$ROOT_DIR" export APP_ENV="${APP_ENV:-local}" export HTTP_ADDR="${HTTP_ADDR:-:8080}" -export DATABASE_URL="${DATABASE_URL:-postgres://nomadcode:nomadcode@localhost:5432/nomadcode?sslmode=disable}" -export REDIS_URL="${REDIS_URL:-redis://localhost:6379/0}" +default_database_url="postgres://nomadcode:nomadcode@code-server-postgres:5432/nomadcode-core-local?sslmode=disable" +legacy_code_server_database_url="postgres://nomadcode:nomadcode@code-server-postgres:5432/nomadcode?sslmode=disable" +default_redis_url="redis://code-server-redis:6379/3" +legacy_code_server_redis_url="redis://code-server-redis:6379/0" +default_redis_key_prefix="nomadcode-core:local" +# code-server exports a shared DATABASE_URL; remap that default to this project's local DB. +if [[ "${DATABASE_URL:-}" == "$legacy_code_server_database_url" ]]; then + export DATABASE_URL="$default_database_url" +else + export DATABASE_URL="${DATABASE_URL:-$default_database_url}" +fi +# code-server exports a shared REDIS_URL; remap that default to this project's local Redis DB. +if [[ "${REDIS_URL:-}" == "$legacy_code_server_redis_url" ]]; then + export REDIS_URL="$default_redis_url" +else + export REDIS_URL="${REDIS_URL:-$default_redis_url}" +fi +export REDIS_KEY_PREFIX="${REDIS_KEY_PREFIX:-$default_redis_key_prefix}" export AUTH_USERNAME="${AUTH_USERNAME:-nomadcode}" exec go run ./cmd/server "$@" diff --git a/docker-compose.yml b/docker-compose.yml index f44a4c1..515e597 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,54 +1,25 @@ +name: nomadcode-core + services: - postgres: - image: postgres:17-alpine - environment: - POSTGRES_DB: nomadcode - POSTGRES_USER: nomadcode - POSTGRES_PASSWORD: nomadcode - ports: - - "5432:5432" - healthcheck: - test: ["CMD-SHELL", "pg_isready -U nomadcode -d nomadcode"] - interval: 5s - timeout: 5s - retries: 10 - volumes: - - postgres-data:/var/lib/postgresql/data - - redis: - image: redis:7-alpine - command: ["redis-server", "--appendonly", "yes"] - ports: - - "6379:6379" - healthcheck: - test: ["CMD", "redis-cli", "ping"] - interval: 5s - timeout: 5s - retries: 10 - volumes: - - redis-data:/data - nomadcode-core: build: . environment: - APP_ENV: local + APP_ENV: dev HTTP_ADDR: :8080 - DATABASE_URL: postgres://nomadcode:nomadcode@postgres:5432/nomadcode?sslmode=disable - REDIS_URL: redis://redis:6379/0 + DATABASE_URL: ${DATABASE_URL:-postgres://nomadcode:nomadcode@code-server-postgres:5432/nomad-core-dev?sslmode=disable} + REDIS_URL: ${DEV_REDIS_URL:-redis://code-server-redis:6379/4} + REDIS_KEY_PREFIX: ${DEV_REDIS_KEY_PREFIX:-nomadcode-core:dev} AUTH_USERNAME: ${AUTH_USERNAME:-nomadcode} AUTH_PASSWORD: ${AUTH_PASSWORD:-} MATTERMOST_BASE_URL: "" MATTERMOST_TOKEN: "" PLANE_BASE_URL: "" PLANE_TOKEN: "" - depends_on: - postgres: - condition: service_healthy - redis: - condition: service_healthy ports: - "8080:8080" + networks: + - net_nginx -volumes: - postgres-data: - redis-data: +networks: + net_nginx: + external: true diff --git a/goose.env.example b/goose.env.example index b55e3db..977ee46 100644 --- a/goose.env.example +++ b/goose.env.example @@ -1,2 +1,2 @@ GOOSE_DRIVER=postgres -GOOSE_DBSTRING=postgres://nomadcode:nomadcode@localhost:5432/nomadcode?sslmode=disable +GOOSE_DBSTRING=postgres://nomadcode:nomadcode@code-server-postgres:5432/nomadcode-core-local?sslmode=disable diff --git a/internal/config/config.go b/internal/config/config.go index 8d9a6fa..fb6e14c 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -7,6 +7,7 @@ type Config struct { HTTPAddr string DatabaseURL string RedisURL string + RedisKeyPrefix string AuthUsername string AuthPassword string MattermostBaseURL string @@ -21,6 +22,7 @@ func Load() Config { HTTPAddr: getEnv("HTTP_ADDR", ":8080"), DatabaseURL: os.Getenv("DATABASE_URL"), RedisURL: os.Getenv("REDIS_URL"), + RedisKeyPrefix: os.Getenv("REDIS_KEY_PREFIX"), AuthUsername: getEnv("AUTH_USERNAME", "nomadcode"), AuthPassword: os.Getenv("AUTH_PASSWORD"), MattermostBaseURL: os.Getenv("MATTERMOST_BASE_URL"),