|
1 | 1 | #!/bin/bash |
2 | 2 | set -e |
3 | 3 |
|
4 | | -# Parse --yes / -y so script can run non-interactively |
5 | 4 | AUTO_YES=false |
6 | 5 | ARGS=() |
7 | 6 | for a in "$@"; do |
8 | | - if [[ "$a" == "--yes" || "$a" == "-y" ]]; then |
9 | | - AUTO_YES=true |
10 | | - else |
11 | | - ARGS+=("$a") |
12 | | - fi |
| 7 | + [[ "$a" == "--yes" || "$a" == "-y" ]] && AUTO_YES=true || ARGS+=("$a") |
13 | 8 | done |
14 | 9 |
|
15 | 10 | ACTION=${ARGS[0]} |
16 | 11 | SERVICE=${ARGS[1]} |
17 | | -ENVIRONMENT=${ARGS[2]:-staging} |
| 12 | +ENVIRONMENT=${ARGS[2]} |
18 | 13 |
|
19 | | -# Check if first arg is an action (start/stop/restart) |
20 | | -if [ "$ACTION" = "start" ] || [ "$ACTION" = "stop" ] || [ "$ACTION" = "restart" ]; then |
21 | | - # First arg is an action, so SERVICE is $2 |
22 | | - if [ -z "$SERVICE" ]; then |
23 | | - echo "Usage: $0 [--yes|-y] start|stop|restart <service> [staging|production]" |
24 | | - echo "Example: $0 start taginfo staging" |
25 | | - exit 1 |
26 | | - fi |
27 | | -fi |
28 | | - |
29 | | -if [ -z "$SERVICE" ]; then |
30 | | - echo "Usage: $0 [--yes|-y] [start|stop|restart] <service> [staging|production]" |
31 | | - echo " --yes, -y Skip confirmation prompts" |
32 | | - echo "Examples:" |
33 | | - echo " $0 taginfo staging # Start service" |
34 | | - echo " $0 --yes start taginfo production # Start without prompting" |
35 | | - echo " $0 stop taginfo staging # Stop service" |
36 | | - echo " $0 restart taginfo staging # Restart service" |
| 14 | +if [ -z "$SERVICE" ] || [ -z "$ENVIRONMENT" ]; then |
| 15 | + echo "Usage: $0 [--yes|-y] start|stop|restart <service> staging|production" |
| 16 | + echo "Example: $0 start taginfo staging" |
37 | 17 | exit 1 |
38 | 18 | fi |
39 | 19 |
|
40 | | -SERVICE_DIR="$(cd "$(dirname "$0")" && pwd)/$SERVICE" |
41 | | -BASE_FILE="$SERVICE_DIR/$SERVICE.base.yml" |
42 | | -ENV_FILE="$SERVICE_DIR/$SERVICE.$ENVIRONMENT.yml" |
43 | | - |
44 | | -# Load environment variables from .env.traefik |
45 | 20 | HETZNER_DIR="$(cd "$(dirname "$0")" && pwd)" |
46 | | -if [ -f "$HETZNER_DIR/.env.traefik" ]; then |
47 | | - export $(grep -v '^#' "$HETZNER_DIR/.env.traefik" | xargs) |
48 | | -fi |
| 21 | +BASE_FILE="$HETZNER_DIR/$SERVICE/$SERVICE.base.yml" |
| 22 | +ENV_FILE="$HETZNER_DIR/$SERVICE/$SERVICE.$ENVIRONMENT.yml" |
49 | 23 |
|
50 | | -# For staging, only use base file. For production, use base + environment file |
51 | | -if [ "$ENVIRONMENT" = "staging" ]; then |
52 | | - COMPOSE_CMD="docker compose -f $BASE_FILE" |
| 24 | +[ -f "$HETZNER_DIR/.env.traefik" ] && export $(grep -v '^#' "$HETZNER_DIR/.env.traefik" | xargs) |
| 25 | + |
| 26 | +if [ -f "$ENV_FILE" ]; then |
| 27 | + COMPOSE="docker compose -f $BASE_FILE -f $ENV_FILE" |
53 | 28 | else |
54 | | - COMPOSE_CMD="docker compose -f $BASE_FILE -f $ENV_FILE" |
| 29 | + COMPOSE="docker compose -f $BASE_FILE" |
55 | 30 | fi |
56 | 31 |
|
57 | | -echo "================================================" |
58 | | -echo "Action: $ACTION" |
59 | | -echo "Service: $SERVICE" |
60 | | -echo "Environment: $ENVIRONMENT" |
61 | | -echo "Command: $COMPOSE_CMD" |
62 | | -echo "================================================" |
| 32 | +echo "==> $ACTION $SERVICE ($ENVIRONMENT)" |
| 33 | + |
| 34 | +# Confirm before start/restart (skip with --yes) |
| 35 | +if [[ "$ACTION" == "start" || "$ACTION" == "restart" ]] && [ "$AUTO_YES" != "true" ]; then |
| 36 | + [ "$ENVIRONMENT" = "production" ] && echo "WARNING: Deploying to PRODUCTION" |
| 37 | + echo "" |
| 38 | + $COMPOSE config |
| 39 | + echo "" |
| 40 | + read -p "Continue? (yes/no): " confirm |
| 41 | + [ "$confirm" != "yes" ] && echo "Cancelled." && exit 0 |
| 42 | +fi |
63 | 43 |
|
64 | 44 | case "$ACTION" in |
65 | | - start) |
66 | | - # Show merged configuration before deploying |
67 | | - echo "" |
68 | | - echo "Preview of merged configuration:" |
69 | | - echo "================================================" |
70 | | - |
71 | | - # Try to use colored output if available |
72 | | - if command -v bat &> /dev/null; then |
73 | | - $COMPOSE_CMD config | bat --language yaml --style=plain |
74 | | - elif command -v pygmentize &> /dev/null; then |
75 | | - $COMPOSE_CMD config | pygmentize -l yaml |
76 | | - elif command -v highlight &> /dev/null; then |
77 | | - $COMPOSE_CMD config | highlight --out-format=ansi --syntax=yaml |
78 | | - else |
79 | | - # Fallback: use basic colors with grep/awk |
80 | | - $COMPOSE_CMD config | while IFS= read -r line; do |
81 | | - if [[ "$line" =~ ^[[:space:]]*# ]]; then |
82 | | - # Comments in gray |
83 | | - echo -e "\033[0;90m$line\033[0m" |
84 | | - elif [[ "$line" =~ ^[[:space:]]*[a-zA-Z_][a-zA-Z0-9_]*: ]]; then |
85 | | - # Keys in yellow |
86 | | - key=$(echo "$line" | sed 's/:.*//') |
87 | | - rest=$(echo "$line" | sed 's/^[^:]*://') |
88 | | - echo -e "\033[0;33m$key\033[0m:\033[0;36m$rest\033[0m" |
89 | | - elif [[ "$line" =~ ^[[:space:]]*- ]]; then |
90 | | - # List items in cyan |
91 | | - echo -e "\033[0;36m$line\033[0m" |
92 | | - else |
93 | | - echo "$line" |
94 | | - fi |
95 | | - done |
96 | | - fi |
97 | | - |
98 | | - echo "================================================" |
99 | | - echo "" |
100 | | - |
101 | | - # Ask for confirmation (skip if --yes/-y) |
102 | | - if [ "$AUTO_YES" != "true" ]; then |
103 | | - if [ "$ENVIRONMENT" = "production" ]; then |
104 | | - echo "⚠️ WARNING: You are about to deploy to PRODUCTION" |
105 | | - echo "" |
106 | | - read -p "Do you want to continue? (yes/no): " confirm |
107 | | - if [ "$confirm" != "yes" ]; then |
108 | | - echo "Deployment cancelled." |
109 | | - exit 0 |
110 | | - fi |
111 | | - else |
112 | | - read -p "Do you want to continue with deployment? (yes/no): " confirm |
113 | | - if [ "$confirm" != "yes" ]; then |
114 | | - echo "Deployment cancelled." |
115 | | - exit 0 |
116 | | - fi |
117 | | - fi |
118 | | - fi |
119 | | - |
120 | | - echo "" |
121 | | - echo "Starting deployment..." |
122 | | - $COMPOSE_CMD up -d |
123 | | - echo "" |
124 | | - echo "✓ Service started: $SERVICE ($ENVIRONMENT)" |
125 | | - echo "" |
126 | | - echo "================================================" |
127 | | - echo "Useful commands:" |
128 | | - echo "================================================" |
129 | | - echo "" |
130 | | - echo "# List running containers for this service:" |
131 | | - echo "docker ps | grep ${SERVICE}" |
132 | | - echo "docker exec -it ${SERVICE}_${ENVIRONMENT} bash" |
133 | | - echo "" |
134 | | - echo "# View logs:" |
135 | | - echo "$COMPOSE_CMD logs -f" |
136 | | - echo "" |
137 | | - ;; |
138 | | - stop) |
139 | | - $COMPOSE_CMD down |
140 | | - echo "Service stopped: $SERVICE ($ENVIRONMENT)" |
141 | | - ;; |
142 | | - restart) |
143 | | - $COMPOSE_CMD restart |
144 | | - echo "Service restarted: $SERVICE ($ENVIRONMENT)" |
145 | | - ;; |
146 | | - *) |
147 | | - echo "Unknown action: $ACTION" |
148 | | - exit 1 |
149 | | - ;; |
| 45 | + start) $COMPOSE up -d ;; |
| 46 | + stop) $COMPOSE down ;; |
| 47 | + restart) $COMPOSE up -d --force-recreate ;; |
| 48 | + *) echo "Unknown action: $ACTION"; exit 1 ;; |
150 | 49 | esac |
| 50 | + |
| 51 | +echo "Done: $ACTION $SERVICE ($ENVIRONMENT)" |
0 commit comments