| ## MozDef Online → Offline Setup Milestones (Frontend / Backend / Infra) |
|
|
| This file gives you a **checklist-style plan** for: |
| - Bringing MozDef up **online** (with internet) |
| - Packing everything |
| - Running it **offline** |
|
|
| Each milestone is split into **infrastructure**, **backend**, and **frontend** where it makes sense, so you can see exactly what layer you’re validating. |
|
|
| --- |
|
|
| ## Milestone 1 – Hosts & Tools Ready |
|
|
| ### 1.1 Online host (build + test) |
| - **Do** |
| - Install Docker + Docker Compose. |
| - Ensure ~50 GB free disk. |
| - **Check** |
| ```bash |
| docker --version |
| docker-compose --version |
| docker run --rm hello-world |
| df -h # check free space |
| uname -m # should be x86_64 |
| ``` |
|
|
| ### 1.2 Offline host (final runtime) |
| - **Do** |
| - Install Docker + Docker Compose from local media / mirror. |
| - **Check** |
| ```bash |
| docker --version |
| docker-compose --version |
| uname -m # x86_64 |
| ``` |
|
|
| --- |
|
|
| ## Milestone 2 – Online: Get Source & Build Images |
|
|
| This milestone builds **all layers** inside Docker (isolated from host OS). |
|
|
| ### 2.1 Get MozDef source |
| - **Do** |
| ```bash |
| cd /root |
| git clone https://github.com/mozilla/MozDef.git # or use your existing /root/MozDef |
| cd MozDef |
| ``` |
| - **Check** |
| ```bash |
| ls |
| # expect: alerts bot config docker docs loginput meteor mq rest ... Makefile |
| ``` |
|
|
| ### 2.2 Build all images (infra + backend + frontend) |
| - **Do** |
| ```bash |
| cd /root/MozDef |
| make build |
| ``` |
| - **Check** |
| ```bash |
| docker images | grep mozdef |
| # expect at least: |
| # mozdef/mozdef_base |
| # mozdef/mozdef_elasticsearch |
| # mozdef/mozdef_rabbitmq |
| # mozdef/mozdef_mongodb |
| # mozdef/mozdef_kibana |
| # mozdef/mozdef_nginx |
| # mozdef/mozdef_bootstrap |
| # mozdef/mozdef_loginput |
| # mozdef/mozdef_mq_worker |
| # mozdef/mozdef_rest |
| # mozdef/mozdef_meteor |
| # mozdef/mozdef_alerts |
| # mozdef/mozdef_alertactions |
| # mozdef/mozdef_cron |
| # mozdef/mozdef_syslog |
| ``` |
|
|
| ### 2.3 Confirm runtime isolation (critical OS/Node concern) |
| - **Do** |
| ```bash |
| # host versions (for info only) |
| node --version || echo "no host node" |
| python3 --version || echo "no host python" |
| |
| # container runtimes (REAL runtime MozDef will use) |
| docker run --rm mozdef/mozdef_meteor node --version # expect v8.11.4 |
| docker run --rm mozdef/mozdef_base python3 --version # expect Python 3.6.x |
| ``` |
| - **Goal** |
| - Prove that **Node 8** and **Python 3.6** live inside containers, independent of CentOS/RHEL 8 host packages. |
|
|
| --- |
|
|
| ## Milestone 3 – Online: Full Stack Test (Infra → Backend → Frontend) |
|
|
| ### 3.1 Start everything |
| - **Do** |
| ```bash |
| cd /root/MozDef |
| make run # starts all infra + backend + frontend |
| sleep 300 # wait 5–8 minutes |
| ``` |
| - **Check** |
| ```bash |
| docker-compose -f docker/compose/docker-compose.yml -p mozdef ps |
| # all services should show "Up" (no "unhealthy") |
| ``` |
|
|
| ### 3.2 Infra checks (shared for backend + frontend) |
| - **Elasticsearch** |
| ```bash |
| docker exec -it mozdef_elasticsearch_1 curl \ |
| http://127.0.0.1:9200/_cluster/health?pretty |
| # status: "green" or "yellow" |
| ``` |
| - **RabbitMQ** |
| ```bash |
| docker exec -it mozdef_rabbitmq_1 curl \ |
| http://127.0.0.1:15672 || echo "mgmt UI ok if 200/redirect" |
| ``` |
| - **MongoDB** |
| ```bash |
| docker exec -it mozdef_mongodb_1 \ |
| mongo --port 3002 --eval "db.adminCommand('ping')" |
| ``` |
|
|
| ### 3.3 Backend checks |
| - **loginput** (ingest API) |
| ```bash |
| curl http://localhost:8080/status |
| # {"status":"ok","service":"loginput"} |
| ``` |
| - **rest** (REST API for Meteor) |
| ```bash |
| curl http://localhost:8081/status |
| # {"status":"ok","service":"restapi"} |
| ``` |
|
|
| ### 3.4 Frontend checks |
| - **Meteor UI** |
| ```bash |
| curl -I http://localhost |
| # HTTP/1.1 200 OK |
| ``` |
| - **Kibana** |
| ```bash |
| curl -I http://localhost:9090/app/kibana |
| # HTTP/1.1 200 OK |
| ``` |
|
|
| ### 3.5 End‑to‑end event test (frontend → backend → Elasticsearch) |
| - **Do** |
| ```bash |
| curl -X POST http://localhost:8080/events \ |
| -H "Content-Type: application/json" \ |
| -d '{ |
| "timestamp": "2024-01-15T10:00:00+00:00", |
| "utctimestamp": "2024-01-15T10:00:00+00:00", |
| "hostname": "test.example.com", |
| "processname": "test.py", |
| "processid": 1234, |
| "severity": "INFO", |
| "summary": "Online pre-pack test event", |
| "category": "test", |
| "source": "test", |
| "tags": ["test"], |
| "details": {} |
| }' |
| sleep 10 |
| ``` |
| - **Check** |
| ```bash |
| docker exec -it mozdef_elasticsearch_1 curl \ |
| "http://127.0.0.1:9200/events-*/_search?q=category:test&size=1&pretty" |
| # expect your test event in hits |
| ``` |
|
|
| ### 3.6 Stop stack (ready to freeze for offline) |
| - **Do** |
| ```bash |
| cd /root/MozDef |
| make stop |
| docker-compose -f docker/compose/docker-compose.yml -p mozdef ps |
| # no containers "Up" |
| ``` |
|
|
| --- |
|
|
| ## Milestone 4 – Online: Package for Offline |
|
|
| ### 4.1 Package Docker images (all layers) |
| - **Do (single tar for all)** |
| ```bash |
| mkdir -p ~/mozdef-offline-package/docker-images |
| cd /root/MozDef |
| |
| docker save $(docker images mozdef/* --format "{{.Repository}}:{{.Tag}}") \ |
| -o ~/mozdef-offline-package/docker-images/mozdef-all-images.tar |
| ``` |
| - **Check** |
| ```bash |
| ls -lh ~/mozdef-offline-package/docker-images/mozdef-all-images.tar |
| # ~10–20 GB |
| ``` |
|
|
| ### 4.2 (Optional safety) cache Python / npm |
| - **Python (backend libs)** |
| ```bash |
| mkdir -p ~/mozdef-offline-package/python-packages |
| cd /root/MozDef |
| |
| python3 -m venv /tmp/mozdef-download-env |
| source /tmp/mozdef-download-env/bin/activate |
| |
| pip download -r requirements.txt \ |
| -d ~/mozdef-offline-package/python-packages \ |
| --platform linux_x86_64 --python-version 36 --only-binary=:all: || true |
| ``` |
| - **npm (frontend libs)** – only if you expect to rebuild Meteor offline: |
| ```bash |
| mkdir -p ~/mozdef-offline-package/npm-packages |
| cd /root/MozDef/meteor |
| |
| if [ ! -f package-lock.json ]; then |
| npm install --package-lock-only |
| fi |
| |
| npm ci --cache ~/mozdef-offline-package/npm-packages/.npm \ |
| --prefer-offline=false || npm install --cache ~/mozdef-offline-package/npm-packages/.npm |
| ``` |
|
|
| ### 4.3 Package source code |
| - **Do** |
| ```bash |
| mkdir -p ~/mozdef-offline-package/source-code |
| tar -czf ~/mozdef-offline-package/source-code/MozDef-source.tar.gz /root/MozDef |
| ``` |
|
|
| ### 4.4 Create final archive to move |
| - **Do** |
| ```bash |
| cd ~/mozdef-offline-package |
| tar -czf ../mozdef-offline-package-$(date +%Y%m%d).tar.gz . |
| du -sh ../mozdef-offline-package-*.tar.gz |
| ``` |
|
|
| --- |
|
|
| ## Milestone 5 – Transfer to Offline |
|
|
| - **Option: USB / disk** |
| ```bash |
| cp ../mozdef-offline-package-*.tar.gz /mnt/usb/ |
| ``` |
|
|
| - **Option: split if too big** |
| ```bash |
| cd ~ |
| split -b 4G mozdef-offline-package-*.tar.gz mozdef-part- |
| # rejoin on offline machine: |
| # cat mozdef-part-* > mozdef-offline-package.tar.gz |
| ``` |
|
|
| --- |
|
|
| ## Milestone 6 – Offline: Load Images & Run |
|
|
| ### 6.1 Extract package |
| - **Do** |
| ```bash |
| mkdir -p ~/mozdef-offline-install |
| cd ~/mozdef-offline-install |
| |
| tar -xzf /path/to/mozdef-offline-package-*.tar.gz |
| cd mozdef-offline-package |
| ``` |
|
|
| ### 6.2 Load Docker images (infra + backend + frontend) |
| - **Do** |
| ```bash |
| cd docker-images |
| |
| docker load -i mozdef-all-images.tar |
| |
| docker images | grep mozdef |
| # should list all mozdef/* images |
| ``` |
|
|
| ### 6.3 Install source code |
| - **Do** |
| ```bash |
| cd ~/mozdef-offline-install/mozdef-offline-package |
| mkdir -p /opt/mozdef |
| |
| tar -xzf source-code/MozDef-source.tar.gz -C /opt/mozdef |
| cd /opt/mozdef/MozDef |
| ``` |
|
|
| ### 6.4 Quick isolation sanity check (same as online) |
| - **Do** |
| ```bash |
| node --version || echo "host node (irrelevant)" |
| docker run --rm mozdef/mozdef_meteor node --version # expect v8.11.4 |
| |
| python3 --version || echo "host python (irrelevant)" |
| docker run --rm mozdef/mozdef_base python3 --version # expect Python 3.6.x |
| ``` |
|
|
| --- |
|
|
| ## Milestone 7 – Offline: Start Stack & Validate |
|
|
| ### 7.1 Start all services offline |
| - **Do** |
| ```bash |
| cd /opt/mozdef/MozDef |
| make run |
| sleep 300 |
| ``` |
| - **Check** |
| ```bash |
| docker-compose -f docker/compose/docker-compose.yml -p mozdef ps |
| # all services "Up" |
| ``` |
|
|
| ### 7.2 Infra checks (same as online) |
| - **Elasticsearch / RabbitMQ / MongoDB** – same commands as Milestone 3.2. |
|
|
| ### 7.3 Backend checks |
| - **loginput** |
| ```bash |
| curl http://localhost:8080/status |
| ``` |
| - **rest** |
| ```bash |
| curl http://localhost:8081/status |
| ``` |
|
|
| ### 7.4 Frontend checks |
| - **Meteor UI** |
| ```bash |
| curl -I http://localhost |
| ``` |
| - **Kibana** |
| ```bash |
| curl -I http://localhost:9090/app/kibana |
| ``` |
|
|
| ### 7.5 Offline end‑to‑end event test |
| - **Do** |
| ```bash |
| curl -X POST http://localhost:8080/events \ |
| -H "Content-Type: application/json" \ |
| -d '{ |
| "timestamp": "2024-01-15T10:00:00+00:00", |
| "utctimestamp": "2024-01-15T10:00:00+00:00", |
| "hostname": "offline.example.com", |
| "processname": "test.py", |
| "processid": 1234, |
| "severity": "INFO", |
| "summary": "Offline test event", |
| "category": "offline-test", |
| "source": "offline", |
| "tags": ["offline","test"], |
| "details": {} |
| }' |
| sleep 10 |
| ``` |
| - **Check** |
| ```bash |
| docker exec -it mozdef_elasticsearch_1 curl \ |
| "http://127.0.0.1:9200/events-*/_search?q=category:offline-test&size=1&pretty" |
| # expect your offline event |
| ``` |
|
|
| --- |
|
|
| ## How to Use This Milestone File |
|
|
| - Go milestone by milestone. |
| - After each **Check** section passes, you know that layer (infra/backend/frontend) is good. |
| - The detailed command reference for packaging, manifests, and scripts lives in `OFFLINE_DEPLOYMENT_GUIDE.md`. |
| This file is your **progress checklist**; the guide is the **full cookbook**. |
|
|
|
|