Skip to content

Commit da194ca

Browse files
authored
feat(API): Adopt the flagsmith entrypoint (#7901)
1 parent 8617611 commit da194ca

7 files changed

Lines changed: 33 additions & 116 deletions

File tree

Dockerfile

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,10 @@ ARG PROMETHEUS_MULTIPROC_DIR="/tmp/prometheus"
135135
ARG ACCESS_LOG_LOCATION="/dev/null"
136136
ENV ACCESS_LOG_LOCATION=${ACCESS_LOG_LOCATION} \
137137
PROMETHEUS_MULTIPROC_DIR=${PROMETHEUS_MULTIPROC_DIR} \
138-
DJANGO_SETTINGS_MODULE=app.settings.production
138+
DJANGO_SETTINGS_MODULE=app.settings.production \
139+
GUNICORN_WORKERS=3 \
140+
GUNICORN_THREADS=2 \
141+
APPLICATION_LOGGERS="app_analytics,audit,code_references,common,core,dynamodb,edge_api,environments,features,import_export,integrations,mcp,oauth2_metadata,organisations,projects,segment_membership,segments,task_processor,users,webhooks,workflows"
139142

140143
ARG CI_COMMIT_SHA
141144
RUN echo ${CI_COMMIT_SHA} > /app/CI_COMMIT_SHA && \
@@ -144,7 +147,7 @@ RUN echo ${CI_COMMIT_SHA} > /app/CI_COMMIT_SHA && \
144147

145148
EXPOSE 8000
146149

147-
ENTRYPOINT ["/app/scripts/run-docker.sh"]
150+
ENTRYPOINT ["flagsmith"]
148151

149152
CMD ["migrate-and-serve"]
150153

api/app/settings/common.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,11 @@
183183
DJANGO_DB_CONN_HEALTH_CHECKS = env.bool("DJANGO_DB_CONN_HEALTH_CHECKS", False)
184184

185185
DATABASE_ROUTERS: list[str] = []
186+
187+
FLAGSMITH_MIGRATE_DATABASES: list[str] = []
188+
FLAGSMITH_WAIT_FOR_MIGRATIONS_DATABASES: list[str] = []
189+
FLAGSMITH_STARTUP_COMMANDS = ["bootstrap"]
190+
186191
# Allows collectstatic to run without a database, mainly for Docker builds to collectstatic at build time
187192
if "DATABASE_URL" in os.environ:
188193
DATABASES = {
@@ -192,6 +197,8 @@
192197
conn_health_checks=DJANGO_DB_CONN_HEALTH_CHECKS,
193198
),
194199
}
200+
FLAGSMITH_MIGRATE_DATABASES.append("default")
201+
FLAGSMITH_WAIT_FOR_MIGRATIONS_DATABASES.append("default")
195202
REPLICA_DATABASE_URLS_DELIMITER = env("REPLICA_DATABASE_URLS_DELIMITER", ",")
196203
REPLICA_DATABASE_URLS = (
197204
env.list(
@@ -249,6 +256,8 @@
249256
conn_health_checks=DJANGO_DB_CONN_HEALTH_CHECKS,
250257
)
251258
DATABASE_ROUTERS.insert(0, "app.routers.AnalyticsRouter")
259+
FLAGSMITH_MIGRATE_DATABASES.append("analytics")
260+
FLAGSMITH_WAIT_FOR_MIGRATIONS_DATABASES.append("analytics")
252261
elif "DJANGO_DB_NAME" in os.environ:
253262
# If there is no DATABASE_URL configured, check for old style DB config parameters
254263
DATABASES = {
@@ -263,6 +272,8 @@
263272
"CONN_HEALTH_CHECKS": DJANGO_DB_CONN_HEALTH_CHECKS,
264273
},
265274
}
275+
FLAGSMITH_MIGRATE_DATABASES.append("default")
276+
FLAGSMITH_WAIT_FOR_MIGRATIONS_DATABASES.append("default")
266277
if "DJANGO_DB_NAME_ANALYTICS" in os.environ:
267278
DATABASES["analytics"] = {
268279
"ENGINE": "django.db.backends.postgresql",
@@ -276,6 +287,8 @@
276287
}
277288

