Skip to content

Commit 4f1abfb

Browse files
committed
WIP Uses one Compose service per component
1 parent b23e29c commit 4f1abfb

File tree

8 files changed

+257
-26
lines changed

8 files changed

+257
-26
lines changed

contrib/docker/dev/.env.template

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ TIMESKETCH_CONF_DIR="/etc/timesketch"
1111
TIMESKETCH_SECRET_KEY="L4np0jV3yAdAFdbVzWRMaBqiFMV8FKYd+Je1WKE40o8="
1212
TIMESKETCH_USER="dev"
1313
TIMESKETCH_PASSWORD="dev"
14+
TIMESKETCH_USER_NAME="timesketch"
15+
TIMESKETCH_USER_UID="1000"
16+
TIMESKETCH_USER_GID="1000"
1417

1518
POSTGRES_USER="timesketch"
1619
POSTGRES_PASSWORD="password"

contrib/docker/dev/compose.yaml

Lines changed: 137 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,105 @@ volumes:
1010
prometheus-data:
1111

1212
services:
13-
timesketch:
14-
image: timesketch-timesketch/dev:latest
13+
setup:
14+
image: timesketch-setup:latest
1515
build:
1616
context: ../../..
1717
dockerfile: contrib/docker/dev/timesketch/Dockerfile
18+
target: setup
1819
args:
1920
BASE_IMAGE: "${TIMESKETCH_BASE_IMAGE:?}"
21+
TIMESKETCH_USER_NAME: "${TIMESKETCH_USER_NAME:?}"
22+
TIMESKETCH_USER_UID: "${TIMESKETCH_USER_UID:?}"
23+
TIMESKETCH_USER_GID: "${TIMESKETCH_USER_GID:?}"
24+
TIMESKETCH_CONF_DIR: "${TIMESKETCH_CONF_DIR:?}"
25+
GIFT_PPA_TRACK: "${GIFT_PPA_TRACK:?}"
26+
GIFT_PPA_URL: "${GIFT_PPA_URL:?}"
27+
NODE_VERSION: "${NODE_VERSION:?}"
28+
NODE_PPA_URL: "${NODE_PPA_URL:?}"
29+
NODE_NPMRC: "${NODE_NPMRC?}"
30+
YARN_YARNRC: "${YARN_YARNRC?}"
31+
PYTHON_PIP_CONF: "${PYTHON_PIP_CONF?}"
32+
command: timesketch
33+
env_file:
34+
- timesketch/timesketch.env
35+
volumes:
36+
- "../../../:/usr/local/src/timesketch/"
37+
- "./timesketch/timesketch.conf:${TIMESKETCH_CONF_DIR:?}/timesketch.conf:ro"
38+
- "./timesketch/sigma_rules.txt:${TIMESKETCH_CONF_DIR:?}/sigma_rules.txt:ro"
39+
- "../../../data/sigma_config.yaml:${TIMESKETCH_CONF_DIR:?}/sigma_config.yaml:ro"
40+
- "../../../data/sigma:${TIMESKETCH_CONF_DIR:?}/sigma:ro"
41+
depends_on:
42+
postgresql:
43+
condition: service_healthy
44+
redis:
45+
condition: service_healthy
46+
networks:
47+
- timesketch-dev
48+
49+
celery-worker:
50+
image: timesketch-celery-worker:latest
51+
build:
52+
context: ../../..
53+
dockerfile: contrib/docker/dev/timesketch/Dockerfile
54+
target: celery-worker
55+
args:
56+
BASE_IMAGE: "${TIMESKETCH_BASE_IMAGE:?}"
57+
TIMESKETCH_USER_NAME: "${TIMESKETCH_USER_NAME:?}"
58+
TIMESKETCH_USER_UID: "${TIMESKETCH_USER_UID:?}"
59+
TIMESKETCH_USER_GID: "${TIMESKETCH_USER_GID:?}"
60+
TIMESKETCH_CONF_DIR: "${TIMESKETCH_CONF_DIR:?}"
61+
GIFT_PPA_TRACK: "${GIFT_PPA_TRACK:?}"
62+
GIFT_PPA_URL: "${GIFT_PPA_URL:?}"
63+
NODE_VERSION: "${NODE_VERSION:?}"
64+
NODE_PPA_URL: "${NODE_PPA_URL:?}"
65+
NODE_NPMRC: "${NODE_NPMRC?}"
66+
YARN_YARNRC: "${YARN_YARNRC?}"
67+
PYTHON_PIP_CONF: "${PYTHON_PIP_CONF?}"
68+
command: timesketch
69+
env_file:
70+
- timesketch/timesketch.env
71+
volumes:
72+
- "../../../:/usr/local/src/timesketch/"
73+
- "./timesketch/timesketch.conf:${TIMESKETCH_CONF_DIR:?}/timesketch.conf:ro"
74+
- "../../../data/regex_features.yaml:${TIMESKETCH_CONF_DIR:?}/regex_features.yaml:ro"
75+
- "../../../data/winevt_features.yaml:${TIMESKETCH_CONF_DIR:?}/winevt_features.yaml:ro"
76+
- "../../../data/tags.yaml:${TIMESKETCH_CONF_DIR:?}/tags.yaml:ro"
77+
- "../../../data/intelligence_tag_metadata.yaml:${TIMESKETCH_CONF_DIR:?}/intelligence_tag_metadata.yaml:ro"
78+
- "../../../data/plaso.mappings:${TIMESKETCH_CONF_DIR:?}/plaso.mappings:ro"
79+
- "../../../data/generic.mappings:${TIMESKETCH_CONF_DIR:?}/generic.mappings:ro"
80+
- "../../../data/ontology.yaml:${TIMESKETCH_CONF_DIR:?}/ontology.yaml:ro"
81+
- "../../../data/data_finder.yaml:${TIMESKETCH_CONF_DIR:?}/data_finder.yaml:ro"
82+
- "../../../data/bigquery_matcher.yaml:${TIMESKETCH_CONF_DIR:?}/bigquery_matcher.yaml:ro"
83+
- "../../../data/sigma_config.yaml:${TIMESKETCH_CONF_DIR:?}/sigma_config.yaml:ro"
84+
- "../../../data/sigma:${TIMESKETCH_CONF_DIR:?}/sigma:ro"
85+
- "../../../data/dfiq:${TIMESKETCH_CONF_DIR:?}/dfiq:ro"
86+
- "../../../data/context_links.yaml:${TIMESKETCH_CONF_DIR:?}/context_links.yaml:ro"
87+
- "../../../data/plaso_formatters.yaml:${TIMESKETCH_CONF_DIR:?}/plaso_formatters.yaml:ro"
88+
- "../../../data/nl2q:${TIMESKETCH_CONF_DIR:?}/nl2q:ro"
89+
- "../../../data/llm_summarize:${TIMESKETCH_CONF_DIR:?}/llm_summarize:ro"
90+
depends_on:
91+
postgresql:
92+
condition: service_healthy
93+
opensearch:
94+
condition: service_started
95+
redis:
96+
condition: service_healthy
97+
networks:
98+
- timesketch-dev
99+
100+
gunicorn:
101+
image: timesketch-gunicorn:latest
102+
build:
103+
context: ../../..
104+
dockerfile: contrib/docker/dev/timesketch/Dockerfile
105+
target: gunicorn
106+
args:
107+
BASE_IMAGE: "${TIMESKETCH_BASE_IMAGE:?}"
108+
TIMESKETCH_USER_NAME: "${TIMESKETCH_USER_NAME:?}"
109+
TIMESKETCH_USER_UID: "${TIMESKETCH_USER_UID:?}"
110+
TIMESKETCH_USER_GID: "${TIMESKETCH_USER_GID:?}"
111+
TIMESKETCH_CONF_DIR: "${TIMESKETCH_CONF_DIR:?}"
20112
GIFT_PPA_TRACK: "${GIFT_PPA_TRACK:?}"
21113
GIFT_PPA_URL: "${GIFT_PPA_URL:?}"
22114
NODE_VERSION: "${NODE_VERSION:?}"
@@ -29,9 +121,6 @@ services:
29121
- name: gunicorn
30122
published: "5000"
31123
target: 5000
32-
- name: vite
33-
published: "5001"
34-
target: 5001
35124
- name: metrics
36125
published: "8080"
37126
target: 8080
@@ -40,7 +129,6 @@ services:
40129
volumes:
41130
- "../../../:/usr/local/src/timesketch/"
42131
- "./timesketch/timesketch.conf:${TIMESKETCH_CONF_DIR:?}/timesketch.conf:ro"
43-
- "./timesketch/sigma_rules.txt:${TIMESKETCH_CONF_DIR:?}/sigma_rules.txt:ro"
44132
- "../../../data/regex_features.yaml:${TIMESKETCH_CONF_DIR:?}/regex_features.yaml:ro"
45133
- "../../../data/winevt_features.yaml:${TIMESKETCH_CONF_DIR:?}/winevt_features.yaml:ro"
46134
- "../../../data/tags.yaml:${TIMESKETCH_CONF_DIR:?}/tags.yaml:ro"
@@ -61,9 +149,49 @@ services:
61149
postgresql:
62150
condition: service_healthy
63151
opensearch:
152+
condition: service_started
153+
redis:
64154
condition: service_healthy
155+
networks:
156+
- timesketch-dev
157+
158+
vue-cli-service:
159+
image: timesketch-vue-cli-service:latest
160+
build:
161+
context: ../../..
162+
dockerfile: contrib/docker/dev/timesketch/Dockerfile
163+
target: vue-cli-service
164+
args:
165+
BASE_IMAGE: "${TIMESKETCH_BASE_IMAGE:?}"
166+
TIMESKETCH_USER_NAME: "${TIMESKETCH_USER_NAME:?}"
167+
TIMESKETCH_USER_UID: "${TIMESKETCH_USER_UID:?}"
168+
TIMESKETCH_USER_GID: "${TIMESKETCH_USER_GID:?}"
169+
TIMESKETCH_CONF_DIR: "${TIMESKETCH_CONF_DIR:?}"
170+
GIFT_PPA_TRACK: "${GIFT_PPA_TRACK:?}"
171+
GIFT_PPA_URL: "${GIFT_PPA_URL:?}"
172+
NODE_VERSION: "${NODE_VERSION:?}"
173+
NODE_PPA_URL: "${NODE_PPA_URL:?}"
174+
NODE_NPMRC: "${NODE_NPMRC?}"
175+
YARN_YARNRC: "${YARN_YARNRC?}"
176+
PYTHON_PIP_CONF: "${PYTHON_PIP_CONF?}"
177+
command: timesketch
178+
ports:
179+
- name: vue-cli-service
180+
published: "5001"
181+
target: 5001
182+
env_file:
183+
- timesketch/timesketch.env
184+
volumes:
185+
- "../../../:/usr/local/src/timesketch/"
186+
depends_on:
187+
postgresql:
188+
condition: service_healthy
189+
opensearch:
190+
condition: service_started
65191
redis:
66192
condition: service_healthy
193+
gunicorn:
194+
condition: service_healthy
67195
networks:
68196
- timesketch-dev
69197

