Skip to content

Commit 5162c7b

Browse files
author
Enrico Wilhelm
committed
Add ISMS Django project
1 parent b63dc63 commit 5162c7b

272 files changed

Lines changed: 15098 additions & 0 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.dockerignore

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
.venv
2+
__pycache__
3+
*.pyc
4+
*.pyo
5+
*.pyd
6+
*.sqlite3
7+
.env
8+
.git
9+
.github
10+
media
11+
staticfiles
12+
models
13+
node_modules
14+
.coverage
15+
.pytest_cache
16+
.mypy_cache

.env.development.example

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
DEBUG=True
2+
SECRET_KEY=dev-secret-key
3+
ALLOWED_HOSTS=127.0.0.1,localhost
4+
DATABASE_URL=postgresql://isms:isms@db:5432/isms
5+
POSTGRES_DB=isms
6+
POSTGRES_USER=isms
7+
POSTGRES_PASSWORD=isms
8+
RUN_MIGRATIONS=1
9+
RUN_SEEDS=1
10+
RUN_COLLECTSTATIC=0
11+
APP_SERVER=runserver
12+
LOCAL_LLM_ENABLED=False

.env.example

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
DEBUG=True
2+
SECRET_KEY=change-me
3+
ALLOWED_HOSTS=127.0.0.1,localhost
4+
CSRF_TRUSTED_ORIGINS=
5+
USE_X_FORWARDED_HOST=False
6+
TRUST_X_FORWARDED_PROTO=False
7+
SECURE_SSL_REDIRECT=False
8+
SESSION_COOKIE_SECURE=False
9+
CSRF_COOKIE_SECURE=False
10+
SECURE_HSTS_SECONDS=0
11+
SECURE_HSTS_INCLUDE_SUBDOMAINS=False
12+
SECURE_HSTS_PRELOAD=False
13+
14+
LOCAL_LLM_ENABLED=False
15+
LOCAL_LLM_BACKEND=llama_cpp
16+
LOCAL_LLM_MODEL_NAME=Qwen3-8B-GGUF
17+
LOCAL_LLM_MODEL_PATH=
18+
LOCAL_LLM_N_CTX=8192
19+
LOCAL_LLM_N_THREADS=4
20+
LOCAL_LLM_GPU_LAYERS=0
21+
LOCAL_LLM_VERBOSE_NATIVE=False
22+
LOCAL_LLM_TEST_MAX_TOKENS=96
23+
NVD_API_KEY=
24+
25+
LOCAL_LLM_HF_REPO_ID=MaziyarPanahi/Qwen3-8B-GGUF
26+
LOCAL_LLM_HF_FILENAME=Qwen3-8B.Q4_K_M.gguf
27+
LOCAL_LLM_TARGET_DIR=models
28+
29+
POSTGRES_DB=isms
30+
POSTGRES_USER=isms
31+
POSTGRES_PASSWORD=isms
32+
DATABASE_URL=sqlite:///db.sqlite3

.env.production.example

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
DEBUG=False
2+
SECRET_KEY=replace-me-with-a-long-random-secret
3+
ALLOWED_HOSTS=localhost,127.0.0.1
4+
CSRF_TRUSTED_ORIGINS=http://localhost,http://127.0.0.1
5+
USE_X_FORWARDED_HOST=True
6+
TRUST_X_FORWARDED_PROTO=False
7+
SECURE_SSL_REDIRECT=False
8+
SESSION_COOKIE_SECURE=False
9+
CSRF_COOKIE_SECURE=False
10+
SECURE_HSTS_SECONDS=0
11+
SECURE_HSTS_INCLUDE_SUBDOMAINS=False
12+
SECURE_HSTS_PRELOAD=False
13+
DATABASE_URL=postgresql://isms:isms@db:5432/isms
14+
POSTGRES_DB=isms
15+
POSTGRES_USER=isms
16+
POSTGRES_PASSWORD=change-me
17+
RUN_MIGRATIONS=1
18+
RUN_SEEDS=0
19+
RUN_COLLECTSTATIC=1
20+
APP_SERVER=gunicorn
21+
GUNICORN_WORKERS=3
22+
GUNICORN_TIMEOUT=120
23+
NGINX_HOST=localhost
24+
NGINX_CLIENT_MAX_BODY_SIZE=50m
25+
NGINX_PROXY_READ_TIMEOUT=300
26+
LOCAL_LLM_ENABLED=False
27+
LOCAL_LLM_BACKEND=llama_cpp
28+
LOCAL_LLM_MODEL_NAME=Qwen3-8B-GGUF
29+
LOCAL_LLM_MODEL_PATH=/app/models/Qwen3-8B.Q4_K_M.gguf
30+
LOCAL_LLM_N_CTX=8192
31+
LOCAL_LLM_N_THREADS=8
32+
LOCAL_LLM_GPU_LAYERS=0
33+
LOCAL_LLM_VERBOSE_NATIVE=False
34+
LOCAL_LLM_HF_REPO_ID=MaziyarPanahi/Qwen3-8B-GGUF
35+
LOCAL_LLM_HF_FILENAME=Qwen3-8B.Q4_K_M.gguf
36+
LOCAL_LLM_TARGET_DIR=models
37+
NVD_API_KEY=

