Created: February 27, 2026
Status: Phases 0–7 Complete · ALL 120 Labs Scripted · Azure Testing: All Phases ✅ (118/118) · Ansible Integrations ✅ (INT-03–23) · Production Monitoring ✅ · Security CI ✅ · DR Tested ✅ · On-Call Policy ✅ · Thunderbird Integration: INT-24 ✅ · INT-25–29 In Progress
This is the living task list for implementing the IT-Stack project using the framework defined in
PROJECT-FRAMEWORK-TEMPLATE.md.
Check items off as you complete them. Each section maps to a Phase or infrastructure domain.
- Phase 0: Planning & Setup — ✅ Complete
- Phase 1: GitHub Organization Bootstrap
- Phase 2: Local Development Environment
- Phase 3: Documentation Migration
- Phase 4: Module Scaffolding — Phase 1 (Foundation)
- Phase 5: Module Scaffolding — Phase 2 (Collaboration)
- Phase 6: Module Scaffolding — Phase 3 (Back Office)
- Phase 7: Module Scaffolding — Phase 4 (IT Management)
- CI/CD & Automation Setup
- Lab Testing Milestones
- Integration Milestones
- Production Readiness
| Symbol | Meaning |
|---|---|
[ ] |
Not started |
[x] |
Complete |
[-] |
In progress |
[!] |
Blocked / needs decision |
[~] |
Optional / nice-to-have |
Status: ✅ COMPLETE
GitHub orgit-stack-devcreated and empty. Documentation set complete (14 docs).
- Define project name:
it-stack - Create GitHub organization:
it-stack-dev - Define 7 categories (identity, database, collaboration, communications, business, it-management, infrastructure)
- List and number 20 modules (01–20)
- Map all modules to categories
- Define 4 deployment phases (Foundation → Collaboration → Back Office → IT Management)
- Define 4 deployment tiers (lab → school → department → enterprise)
- Complete documentation set assembled (~600 pages, 14 documents in
C:\IT-Stack\docs\) -
PROJECT-FRAMEWORK-TEMPLATE.mdrevised for IT-Stack
Status: ✅ COMPLETE — 26 repos · 5 projects · 39 labels · 4 milestones · 120 issues
- Create repository:
github.com/it-stack-dev/.github - Create
profile/README.md— org homepage - Create
CONTRIBUTING.md— contribution guidelines - Create
CODE_OF_CONDUCT.md— Contributor Covenant - Create
SECURITY.md— vulnerability reporting policy - Create
workflows/ci.yml— reusable CI workflow - Create
workflows/release.yml— reusable release workflow - Create
workflows/security-scan.yml— Trivy security scanning - Create
workflows/docker-build.yml— Docker image build & push to GHCR
- Create
it-stack-docs— MkDocs site live at https://it-stack-dev.github.io/it-stack-docs/- Initialize git in
C:\IT-Stack\ -
git remote add origin https://github.com/it-stack-dev/it-stack-docs.git - Push
mainbranch + GitHub Pages enabled
- Initialize git in
- Create
it-stack-installer— bootstrap & automation scripts - Create
it-stack-testing— integration & e2e testing suite - Create
it-stack-ansible— Full Ansible roles: all 21 services, 20 playbooks, group_vars+host_vars, full site.yml (161 files) - Create
it-stack-terraform— Terraform modules (VM provisioning) - Create
it-stack-helm— Helm charts for all services
- Create Project #6 — "Phase 1: Foundation" (Kanban + Table + Roadmap views)
- Create Project #7 — "Phase 2: Collaboration"
- Create Project #8 — "Phase 3: Back Office"
- Create Project #9 — "Phase 4: IT Management"
- Create Project #10 — "Master Dashboard" (all modules)
- 39 labels × 20+ repos —
lab,module-01…20,phase-1…4, category tags, priority, status
- Create milestone: "Phase 1: Foundation" (target: Week 4)
- Create milestone: "Phase 2: Collaboration" (target: Week 8)
- Create milestone: "Phase 3: Back Office" (target: Week 14)
- Create milestone: "Phase 4: IT Management" (target: Week 20)
Status: ✅ COMPLETE —
C:\IT-Stack\it-stack-dev\· 35 subdirs · all 6 meta repos cloned
- Created
C:\IT-Stack\it-stack-dev\with 35 subdirectories-
repos\meta\,repos\01-identity\throughrepos\07-infrastructure\ -
workspaces\,deployments\,lab-environments\,configs\,scripts\,logs\
-
- All 6 meta repos cloned into
repos\meta\ -
claude.md— AI assistant context file -
README.md— Dev environment quick start -
configs\global\it-stack.yaml— Global config (all 8 servers, subdomains, ports, versions) -
it-stack.code-workspace— VS Code multi-root workspace - [~] PowerShell profile aliases — optional, not yet done
- Tools verified: Git · GitHub CLI · Docker Desktop
Status: ✅ COMPLETE — 21 docs total · 14 migrated · 7 category specs written · MkDocs site live · numbered structure committed
-
docs/01-core/— category specs -
docs/02-implementation/— deployment and integration guides -
docs/03-labs/— lab manuals (parts 1–5) -
docs/04-github/— org structure and setup guides -
docs/05-guides/— master index, AI instructions -
docs/06-technical-reference/— deep technical docs -
docs/07-architecture/— ADRs and diagrams
| New Path | Source Document |
|---|---|
docs/05-guides/01-master-index.md |
MASTER-INDEX.md |
docs/05-guides/02-lab-manual-structure.md |
LAB_MANUAL_STRUCTURE.md |
docs/02-implementation/03-lab-deployment-plan.md |
lab-deployment-plan.md |
docs/02-implementation/04-lab-deployment-plan-v2.md |
lab-deployment-plan(1).md |
docs/06-technical-reference/05-stack-deployment.md |
enterprise-it-stack-deployment.md |
docs/02-implementation/06-stack-complete-v2.md |
enterprise-stack-complete-v2.md |
docs/03-labs/07-lab-manual-part1.md |
enterprise-it-lab-manual.md |
docs/03-labs/08-lab-manual-part2.md |
enterprise-it-lab-manual-part2.md |
docs/03-labs/09-lab-manual-part3.md |
enterprise-it-lab-manual-part3.md |
docs/03-labs/10-lab-manual-part4.md |
enterprise-it-lab-manual-part4.md |
docs/03-labs/11-lab-manual-part5.md |
enterprise-lab-manual-part5.md |
docs/02-implementation/12-integration-guide.md |
integration-guide-complete.md |
docs/04-github/13-github-guide.md |
IT-STACK-GITHUB-GUIDE.md (new) |
docs/05-guides/14-project-framework.md |
PROJECT-FRAMEWORK-TEMPLATE.md |
- All 14 documents migrated to numbered paths
-
MASTER-INDEX.mdupdated with new paths -
docs/README.mdcreated - [~] Front-matter on individual docs — optional, not yet added
-
docs/01-core/01-identity.md— FreeIPA + Keycloak architecture -
docs/01-core/02-database.md— PostgreSQL + Redis + Elasticsearch -
docs/01-core/03-collaboration.md— Nextcloud + Mattermost + Jitsi -
docs/01-core/04-communications.md— iRedMail + FreePBX + Zammad -
docs/01-core/05-business.md— SuiteCRM + Odoo + OpenKM -
docs/01-core/06-it-management.md— Taiga + Snipe-IT + GLPI -
docs/01-core/07-infrastructure.md— Traefik + Zabbix + Graylog
Status: ✅ COMPLETE — 5 repos scaffolded · 30 issues filed · CI passing · Labs 01–05 real content done (25/120 labs)
-
it-stack-freeipa— Labs 01–03 +docker-compose.sso.yml+test-lab-01-04.sh(LDAP federation) +docker-compose.integration.yml+test-lab-01-05.sh(FreeIPA+KC+PG+Redis ecosystem) + CI ✅ -
it-stack-keycloak— Labs 01–03 +docker-compose.sso.yml+test-lab-02-04.sh(OIDC/SAML hub) +docker-compose.integration.yml+test-lab-02-05.sh(OpenLDAP federation+MailHog+multi-app) + CI ✅ -
it-stack-postgresql— Labs 01–03 +docker-compose.sso.yml+test-lab-03-04.sh(pgAdmin+oauth2-proxy) +docker-compose.integration.yml+test-lab-03-05.sh(PG multi-DB+Redis+KC+Traefik+Prometheus) + CI ✅ -
it-stack-redis— Labs 01–03 +docker-compose.sso.yml+test-lab-04-04.sh(redis-commander+oauth2-proxy) +docker-compose.integration.yml+test-lab-04-05.sh(cache+session+LRU+keyspace+KC+Traefik) + CI ✅ -
it-stack-traefik— Labs 01–03 +docker-compose.sso.yml+test-lab-18-04.sh(ForwardAuth) +docker-compose.integration.yml+test-lab-18-05.sh(ForwardAuth+KC+oauth2-proxy+Prometheus) + CI ✅
All 5 repos have:
- Full directory structure, manifest YAML, Makefile, Dockerfile
- 6 Docker Compose files (standalone + lan + advanced + sso + integration + production real)
- 6 lab test scripts (Labs 01–06 all real and complete)
- 3 GitHub Actions workflows:
ci.yml,release.yml,security.yml -
lab-01throughlab-06-smokeCI jobs (all 5 modules) - CI/ShellCheck passing (all 5 green)
- 30 issues created (6 labs × 5 repos), all labeled and milestoned
- All added to GitHub Project #6 (Phase 1: Foundation) and #10 (Master Dashboard)
-
roles/common— base OS hardening, sysctl, locale, Docker, NTP -
roles/freeipa— install + DNS + realm + admin user -
roles/postgresql— install + users + databases + pg_hba -
roles/redis— install + auth + AOF persistence + maxmemory -
roles/keycloak— deploy + realm + LDAP federation -
roles/traefik— deploy + TLS + Let's Encrypt + dashboard -
roles/nextcloud— deploy + Nginx + PHP-FPM + occ integration -
roles/mattermost— deploy + systemd + PostgreSQL config -
roles/jitsi— deploy + Prosody XMPP + JWT auth -
roles/iredmail— deploy + Postfix + Dovecot + PostgreSQL lookups -
roles/zammad— deploy + apt + Elasticsearch integration -
roles/elasticsearch— deploy + cluster config + JVM heap -
roles/freepbx— deploy + Asterisk + PJSIP transports -
roles/suitecrm— deploy + Nginx + PHP-FPM + cron -
roles/odoo— deploy + systemd + workers + PostgreSQL -
roles/openkm— deploy + Tomcat/systemd + Java opts -
roles/taiga— deploy + Gunicorn + LDAP + events -
roles/snipeit— deploy + Laravel + PHP-FPM + env config -
roles/glpi— deploy + Nginx + PHP-FPM + cron -
roles/zabbix— deploy + server + frontend + agent config -
roles/graylog— deploy + MongoDB + Elasticsearch integration -
site.yml— full 20-service phased playbook (6 phases, 16 plays) - 20 targeted playbooks (one per service)
-
inventory/— 8 servers, group_vars (7 files), host_vars (5 files) -
vault/secrets.yml.example— all 40+ vault variable stubs -
Makefile—deploy-phase2,deploy-phase3,deploy-phase4group targets
Status: ✅ COMPLETE — All 6 labs done · 5 modules · 30 labs · Phase 2 COMPLETE 🎉
-
it-stack-nextcloud— scaffolded · Lab 01 ✅ (SQLite standalone, occ/WebDAV/OCS tests) · Lab 02 ✅ (PostgreSQL + Redis external) · Lab 03 ✅ (PHP tuning, cron worker, resource limits) · Lab 04 ✅ (Keycloak OIDC, user_oidc) · Lab 05 ✅ (LDAP federation + OIDC, Redis sessions, cron worker) · Lab 06 ✅ (production: PHP 1G/512M, Redis persist, KC metrics) -
it-stack-mattermost— scaffolded · Lab 01 ✅ (PG sidecar, API/team/channel/post tests) · Lab 02 ✅ (PostgreSQL + Redis external) · Lab 03 ✅ (advanced config, resource limits) · Lab 04 ✅ (Keycloak OIDC) · Lab 05 ✅ (LDAP sync + OIDC, MinIO S3) · Lab 06 ✅ (production: MM metrics :8067, MinIO S3 9110/9111, mm-prod-config vol) -
it-stack-jitsi— scaffolded · Lab 01 ✅ (4-container stack, TLS/BOSH/config.js tests) · Lab 02 ✅ (external dependencies) · Lab 03 ✅ (advanced features, resource limits) · Lab 04 ✅ (JWT/JWKS via Keycloak) · Lab 05 ✅ (Traefik reverse proxy + Keycloak JWT, coturn TURN :3478) · Lab 06 ✅ (production: Traefik 8280/8209, JVB UDP 10002, coturn 3479) -
it-stack-iredmail— scaffolded · Lab 01 ✅ (SMTP/IMAP/webmail, Postfix/Dovecot/MariaDB tests) · Lab 02 ✅ (external dependencies) · Lab 03 ✅ (advanced features, resource limits) · Lab 04 ✅ (Keycloak LDAP Federation) · Lab 05 ✅ (LDAP primary auth + Keycloak LDAP fed, Mailhog SMTP relay) · Lab 06 ✅ (production: ClamAV, Mailhog relay 9026, vmail+backup volumes) -
it-stack-zammad— scaffolded · Lab 01 ✅ (PG+ES+memcached, API/railsserver/scheduler tests) · Lab 02 ✅ (external dependencies) · Lab 03 ✅ (advanced features, resource limits) · Lab 04 ✅ (Keycloak OIDC channel) · Lab 05 ✅ (LDAP user import + OIDC channel, Elasticsearch + Mailhog) · Lab 06 ✅ (production: Elasticsearch 2G, zammad-init pattern, Redis persist) - 30 issues filed, added to Project #7 + #10
- Write real
docker-compose.standalone.yml+test-lab-XX-01.sh✅ (Sprint 7 complete) - Write real
docker-compose.lan.yml+test-lab-XX-02.sh+lab-02-smokeCI ✅ (Sprint 8 complete) - Write real
docker-compose.advanced.yml+test-lab-XX-03.sh+lab-03-smokeCI ✅ (Sprint 9 complete) - Write real
docker-compose.sso.yml+test-lab-XX-04.sh+lab-04-smokeCI ✅ (Sprint 10 complete) - Write real
docker-compose.integration.yml+test-lab-XX-05.sh+lab-05-smokeCI ✅ (Sprint 11 complete) - Write real
docker-compose.production.yml+test-lab-XX-06.sh+lab-06-smokeCI ✅ (Sprint 12 complete)
Status: ✅ COMPLETE — All 6 labs done · 4 modules · 24 labs · Phase 3 COMPLETE 🎉
-
it-stack-freepbx— scaffolded · Lab 01 ✅ · Lab 02 ✅ · Lab 03 ✅ (AMI + recordings/MOH/voicemail + resource limits) · Lab 04 ✅ (Keycloak OIDC) · Lab 05 ✅ (SuiteCRM CTI + Zammad webhook) · Lab 06 ✅ (production: restart policy, resource limits) -
it-stack-suitecrm— scaffolded · Lab 01 ✅ · Lab 02 ✅ · Lab 03 ✅ (Redis session cache + cron container + resource limits) · Lab 04 ✅ (Keycloak SAML) · Lab 05 ✅ (Odoo JSONRPC + Nextcloud CalDAV) · Lab 06 ✅ (production: restart policy, resource limits) -
it-stack-odoo— scaffolded · Lab 01 ✅ · Lab 02 ✅ · Lab 03 ✅ (multi-worker + gevent longpolling + resource limits) · Lab 04 ✅ (Keycloak OIDC) · Lab 05 ✅ (WireMock API mocks) · Lab 06 ✅ (production: restart policy, resource limits) -
it-stack-openkm— scaffolded · Lab 01 ✅ · Lab 02 ✅ · Lab 03 ✅ (Elasticsearch 8.x + resource limits) · Lab 04 ✅ (Keycloak SAML) · Lab 05 ✅ (WireMock API mocks) · Lab 06 ✅ (production: restart policy, resource limits) - 24 issues filed, added to Project #8 + #10
- Write real
docker-compose.standalone.yml+test-lab-XX-01.sh✅ (Sprint 13 complete) - Write real
docker-compose.lan.yml+test-lab-XX-02.sh+lab-02-smokeCI ✅ (Sprint 14 complete) - Write real
docker-compose.advanced.yml+test-lab-XX-03.sh+lab-03-smokeCI ✅ (Sprint 15 complete) - Write real
docker-compose.sso.yml+test-lab-XX-04.sh+lab-04-smokeCI ✅ (Sprint 16 complete) - Write real
docker-compose.integration.yml+test-lab-XX-05.sh+lab-05-smokeCI ✅ (Sprint 17 complete) - Write real
docker-compose.production.yml+test-lab-XX-06.sh+lab-06-smokeCI ✅ (Sprint 18 complete)
Status: ✅ COMPLETE — All 6 labs done for all 6 modules · 36/36 labs · Phase 4 COMPLETE 🎉
-
it-stack-taiga— scaffolded · Lab 01 ✅ · Lab 02 ✅ (PostgreSQL + Redis + Mailhog) · Lab 03 ✅ (async events worker + Redis persistence) · Lab 04 ✅ (Keycloak OIDC + OpenLDAP) · Lab 05 ✅ (WireMock Mattermost webhook mock) · Lab 06 ✅ (production: restart policy, resource limits, Celery events worker) -
it-stack-snipeit— scaffolded · Lab 01 ✅ · Lab 02 ✅ (MariaDB + Mailhog) · Lab 03 ✅ (SESSION/CACHE_DRIVER=redis + queue worker) · Lab 04 ✅ (Keycloak SAML + OpenLDAP) · Lab 05 ✅ (WireMock Odoo REST mock) · Lab 06 ✅ (production: restart policy, resource limits, queue worker) -
it-stack-glpi— scaffolded · Lab 01 ✅ · Lab 02 ✅ (MariaDB + Mailhog) · Lab 03 ✅ (dedicated cron scheduler container) · Lab 04 ✅ (Keycloak SAML + OpenLDAP) · Lab 05 ✅ (WireMock Zammad REST mock) · Lab 06 ✅ (production: restart policy, resource limits, cron container) -
it-stack-elasticsearch— scaffolded · Lab 01 ✅ · Lab 02 ✅ (ES + Kibana LAN tier) · Lab 03 ✅ (ES+Kibana+Logstash pipeline + resource limits) · Lab 04 ✅ (Kibana OIDC + OpenLDAP) · Lab 05 ✅ (WireMock Graylog API mock) · Lab 06 ✅ (production: restart policy, resource limits, ILM env vars) -
it-stack-zabbix— scaffolded · Lab 01 ✅ · Lab 02 ✅ (MySQL + Mailhog) · Lab 03 ✅ (Zabbix Agent2 self-monitoring) · Lab 04 ✅ (Keycloak SAML + OpenLDAP) · Lab 05 ✅ (WireMock Mattermost webhook mock) · Lab 06 ✅ (production: restart policy, resource limits, server+web) -
it-stack-graylog— scaffolded · Lab 01 ✅ · Lab 02 ✅ (MongoDB + Elasticsearch) · Lab 03 ✅ (tuned heap + UDP syslog/GELF inputs + resource limits) · Lab 04 ✅ (Keycloak OIDC + OpenLDAP) · Lab 05 ✅ (WireMock Zabbix HTTP API mock) · Lab 06 ✅ (production: restart policy, resource limits, syslog+GELF UDP inputs) - 36 issues filed, added to Project #9 + #10
- Write real
docker-compose.standalone.yml+test-lab-XX-01.sh✅ (Sprint 19 complete) - Write real
docker-compose.lan.yml+test-lab-XX-02.sh+lab-02-smokeCI ✅ (Sprint 20 complete) - Write real
docker-compose.advanced.yml+test-lab-XX-03.sh+lab-03-smokeCI ✅ (Sprint 21 complete) - Write real
docker-compose.sso.yml+test-lab-XX-04.sh+lab-04-smokeCI ✅ (Sprint 22 complete) - Write real
docker-compose.integration.yml+test-lab-XX-05.sh+lab-05-smokeCI ✅ (Sprint 23 complete) - Write real
docker-compose.production.yml+test-lab-XX-06.sh+lab-06-smokeCI ✅ (Sprint 24 complete)
Status: ✅ WORKFLOWS COMPLETE — 3 workflows × 20 repos = 60 workflow files pushed and passing
-
.github/workflows/ci.yml— ShellCheck · Compose validate · Trivy config scan · Lab 01 smoke test -
.github/workflows/release.yml— Docker build + GHCR push + GitHub Release on semver tags -
.github/workflows/security.yml— Weekly Trivy filesystem + config scan, SARIF → GitHub Security tab - All Phase 1 repos: CI passing ✅ (3 rounds of debugging required — see session notes)
-
scripts/setup/install-tools.ps1— Installs Git, gh, Docker, Helm, kubectl, Ansible -
scripts/setup/setup-directory-structure.ps1— CreatesC:\it-stack-dev\tree -
scripts/setup/setup-github.ps1— Authenticatesgh, sets default org -
scripts/github/create-phase1-modules.ps1 -
scripts/github/create-phase2-modules.ps1 -
scripts/github/create-phase3-modules.ps1 -
scripts/github/create-phase4-modules.ps1 -
scripts/github/add-phase1-issues.ps1 -
scripts/github/add-phase2-issues.ps1 -
scripts/github/add-phase3-issues.ps1 -
scripts/github/add-phase4-issues.ps1 -
scripts/github/create-github-projects.ps1 -
scripts/github/create-milestones.ps1 -
scripts/github/apply-labels.ps1 -
scripts/operations/clone-all-repos.ps1 -
scripts/operations/update-all-repos.ps1 -
scripts/utilities/create-repo-template.ps1— Scaffold a new module repo -
scripts/deployment/deploy-stack.sh— Full stack deployment -
scripts/testing/run-all-labs.sh— Run all 120 lab tests -
scripts/testing/lab-phase1.sh— Phase 1 standalone test runner (18 tests) · 18/18 PASS on Azure Standard_D4s_v4 ✅ (commite3ddab0) -
scripts/testing/lab-phase2.sh— Phase 2 standalone test runner (20 tests: Nextcloud·Mattermost·Jitsi·iRedMail·Zammad) · 20/20 PASS on Azure Standard_D4s_v4 ✅ -
scripts/testing/lab-phase3.sh— Phase 3 standalone test runner (20 tests: FreePBX·SuiteCRM·Odoo·OpenKM) · 20/20 PASS on Azure Standard_D4s_v4 ✅ (commit7751fcc) -
scripts/testing/lab-sso-integrations.sh— SSO integration test runner (35 tests across FreeIPA·Keycloak·Nextcloud·Mattermost·Jitsi·iRedMail·Zammad·SuiteCRM·Odoo·Taiga+Snipe-IT+GLPI stubs) · 35/35 PASS on Azure Standard_D4s_v4 ✅ -
scripts/testing/freeipa-patch/Dockerfile— FreeIPA custom image for Docker 29.x + cgroupv2-only kernels (Fix 1: cgroupv2 RAM check; Fix 2: PrivateTmp=false in httpd.service) -
scripts/test-local-docker.ps1— PowerShell local Docker test runner for all 4 phases - [-] Local Docker test runner Phase 2 failures — Zammad healthcheck
[x]✅ Fixed:nginx:alpineuseswgethealthcheck (no curl in Alpine); increased retries to 40,start_period120s,wait_healthy30×30=900s - [-] Local Docker test runner Phase 3 failures — FreePBX init time
[x]✅ Fixed: addedwait_httphelper; extendedwait_healthyto 60×30=1800s + 10-min HTTP fallback poll (total 40 min cap) - [-] Local Docker test runner Phase 4 failures — Graylog/Snipe-IT healthcheck tuning
[x]✅ Fixed: Snipe-ITwait_healthy48×10=480s + retries→30; Graylogwait_healthy54×20=1080s + retries→36
Track actual hardware validation of lab scripts on Azure VMs. These are distinct from lab script completion (all 120 done) — this tracks verifying scripts run correctly on target hardware.
| Module | Lab 01 (Azure) | Notes |
|---|---|---|
| 01 · FreeIPA | [x] ✅ | patched image (it-stack-freeipa-patched:almalinux-9), 390s install |
| 02 · Keycloak | [x] ✅ | HTTP 302, OIDC token, /health/ready |
| 03 · PostgreSQL | [x] ✅ | pg_isready, CRUD, multi-db |
| 04 · Redis | [x] ✅ | PING, SET/GET, LPUSH/LLEN, AOF |
| 18 · Traefik | [x] ✅ | file provider (Docker 29.x API incompatibility), /ping, dashboard, reverse proxy |
Azure Phase 1 result: 18/18 PASS (2026-03-07, commit e3ddab0)
| Module | Result | Notes |
|---|---|---|
| 06 · Nextcloud | [x] ✅ | HTTP 200, WebDAV, OCS API |
| 07 · Mattermost | [x] ✅ | API ping, team/channel/post created |
| 08 · Jitsi | [x] ✅ | 4-container stack, TLS/BOSH/config.js |
| 09 · iRedMail | [x] ✅ | SMTP:25, IMAP:143, webmail |
| 11 · Zammad | [x] ✅ | Rails server, ES index, API token |
Azure Phase 2 result: 20/20 PASS (lab-phase2.sh)
| Module | Result | Notes |
|---|---|---|
| 10 · FreePBX | [x] ✅ | Admin HTTP, Asterisk CLI, dashboard content |
| 12 · SuiteCRM | [x] ✅ | Apache, login page, config.php, DB |
| 13 · Odoo | [x] ✅ | Web client, XML-RPC, database list |
| 14 · OpenKM | [x] ✅ | Tomcat :8080, REST API (port check via /proc/net/tcp) |
Azure Phase 3 result: 20/20 PASS (2026-03-09, commit 7751fcc)
Azure SSO result: 35/35 PASS (lab-sso-integrations.sh)
| Module | Result | Notes |
|---|---|---|
| 05 · Elasticsearch | ✅ | single-node, xpack disabled, vm.max_map_count, index CRUD |
| 15 · Taiga | ✅ | PostgreSQL + Django back API + nginx front, wait_http polling |
| 16 · Snipe-IT | ✅ | MariaDB healthcheck, HTTP 200, branding |
| 17 · GLPI | ✅ | MariaDB + wait_http (no Docker healthcheck in image) |
| 19 · Zabbix | ✅ | PostgreSQL + web-nginx-pgsql, API jsonrpc v7.2.15 |
| 20 · Graylog | ✅ | MongoDB + ES 7.17, journal size 512mb, lbstatus ALIVE |
Azure Phase 4 result: 25/25 PASS (2026-03-10, commit 22fac0f)
Key fixes: Taiga direct HTTP poll (Django migrations 8–10 min), Graylog journal size cap (GRAYLOG_MESSAGE_JOURNAL_MAX_SIZE=512mb) for disk-constrained labs, correct SHA256 hash for Graylog root password.
Track lab completion status here as you work through the 6-lab progression for each module. Format:
[x]= lab passed,[ ]= not started,[-]= in progress
| Module | Lab 01 | Lab 02 | Lab 03 | Lab 04 | Lab 05 | Lab 06 |
|---|---|---|---|---|---|---|
| 01 · FreeIPA | [x] | [x] | [x] | [x] | [x] | [x] |
| 02 · Keycloak | [x] | [x] | [x] | [x] | [x] | [x] |
| Module | Lab 01 | Lab 02 | Lab 03 | Lab 04 | Lab 05 | Lab 06 |
|---|---|---|---|---|---|---|
| 03 · PostgreSQL | [x] | [x] | [x] | [x] | [x] | [x] |
| 04 · Redis | [x] | [x] | [x] | [x] | [x] | [x] |
| 05 · Elasticsearch | [x] | [x] | [x] | [x] | [x] | [x] |
| Module | Lab 01 | Lab 02 | Lab 03 | Lab 04 | Lab 05 | Lab 06 |
|---|---|---|---|---|---|---|
| 06 · Nextcloud | [x] | [x] | [x] | [x] | [x] | [x] |
| 07 · Mattermost | [x] | [x] | [x] | [x] | [x] | [x] |
| 08 · Jitsi | [x] | [x] | [x] | [x] | [x] | [x] |
| Module | Lab 01 | Lab 02 | Lab 03 | Lab 04 | Lab 05 | Lab 06 |
|---|---|---|---|---|---|---|
| 09 · iRedMail | [x] | [x] | [x] | [x] | [x] | [x] |
| 10 · FreePBX | [x] | [x] | [x] | [x] | [x] | [x] |
| 11 · Zammad | [x] | [x] | [x] | [x] | [x] | [x] |
| Module | Lab 01 | Lab 02 | Lab 03 | Lab 04 | Lab 05 | Lab 06 |
|---|---|---|---|---|---|---|
| 12 · SuiteCRM | [x] | [x] | [x] | [x] | [x] | [x] |
| 13 · Odoo | [x] | [x] | [x] | [x] | [x] | [x] |
| 14 · OpenKM | [x] | [x] | [x] | [x] | [x] | [x] |
| Module | Lab 01 | Lab 02 | Lab 03 | Lab 04 | Lab 05 | Lab 06 |
|---|---|---|---|---|---|---|
| 15 · Taiga | [x] | [x] | [x] | [x] | [x] | [x] |
| 16 · Snipe-IT | [x] | [x] | [x] | [x] | [x] | [x] |
| 17 · GLPI | [x] | [x] | [x] | [x] | [x] | [x] |
| Module | Lab 01 | Lab 02 | Lab 03 | Lab 04 | Lab 05 | Lab 06 |
|---|---|---|---|---|---|---|
| 18 · Traefik | [x] | [x] | [x] | [x] | [x] | [x] |
| 19 · Zabbix | [x] | [x] | [x] | [x] | [x] | [x] |
| 20 · Graylog | [x] | [x] | [x] | [x] | [x] | [x] |
Lab Progress: 120/120 (100.0%) — Phase 1 complete (30/120) ✅ · Phase 2 complete (30/120) ✅ · Phase 3 COMPLETE (24/120) ✅🎉 · Phase 4 COMPLETE (36/120) ✅🎉 — ALL 120 LABS DONE!
From
integration-guide-complete.md— cross-service integrations
GitHub Issues created viacreate-integration-issues.ps1(Sprint 29) — checkboxes below track implementation status.
- FreeIPA ↔ Keycloak LDAP Federation ← INT-01 DONE (Sprint 30: Ansible tasks + integration test)
- Nextcloud ↔ Keycloak OIDC ← INT-02 DONE (Sprint 31: Ansible tasks + integration test)
- Mattermost ↔ Keycloak OIDC ← INT-03 DONE (
roles/mattermost/tasks/keycloak-oidc.yml, 172 lines;it-stack-ansible#1 closed) - SuiteCRM ↔ Keycloak SAML ← INT-04 DONE (
roles/suitecrm/tasks/keycloak-saml.yml, 98 lines;it-stack-ansible#2 closed) - Odoo ↔ Keycloak OIDC ← INT-05 DONE (
roles/odoo/tasks/keycloak-oidc.yml, 364 lines;it-stack-ansible#3 closed) - Zammad ↔ Keycloak OIDC ← INT-06 DONE (
roles/zammad/tasks/keycloak-oidc.yml, 241 lines;it-stack-ansible#4 closed) - GLPI ↔ Keycloak SAML ← INT-07 DONE (
roles/glpi/tasks/keycloak-saml.yml, 177 lines;it-stack-ansible#5 closed) - Taiga ↔ Keycloak OIDC ← INT-08 DONE (
roles/taiga/tasks/keycloak-oidc.yml, 142 lines;it-stack-ansible#6 closed)
- FreePBX ↔ SuiteCRM (click-to-call, call logging) ← INT-09 DONE (
roles/freepbx/tasks/suitecrm-cti.yml, 89 lines;it-stack-ansible#7 closed) - FreePBX ↔ Zammad (automatic phone tickets) ← INT-10 DONE (
roles/freepbx/tasks/zammad-webhook.yml, 76 lines;it-stack-ansible#8 closed) - FreePBX ↔ FreeIPA (extension provisioning from directory) ← INT-11 DONE (
roles/freepbx/tasks/freeipa-sync.yml, 102 lines;it-stack-ansible#9 closed) - SuiteCRM ↔ Odoo (customer data sync) ← INT-12 DONE (
roles/suitecrm/tasks/odoo-sync.yml;it-stack-ansible#10 closed) - SuiteCRM ↔ Nextcloud (calendar sync) ← INT-13 DONE (Sprint 43: nextcloud-caldav.yml + suitecrm-nextcloud-caldav.py.j2 + suitecrm-share.yml + compose WireMock nc-int-mock:8105 + SuiteCRM Phase 3f + Nextcloud Section 13)
- SuiteCRM ↔ OpenKM (document linking) ← INT-14 DONE (Sprints 26-35: openkm-docs.yml + suitecrm-openkm-docs.py.j2)
- Odoo ↔ FreeIPA (employee sync) ← INT-15 DONE (Sprints 26-35: freeipa-ldap.yml + odoo-freeipa-ldap.conf.j2 + setup.py.j2 + sync.timer.j2)
- Odoo ↔ Taiga (time tracking export) ← INT-16 DONE (Sprints 26-35: taiga-timetrack.yml + odoo-taiga-timetrack.py.j2)
- Odoo ↔ Snipe-IT (asset procurement) ← INT-17 DONE (Sprints 26-35: snipeit-assets.yml + odoo-snipeit-assets.py.j2)
- Taiga ↔ Mattermost (notifications) ← INT-18 DONE (Sprints 26-35: mattermost-webhook.yml — pure REST API, no template)
- Snipe-IT ↔ GLPI (asset sync) ← INT-19 DONE (Sprints 26-35: glpi-sync.yml + snipeit-glpi-sync.py.j2)
- GLPI ↔ Zammad (ticket sync / escalation) ← INT-20 DONE (Sprints 26-35: zammad-escalation.yml + glpi-zammad-escalation.php.j2 + glpi-zammad-sync.py.j2)
- OpenKM ↔ Nextcloud (document storage backend) ← INT-21 DONE (Sprints 26-35: nextcloud-storage.yml + openkm-nextcloud-bridge.py.j2)
- Zabbix ↔ Mattermost (infrastructure alerts) ← INT-22 DONE (Sprints 26-35: mattermost-alerts.yml + zabbix-mattermost-media.xml.j2)
- Graylog ↔ Zabbix (log-based alerting) ← INT-23 DONE (Sprints 26-35: zabbix-alerts.yml + graylog-zabbix-sender.sh.j2)
Status: INT-24 DONE ✅ —
docker-mailserverdeployed on Azure VM (port 143/587, no SSL), 3 accounts created, Nextcloud Mail webmail enabled. Guide updated 2026-03-11 indocs/05-guides/23-thunderbird-integration.md
- INT-24 Thunderbird ↔ docker-mailserver (IMAP port 143 / SMTP port 587, no SSL) — DONE (container
mail-demorunning, accounts: admin/jdoe/jsmith, Nextcloud Mail webmail at port 8280 ✅) - Email test suite
scripts/testing/test-email.sh— 47/47 PASS on Azure VM ✅ (bash ~/test-email.sh) - INT-25 Thunderbird ↔ Nextcloud (CalDAV calendar sync) via TbSync add-on — documented, test with TbSync after Thunderbird install
- INT-26 Thunderbird ↔ Nextcloud (CardDAV contact sync) via TbSync add-on — documented, test with TbSync after Thunderbird install
- INT-27 Thunderbird ↔ FreeIPA (LDAP global address book) — LDAP directory config documented; requires FreeIPA running (
bash ~/lab-phase1.sh --only-freeipa) - INT-28 Thunderbird ↔ Keycloak (OAuth2 modern auth for IMAP/SMTP) — production feature; Dovecot OAuth2 config + Keycloak client
thunderbird-mailserver - INT-29 Thunderbird ↔ FreeIPA CA (S/MIME email signing) — production feature; cert issuance workflow + Thunderbird import guide
- Deploy
autoconfig.xmlvia Traefik for zero-touch Thunderbird onboarding (points to docker-mailserver port 143/587) - Add Thunderbird lab test scripts to
it-stack-iredmailrepo (tests/labs/test-lab-05.sh— SSO integration) - Issue GitHub items in
it-stack-iredmailfor INT-25–29 (INT-24 complete)
- TLS on all services (via Traefik internal CA) ←
playbooks/tls-setup.yml+make tls - All secrets managed via Ansible Vault (no plaintext credentials in repos)
- Firewall rules documented and applied ←
roles/common/tasks/firewall.yml+ UFW per-host - SSH key-only authentication on all servers ←
playbooks/harden.yml+vault_ssh_authorized_keys - FreeIPA Kerberos tickets for internal service auth ← DONE (
roles/freeipa/tasks/kerberos-service-principals.yml, 109 lines: 12 principals, keytabs, krb5.conf.j2;it-stack-ansible#14 closed) - Regular security scan (Trivy) on all Docker images in CI ← DONE (
.github/workflows/trivy.yml: 5-job pipeline — Gitleaks, ansible-lint, Trivy image scan all 20 images, Trivy FS scan; SARIF → GitHub Security;make scan/make scan-images; commitef3de9a)
- Zabbix monitoring all 8-9 servers (CPU, RAM, disk, network) ← DONE (
roles/zabbix/tasks/register-hosts.yml, 262 lines: auto-registers all 8 hosts via API, Linux template applied;it-stack-ansible#11 closed) - Zabbix service checks for all 20 services ← DONE (IT-Stack Service Checks template with 23 TCP port checks; created by register-hosts.yml)
- Graylog collecting logs from all services (Syslog / Filebeat) ← DONE (
roles/graylog/tasks/configure-inputs.yml, 195 lines: Syslog UDP :1514, GELF UDP :12201, GELF HTTP :12202 + 8 streams + rsyslog-graylog.conf.j2;it-stack-ansible#12 closed) - Alerting to Mattermost channel
#ops-alerts← INT-22/23 DONE (roles/zabbix/tasks/mattermost-alerts.yml135 lines +roles/graylog/tasks/zabbix-alerts.yml126 lines;it-stack-ansible#13 closed) - On-call escalation policy documented ← DONE (
docs/05-guides/18-on-call-policy.md: P1–P4 severity levels, 15-min P1 response target, escalation path Mattermost→primary→secondary→manager, per-issue runbooks, RTO/RPO table, incident report template, maintenance window schedule)
- PostgreSQL automated daily backup (all 10+ databases) ←
playbooks/backup.ymlPlay 1 + cron 02:00 UTC - Nextcloud file backup scheduled ←
playbooks/backup.ymlPlay 2 + cron 03:00 UTC - Configuration backups (Ansible playbook:
playbooks/backup.yml) ← Play 3 + optional GPG encrypt - Backup restoration tested (RPO/RTO documented) ← DONE (
playbooks/test-restore.yml: pg_restore each DB to staging + object-count verify, Nextcloud rsync dry-run, config archive decrypt/list, RPO ≤24h / RTO targets table;make test-restore; commitef3de9a) - Disaster recovery runbook written ←
docs/05-guides/17-admin-runbook.md
- Hardware/VM inventory documented ←
docs/02-implementation/15-capacity-planning.md - Resource utilization baselines captured ← service RAM/CPU table in capacity-planning.md
- Growth projections (user count × service resource needs) ← 50/100/200/500/1000-user tables
- Scale-out plan per service documented ← scale-out plan table in capacity-planning.md
- All
docs/content pushed toit-stack-docsrepo ← DONE (55/55 docs files verified tracked in git, confirmed 2026-03-10) - Runbooks for each service written or linked ←
docs/05-guides/17-admin-runbook.md+docs/05-guides/18-on-call-policy.md - Network diagram (with IP addresses) in
docs/07-architecture/ - User onboarding guide (how to get SSO account, access each service) ←
docs/05-guides/16-user-onboarding.md - Admin handover guide (passwords in vault, backup procedures) ←
docs/05-guides/17-admin-runbook.md
| # | Service | Repo | Category | Phase |
|---|---|---|---|---|
| 01 | FreeIPA | it-stack-freeipa |
identity | 1 |
| 02 | Keycloak | it-stack-keycloak |
identity | 1 |
| 03 | PostgreSQL | it-stack-postgresql |
database | 1 |
| 04 | Redis | it-stack-redis |
database | 1 |
| 05 | Elasticsearch | it-stack-elasticsearch |
database | 4 |
| 06 | Nextcloud | it-stack-nextcloud |
collaboration | 2 |
| 07 | Mattermost | it-stack-mattermost |
collaboration | 2 |
| 08 | Jitsi | it-stack-jitsi |
collaboration | 2 |
| 09 | iRedMail | it-stack-iredmail |
communications | 2 |
| 10 | FreePBX | it-stack-freepbx |
communications | 3 |
| 11 | Zammad | it-stack-zammad |
communications | 2 |
| 12 | SuiteCRM | it-stack-suitecrm |
business | 3 |
| 13 | Odoo | it-stack-odoo |
business | 3 |
| 14 | OpenKM | it-stack-openkm |
business | 3 |
| 15 | Taiga | it-stack-taiga |
it-management | 4 |
| 16 | Snipe-IT | it-stack-snipeit |
it-management | 4 |
| 17 | GLPI | it-stack-glpi |
it-management | 4 |
| 18 | Traefik | it-stack-traefik |
infrastructure | 1 |
| 19 | Zabbix | it-stack-zabbix |
infrastructure | 4 |
| 20 | Graylog | it-stack-graylog |
infrastructure | 4 |
Chosen path: Go deep on Phase 1 — complete Labs 01→06 for all 5 Phase 1 modules before writing Lab 01 for Phase 2.
Rationale:
- Phase 2 services (Nextcloud, Mattermost) depend on Phase 1 (PostgreSQL, Keycloak) — Phase 1 must be solid first
- Lab 04 for Phase 1 is the SSO integration test — proves Keycloak and FreeIPA are production-ready
- Lab 06 for PostgreSQL proves the database tier that everything else builds on
- Completing Labs 01–06 for 5 small/well-understood services proves the lab methodology before applying it to 15 more complex services
Sequence:
| Sprint | Goal | Labs |
|---|---|---|
| Sprint 13 ✅ | Phase 3 Lab 01 (standalone) | freepbx·suitecrm·odoo·openkm Lab 01 done |
| Sprint 15 ✅ | Phase 3 Lab 03 (advanced features) | freepbx·suitecrm·odoo·openkm Lab 03 done |
| Sprint 16 ✅ | Phase 3 Lab 04 (SSO integration) | freepbx·suitecrm·odoo·openkm Lab 04 done |
| Sprint 17 ✅ | Phase 3 Lab 05 (advanced integration) | freepbx·suitecrm·odoo·openkm Lab 05 done |
| Sprint 18 ✅ | Phase 3 Lab 06 (production deployment) | freepbx·suitecrm·odoo·openkm Lab 06 done — Phase 3 COMPLETE 🎉 |
| Sprint 19 ✅ | Phase 4 Lab 01 (standalone) | taiga·snipeit·glpi·elasticsearch·zabbix·graylog Lab 01 done |
| Sprint 20 ✅ | Phase 4 Lab 02 (external deps) | taiga·snipeit·glpi·elasticsearch·zabbix·graylog Lab 02 done |
| Sprint 21 ✅ | Phase 4 Lab 03 (advanced features) | taiga·snipeit·glpi·elasticsearch·zabbix·graylog Lab 03 done |
| Sprint 22 ✅ | Phase 4 Lab 04 (SSO integration) | taiga·snipeit·glpi·elasticsearch·zabbix·graylog Lab 04 done |
| Sprint 23 ✅ | Phase 4 Lab 05 (advanced integration) | taiga·snipeit·glpi·elasticsearch·zabbix·graylog Lab 05 done |
| Sprint 24 ✅ | Phase 4 Lab 06 (production deployment) | taiga·snipeit·glpi·elasticsearch·zabbix·graylog Lab 06 done — PHASE 4 COMPLETE 🎉 |
| Sprint 14 ✅ | Phase 3 Lab 02 (external deps) | freepbx·suitecrm·odoo·openkm Lab 02 done |
Goal: Migrate the full IT-Stack from Docker Compose to production-grade Kubernetes,
enabling HA, auto-scaling, rolling updates, and GitOps for the 8-server topology.
-
it-stack-helmrepo — initialize chart structure (umbrella chart + 20 sub-charts) - k3s single-node install playbook (
playbooks/k3s-single.yml) - k3s multi-node HA install playbook (
playbooks/k3s-ha.yml— 3 control-plane nodes) - StorageClass definitions (local-path for labs, Longhorn for production)
- MetalLB load-balancer config (IP pool 10.0.50.100–.150)
- cert-manager install + ClusterIssuer (Let's Encrypt + internal CA)
- Traefik CRD IngressRoute replacing standalone Traefik container
- Helm chart: FreeIPA StatefulSet + PVC (LDAP + Kerberos data)
- Helm chart: Keycloak (Bitnami chart override, externalDatabase PostgreSQL)
- NetworkPolicy: FreeIPA ↔ Keycloak LDAP federation (TCP 389/636)
- Helm chart: PostgreSQL cluster (Bitnami HA, 1 primary + 2 replicas)
- Helm chart: Redis Sentinel (3-node sentinel + 1 primary + 2 replicas)
- Helm chart: Elasticsearch (2-node cluster, 512 MB heap each)
- PersistentVolumeClaims: 50 GB PostgreSQL, 20 GB Redis AOF, 100 GB Elasticsearch
- Helm chart: Nextcloud (Apache, externalDatabase, externalRedis, PVC 200 GB)
- Helm chart: Mattermost (externalDB, externalRedis, file store via Nextcloud S3)
- Helm chart: Jitsi (videoBridge DaemonSet + web Deployment, UDP hostPort 10000)
- Helm chart: iRedMail (StatefulSet, hostNetwork for SMTP/IMAP port binding)
- Helm chart: Zammad (6-container set: pg, es, redis, init, rails, nginx)
- Helm chart: FreePBX (StatefulSet, hostNetwork for SIP/RTP port binding)
- Helm chart: SuiteCRM (Apache + PVC for uploads)
- Helm chart: Odoo (+ workers Deployment, externalDB)
- Helm chart: OpenKM (Tomcat StatefulSet + PVC)
- Helm chart: Taiga (back + front + celery + rabbitmq, externalDB)
- Helm chart: Snipe-IT (Apache + externalDB MariaDB or PG)
- Helm chart: GLPI (Apache + externalDB)
- Helm chart: Zabbix (server + web, externalDB PG)
- Helm chart: Graylog (+ MongoDB StatefulSet)
- HorizontalPodAutoscaler for: Keycloak web, Mattermost, Jitsi web, Taiga-back
- PodDisruptionBudgets for all StatefulSets
- ArgoCD install + ApplicationSet for all 20 modules
- Kubernetes-native secret management (Sealed Secrets or External Secrets Operator)
- Helm umbrella chart
it-stack— deploy full stack in one command -
make k8s-install/make k8s-destroyconvenience targets - GitHub Actions:
helm lint+helm template+kubevalin CI for all charts
This phase tracks the manual Docker-based deployment on a single Azure VM (
lab-single,rg-it-stack-phase1).
Unlike previous phases which ran automated lab scripts, this was a live, hands-on provisioning session.
- Azure VM provisioned:
lab-single, Standard_D4s_v4 (4 vCPU / 16 GB RAM), West US 2 - Static public IP assigned:
4.154.17.25 - NSG rules opened: ports 8080, 8180, 8265, 8280, 8302–8305, 8307, 8880, 9001, 9002, 25, 143, 587
- Private DNS zone:
lab.it-stack.local - Auto-shutdown configured: 22:00 UTC daily (Azure DevTest Labs policy)
- Expand OS disk from 30 GB → 64 GB (blocked by quota — pending resize via Azure Portal)
- Delete 2 idle static IPs:
vnet-westus2-IPv4,workspace-1-vnet-IPv4(saves ~$7.44/month) - Bastion
workspace-1-vnet-bastiondeleted (was billing ~$140/month idle) - Bastion
rg-stack-test1deletion confirm (delete queued with--no-wait)
- docker-mailserver (
mail-demo) — SMTP :25/:587, IMAP :143, domain: itstack.local - Traefik dashboard (
traefik-demo) — port 8080 - Keycloak SSO (
keycloak-demo) — port 8180; Nginx proxy sidecar added - Nextcloud (
nc-demo) — port 8280; 57 apps enabled; SMTP configured - Mattermost (
mm-demo) — port 8265; SMTP configured - SuiteCRM (
crm-demo) — port 8302; SMTP via config_override.php (Bitnami path corrected) - Odoo ERP (
odoo-demo) — port 8303; DB:testdb; SMTP via ir_mail_server insert - Snipe-IT (
snipe-demo) — port 8305; 506 error fixed (duplicate migration marked + re-run); admin user created; SMTP via ENV vars - Jitsi Meet (
jitsi-web-lab01) — port 8880; guest mode; JVB on UDP :10000 - Taiga (
taiga-front-s01) — port 9001; backend internal on :9000 - Zabbix (
zabbix-web-s01) — port 8307; VM host added; Zabbix Agent 2 installed on host - Graylog (
graylog-s01) — port 9002; GELF UDP :12201 input live; Syslog UDP :1514 input live - Zammad — BLOCKED: disk 100% full; retry after disk expansion to 64 GB
- Removed
mailhog/mailhog:latest(freed 572 MB) — replaced by docker-mailserver - Removed
elasticsearch:8.17.3(freed 2 GB) — was orphaned (Graylog uses bundled ES) - Run
docker image prune -fafter Zammad deployment to recover additional space - Expand OS disk: Azure Portal →
lab-single_OsDisk→ Size + performance → 64 GB, thensudo growpart /dev/sda 1 && sudo resize2fs /dev/root
- Snipe-IT: migration conflict resolved (
2018_05_14_223646_add_indexes_to_assetsmarked in migrations table) - Snipe-IT: admin user created via
artisan snipeit:create-admin - Nextcloud: 57 apps installed (
install-nc-apps.sh) - SuiteCRM: SMTP configured via
/bitnami/suitecrm/public/legacy/config_override.php - Odoo: SMTP configured via direct SQL insert into
ir_mail_server+ir_config_parameter - Graylog: GELF + Syslog inputs created via REST API on first run
- Zabbix: lab-single VM added as monitored host via JSON-RPC API
- Configure Docker GELF log driver on host (
/etc/docker/daemon.json) to route all container logs to Graylog - Set up Zabbix → Mattermost webhook alert channel (
#ops-alerts) - Create Nextcloud external storage config pointing to shared volume
- Enable Keycloak OIDC realm clients for Nextcloud and Mattermost
- Configure Mattermost slash commands / webhooks for key services
-
docs/05-guides/18-azure-lab-deployment.md— Added "Current Live Deployment (March 2026)" section with full service table, compose commands, fix procedures, cost summary -
docs/07-architecture/network-topology.md— Added "Cloud Single-VM Topology" section with container diagram, port map table, and limitations comparison -
README.md— Added Cloud Lab Deployment callout section; updated Project Status table with Cloud row; updated Getting Started -
CHANGELOG.md— Added [2.1.0] — 2026-03-12 entry documenting all cloud lab work -
docs/05-guides/22-gui-walkthrough.md— Updated entire document to reflect live services: corrected Service Directory table (real credentials, ✅ active vs ⏳ pending split), fixed NSG/SSH-tunnel commands to active ports only, added ✅ Already Running callout to each deployed module, added ⏳ Not yet deployed notice to Zammad and FreeIPA, removed stale MailHog reference -
docs/05-guides/01-master-index.md— Added Path 0 (Cloud Lab live environment), updated Documentation Versioning to v2.1 -
docs/05-guides/17-admin-runbook.md— Added Deployment Context table (Cloud Lab vs On-Prem), added Cloud Lab VM operations section with health check and user management procedures -
docs/05-guides/21-production-troubleshooting.md— Added deployment context note clarifying single-VM vs multi-server command differences
Document Version: 2.7
Project: IT-Stack | Org: it-stack-dev
Last Updated: 2026-03-12 — Added Phase: Cloud Lab Deployment (Azure Single-VM). 12/13 services live. Zammad pending disk expansion. Documentation updated to reflect live environment.