@@ -129,7 +257,8 @@ services:
129257

130258
command: --config.file=/etc/prometheus/prometheus.yml
131259
depends_on:
132-
- timesketch
260+
gunicorn:
261+
condition: service_healthy
133262
networks:
134263
- timesketch-dev
135264

@@ -149,6 +278,6 @@ services:
149278
- "/tmp/:/usr/local/src/picadata/"
150279
depends_on:
151280
opensearch:
152-
condition: service_healthy
281+
condition: service_started
153282
networks:
154283
- timesketch-dev

contrib/docker/dev/timesketch/Dockerfile

Lines changed: 75 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,33 @@
11
# Use the official Docker Hub Ubuntu base image
22
ARG BASE_IMAGE="ubuntu:24.04"
3-
FROM $BASE_IMAGE
3+
FROM ${BASE_IMAGE} AS common
44

55
# Prevent needing to configure debian packages, stopping the setup of
66
# the docker container.
77
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
88

9-
RUN apt-get update && apt-get install -y --no-install-recommends \
9+
ARG TIMESKETCH_USER_NAME="timesketch"
10+
ARG TIMESKETCH_USER_UID="1000"
11+
ARG TIMESKETCH_USER_GID="1000"
12+
ARG TIMESKETCH_CONF_DIR="/etc/timesketch"
13+
RUN if ! id -u "${TIMESKETCH_USER_UID}" &>/dev/null; then \
14+
echo "Creating user ${USER_NAME} (${TIMESKETCH_USER_UID}:${TIMESKETCH_USER_GID})..."; \
15+
if getent group "${TIMESKETCH_USER_GID}" >/dev/null; then \
16+
echo "Group with GID ${TIMESKETCH_USER_GID} already exists."; \
17+
else \
18+
echo "Creating group ${TIMESKETCH_USER_NAME} with GID ${TIMESKETCH_USER_GID}..."; \
19+
groupadd -g "${TIMESKETCH_USER_GID}" "${TIMESKETCH_USER_NAME}"; \
20+
fi; \
21+
useradd -m -u "${TIMESKETCH_USER_UID}" -g "${TIMESKETCH_USER_GID}" -s /bin/bash "${TIMESKETCH_USER_NAME}"; \
22+
else \
23+
echo "User with UID ${TIMESKETCH_USER_UID} already exists."; \
24+
fi \
25+
&& for d in "${TIMESKETCH_CONF_DIR}" "/usr/local/src/sigma"; do \
26+
mkdir -p "${d}" \
27+
&& chown "${TIMESKETCH_USER_UID}:${TIMESKETCH_USER_GID}" "${d}"; \
28+
done \
29+
&& apt-get update \
30+
&& apt-get install -y --no-install-recommends \
1031
software-properties-common \
1132
apt-transport-https \
1233
apt-utils \
@@ -61,38 +82,75 @@ RUN set -eux \
6182
ARG NODE_NPMRC=""
6283
RUN if [ -n "${NODE_NPMRC}" ]; then \
6384
env echo -e "${NODE_NPMRC}" > ~/.npmrc; \
85+
cp ~/.npmrc ~${TIMESKETCH_USER_NAME}/; \
86+
chown "${TIMESKETCH_USER_UID}:${TIMESKETCH_USER_GID}" ~${TIMESKETCH_USER_NAME}/.npmrc; \
6487
fi
6588