.env.stage.example

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
DEBUG=False
2+
SECRET_KEY=replace-me-stage-secret
3+
ALLOWED_HOSTS=stage.localhost,localhost,127.0.0.1
4+
CSRF_TRUSTED_ORIGINS=http://stage.localhost,http://127.0.0.1:8080
5+
USE_X_FORWARDED_HOST=True
6+
TRUST_X_FORWARDED_PROTO=False
7+
SECURE_SSL_REDIRECT=False
8+
SESSION_COOKIE_SECURE=False
9+
CSRF_COOKIE_SECURE=False
10+
SECURE_HSTS_SECONDS=0
11+
SECURE_HSTS_INCLUDE_SUBDOMAINS=False
12+
SECURE_HSTS_PRELOAD=False
13+
DATABASE_URL=postgresql://isms:isms@db:5432/isms
14+
POSTGRES_DB=isms
15+
POSTGRES_USER=isms
16+
POSTGRES_PASSWORD=change-me
17+
RUN_MIGRATIONS=1
18+
RUN_SEEDS=0
19+
RUN_COLLECTSTATIC=1
20+
APP_SERVER=gunicorn
21+
NGINX_HOST=stage.localhost
22+
NGINX_CLIENT_MAX_BODY_SIZE=50m
23+
NGINX_PROXY_READ_TIMEOUT=300
24+
LOCAL_LLM_ENABLED=False

.github/workflows/ci.yml

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
branches: ["main", "master"]
6+
pull_request:
7+
8+
jobs:
9+
django-core:
10+
runs-on: ubuntu-24.04
11+
steps:
12+
- uses: actions/checkout@v4
13+
- uses: actions/setup-python@v5
14+
with:
15+
python-version: '3.12'
16+
- name: Install app dependencies
17+
run: |
18+
python -m venv .venv
19+
source .venv/bin/activate
20+
python -m pip install --upgrade pip
21+
pip install -r requirements.txt
22+
pip install -r requirements-prod.txt
23+
- name: Django checks and smoke setup
24+
env:
25+
SECRET_KEY: ci-secret-key
26+
DEBUG: 'True'
27+
DATABASE_URL: sqlite:///db.sqlite3
28+
run: |
29+
source .venv/bin/activate
30+
mkdir -p static media
31+
python manage.py makemigrations --check --dry-run
32+
python manage.py migrate --noinput
33+
python manage.py seed_demo || true
34+
python manage.py seed_catalog || true
35+
python manage.py seed_requirements || true
36+
python manage.py seed_product_security || true
37+
python manage.py check
38+
python manage.py test apps.core
39+
40+
llm-runtime-build:
41+
runs-on: ubuntu-24.04
42+
steps:
43+
- uses: actions/checkout@v4
44+
- uses: actions/setup-python@v5
45+
with:
46+
python-version: '3.12'
47+
- name: Install system packages for llama-cpp-python
48+
run: |
49+
sudo apt-get update
50+
sudo apt-get install -y build-essential cmake ninja-build pkg-config python3-dev clang libopenblas-dev g++-14 libstdc++-14-dev
51+
- name: Build llama-cpp-python runtime
52+
run: |
53+
python -m venv .venv
54+
source .venv/bin/activate
55+
python -m pip install --upgrade pip setuptools wheel
56+
export CC=/usr/bin/clang
57+
export CXX=/usr/bin/clang++
58+
export CMAKE_ARGS="-DGGML_BLAS=ON -DGGML_BLAS_VENDOR=OpenBLAS -DLLAMA_BUILD_TOOLS=OFF -DLLAMA_BUILD_EXAMPLES=OFF -DLLAMA_BUILD_SERVER=OFF"
59+
export FORCE_CMAKE=1
60+
pip install --no-cache-dir --force-reinstall --no-binary=llama-cpp-python llama-cpp-python
61+
python -c "import llama_cpp; print('llama-cpp-python OK')"
62+
63+
docker-config:
64+
runs-on: ubuntu-24.04
65+
steps:
66+
- uses: actions/checkout@v4
67+
- name: Validate docker compose files
68+
run: |
69+
docker compose -f docker-compose.yml config
70+
docker compose -f docker-compose.yml -f docker-compose.llm.yml config
71+
docker compose -f docker-compose.yml -f docker-compose.stage.yml config
72+
docker compose -f docker-compose.yml -f docker-compose.prod.yml config
73+
docker compose -f docker-compose.yml -f docker-compose.prod.yml -f docker-compose.llm.yml config