278289
DATABASE_ROUTERS.insert(0, "app.routers.AnalyticsRouter")
290+
FLAGSMITH_MIGRATE_DATABASES.append("analytics")
291+
FLAGSMITH_WAIT_FOR_MIGRATIONS_DATABASES.append("analytics")
279292

280293
# Task processor database — OPTIONALLY SEPARATED
281294
TASK_PROCESSOR_DATABASE_URL = env("TASK_PROCESSOR_DATABASE_URL", default=None)
@@ -305,6 +318,8 @@
305318
"CONN_MAX_AGE": DJANGO_DB_CONN_MAX_AGE,
306319
}
307320
DATABASE_ROUTERS.insert(0, "task_processor.routers.TaskProcessorRouter")
321+
FLAGSMITH_MIGRATE_DATABASES.append("task_processor")
322+
FLAGSMITH_WAIT_FOR_MIGRATIONS_DATABASES.append("task_processor")
308323

309324
# Consume any remaining tasks from 'default' when opting in to 'task_processor' database
310325
_task_processor_databases = ["default", "task_processor"]
@@ -1525,3 +1540,4 @@
15251540
},
15261541
}
15271542
DATABASES["clickhouse"] = _clickhouse_db # type: ignore[assignment]
1543+
FLAGSMITH_MIGRATE_DATABASES.append("clickhouse")