6689
ARG YARN_YARNRC=""
6790
RUN if [ -n "${YARN_YARNRC}" ]; then \
6891
env echo -e "${YARN_YARNRC}" > ~/.yarnrc; \
92+
cp ~/.yarnrc ~${TIMESKETCH_USER_NAME}/; \
93+
chown "${TIMESKETCH_USER_UID}:${TIMESKETCH_USER_GID}" ~${TIMESKETCH_USER_NAME}/.yarnrc; \
6994
fi
7095

7196
ARG PYTHON_PIP_CONF=""
7297
RUN if [ -n "${PYTHON_PIP_CONF}" ]; then \
73-
mkdir -p ~/.config/pip; \
98+
mkdir -p ~/.config/pip ~${TIMESKETCH_USER_NAME}/.config/pip; \
7499
env echo -e "${PYTHON_PIP_CONF}" > ~/.config/pip/pip.conf; \
100+
cp ~/.config/pip/pip.conf ~${TIMESKETCH_USER_NAME}/.config/pip/pip.conf; \
101+
chown -R "${TIMESKETCH_USER_UID}:${TIMESKETCH_USER_GID}" ~${TIMESKETCH_USER_NAME}/.config; \
75102
fi
76103

77104
# Install Yarn for frontend development
78105
RUN npm install --global yarn
79106

