-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstart.sh
More file actions
245 lines (193 loc) · 6.92 KB
/
Copy pathstart.sh
File metadata and controls
245 lines (193 loc) · 6.92 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
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
#!/bin/bash
set -eu
echo "=== docassemble-cloudron start.sh ==="
echo "Domain: ${CLOUDRON_APP_DOMAIN:-unknown}"
# -- 1. Create and seed volatile directories under /run/ ---------------------
mkdir -p /run/nginx-sites-available
mkdir -p /run/nginx-sites-enabled
mkdir -p /run/log/nginx
mkdir -p /run/log/supervisor
mkdir -p /run/log/apache2
mkdir -p /run/log/postgresql
mkdir -p /run/nginx-lib/body /run/nginx-lib/proxy /run/nginx-lib/fastcgi /run/nginx-lib/uwsgi /run/nginx-lib/scgi
mkdir -p /var/run/uwsgi
mkdir -p /var/run/docassemble
mkdir -p /var/run/postgresql
mkdir -p /run/postgresql-data
mkdir -p /run/cron-daily
mkdir -p /run/www-certs
cp /app/code/docassemble.wsgi.seed /run/docassemble.wsgi
chown www-data:www-data /run/docassemble.wsgi
echo "[global]" > /run/pip.conf
chown www-data:www-data /run/pip.conf
ln -sf /usr/share/zoneinfo/UTC /run/localtime
echo "Etc/UTC" > /run/timezone
cp -a /app/code/seed-ssl /run/ssl
cp -a /app/code/seed-www /run/www
chown -R www-data:www-data /run/www
mkdir -p /run/debconf
cp -a /app/code/seed-debconf/* /run/debconf/ 2>/dev/null || true
cp /app/code/seed-locale.gen /run/locale.gen 2>/dev/null || echo "en_US.UTF-8 UTF-8" > /run/locale.gen
echo "" > /run/locale.conf
touch /run/hasbeeninitialized
touch /run/syslog-ng-orig.conf
chown -R postgres:postgres /run/postgresql-data
echo "Volatile directories created."
# -- 2. Seed persistent directories (first boot only) -----------------------
FIRST_BOOT=false
if [ ! -f /app/data/.initialized ]; then
FIRST_BOOT=true
echo "First boot detected. Seeding persistent data..."
if [ ! -d /app/data/config ] || [ -z "$(ls -A /app/data/config 2>/dev/null)" ]; then
mkdir -p /app/data/config
cp -a /app/code/seed-config/* /app/data/config/ 2>/dev/null || true
echo " Seeded: config"
fi
if [ ! -d /app/data/certs ] || [ -z "$(ls -A /app/data/certs 2>/dev/null)" ]; then
mkdir -p /app/data/certs
cp -a /app/code/seed-certs/* /app/data/certs/ 2>/dev/null || true
echo " Seeded: certs"
fi
if [ ! -d /app/data/cron ] || [ -z "$(ls -A /app/data/cron 2>/dev/null)" ]; then
mkdir -p /app/data/cron
cp -a /app/code/seed-cron/* /app/data/cron/ 2>/dev/null || true
echo " Seeded: cron"
fi
# Python venv (~2 GB, only copied on first boot)
if [ ! -d /app/data/venv ] || [ ! -f /app/data/venv/bin/python3 ]; then
echo " Copying Python virtualenv (this takes several minutes)..."
cp -a /app/code/seed-venv /app/data/venv
chown -R www-data:www-data /app/data/venv
echo " Seeded: venv"
fi
fi
# Ensure all persistent directories exist
mkdir -p /app/data/config
mkdir -p /app/data/files
mkdir -p /app/data/log
mkdir -p /app/data/backup
mkdir -p /app/data/certs
mkdir -p /app/data/cron
mkdir -p /app/data/lavinmq
mkdir -p /app/data/venv
# -- 3. Map Cloudron env vars -----------------------------------------------
export DBHOST="${CLOUDRON_POSTGRESQL_HOST}"
export DBPORT="${CLOUDRON_POSTGRESQL_PORT}"
export DBNAME="${CLOUDRON_POSTGRESQL_DATABASE}"
export DBUSER="${CLOUDRON_POSTGRESQL_USERNAME}"
export DBPASSWORD="${CLOUDRON_POSTGRESQL_PASSWORD}"
export DBPREFIX="postgresql+psycopg2://"
export DBBACKUP="false"
if [ -n "${CLOUDRON_REDIS_PASSWORD:-}" ]; then
export DA_REDIS_URL="redis://:${CLOUDRON_REDIS_PASSWORD}@${CLOUDRON_REDIS_HOST}:${CLOUDRON_REDIS_PORT}"
else
export DA_REDIS_URL="redis://${CLOUDRON_REDIS_HOST}:${CLOUDRON_REDIS_PORT}"
fi
export DAHOSTNAME="${CLOUDRON_APP_DOMAIN}"
export BEHINDHTTPSLOADBALANCER="true"
export USEHTTPS="false"
export USELETSENCRYPT="false"
export POSTURLROOT="/"
export PORT="8080"
export DAEMAILSERVER="${CLOUDRON_MAIL_SMTP_SERVER:-}"
export DAEMAILPORT="${CLOUDRON_MAIL_SMTP_PORT:-587}"
export DAEMAILUSER="${CLOUDRON_MAIL_SMTP_USERNAME:-}"
export DAEMAILPASSWORD="${CLOUDRON_MAIL_SMTP_PASSWORD:-}"
export DAEMAILDEFAULTSENDER="${CLOUDRON_MAIL_FROM:-noreply@${CLOUDRON_APP_DOMAIN}}"
export RABBITMQ="amqp://guest:guest@localhost:5672"
export CONTAINERROLE="web:celery:cron:log:mail"
export ENVIRONMENT_TAKES_PRECEDENCE="true"
export DAALLOWUPDATES="true"
export DAENABLEPLAYGROUND="true"
export DAALLOWCONFIGURATIONEDITING="true"
export DASTABLEVERSION="true"
export DAWEBSERVER="nginx"
export DACELERYPROCESSES="${DACELERYPROCESSES:-2}"
# -- 4. Generate config.yml -------------------------------------------------
CONFIG_FILE="/app/data/config/config.yml"
if [ ! -f /app/data/config/.secret ]; then
python3 -c "import secrets; print(secrets.token_urlsafe(32))" > /app/data/config/.secret
fi
SECRET_KEY=$(cat /app/data/config/.secret)
cat > "$CONFIG_FILE" << CONFIGEOF
debug: false
development site is protected: true
root owned: false
db:
prefix: ${DBPREFIX}
name: ${DBNAME}
user: ${DBUSER}
password: ${DBPASSWORD}
host: ${DBHOST}
port: ${DBPORT}
backup: false
redis: ${DA_REDIS_URL}
rabbitmq: ${RABBITMQ}
secretkey: ${SECRET_KEY}
external hostname: ${DAHOSTNAME}
behind https load balancer: true
root: /
url root: /
mail:
server: ${DAEMAILSERVER}
port: ${DAEMAILPORT}
username: ${DAEMAILUSER}
password: ${DAEMAILPASSWORD}
default sender: ${DAEMAILDEFAULTSENDER}
use tls: true
use ssl: false
collect statistics: true
allow log viewing: true
allow configuration editing: true
allow updates: true
enable playground: true
allow demo: false
celery processes: ${DACELERYPROCESSES}
javascript defer: true
CONFIGEOF
echo "config.yml written."
# -- 5. Fix ownership -------------------------------------------------------
chown -R www-data:www-data /app/data/config
chown -R www-data:www-data /app/data/files
chown -R www-data:www-data /app/data/log
chown -R www-data:www-data /app/data/backup
chown -R www-data:www-data /app/data/cron
chown -R www-data:www-data /app/data/venv
chown www-data:www-data /var/run/uwsgi
echo "Ownership fixed."
# -- 6. Start LavinMQ -------------------------------------------------------
echo "Starting LavinMQ..."
lavinmq --data-dir /app/data/lavinmq --bind 127.0.0.1 --amqp-port 5672 &
LAVINMQ_PID=$!
for i in $(seq 1 30); do
if python3 -c "import socket; s=socket.socket(); s.settimeout(1); s.connect(('127.0.0.1',5672)); s.close()" 2>/dev/null; then
echo "LavinMQ ready (PID: $LAVINMQ_PID)"
break
fi
sleep 1
done
# -- 7. Graceful shutdown handler -------------------------------------------
cleanup() {
echo "=== SIGTERM received, shutting down ==="
if [ -n "${SUPERVISOR_PID:-}" ]; then
kill -TERM "$SUPERVISOR_PID" 2>/dev/null || true
wait "$SUPERVISOR_PID" 2>/dev/null || true
fi
if [ -n "${LAVINMQ_PID:-}" ]; then
kill -TERM "$LAVINMQ_PID" 2>/dev/null || true
wait "$LAVINMQ_PID" 2>/dev/null || true
fi
echo "=== Shutdown complete ==="
exit 0
}
trap cleanup SIGTERM SIGINT
# -- 8. Launch supervisord --------------------------------------------------
echo "Launching supervisord..."
/usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf &
SUPERVISOR_PID=$!
if [ "$FIRST_BOOT" = true ]; then
touch /app/data/.initialized
echo "First boot complete."
fi
echo "=== docassemble-cloudron running ==="
wait "$SUPERVISOR_PID"