Dockerfile

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
FROM ubuntu:24.04
2+
3+
ARG DEBIAN_FRONTEND=noninteractive
4+
ARG INSTALL_LOCAL_LLM=false
5+
6+
ENV PYTHONDONTWRITEBYTECODE=1 \
7+
PYTHONUNBUFFERED=1 \
8+
PIP_DISABLE_PIP_VERSION_CHECK=1 \
9+
VIRTUAL_ENV=/opt/venv \
10+
PATH="/opt/venv/bin:$PATH"
11+
12+
RUN apt-get update && apt-get install -y --no-install-recommends \
13+
ca-certificates \
14+
git \
15+
python3 \
16+
python3-venv \
17+
python3-pip \
18+
python3-dev \
19+
build-essential \
20+
cmake \
21+
ninja-build \
22+
pkg-config \
23+
libpq-dev \
24+
&& rm -rf /var/lib/apt/lists/*
25+
26+
RUN python3 -m venv $VIRTUAL_ENV && pip install --upgrade pip setuptools wheel
27+
28+
WORKDIR /app
29+
30+
COPY requirements.txt requirements-prod.txt requirements-llm.txt ./
31+
RUN pip install -r requirements-prod.txt
32+
33+
RUN if [ "$INSTALL_LOCAL_LLM" = "true" ]; then \
34+
apt-get update && apt-get install -y --no-install-recommends \
35+
clang \
36+
libopenblas-dev \
37+
g++-14 \
38+
libstdc++-14-dev \
39+
&& rm -rf /var/lib/apt/lists/* && \
40+
CC=/usr/bin/clang \
41+
CXX=/usr/bin/clang++ \
42+
CMAKE_ARGS="-DGGML_BLAS=ON -DGGML_BLAS_VENDOR=OpenBLAS -DLLAMA_BUILD_TOOLS=OFF -DLLAMA_BUILD_EXAMPLES=OFF -DLLAMA_BUILD_SERVER=OFF" \
43+
FORCE_CMAKE=1 \
44+
pip install --no-cache-dir --force-reinstall --no-binary=llama-cpp-python llama-cpp-python && \
45+
pip install 'huggingface_hub>=0.34.0'; \
46+
fi
47+
48+
COPY . .
49+
50+
RUN useradd -ms /bin/bash appuser && \
51+
mkdir -p /app/media /app/staticfiles /app/models && \
52+
chown -R appuser:appuser /app /opt/venv
53+
54+
USER appuser
55+
56+
EXPOSE 8000
57+
58+
ENTRYPOINT ["/app/docker/entrypoint.sh"]

Makefile

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
COMPOSE_DEV=docker compose
2+
COMPOSE_STAGE=docker compose -f docker-compose.yml -f docker-compose.stage.yml
3+
COMPOSE_PROD=docker compose -f docker-compose.yml -f docker-compose.prod.yml
4+
COMPOSE_PROD_LLM=docker compose -f docker-compose.yml -f docker-compose.prod.yml -f docker-compose.llm.yml
5+
6+
.PHONY: dev-up dev-down stage-up stage-down prod-up prod-down prod-up-llm llm-download backup restore health
7+
8+
dev-up:
9+
$(COMPOSE_DEV) up --build
10+
11+
dev-down:
12+
$(COMPOSE_DEV) down
13+
14+
stage-up:
15+
$(COMPOSE_STAGE) up --build -d
16+
17+
stage-down:
18+
$(COMPOSE_STAGE) down
19+
20+
prod-up:
21+
$(COMPOSE_PROD) up --build -d
22+
23+
prod-down:
24+
$(COMPOSE_PROD) down
25+
26+
prod-up-llm:
27+
$(COMPOSE_PROD_LLM) up --build -d
28+
29+
llm-download:
30+
$(COMPOSE_PROD_LLM) run --rm --profile llm-setup model-downloader
31+
32+
backup:
33+
ENV_FILE=.env.production ./scripts/backup_compose.sh
34+
35+
restore:
36+
@echo "Usage: make restore BACKUP=backups/<timestamp>"
37+
@test -n "$(BACKUP)"
38+
ENV_FILE=.env.production ./scripts/restore_compose.sh $(BACKUP)
39+
40+
health:
41+
curl -fsS http://127.0.0.1/health/ready/

0 commit comments

Comments
 (0)