-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdev-stack.sh
More file actions
executable file
·182 lines (151 loc) · 7.14 KB
/
dev-stack.sh
File metadata and controls
executable file
·182 lines (151 loc) · 7.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
#!/bin/bash
# Script to manage multiple isolated development stacks
# Usage: ./dev-stack.sh <stack-name> <command> [port]
# stack-name: unique identifier for this dev stack (e.g., feature1, user1, etc.)
# command: up, down, logs, ps, restart
# port: apache host port (optional, defaults to auto-assign based on stack name)
set -e
STACK_NAME="${1:-default}"
COMMAND="${2:-up}"
if [ -z "$STACK_NAME" ]; then
echo "Usage: $0 <stack-name> <command> [port]"
echo " stack-name: unique identifier (e.g., feature1, user1)"
echo " command: up, down, logs, ps, restart, exec, shell, migrate, manage, build, init"
echo " port: custom Apache port (optional, auto-assigned if not provided)"
echo ""
echo "Examples:"
echo " $0 feature1 up # Start stack 'feature1' with auto port"
echo " $0 feature1 up 8090 # Start stack 'feature1' on port 8090"
echo " $0 feature1 logs # View logs for stack 'feature1'"
echo " $0 feature1 shell # Open Django shell in stack 'feature1'"
echo " $0 feature1 down # Stop and remove stack 'feature1'"
exit 1
fi
# Generate project name
PROJECT_NAME="${STACK_NAME}"
ENV_FILE=".env.${PROJECT_NAME}"
# Auto-create env file with unique ports if it doesn't exist
if [ ! -f "${ENV_FILE}" ]; then
# Derive a deterministic offset (0–99) from the stack name
HASH=$(echo -n "$STACK_NAME" | cksum | awk '{print $1}')
OFFSET=$((HASH % 100))
cat > "${ENV_FILE}" <<EOF
# Dev stack configuration for ${STACK_NAME} (auto-generated)
DEV_APACHE_PORT=$((8100 + OFFSET))
DEV_REDIS_PORT=$((6400 + OFFSET))
DEV_MYSQL_PORT=$((3400 + OFFSET))
DEV_DJANGO_PORT=$((9000 + OFFSET))
DEV_DEBUGPY_PORT=$((5700 + OFFSET))
EOF
echo "📝 Created ${ENV_FILE} with auto-assigned ports (offset ${OFFSET})"
fi
# Always load base .env file first
if [ -f .env ]; then
export $(grep -v '^#' .env | xargs)
fi
# Check if custom env file exists and override with its values
if [ -f "${ENV_FILE}" ]; then
echo "Using custom environment file: ${ENV_FILE}"
export $(grep -v '^#' ${ENV_FILE} | xargs)
fi
echo "🚀 Development Stack: $STACK_NAME"
echo "📦 Project Name: $PROJECT_NAME"
echo "🌐 Apache Port: $DEV_APACHE_PORT"
echo ""
PORT=$DEV_APACHE_PORT
# Collect all DEV_ env vars to pass through sudo
SUDO_ENV=""
for var in $(compgen -v | grep '^DEV_\|^DB_\|^MYSQL_\|^SECRET_KEY\|^DEBUG\|^CELERY_\|^CACHE_\|^IRIS_\|^OIDC_\|^LDAP_\|^MAILINGLIST_\|^TZ'); do
SUDO_ENV="$SUDO_ENV $var=${!var}"
done
case "$COMMAND" in
up)
echo "Starting development stack..."
sudo $SUDO_ENV docker compose -p "$PROJECT_NAME" -f docker-compose.yml -f docker-compose.dev.yml up -d \
dev-django-app dev-mysql-db dev-redis \
dev-celery-worker dev-celery-beat apache-dev
echo ""
echo "✅ Stack '$STACK_NAME' is running!"
echo " Access URL: http://localhost:$PORT"
echo " Django direct: http://localhost:$(sudo $SUDO_ENV docker compose -p "$PROJECT_NAME" -f docker-compose.yml -f docker-compose.dev.yml port dev-django-app 8000 2>/dev/null | cut -d: -f2 || echo "N/A")"
echo ""
echo "Useful commands:"
echo " View logs: $0 $STACK_NAME logs"
echo " Django shell: $0 $STACK_NAME shell"
echo " Stop stack: $0 $STACK_NAME down"
;;
down)
echo "Stopping and removing development stack..."
sudo $SUDO_ENV docker compose -p "$PROJECT_NAME" -f docker-compose.yml -f docker-compose.dev.yml down
echo "✅ Stack '$STACK_NAME' stopped and removed"
;;
logs)
sudo $SUDO_ENV docker compose -p "$PROJECT_NAME" -f docker-compose.yml -f docker-compose.dev.yml logs -f "${@:3}"
;;
ps)
sudo $SUDO_ENV docker compose -p "$PROJECT_NAME" -f docker-compose.yml -f docker-compose.dev.yml ps
;;
restart)
echo "Restarting development stack..."
sudo $SUDO_ENV docker compose -p "$PROJECT_NAME" -f docker-compose.yml -f docker-compose.dev.yml restart "${@:3}"
echo "✅ Stack '$STACK_NAME' restarted"
;;
exec)
if [ -z "$4" ]; then
echo "Usage: $0 $STACK_NAME exec <service> <command>"
echo "Example: $0 $STACK_NAME exec dev-django-app python manage.py migrate"
exit 1
fi
sudo $SUDO_ENV docker compose -p "$PROJECT_NAME" -f docker-compose.yml -f docker-compose.dev.yml exec "${@:3}"
;;
shell)
echo "Opening Django shell for stack '$STACK_NAME'..."
sudo $SUDO_ENV docker compose -p "$PROJECT_NAME" -f docker-compose.yml -f docker-compose.dev.yml exec dev-django-app python manage.py shell
;;
migrate)
echo "Running migrations for stack '$STACK_NAME'..."
sudo $SUDO_ENV docker compose -p "$PROJECT_NAME" -f docker-compose.yml -f docker-compose.dev.yml exec dev-django-app python manage.py migrate
;;
manage)
echo "Running manage.py command for stack '$STACK_NAME'..."
sudo $SUDO_ENV docker compose -p "$PROJECT_NAME" -f docker-compose.yml -f docker-compose.dev.yml exec dev-django-app python manage.py "${@:3}"
;;
build)
echo "Building development stack..."
sudo $SUDO_ENV docker compose -p "$PROJECT_NAME" -f docker-compose.yml -f docker-compose.dev.yml build \
dev-django-app dev-mysql-db dev-redis \
dev-celery-worker dev-celery-beat apache-dev
echo "✅ Stack '$STACK_NAME' built"
;;
init)
echo "Initialising development stack '$STACK_NAME' (build → up → migrate → collectstatic)..."
echo ""
echo "📦 Building containers..."
sudo $SUDO_ENV docker compose -p "$PROJECT_NAME" -f docker-compose.yml -f docker-compose.dev.yml build \
dev-django-app dev-mysql-db dev-redis \
dev-celery-worker dev-celery-beat apache-dev
echo "🚀 Starting services..."
sudo $SUDO_ENV docker compose -p "$PROJECT_NAME" -f docker-compose.yml -f docker-compose.dev.yml up -d \
dev-django-app dev-mysql-db dev-redis \
dev-celery-worker dev-celery-beat apache-dev
echo "⏳ Waiting for services to be ready..."
sleep 10
echo "🗄️ Running migrations..."
sudo $SUDO_ENV docker compose -p "$PROJECT_NAME" -f docker-compose.yml -f docker-compose.dev.yml exec -T dev-django-app python manage.py migrate
echo "📁 Collecting static files..."
sudo $SUDO_ENV docker compose -p "$PROJECT_NAME" -f docker-compose.yml -f docker-compose.dev.yml exec -T dev-django-app python manage.py collectstatic --noinput
echo "🔄 Restarting Apache..."
sudo $SUDO_ENV docker compose -p "$PROJECT_NAME" -f docker-compose.yml -f docker-compose.dev.yml restart apache-dev
echo ""
echo "✅ Stack '$STACK_NAME' initialised!"
echo " Access URL: http://localhost:$PORT"
echo ""
echo "To create a superuser:"
echo " $0 $STACK_NAME manage createsuperuser"
;;
*)
echo "Unknown command: $COMMAND"
echo "Available commands: up, down, logs, ps, restart, exec, shell, migrate, manage, build, init"
exit 1
;;
esac