From 6555d33e91432e279f21cafbc76a0225bd09906a Mon Sep 17 00:00:00 2001 From: Neru_Han Date: Fri, 21 Aug 2026 18:46:29 +0900 Subject: [PATCH] docs: clarify standalone 2-file Docker deployment without git clone --- .cline-context.md | 4 ++-- README.md | 50 +++++++++++++++++++++++++++++----------------- docker-compose.yml | 2 -- 3 files changed, 34 insertions(+), 22 deletions(-) diff --git a/.cline-context.md b/.cline-context.md index 0f898b5..8fc4c81 100644 --- a/.cline-context.md +++ b/.cline-context.md @@ -26,9 +26,9 @@ - Added localized i18n strings for Export across English, Korean, and Japanese. - Configured production multi-stage `Dockerfile` with standalone Next.js runner, Prisma CLI migrations support, and automated `docker-entrypoint.sh` startup script. - Added `.dockerignore` for minimal context transfer and fast build times. - - Refined `docker-compose.yml` and `.env.example` to support prebuilt registry images (`CHECKFLOW_IMAGE`), Watchtower auto-updating labels, and automated database migrations. + - Refined `docker-compose.yml` and `.env.example` to support standalone 2-file deployment (`docker-compose.yml` + `.env`) without cloning source code, prebuilt registry images (`CHECKFLOW_IMAGE`), Watchtower auto-updating labels, and automated database migrations. - Automated Gitea Actions CI workflow (`.gitea/workflows/docker-build.yaml`) for building & pushing container images to Gitea Container Registry with lowercase repository name normalization (`env.REPO`) and OCI source labels (`org.opencontainers.image.source`) for automatic repository package linkage. - - Completely revamped `README.md` to reflect project design philosophy, architecture, Docker setup, Watchtower auto-update, and open-standard CalDAV sync guidelines. + - Completely revamped `README.md` to reflect standalone 2-file Docker deployment (with curl/wget commands), Watchtower auto-update, architecture, and open-standard CalDAV sync guidelines. - Validated that `npm run lint` and `npm run build` execute with 0 errors and 0 warnings. - **Next Steps (Todo):** diff --git a/README.md b/README.md index b5311c0..67cdc09 100644 --- a/README.md +++ b/README.md @@ -72,49 +72,63 @@ ## ๐Ÿš€ ๋น ๋ฅธ ์‹œ์ž‘ (Docker ๋ฐฐํฌ) -CheckFlow๋Š” ๋นŒ๋“œ๋œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ด๋ฏธ์ง€์™€ ์ž๋™ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ง„์ž…์ (`docker-entrypoint.sh`)์„ ์ง€์›ํ•˜์—ฌ `docker compose` ๋ช…๋ น ํ•˜๋‚˜๋กœ ์ฆ‰์‹œ ๋ฐฐํฌ ๋ฐ ๊ตฌ๋™๋ฉ๋‹ˆ๋‹ค. +CheckFlow๋Š” ์‚ฌ์ „ ๋นŒ๋“œ๋œ ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ด๋ฏธ์ง€์™€ ์ž๋™ DB ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ง„์ž…์ (`docker-entrypoint.sh`)์„ ์ œ๊ณตํ•˜๋ฏ€๋กœ, **Git ์†Œ์Šค ์ฝ”๋“œ ๋ณต์ œ(clone) ์—†์ด `docker-compose.yml`๊ณผ `.env` ํŒŒ์ผ ๋‹จ 2๊ฐœ๋งŒ์œผ๋กœ ์ฆ‰์‹œ ๋ฐฐํฌ**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -### 1. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ตฌ์„ฑ -`.env.example` ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜์—ฌ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: +### 1. ๋ฐฐํฌ ๋””๋ ‰ํ„ฐ๋ฆฌ ์ค€๋น„ ๋ฐ ์„ค์ • ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ +์„œ๋ฒ„์˜ ์›ํ•˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ์„ค์ • ํŒŒ์ผ 2๊ฐœ๋ฅผ ๋‚ด๋ ค๋ฐ›์Šต๋‹ˆ๋‹ค: ```bash +mkdir checkflow && cd checkflow + +# docker-compose.yml ๋‹ค์šด๋กœ๋“œ +curl -O https://git.nrh.kr/Neru_Han/checkflow/raw/branch/master/docker-compose.yml + +# .env.example ๋‹ค์šด๋กœ๋“œ ํ›„ .env ์ƒ์„ฑ +curl -O https://git.nrh.kr/Neru_Han/checkflow/raw/branch/master/.env.example cp .env.example .env ``` -`.env` ํŒŒ์ผ ์„ค์ •: +### 2. ํ™˜๊ฒฝ ๋ณ€์ˆ˜(`.env`) ์„ค์ • +`.env` ํŒŒ์ผ์„ ์—ด์–ด ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค: + ```env -# ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋น„๋ฐ€๋ฒˆํ˜ธ (ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ์•ˆ์ „ํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๋ณ€๊ฒฝํ•˜์„ธ์š”) +# [ํ•„์ˆ˜] ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋น„๋ฐ€๋ฒˆํ˜ธ (์•ˆ์ „ํ•œ ๋‚œ์ˆ˜๋กœ ์ง€์ •) POSTGRES_PASSWORD=your_secure_password -# ์„œ๋น„์Šค ๋„๋ฉ”์ธ ๋˜๋Š” ์ ‘๊ทผ IP +# [ํ•„์ˆ˜] ์„œ๋น„์Šค ์ ‘์† URL (๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ๋„๋ฉ”์ธ ๋˜๋Š” IP) NEXTAUTH_URL=https://todo.yourdomain.com -# NextAuth ์ธ์ฆ ์‹œํฌ๋ฆฟ ํ‚ค (openssl rand -base64 32 ๋“ฑ์œผ๋กœ ์ƒ์„ฑ) +# [ํ•„์ˆ˜] NextAuth ์„ธ์…˜ ์•”ํ˜ธํ™” ํ‚ค (openssl rand -base64 32 ๋“ฑ์œผ๋กœ ์ƒ์„ฑ) NEXTAUTH_SECRET=your_generated_random_secret_string -# ์™ธ๋ถ€ ๋…ธ์ถœ ํฌํŠธ (๊ธฐ๋ณธ๊ฐ’: 3000) +# [์„ ํƒ] ์™ธ๋ถ€ ๋…ธ์ถœ ํฌํŠธ (๊ธฐ๋ณธ๊ฐ’: 3000) PORT=3000 -# Gitea / Docker ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ด๋ฏธ์ง€ ์ฃผ์†Œ -CHECKFLOW_IMAGE=git.yourdomain.com/neru_han/checkflow:latest +# [์„ ํƒ] Gitea / Docker ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ด๋ฏธ์ง€ ์ฃผ์†Œ +CHECKFLOW_IMAGE=git.nrh.kr/neru_han/checkflow:latest ``` -### 2. ์ตœ์‹  ์ด๋ฏธ์ง€ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฐ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ +### 3. ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ํ’€(Pull) ๋ฐ ์‹คํ–‰ +Gitea ํŒจํ‚ค์ง€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๊ฐ€ ๋น„๊ณต๊ฐœ์ธ ๊ฒฝ์šฐ ๋จผ์ € ๋„์ปค ๋กœ๊ทธ์ธ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค (๊ณต๊ฐœ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์ธ ๊ฒฝ์šฐ ์ƒ๋žต ๊ฐ€๋Šฅ): + ```bash +# (๋น„๊ณต๊ฐœ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์ธ ๊ฒฝ์šฐ 1ํšŒ ๋กœ๊ทธ์ธ) +docker login git.nrh.kr + # ์ตœ์‹  ๋ฐฐํฌ ์ด๋ฏธ์ง€ ๋‹ค์šด๋กœ๋“œ docker compose pull -# ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ +# ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์„œ๋น„์Šค ์‹œ์ž‘ docker compose up -d ``` -> ๐Ÿ’ก **์ž๋™ DB ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜**: ์ปจํ…Œ์ด๋„ˆ ๊ตฌ๋™ ์‹œ `docker-entrypoint.sh`๊ฐ€ PostgreSQL ํ—ฌ์Šค์ฒดํฌ๋ฅผ ํ™•์ธํ•œ ํ›„ `prisma migrate deploy`๋ฅผ ์ž๋™ ์‹คํ–‰ํ•˜๋ฏ€๋กœ ์ˆ˜๋™ DB ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ ˆ์ฐจ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. +> ๐Ÿ’ก **์ž๋™ DB ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜**: ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ PostgreSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ค€๋น„ ์ƒํƒœ๋ฅผ ํ™•์ธํ•œ ํ›„ `prisma migrate deploy`๋ฅผ ์ž๋™ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ๋ณ„๋„์˜ ์ˆ˜๋™ DB ์„ค์ •์ด ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. -### ๐Ÿ”„ Watchtower ๊ธฐ๋ฐ˜ ์ž๋™ ๊ฐฑ์‹  ๊ถŒ์žฅ -`docker-compose.yml`์˜ `app` ์„œ๋น„์Šค์—๋Š” `com.centurylinklabs.watchtower.enable=true` ๋ผ๋ฒจ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. -Gitea Actions CI ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์ƒˆ ์ด๋ฏธ์ง€๊ฐ€ ํ‘ธ์‹œ๋˜๋ฉด Watchtower๊ฐ€ ์ด๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ๋ฌด์ค‘๋‹จ์— ๊ฐ€๊น๊ฒŒ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์ž๋™ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +### ๐Ÿ”„ Watchtower ๊ธฐ๋ฐ˜ ๋ฌด์ค‘๋‹จ ์ž๋™ ๊ฐฑ์‹  +`docker-compose.yml`์—๋Š” `com.centurylinklabs.watchtower.enable=true` ๋ผ๋ฒจ์ด ๊ธฐ๋ณธ ์ ์šฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. +Gitea Actions CI ํŒŒ์ดํ”„๋ผ์ธ์„ ํ†ตํ•ด ์ƒˆ ์ด๋ฏธ์ง€๊ฐ€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ํ‘ธ์‹œ๋˜๋ฉด, Watchtower๊ฐ€ ์ด๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ž๋™์œผ๋กœ ์ตœ์‹  ์ƒํƒœ๋กœ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค: ```bash -# Watchtower๋ฅผ ์‹คํ–‰ ์ค‘์ธ ๊ฒฝ์šฐ ์ž๋™ ๊ฐ์ง€ (๋˜๋Š” ์›ํด๋ฆญ ์—…๋ฐ์ดํŠธ ์ง€์›) +# Watchtower๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ๊ฒฝ์šฐ CheckFlow ์ปจํ…Œ์ด๋„ˆ ์ž๋™ ๊ฐ์ง€ & ๊ฐฑ์‹  docker run -d \ --name watchtower \ --restart unless-stopped \ @@ -122,7 +136,7 @@ docker run -d \ containrrr/watchtower --interval 300 --cleanup --label-enable ``` -๋ธŒ๋ผ์šฐ์ €์—์„œ ์„ค์ •ํ•œ ๋„๋ฉ”์ธ(๋˜๋Š” `http://localhost:3000`)์— ์ ‘์†ํ•˜์—ฌ ์ฒซ ๊ด€๋ฆฌ์ž ๊ณ„์ •์„ ๋“ฑ๋กํ•˜๊ณ  ์‚ฌ์šฉ์„ ์‹œ์ž‘ํ•˜์„ธ์š”. +๋ธŒ๋ผ์šฐ์ €์—์„œ ์„ค์ •ํ•œ ๋„๋ฉ”์ธ(`https://todo.yourdomain.com` ๋˜๋Š” `http://์„œ๋ฒ„IP:3000`)์— ์ ‘์†ํ•˜์—ฌ ์ฒซ ๊ด€๋ฆฌ์ž ๊ณ„์ •์„ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ”๋กœ ์‚ฌ์šฉ์„ ์‹œ์ž‘ํ•˜์„ธ์š”. --- diff --git a/docker-compose.yml b/docker-compose.yml index e98f3b2..66b3552 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -37,8 +37,6 @@ services: NODE_ENV: production labels: - "com.centurylinklabs.watchtower.enable=true" - volumes: - - ./prisma:/app/prisma volumes: postgres_data: