[{"data":1,"prerenderedAt":713},["ShallowReactive",2],{"blog-docker-deployment-guide":3},{"id":4,"title":5,"author":6,"body":7,"category":697,"date":698,"description":699,"extension":700,"featured":701,"image":702,"locale":702,"meta":703,"modified":702,"navigation":445,"path":704,"readingTime":283,"seo":705,"sitemap":706,"slug":702,"stem":707,"tags":708,"__hash__":712},"blog\u002Fblog\u002Fdocker-deployment-guide.md","Deploying Open-AudIT with Docker Compose","Community Contributor",{"type":8,"value":9,"toc":685},"minimark",[10,28,37,42,60,64,67,104,111,115,118,192,196,202,224,314,328,332,360,367,394,398,412,416,419,508,517,521,524,597,600,604,607,653,657,660,663,681],[11,12,13,14,21,22,27],"p",{},"Open-AudIT Community ships with container support in the source code itself. There is no published image on Docker Hub. Instead, the ",[15,16,20],"a",{"href":17,"rel":18},"https:\u002F\u002Fgithub.com\u002FOpmantek\u002Fopen-audit",[19],"nofollow","GitHub repository"," includes a ",[15,23,26],{"href":24,"rel":25},"https:\u002F\u002Fgithub.com\u002FOpmantek\u002Fopen-audit\u002Fblob\u002Fmaster\u002Fcompose.yml",[19],"compose.yml"," and Containerfiles that build two containers locally: an Apache\u002FPHP web container and a MariaDB database container.",[11,29,30,31,36],{},"This guide walks through that official setup with Docker. The upstream project documents it in ",[15,32,35],{"href":33,"rel":34},"https:\u002F\u002Fgithub.com\u002FOpmantek\u002Fopen-audit\u002Fblob\u002Fmaster\u002FCONTAINER.md",[19],"CONTAINER.md"," using Podman; the two are interchangeable here, so use whichever your host runs.",[38,39,41],"h2",{"id":40},"prerequisites","Prerequisites",[43,44,45,49,57],"ul",{},[46,47,48],"li",{},"Git",[46,50,51,52,56],{},"Docker Engine with Compose v2 (or Podman with ",[53,54,55],"code",{},"podman-compose",")",[46,58,59],{},"A host with network access to the subnets you want to audit",[38,61,63],{"id":62},"_1-clone-the-source","1. Clone the source",[11,65,66],{},"The compose file ships with the source, so you do not write your own:",[68,69,74],"pre",{"className":70,"code":71,"language":72,"meta":73,"style":73},"language-bash shiki shiki-themes github-dark github-dark","git clone https:\u002F\u002Fgithub.com\u002FOpmantek\u002Fopen-audit.git open-audit\ncd open-audit\n","bash","",[53,75,76,95],{"__ignoreMap":73},[77,78,81,85,89,92],"span",{"class":79,"line":80},"line",1,[77,82,84],{"class":83},"sFR8T","git",[77,86,88],{"class":87},"s4wv1"," clone",[77,90,91],{"class":87}," https:\u002F\u002Fgithub.com\u002FOpmantek\u002Fopen-audit.git",[77,93,94],{"class":87}," open-audit\n",[77,96,98,102],{"class":79,"line":97},2,[77,99,101],{"class":100},"s8ozJ","cd",[77,103,94],{"class":87},[11,105,106,107,110],{},"All remaining steps run from the ",[53,108,109],{},"open-audit"," directory.",[38,112,114],{"id":113},"_2-set-folder-permissions","2. Set folder permissions",[11,116,117],{},"The web container mounts the cloned source and needs to write to a few directories:",[68,119,121],{"className":70,"code":120,"language":72,"meta":73,"style":73},"chmod 0777 .\u002Fapp\u002FAttachments\nchmod 0777 .\u002Fother\u002Fscripts\nchmod 0777 .\u002Fpublic\u002Fcustom_images\nchmod 0777 .\u002Fwritable\nfind .\u002Fwritable -type d -exec chmod 0777 {} \\;\n",[53,122,123,134,143,153,163],{"__ignoreMap":73},[77,124,125,128,131],{"class":79,"line":80},[77,126,127],{"class":83},"chmod",[77,129,130],{"class":100}," 0777",[77,132,133],{"class":87}," .\u002Fapp\u002FAttachments\n",[77,135,136,138,140],{"class":79,"line":97},[77,137,127],{"class":83},[77,139,130],{"class":100},[77,141,142],{"class":87}," .\u002Fother\u002Fscripts\n",[77,144,146,148,150],{"class":79,"line":145},3,[77,147,127],{"class":83},[77,149,130],{"class":100},[77,151,152],{"class":87}," .\u002Fpublic\u002Fcustom_images\n",[77,154,156,158,160],{"class":79,"line":155},4,[77,157,127],{"class":83},[77,159,130],{"class":100},[77,161,162],{"class":87}," .\u002Fwritable\n",[77,164,166,169,172,175,178,181,184,186,189],{"class":79,"line":165},5,[77,167,168],{"class":83},"find",[77,170,171],{"class":87}," .\u002Fwritable",[77,173,174],{"class":100}," -type",[77,176,177],{"class":87}," d",[77,179,180],{"class":100}," -exec",[77,182,183],{"class":87}," chmod",[77,185,130],{"class":100},[77,187,188],{"class":87}," {}",[77,190,191],{"class":100}," \\;\n",[38,193,195],{"id":194},"_3-review-the-compose-file","3. Review the compose file",[11,197,198,199,201],{},"Open ",[53,200,26],{}," before building. The defaults work out of the box, but two things deserve attention:",[11,203,204,208,209,212,213,216,217,212,220,223],{},[205,206,207],"strong",{},"Change the default passwords."," The database credentials appear in both services and must stay in sync: ",[53,210,211],{},"MARIADB_PASSWORD"," on the ",[53,214,215],{},"database"," service and ",[53,218,219],{},"database_default_password",[53,221,222],{},"web"," service (likewise the root password). The database connection settings use the naming Open-AudIT's framework expects:",[68,225,229],{"className":226,"code":227,"language":228,"meta":73,"style":73},"language-yaml shiki shiki-themes github-dark github-dark","environment:\n  app_baseURL: http:\u002F\u002Flocalhost:8087\n  database_default_hostname: open-audit-community-database\n  database_default_database: openaudit\n  database_default_username: openaudit\n  database_default_password: openauditpassword\n  database_default_port: 3306\n  database_default_DBDriver: MySQLi\n","yaml",[53,230,231,241,252,262,272,281,292,303],{"__ignoreMap":73},[77,232,233,237],{"class":79,"line":80},[77,234,236],{"class":235},"sxg3X","environment",[77,238,240],{"class":239},"suv1-",":\n",[77,242,243,246,249],{"class":79,"line":97},[77,244,245],{"class":235},"  app_baseURL",[77,247,248],{"class":239},": ",[77,250,251],{"class":87},"http:\u002F\u002Flocalhost:8087\n",[77,253,254,257,259],{"class":79,"line":145},[77,255,256],{"class":235},"  database_default_hostname",[77,258,248],{"class":239},[77,260,261],{"class":87},"open-audit-community-database\n",[77,263,264,267,269],{"class":79,"line":155},[77,265,266],{"class":235},"  database_default_database",[77,268,248],{"class":239},[77,270,271],{"class":87},"openaudit\n",[77,273,274,277,279],{"class":79,"line":165},[77,275,276],{"class":235},"  database_default_username",[77,278,248],{"class":239},[77,280,271],{"class":87},[77,282,284,287,289],{"class":79,"line":283},6,[77,285,286],{"class":235},"  database_default_password",[77,288,248],{"class":239},[77,290,291],{"class":87},"openauditpassword\n",[77,293,295,298,300],{"class":79,"line":294},7,[77,296,297],{"class":235},"  database_default_port",[77,299,248],{"class":239},[77,301,302],{"class":100},"3306\n",[77,304,306,309,311],{"class":79,"line":305},8,[77,307,308],{"class":235},"  database_default_DBDriver",[77,310,248],{"class":239},[77,312,313],{"class":87},"MySQLi\n",[11,315,316,323,324,327],{},[205,317,318,319,322],{},"Set ",[53,320,321],{},"app_baseURL"," to the address you will actually browse to."," The web container publishes port 8087, so for local use that is ",[53,325,326],{},"http:\u002F\u002Flocalhost:8087"," as above. If you put the site behind a proxy or hostname later, update this value to match.",[38,329,331],{"id":330},"_4-build-and-start","4. Build and start",[68,333,335],{"className":70,"code":334,"language":72,"meta":73,"style":73},"docker compose build\ndocker compose up -d\n",[53,336,337,348],{"__ignoreMap":73},[77,338,339,342,345],{"class":79,"line":80},[77,340,341],{"class":83},"docker",[77,343,344],{"class":87}," compose",[77,346,347],{"class":87}," build\n",[77,349,350,352,354,357],{"class":79,"line":97},[77,351,341],{"class":83},[77,353,344],{"class":87},[77,355,356],{"class":87}," up",[77,358,359],{"class":100}," -d\n",[11,361,362,363,366],{},"The database container seeds its schema from ",[53,364,365],{},"other\u002Fopen-audit.sql"," on first start. Then install the PHP dependencies inside the web container:",[68,368,370],{"className":70,"code":369,"language":72,"meta":73,"style":73},"docker exec -it open-audit-community-web sh -c \"composer install\"\n",[53,371,372],{"__ignoreMap":73},[77,373,374,376,379,382,385,388,391],{"class":79,"line":80},[77,375,341],{"class":83},[77,377,378],{"class":87}," exec",[77,380,381],{"class":100}," -it",[77,383,384],{"class":87}," open-audit-community-web",[77,386,387],{"class":87}," sh",[77,389,390],{"class":100}," -c",[77,392,393],{"class":87}," \"composer install\"\n",[38,395,397],{"id":396},"_5-log-in","5. Log in",[11,399,198,400,403,404,407,408,411],{},[53,401,402],{},"http:\u002F\u002Flocalhost:8087\u002Findex.php"," in your browser. To stop the stack later, run ",[53,405,406],{},"docker compose down",". The database persists in the named ",[53,409,410],{},"database_storage"," volume, and your attachments and settings live in the cloned source directory.",[38,413,415],{"id":414},"optional-tls-with-a-reverse-proxy","Optional: TLS with a reverse proxy",[11,417,418],{},"For anything beyond local use, terminate TLS in front of the web container:",[68,420,424],{"className":421,"code":422,"language":423,"meta":73,"style":73},"language-nginx shiki shiki-themes github-dark github-dark","server {\n    listen 443 ssl;\n    server_name audit.yourdomain.com;\n\n    ssl_certificate     \u002Fetc\u002Fssl\u002Fcerts\u002Faudit.crt;\n    ssl_certificate_key \u002Fetc\u002Fssl\u002Fprivate\u002Faudit.key;\n\n    location \u002F {\n        proxy_pass         http:\u002F\u002F127.0.0.1:8087;\n        proxy_set_header   Host              $host;\n        proxy_set_header   X-Real-IP         $remote_addr;\n        proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;\n        proxy_set_header   X-Forwarded-Proto $scheme;\n    }\n}\n","nginx",[53,425,426,431,436,441,447,452,457,461,466,472,478,484,490,496,502],{"__ignoreMap":73},[77,427,428],{"class":79,"line":80},[77,429,430],{},"server {\n",[77,432,433],{"class":79,"line":97},[77,434,435],{},"    listen 443 ssl;\n",[77,437,438],{"class":79,"line":145},[77,439,440],{},"    server_name audit.yourdomain.com;\n",[77,442,443],{"class":79,"line":155},[77,444,446],{"emptyLinePlaceholder":445},true,"\n",[77,448,449],{"class":79,"line":165},[77,450,451],{},"    ssl_certificate     \u002Fetc\u002Fssl\u002Fcerts\u002Faudit.crt;\n",[77,453,454],{"class":79,"line":283},[77,455,456],{},"    ssl_certificate_key \u002Fetc\u002Fssl\u002Fprivate\u002Faudit.key;\n",[77,458,459],{"class":79,"line":294},[77,460,446],{"emptyLinePlaceholder":445},[77,462,463],{"class":79,"line":305},[77,464,465],{},"    location \u002F {\n",[77,467,469],{"class":79,"line":468},9,[77,470,471],{},"        proxy_pass         http:\u002F\u002F127.0.0.1:8087;\n",[77,473,475],{"class":79,"line":474},10,[77,476,477],{},"        proxy_set_header   Host              $host;\n",[77,479,481],{"class":79,"line":480},11,[77,482,483],{},"        proxy_set_header   X-Real-IP         $remote_addr;\n",[77,485,487],{"class":79,"line":486},12,[77,488,489],{},"        proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;\n",[77,491,493],{"class":79,"line":492},13,[77,494,495],{},"        proxy_set_header   X-Forwarded-Proto $scheme;\n",[77,497,499],{"class":79,"line":498},14,[77,500,501],{},"    }\n",[77,503,505],{"class":79,"line":504},15,[77,506,507],{},"}\n",[11,509,510,511,513,514,516],{},"Remember to set ",[53,512,321],{}," in ",[53,515,26],{}," to the public URL and rebuild.",[38,518,520],{"id":519},"backups","Backups",[11,522,523],{},"Dump the database from the database container on a schedule:",[68,525,527],{"className":70,"code":526,"language":72,"meta":73,"style":73},"docker exec open-audit-community-database \\\n  mariadb-dump -u openaudit -p\u003Cyour-password> openaudit \\\n  | gzip > backup_$(date +%Y%m%d).sql.gz\n",[53,528,529,541,569],{"__ignoreMap":73},[77,530,531,533,535,538],{"class":79,"line":80},[77,532,341],{"class":83},[77,534,378],{"class":87},[77,536,537],{"class":87}," open-audit-community-database",[77,539,540],{"class":100}," \\\n",[77,542,543,546,549,552,555,559,562,565,567],{"class":79,"line":97},[77,544,545],{"class":87},"  mariadb-dump",[77,547,548],{"class":100}," -u",[77,550,551],{"class":87}," openaudit",[77,553,554],{"class":100}," -p",[77,556,558],{"class":557},"sOPea","\u003C",[77,560,561],{"class":100},"your-password",[77,563,564],{"class":557},">",[77,566,551],{"class":87},[77,568,540],{"class":100},[77,570,571,574,577,580,583,586,589,592,594],{"class":79,"line":145},[77,572,573],{"class":557},"  |",[77,575,576],{"class":83}," gzip",[77,578,579],{"class":557}," >",[77,581,582],{"class":87}," backup_",[77,584,585],{"class":239},"$(",[77,587,588],{"class":83},"date",[77,590,591],{"class":87}," +%Y%m%d",[77,593,56],{"class":239},[77,595,596],{"class":87},".sql.gz\n",[11,598,599],{},"Back up the cloned source directory too. It holds your attachments, custom images and writable data.",[38,601,603],{"id":602},"updating","Updating",[11,605,606],{},"Because the containers are built from the source you cloned, updating means pulling the latest code and rebuilding:",[68,608,610],{"className":70,"code":609,"language":72,"meta":73,"style":73},"git pull\ndocker compose build\ndocker compose up -d\ndocker exec -it open-audit-community-web sh -c \"composer install\"\n",[53,611,612,619,627,637],{"__ignoreMap":73},[77,613,614,616],{"class":79,"line":80},[77,615,84],{"class":83},[77,617,618],{"class":87}," pull\n",[77,620,621,623,625],{"class":79,"line":97},[77,622,341],{"class":83},[77,624,344],{"class":87},[77,626,347],{"class":87},[77,628,629,631,633,635],{"class":79,"line":145},[77,630,341],{"class":83},[77,632,344],{"class":87},[77,634,356],{"class":87},[77,636,359],{"class":100},[77,638,639,641,643,645,647,649,651],{"class":79,"line":155},[77,640,341],{"class":83},[77,642,378],{"class":87},[77,644,381],{"class":100},[77,646,384],{"class":87},[77,648,387],{"class":87},[77,650,390],{"class":100},[77,652,393],{"class":87},[38,654,656],{"id":655},"network-discovery-notes","Network discovery notes",[11,658,659],{},"The web container image includes Nmap and SNMP tooling, and a cron task inside the container runs scheduled discoveries. The stack uses a standard bridge network, so make sure the Docker host can reach the subnets you want to audit. Discovery of the host's own subnet works normally; scanning behaviour across routed networks depends on your environment, so verify reachability from inside the container if a discovery comes back empty.",[661,662],"hr",{},[11,664,665,666,669,670,674,675,680],{},"The compose file and Containerfiles are maintained in the source tree, so treat ",[15,667,35],{"href":33,"rel":668},[19]," as the canonical reference if anything here drifts. Improvements are welcome. Open a pull request on ",[15,671,673],{"href":17,"rel":672},[19],"GitHub"," or share your setup on the ",[15,676,679],{"href":677,"rel":678},"https:\u002F\u002Fcommunity.firstwave.com",[19],"community forum",".",[682,683,684],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sFR8T, html code.shiki .sFR8T{--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .s4wv1, html code.shiki .s4wv1{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .s8ozJ, html code.shiki .s8ozJ{--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .sxg3X, html code.shiki .sxg3X{--shiki-default:#85E89D;--shiki-dark:#85E89D}html pre.shiki code .suv1-, html code.shiki .suv1-{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .sOPea, html code.shiki .sOPea{--shiki-default:#F97583;--shiki-dark:#F97583}",{"title":73,"searchDepth":97,"depth":97,"links":686},[687,688,689,690,691,692,693,694,695,696],{"id":40,"depth":97,"text":41},{"id":62,"depth":97,"text":63},{"id":113,"depth":97,"text":114},{"id":194,"depth":97,"text":195},{"id":330,"depth":97,"text":331},{"id":396,"depth":97,"text":397},{"id":414,"depth":97,"text":415},{"id":519,"depth":97,"text":520},{"id":602,"depth":97,"text":603},{"id":655,"depth":97,"text":656},"Tutorials","2025-10-22","Run Open-AudIT Community in containers using the Compose file that ships with the source code. This guide covers building, configuring and running the official two-container setup.","md",false,null,{},"\u002Fblog\u002Fdocker-deployment-guide",{"title":5,"description":699},{"loc":704},"blog\u002Fdocker-deployment-guide",[341,709,710,711],"containers","deployment","devops","bzNS9IZuYRCnlqZAbShjEyvpgsHwZZNba7-5rJhxyHk",1792632799180]