Compare commits

...

2 Commits

3 changed files with 105 additions and 1 deletions

26
Dockerfile Normal file
View File

@ -0,0 +1,26 @@
FROM node:22-bookworm-slim
WORKDIR /app
ENV NEXT_TELEMETRY_DISABLED=1
# Build-time NEXT_PUBLIC vars so client bundles can be configured during image build.
ARG NEXT_PUBLIC_SUPABASE_URL
ARG NEXT_PUBLIC_SUPABASE_ANON_KEY
ARG NEXT_PUBLIC_APP_URL
ENV NEXT_PUBLIC_SUPABASE_URL=$NEXT_PUBLIC_SUPABASE_URL \
NEXT_PUBLIC_SUPABASE_ANON_KEY=$NEXT_PUBLIC_SUPABASE_ANON_KEY \
NEXT_PUBLIC_APP_URL=$NEXT_PUBLIC_APP_URL
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build && npm prune --omit=dev
RUN mkdir -p /app/data
EXPOSE 8300
CMD ["npm", "run", "start", "--", "-H", "0.0.0.0", "-p", "8300"]

43
docker-compose.yml Normal file
View File

@ -0,0 +1,43 @@
services:
gantt-board:
image: gantt-board:latest
pull_policy: build
build:
context: .
dockerfile: Dockerfile
args:
NEXT_PUBLIC_SUPABASE_URL: ${NEXT_PUBLIC_SUPABASE_URL:-}
NEXT_PUBLIC_SUPABASE_ANON_KEY: ${NEXT_PUBLIC_SUPABASE_ANON_KEY:-}
NEXT_PUBLIC_APP_URL: ${NEXT_PUBLIC_APP_URL:-}
restart: unless-stopped
ports:
- "${APP_PORT:-8300}:8300"
environment:
NODE_ENV: production
NEXT_TELEMETRY_DISABLED: "1"
NEXT_PUBLIC_SUPABASE_URL: ${NEXT_PUBLIC_SUPABASE_URL:-}
NEXT_PUBLIC_SUPABASE_ANON_KEY: ${NEXT_PUBLIC_SUPABASE_ANON_KEY:-}
SUPABASE_SERVICE_ROLE_KEY: ${SUPABASE_SERVICE_ROLE_KEY:-}
SUPABASE_URL: ${SUPABASE_URL:-}
SUPABASE_ANON_KEY: ${SUPABASE_ANON_KEY:-}
SUPABASE_SECRET_KEY: ${SUPABASE_SECRET_KEY:-}
NEXT_PUBLIC_APP_URL: ${NEXT_PUBLIC_APP_URL:-}
GANTT_MACHINE_TOKEN: ${GANTT_MACHINE_TOKEN:-}
GANTT_MACHINE_USER_ID: ${GANTT_MACHINE_USER_ID:-}
GANTT_MACHINE_USER_NAME: ${GANTT_MACHINE_USER_NAME:-}
GANTT_MACHINE_USER_EMAIL: ${GANTT_MACHINE_USER_EMAIL:-}
RESEND_API_KEY: ${RESEND_API_KEY:-}
RESEND_FROM_EMAIL: ${RESEND_FROM_EMAIL:-}
EMAIL_FROM: ${EMAIL_FROM:-}
VERCEL_URL: ${VERCEL_URL:-}
volumes:
- gantt_board_data:/app/data
healthcheck:
test: ["CMD-SHELL", "node -e \"fetch('http://127.0.0.1:8300/login').then((r)=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\""]
interval: 30s
timeout: 5s
retries: 5
start_period: 45s
volumes:
gantt_board_data:

View File

@ -8,12 +8,23 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck source=./lib/api_client.sh # shellcheck source=./lib/api_client.sh
source "$SCRIPT_DIR/lib/api_client.sh" source "$SCRIPT_DIR/lib/api_client.sh"
# Color support - disable with --no-color or NO_COLOR env var
NO_COLOR="${NO_COLOR:-}"
RED='\033[0;31m' RED='\033[0;31m'
GREEN='\033[0;32m' GREEN='\033[0;32m'
YELLOW='\033[1;33m' YELLOW='\033[1;33m'
BLUE='\033[0;34m' BLUE='\033[0;34m'
NC='\033[0m' NC='\033[0m'
# Disable colors if requested
if [[ -n "$NO_COLOR" ]]; then
RED=''
GREEN=''
YELLOW=''
BLUE=''
NC=''
fi
log_info() { echo -e "${BLUE}i${NC} $1"; } log_info() { echo -e "${BLUE}i${NC} $1"; }
log_success() { echo -e "${GREEN}ok${NC} $1"; } log_success() { echo -e "${GREEN}ok${NC} $1"; }
log_warning() { echo -e "${YELLOW}warn${NC} $1"; } log_warning() { echo -e "${YELLOW}warn${NC} $1"; }
@ -39,7 +50,10 @@ show_usage() {
Task CLI for Gantt Board Task CLI for Gantt Board
USAGE: USAGE:
./task.sh [list|get|create|update|delete|current-sprint|bulk-create] [args...] ./task.sh [--no-color] [list|get|create|update|delete|current-sprint|bulk-create] [args...]
GLOBAL FLAGS:
--no-color Disable colored output (also respects NO_COLOR env var)
COMMANDS: COMMANDS:
list [status] List tasks (supports filters) list [status] List tasks (supports filters)
@ -577,6 +591,27 @@ bulk_create() {
check_dependencies check_dependencies
# Handle global flags before commands
while [[ $# -gt 0 ]]; do
case "${1:-}" in
--no-color)
RED=''
GREEN=''
YELLOW=''
BLUE=''
NC=''
shift
;;
--)
shift
break
;;
*)
break
;;
esac
done
case "${1:-}" in case "${1:-}" in
list) list)
shift shift