-
-
Notifications
You must be signed in to change notification settings - Fork 0
Getting Started
- Docker 24+ and Docker Compose v2
- 8 GB RAM minimum (16 GB recommended when running local LLM via LM Studio)
- Git
git clone https://github.com/zach115th/iris-ng.git
cd iris-ng
# Copy and edit the environment file
cp .env.model .env
# Edit .env — set POSTGRES_PASSWORD, SECRET_KEY, IRIS_ADM_PASSWORD at minimum
docker compose -f docker-compose.dev.yml up -d --buildThe stack comes up on https://localhost (nginx with a self-signed cert).
Default admin credentials are whatever you set in .env.
| Container | Role |
|---|---|
iriswebapp_app |
Flask/gunicorn web + REST API |
iriswebapp_worker |
Celery default queue (hooks, modules) |
iriswebapp_ai_worker |
Celery ai_queue (AI jobs, concurrency=1) |
iriswebapp_db |
PostgreSQL 15 |
iriswebapp_nginx |
TLS termination + reverse proxy |
iriswebapp_rabbitmq |
RabbitMQ broker |
iriswebapp_claude_proxy |
Claude HTTP sidecar (optional, port 7440) |
IRIS-NG ships with an AI backend admin UI at /manage/settings → AI tab.
The default backend is LM Studio (always-on, runs locally). Configure the
primary slot URL to http://host.docker.internal:1234/v1 and the model name to
whatever you have loaded.
Optional: enable the Claude sidecar as the alt slot — see AI Features.
IRIS-NG is purely additive over v2.5.0-beta.1 (new tables and columns only — no renames, no removals), but vanilla DFIR-IRIS cannot connect to an iris-ng database without the schema additions in place.
scripts/import_vanilla_db.sh handles the full migration in two phases — one
command on the old host, one command on the new host.
Run this from the root of your vanilla DFIR-IRIS checkout on the source server:
bash scripts/import_vanilla_db.sh export --out ./iris-export--out is optional; if omitted the script auto-names the directory
./iris-export-YYYYMMDD-HHMMSS. The export creates a directory (not a
single file) containing up to five files:
iris-export/
├── iris.dump ← Postgres dump (required — migration aborts without this)
├── server_data.tar.gz ← uploaded evidence files and datastore
├── user_templates.tar.gz ← uploaded .docx report templates
├── iris-downloads.tar.gz ← previously generated reports
└── secrets.env ← IRIS_SECRET_KEY + IRIS_SECURITY_PASSWORD_SALT
Important: copy the entire directory (all files) to the new host. If you only copy
iris.dump, the script will still run but user passwords and uploaded files will not carry over.
Run this from the root of your iris-ng checkout on the destination server.
The --from flag is required and must point to the directory you copied over:
bash scripts/import_vanilla_db.sh import --from /path/to/iris-exportFor example, if you copied the bundle to /root/iris-ng/iris-export-20260629-184838:
bash scripts/import_vanilla_db.sh import --from /root/iris-ng/iris-export-20260629-184838The script will print a migration plan and ask for confirmation before wiping the existing iris-ng database. It then:
- Stops the app, worker, and ai_worker containers (leaves db running)
- Drops and recreates
iris_db, restores the Postgres dump - Runs a pre-Alembic schema sanity check
- Restores the named volumes (evidence, templates, generated reports)
- Carries
IRIS_SECRET_KEY+IRIS_SECURITY_PASSWORD_SALTinto iris-ng's.env - Reconciles any columns that vanilla's broken
alembic/env.pyleft uncommitted - Brings the app back up — Alembic adds iris-ng's new tables on startup
- Runs a post-Alembic check confirming all iris-ng tables exist
| Flag | What it does |
|---|---|
--out <dir> |
(export) write bundle to this directory (default: auto-named) |
--from <dir> |
(import) required — path to the exported bundle directory |
--skip-volumes |
(import) do not restore evidence/template volumes |
--skip-secrets |
(import) do not carry over IRIS_SECRET_KEY / IRIS_SECURITY_PASSWORD_SALT |
-f / --force
|
skip the confirmation prompt |
- Login with your existing credentials at
https://localhost/login - If secrets were not carried over, find the generated admin password with:
docker compose logs app | grep "Administrator password" - Reconfigure MISP sync under
/manage/modules— the old upstreamiris_misp_moduleconfig does not carry over (iris-ng uses a different module,iris_misp_sync_module)
The script supports vanilla DFIR-IRIS v2.4.x and v2.5.0-beta.1.
Always use --build --force-recreate together:
git pull
docker compose -f docker-compose.dev.yml up -d --build --force-recreateDo not omit --force-recreate. A plain up --build can leave worker
and ai_worker on the old container while only app is rebuilt, causing ORM
mapper state mismatches that crash hook tasks with a NotImplementedError deep
in task_hook_wrapper before any module's hooks_handler runs.
- Navigate to
https://localhost/login - Sign in with the admin credentials from
.env - Go to
/manage/modules→ enable IrisMISPSync if you have a MISP instance - Go to
/manage/settings→ AI tab → enter your LM Studio (or cloud) backend URL
| Port | Service |
|---|---|
443 |
IRIS-NG web UI and API (nginx, TLS) |
7440 |
Claude proxy sidecar (internal Docker network only) |
The default compose stack uses a self-signed certificate generated at container
start. For production, mount your own cert/key into the nginx container by
editing the docker-compose.dev.yml nginx volume mounts.