107+
USER "${TIMESKETCH_USER_NAME}"
108+
80109
# Install dependencies for Timesketch in a virtual environment
81-
COPY ["requirements.txt", "/timesketch-requirements.txt"]
82-
COPY ["test_requirements.txt", "/timesketch-test-requirements.txt"]
83-
RUN python3 -m venv --upgrade-deps --system-site-packages /opt/venv \
84-
&& . /opt/venv/bin/activate \
85-
&& pip install --no-cache-dir \
86-
-r /timesketch-requirements.txt \
87-
-r /timesketch-test-requirements.txt \
88-
psycopg2-binary
110+
COPY --chown="${TIMESKETCH_USER_UID}:${TIMESKETCH_USER_GID}" ["api_client", "/usr/local/src/timesketch/api_client/"]
111+
COPY --chown="${TIMESKETCH_USER_UID}:${TIMESKETCH_USER_GID}" ["cli_client", "/usr/local/src/timesketch/cli_client/"]
112+
COPY --chown="${TIMESKETCH_USER_UID}:${TIMESKETCH_USER_GID}" ["end_to_end_tests", "/usr/local/src/timesketch/end_to_end_tests/"]
113+
COPY --chown="${TIMESKETCH_USER_UID}:${TIMESKETCH_USER_GID}" ["importer_client", "/usr/local/src/timesketch/importer_client/"]
114+
COPY --chown="${TIMESKETCH_USER_UID}:${TIMESKETCH_USER_GID}" ["timesketch", "/usr/local/src/timesketch/timesketch/"]
115+
COPY --chown="${TIMESKETCH_USER_UID}:${TIMESKETCH_USER_GID}" ["tests", "/usr/local/src/timesketch/tests/"]
116+
COPY --chown="${TIMESKETCH_USER_UID}:${TIMESKETCH_USER_GID}" [ \
117+
"requirements.txt", \
118+
"setup.py", \
119+
"test_requirements.txt", \
120+
"/usr/local/src/timesketch/" \
121+
]
122+
123+
RUN python3 -m venv --upgrade-deps --system-site-packages "${HOME}/venv" \
124+
&& . "${HOME}/venv/bin/activate" \
125+
&& pip install --no-cache-dir \
126+
-r /usr/local/src/timesketch/requirements.txt \
127+
-r /usr/local/src/timesketch/test_requirements.txt \
128+
&& pip install -e /usr/local/src/timesketch
89129