api/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ dependencies = [
7474
"hubspot-api-client>=12.0.0,<13.0.0",
7575
"djangorestframework-dataclasses>=1.3.1,<2.0.0",
7676
"pyotp>=2.9.0,<3.0.0",
77-
"flagsmith-common[common-core,flagsmith-schemas,task-processor]>=3.10.1,<4",
77+
"flagsmith-common[common-core,flagsmith-schemas,task-processor]>=3.11.0,<4",
7878
"django-stubs>=5.1.3,<6.0.0",
7979
"tzdata>=2024.1,<2025.0.0",
8080
"djangorestframework-simplejwt>=5.5.1,<6.0.0",

api/scripts/run-docker.sh

Lines changed: 1 addition & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -1,108 +1,4 @@
11
#!/bin/sh
22
set -e
33

4-
# common environment variables
5-
ACCESS_LOG_FORMAT=${ACCESS_LOG_FORMAT:-'%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s" %({origin}i)s %({access-control-allow-origin}o)s'}
6-
APPLICATION_LOGGERS=${APPLICATION_LOGGERS:-"app_analytics,audit,code_references,common,core,dynamodb,edge_api,environments,features,import_export,integrations,mcp,oauth2_metadata,organisations,projects,segment_membership,segments,task_processor,users,webhooks,workflows"}
7-
8-
waitfordb() {
9-
if [ -z "${SKIP_WAIT_FOR_DB}" ]; then
10-
python manage.py waitfordb "$@"
11-
fi
12-
}
13-
14-
migrate () {
15-
waitfordb \
16-
&& python manage.py showmigrations --verbosity 2 \
17-
&& python manage.py migrate --verbosity 2 \
18-
&& python manage.py createcachetable
19-
}
20-
serve() {
21-
# configuration parameters for statsd. Docs can be found here:
22-
# https://docs.gunicorn.org/en/stable/instrumentation.html
23-
export STATSD_PORT=${STATSD_PORT:-8125}
24-
export STATSD_PREFIX=${STATSD_PREFIX:-flagsmith.api}
25-
26-
waitfordb
27-
28-
exec flagsmith start \
29-
--worker-tmp-dir /dev/shm \
30-
--timeout ${GUNICORN_TIMEOUT:-30} \
31-
--workers ${GUNICORN_WORKERS:-3} \
32-
--threads ${GUNICORN_THREADS:-2} \
33-
--access-logfile $ACCESS_LOG_LOCATION \
34-
--access-logformat "$ACCESS_LOG_FORMAT" \
35-
--keep-alive ${GUNICORN_KEEP_ALIVE:-2} \
36-
${STATSD_HOST:+--statsd-host $STATSD_HOST:$STATSD_PORT} \
37-
${STATSD_HOST:+--statsd-prefix $STATSD_PREFIX} \
38-
api
39-
}
40-
run_task_processor() {
41-
waitfordb --waitfor 30 --migrations
42-
if [ -n "$ANALYTICS_DATABASE_URL" ] || [ -n "$DJANGO_DB_NAME_ANALYTICS" ]; then
43-
waitfordb --waitfor 30 --migrations --database analytics
44-
fi
45-
if [ -n "$TASK_PROCESSOR_DATABASE_URL" ] || [ -n "$TASK_PROCESSOR_DATABASE_NAME" ]; then
46-
waitfordb --waitfor 30 --migrations --database task_processor
47-
fi
48-
exec flagsmith start \
49-
--bind 0.0.0.0:8000 \
50-
--access-logfile $ACCESS_LOG_LOCATION \
51-
--access-logformat "$ACCESS_LOG_FORMAT" \
52-
task-processor \
53-
--sleepintervalms ${TASK_PROCESSOR_SLEEP_INTERVAL_MS:-${TASK_PROCESSOR_SLEEP_INTERVAL:-500}} \
54-
--graceperiodms ${TASK_PROCESSOR_GRACE_PERIOD_MS:-20000} \
55-
--numthreads ${TASK_PROCESSOR_NUM_THREADS:-5} \
56-
--queuepopsize ${TASK_PROCESSOR_QUEUE_POP_SIZE:-10}
57-
58-
}
59-
migrate_analytics_db(){
60-
if [ -z "$ANALYTICS_DATABASE_URL" ] && [ -z "$DJANGO_DB_NAME_ANALYTICS" ]; then
61-
return 0
62-
fi
63-
python manage.py migrate --database analytics
64-
}
65-
migrate_task_processor_db(){
66-
if [ -z "$TASK_PROCESSOR_DATABASE_URL" ] && [ -z "$TASK_PROCESSOR_DATABASE_NAME" ]; then
67-
return 0
68-
fi
69-
python manage.py migrate --database task_processor
70-
}
71-
migrate_clickhouse_db(){
72-
if [ -z "$CLICKHOUSE_URL" ] && [ -z "$CLICKHOUSE_HOST" ]; then
73-
return 0
74-
fi
75-
python manage.py migrate --database clickhouse
76-
}
77-
bootstrap(){
78-
python manage.py bootstrap
79-
}
80-
default(){
81-
python manage.py "$@"
82-
}
83-
84-
set -x
85-
86-
if [ "$1" = "migrate" ]; then
87-
migrate
88-
migrate_analytics_db
89-
migrate_task_processor_db
90-
migrate_clickhouse_db
91-
elif [ "$1" = "serve" ]; then
92-
serve
93-
elif [ "$1" = "run-task-processor" ]; then
94-
migrate
95-
migrate_analytics_db
96-
migrate_task_processor_db
97-
migrate_clickhouse_db
98-
run_task_processor
99-
elif [ "$1" = "migrate-and-serve" ]; then
100-
migrate
101-
migrate_analytics_db
102-
migrate_task_processor_db
103-
migrate_clickhouse_db
104-
bootstrap
105-
serve
106-
else
107-
default "$@"
108-
fi
4+
exec flagsmith "$@"

api/uv.lock

Lines changed: 5 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

infrastructure/aws/production/ecs-task-definition-task-processor.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
{
88
"name": "flagsmith-task-processor",
99
"command": [
10-
"run-task-processor"
10+
"start",
11+
"task-processor"
1112
],
1213
"portMappings": [
1314
{
@@ -29,7 +30,7 @@
2930
"interval": 10,
3031
"timeout": 2,
3132
"retries": 5,
32-
"startPeriod": 120
33+
"startPeriod": 30
3334
},
3435
"essential": true,
3536
"environment": [

infrastructure/aws/staging/ecs-task-definition-task-processor.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"containerDefinitions": [
77
{
88
"name": "flagsmith-task-processor",
9-
"command": ["run-task-processor"],
9+
"command": ["start", "task-processor"],
1010
"portMappings": [
1111
{
1212
"containerPort": 9100,
@@ -24,7 +24,7 @@
2424
"interval": 10,
2525
"timeout": 2,
2626
"retries": 5,
27-
"startPeriod": 120
27+
"startPeriod": 30
2828
},
2929
"essential": true,
3030
"environment": [

0 commit comments

Comments
 (0)