90130
# Update the PATH to include the virtual environment
91-
ENV PATH="/opt/venv/bin:${PATH}"
131+
ENV PATH="/home/${TIMESKETCH_USER_NAME}/venv/bin:${PATH}"
132+
ENV TIMESKETCH_CONF_DIR="${TIMESKETCH_CONF_DIR}"
133+
134+
FROM common AS setup
135+
136+
COPY --chown=root:root --chmod=755 ["contrib/docker/dev/timesketch/setup-docker-entrypoint.sh", "/usr/local/bin/docker-entrypoint.sh"]
137+
ENTRYPOINT ["docker-entrypoint.sh"]
138+
139+
FROM common AS celery-worker
140+
141+
COPY --chown=root:root --chmod=755 ["contrib/docker/dev/timesketch/celery-worker-docker-entrypoint.sh", "/usr/local/bin/docker-entrypoint.sh"]
142+
ENTRYPOINT ["docker-entrypoint.sh"]
143+
144+
FROM common AS gunicorn
145+
146+
COPY --chown=root:root --chmod=755 ["contrib/docker/dev/timesketch/gunicorn-docker-entrypoint.sh", "/usr/local/bin/docker-entrypoint.sh"]
147+
148+
HEALTHCHECK --interval=10s --timeout=5s --start-period=15s --start-interval=2s --retries=1 \
149+
CMD ["curl", "-f", "-s", "http://localhost:5000/"]
150+
151+
ENTRYPOINT ["docker-entrypoint.sh"]
92152

93-
# Copy the entrypoint script into the container
94-
COPY ["contrib/docker/dev/timesketch/docker-entrypoint.sh", "/"]
95-
RUN chmod a+x /docker-entrypoint.sh
153+
FROM common AS vue-cli-service
96154

97-
# Load the entrypoint script to be run later
98-
ENTRYPOINT ["/docker-entrypoint.sh"]
155+
COPY --chown=root:root --chmod=755 ["contrib/docker/dev/timesketch/vue-cli-service-docker-entrypoint.sh", "/usr/local/bin/docker-entrypoint.sh"]
156+
ENTRYPOINT ["docker-entrypoint.sh"]
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#!/usr/bin/env sh
2+
3+
exec celery \
4+
-A timesketch.lib.tasks \
5+
worker \
6+
--loglevel debug
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#!/usr/bin/env sh
2+
3+
exec gunicorn \
4+
--reload \
5+
-b 0.0.0.0:5000 \
6+
--log-file - \
7+
--timeout 600 \
8+
-c /usr/local/src/timesketch/data/gunicorn_config.py \
9+
timesketch.wsgi:application
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#!/usr/bin/env bash
2+
3+
set -e
4+
5+
# Add web user
6+
tsctl create-user --password "${TIMESKETCH_PASSWORD}" "${TIMESKETCH_USER}"
7+
8+
# Add Sigma rules
9+
git clone --depth 1 https://github.com/SigmaHQ/sigma /usr/local/src/sigma
10+
11+
# for each line in sigma_rules.txt execute the command
12+
while IFS= read -r line; do
13+
if [ -f "${line}" ]; then
14+
tsctl import-sigma-rules "${line}" &
15+
else
16+
echo "Skipping non existing Sigma rule: ${line}"
17+
fi
18+
done < "${TIMESKETCH_CONF_DIR}/sigma_rules.txt"
19+
wait

contrib/docker/dev/timesketch/timesketch.env

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
TIMESKETCH_USER="${TIMESKETCH_USER}"
22
TIMESKETCH_PASSWORD="${TIMESKETCH_PASSWORD}"
3-
TIMESKETCH_CONF_DIR="${TIMESKETCH_CONF_DIR}"
43

54
SECRET_KEY="${TIMESKETCH_SECRET_KEY}"
65
POSTGRES_USER="${POSTGRES_USER}"
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#!/usr/bin/env bash
2+
3+
set -e
4+
5+
cd /usr/local/src/timesketch/timesketch/frontend-ng
6+
7+
yarn install
8+
exec yarn run serve

0 commit comments

Comments
 (0)