[{"data":1,"prerenderedAt":669},["ShallowReactive",2],{"\u002Fdocs\u002Fserver\u002Finstallation":3},{"id":4,"title":5,"body":6,"description":661,"extension":662,"meta":663,"navigation":664,"path":665,"seo":666,"stem":667,"__hash__":668},"docs\u002Fdocs\u002Fserver\u002Finstallation.md","Installation",{"type":7,"value":8,"toc":653},"minimark",[9,13,17,28,81,94,99,210,247,264,268,341,345,392,407,411,414,446,462,472,484,488,491,515,521,525,538,588,614,617,642,649],[10,11,5],"h1",{"id":12},"installation",[14,15,16],"p",{},"The NetIgnite server ships as a Docker image on the GitHub Container Registry:",[18,19,25],"pre",{"className":20,"code":22,"language":23,"meta":24},[21],"language-text","ghcr.io\u002Fnetignite-project\u002Fserver\n","text","",[26,27,22],"code",{"__ignoreMap":24},[29,30,31,44],"table",{},[32,33,34],"thead",{},[35,36,37,41],"tr",{},[38,39,40],"th",{},"Tag",[38,42,43],{},"Content",[45,46,47,58],"tbody",{},[35,48,49,55],{},[50,51,52],"td",{},[26,53,54],{},"latest",[50,56,57],{},"The latest stable release",[35,59,60,70],{},[50,61,62,65,66,69],{},[26,63,64],{},"0.1.3",", ",[26,67,68],{},"0.1.2",", …",[50,71,72,73,80],{},"A specific release (see the ",[74,75,79],"a",{"href":76,"rel":77},"https:\u002F\u002Fgithub.com\u002FNetIgnite-project\u002FServer\u002Freleases",[78],"nofollow","release list",")",[14,82,83,84,87,88,93],{},"Images are built for ",[26,85,86],{},"linux\u002Famd64"," and signed with ",[74,89,92],{"href":90,"rel":91},"https:\u002F\u002Fgithub.com\u002Fsigstore\u002Fcosign",[78],"cosign","\n(keyless).",[95,96,98],"h2",{"id":97},"docker-compose-recommended","Docker Compose (recommended)",[18,100,105],{"className":101,"code":102,"filename":103,"language":104,"meta":24,"style":24},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","services:\n  netignite-server:\n    image: ghcr.io\u002Fnetignite-project\u002Fserver:latest\n    container_name: netignite-server\n    restart: unless-stopped\n    ports:\n      - \"18232:18232\"\n    volumes:\n      - \u002Fopt\u002Fnetignite\u002Fdata:\u002Fopt\u002Fnetignite\u002Fdata\n      - \u002Fopt\u002Fnetignite\u002Fconfig:\u002Fopt\u002Fnetignite\u002Fconfig\n","docker-compose.yml","yaml",[26,106,107,120,128,141,152,163,171,186,194,202],{"__ignoreMap":24},[108,109,112,116],"span",{"class":110,"line":111},"line",1,[108,113,115],{"class":114},"swJcz","services",[108,117,119],{"class":118},"sMK4o",":\n",[108,121,123,126],{"class":110,"line":122},2,[108,124,125],{"class":114},"  netignite-server",[108,127,119],{"class":118},[108,129,131,134,137],{"class":110,"line":130},3,[108,132,133],{"class":114},"    image",[108,135,136],{"class":118},":",[108,138,140],{"class":139},"sfazB"," ghcr.io\u002Fnetignite-project\u002Fserver:latest\n",[108,142,144,147,149],{"class":110,"line":143},4,[108,145,146],{"class":114},"    container_name",[108,148,136],{"class":118},[108,150,151],{"class":139}," netignite-server\n",[108,153,155,158,160],{"class":110,"line":154},5,[108,156,157],{"class":114},"    restart",[108,159,136],{"class":118},[108,161,162],{"class":139}," unless-stopped\n",[108,164,166,169],{"class":110,"line":165},6,[108,167,168],{"class":114},"    ports",[108,170,119],{"class":118},[108,172,174,177,180,183],{"class":110,"line":173},7,[108,175,176],{"class":118},"      -",[108,178,179],{"class":118}," \"",[108,181,182],{"class":139},"18232:18232",[108,184,185],{"class":118},"\"\n",[108,187,189,192],{"class":110,"line":188},8,[108,190,191],{"class":114},"    volumes",[108,193,119],{"class":118},[108,195,197,199],{"class":110,"line":196},9,[108,198,176],{"class":118},[108,200,201],{"class":139}," \u002Fopt\u002Fnetignite\u002Fdata:\u002Fopt\u002Fnetignite\u002Fdata\n",[108,203,205,207],{"class":110,"line":204},10,[108,206,176],{"class":118},[108,208,209],{"class":139}," \u002Fopt\u002Fnetignite\u002Fconfig:\u002Fopt\u002Fnetignite\u002Fconfig\n",[18,211,216],{"className":212,"code":213,"filename":214,"language":215,"meta":24,"style":24},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","docker compose up -d\ndocker compose logs -f netignite-server\n","Terminal","bash",[26,217,218,233],{"__ignoreMap":24},[108,219,220,224,227,230],{"class":110,"line":111},[108,221,223],{"class":222},"sBMFI","docker",[108,225,226],{"class":139}," compose",[108,228,229],{"class":139}," up",[108,231,232],{"class":139}," -d\n",[108,234,235,237,239,242,245],{"class":110,"line":122},[108,236,223],{"class":222},[108,238,226],{"class":139},[108,240,241],{"class":139}," logs",[108,243,244],{"class":139}," -f",[108,246,151],{"class":139},[14,248,249,250,255,256,259,260,263],{},"The upstream ",[74,251,254],{"href":252,"rel":253},"https:\u002F\u002Fgithub.com\u002FNetIgnite-project\u002FServer\u002Fblob\u002Fmain\u002Fdocker\u002Fdocker-compose.yml",[78],"compose file","\nalso mounts ",[26,257,258],{},"\u002Fopt\u002Fnetignite\u002Flogs",". The current release logs to stdout only (use ",[26,261,262],{},"docker logs","),\nso that mount is optional.",[95,265,267],{"id":266},"docker-run","docker run",[18,269,271],{"className":212,"code":270,"filename":214,"language":215,"meta":24,"style":24},"docker run -d \\\n  --name netignite-server \\\n  --restart unless-stopped \\\n  -p 18232:18232 \\\n  -v \u002Fopt\u002Fnetignite\u002Fdata:\u002Fopt\u002Fnetignite\u002Fdata \\\n  -v \u002Fopt\u002Fnetignite\u002Fconfig:\u002Fopt\u002Fnetignite\u002Fconfig \\\n  ghcr.io\u002Fnetignite-project\u002Fserver:latest\n",[26,272,273,287,297,307,317,327,336],{"__ignoreMap":24},[108,274,275,277,280,283],{"class":110,"line":111},[108,276,223],{"class":222},[108,278,279],{"class":139}," run",[108,281,282],{"class":139}," -d",[108,284,286],{"class":285},"sTEyZ"," \\\n",[108,288,289,292,295],{"class":110,"line":122},[108,290,291],{"class":139},"  --name",[108,293,294],{"class":139}," netignite-server",[108,296,286],{"class":285},[108,298,299,302,305],{"class":110,"line":130},[108,300,301],{"class":139},"  --restart",[108,303,304],{"class":139}," unless-stopped",[108,306,286],{"class":285},[108,308,309,312,315],{"class":110,"line":143},[108,310,311],{"class":139},"  -p",[108,313,314],{"class":139}," 18232:18232",[108,316,286],{"class":285},[108,318,319,322,325],{"class":110,"line":154},[108,320,321],{"class":139},"  -v",[108,323,324],{"class":139}," \u002Fopt\u002Fnetignite\u002Fdata:\u002Fopt\u002Fnetignite\u002Fdata",[108,326,286],{"class":285},[108,328,329,331,334],{"class":110,"line":165},[108,330,321],{"class":139},[108,332,333],{"class":139}," \u002Fopt\u002Fnetignite\u002Fconfig:\u002Fopt\u002Fnetignite\u002Fconfig",[108,335,286],{"class":285},[108,337,338],{"class":110,"line":173},[108,339,340],{"class":139},"  ghcr.io\u002Fnetignite-project\u002Fserver:latest\n",[95,342,344],{"id":343},"whats-in-the-container","What's in the container",[29,346,347,356],{},[32,348,349],{},[35,350,351,354],{},[38,352,353],{},"Path",[38,355,43],{},[45,357,358,368,378],{},[35,359,360,365],{},[50,361,362],{},[26,363,364],{},"\u002Fopt\u002Fnetignite\u002Fdata\u002Fdb.sqlite",[50,366,367],{},"The SQLite database (users, agents, devices)",[35,369,370,375],{},[50,371,372],{},[26,373,374],{},"\u002Fopt\u002Fnetignite\u002Fdata\u002Finitial_admin_credentials",[50,376,377],{},"The generated admin password from the first start",[35,379,380,385],{},[50,381,382],{},[26,383,384],{},"\u002Fopt\u002Fnetignite\u002Fconfig\u002Fconfig.json",[50,386,387,388,80],{},"Server settings; created from a sample on first start (see ",[74,389,391],{"href":390},"\u002Fdocs\u002Fserver\u002Fconfiguration","Configuration",[14,393,394,395,398,399,402,403,406],{},"The container listens on port ",[26,396,397],{},"18232"," (",[26,400,401],{},"NITRO_PORT",") on all interfaces. The dashboard, the REST\nAPI and the agent WebSocket (",[26,404,405],{},"\u002Fapi\u002Fagent-control-service",") all share this port.",[95,408,410],{"id":409},"first-start","First start",[14,412,413],{},"On first start, the server:",[415,416,417,429,432,443],"ol",{},[418,419,420,421,424,425,428],"li",{},"creates ",[26,422,423],{},"config\u002Fconfig.json"," from the bundled sample (an empty ",[26,426,427],{},"{}",") if it doesn't exist,",[418,430,431],{},"creates the database tables,",[418,433,434,435,438,439,442],{},"creates the user ",[26,436,437],{},"admin"," with a random 64-character password, writes it to\n",[26,440,441],{},"data\u002Finitial_admin_credentials"," and prints it to the log,",[418,444,445],{},"loads the agents from the database and starts accepting agent connections.",[18,447,449],{"className":212,"code":448,"filename":214,"language":215,"meta":24,"style":24},"sudo cat \u002Fopt\u002Fnetignite\u002Fdata\u002Finitial_admin_credentials\n",[26,450,451],{"__ignoreMap":24},[108,452,453,456,459],{"class":110,"line":111},[108,454,455],{"class":222},"sudo",[108,457,458],{"class":139}," cat",[108,460,461],{"class":139}," \u002Fopt\u002Fnetignite\u002Fdata\u002Finitial_admin_credentials\n",[463,464,465],"warning",{},[14,466,467,468,471],{},"Log in and change the admin password right away, then delete ",[26,469,470],{},"initial_admin_credentials",". The\nserver never removes the file itself.",[14,473,474,475,478,479,483],{},"Production builds only accept the session cookie over HTTPS (or on ",[26,476,477],{},"localhost","). Before you use\nthe dashboard from another machine, set up ",[74,480,482],{"href":481},"\u002Fdocs\u002Fserver\u002Freverse-proxy","HTTPS & a reverse proxy",".",[95,485,487],{"id":486},"updating","Updating",[14,489,490],{},"Pull the new image and recreate the container. The database and config live in the mounted\nvolumes and are kept.",[18,492,494],{"className":212,"code":493,"filename":214,"language":215,"meta":24,"style":24},"docker compose pull\ndocker compose up -d\n",[26,495,496,505],{"__ignoreMap":24},[108,497,498,500,502],{"class":110,"line":111},[108,499,223],{"class":222},[108,501,226],{"class":139},[108,503,504],{"class":139}," pull\n",[108,506,507,509,511,513],{"class":110,"line":122},[108,508,223],{"class":222},[108,510,226],{"class":139},[108,512,229],{"class":139},[108,514,232],{"class":139},[516,517,518],"note",{},[14,519,520],{},"Login sessions are held in memory, so everyone has to log in again after a restart or update.",[95,522,524],{"id":523},"from-source","From source",[14,526,527,528,533,534,537],{},"The server requires ",[74,529,532],{"href":530,"rel":531},"https:\u002F\u002Fbun.sh",[78],"Bun",". Node.js is not supported: the build uses Nitro's ",[26,535,536],{},"bun","\npreset and the startup code uses Bun APIs.",[18,539,541],{"className":212,"code":540,"filename":214,"language":215,"meta":24,"style":24},"git clone https:\u002F\u002Fgithub.com\u002FNetIgnite-project\u002FServer.git\ncd Server\nbun install\nbun run build\nbun run .output\u002Fserver\u002Findex.mjs\n",[26,542,543,554,563,570,579],{"__ignoreMap":24},[108,544,545,548,551],{"class":110,"line":111},[108,546,547],{"class":222},"git",[108,549,550],{"class":139}," clone",[108,552,553],{"class":139}," https:\u002F\u002Fgithub.com\u002FNetIgnite-project\u002FServer.git\n",[108,555,556,560],{"class":110,"line":122},[108,557,559],{"class":558},"s2Zo4","cd",[108,561,562],{"class":139}," Server\n",[108,564,565,567],{"class":110,"line":130},[108,566,536],{"class":222},[108,568,569],{"class":139}," install\n",[108,571,572,574,576],{"class":110,"line":143},[108,573,536],{"class":222},[108,575,279],{"class":139},[108,577,578],{"class":139}," build\n",[108,580,581,583,585],{"class":110,"line":154},[108,582,536],{"class":222},[108,584,279],{"class":139},[108,586,587],{"class":139}," .output\u002Fserver\u002Findex.mjs\n",[14,589,590,591,594,595,598,599,602,603,605,606,609,610,613],{},"Run the last command from the repository root: ",[26,592,593],{},"config\u002F"," and ",[26,596,597],{},"data\u002F"," are resolved relative to the\nworking directory, and the config file is created from ",[26,600,601],{},"config\u002Fconfig.sample.json",". Without\n",[26,604,401],{}," the server listens on port ",[26,607,608],{},"3000","; set ",[26,611,612],{},"NITRO_PORT=18232"," to match the Docker image.",[14,615,616],{},"To build the image yourself, use the repository root as the build context:",[18,618,620],{"className":212,"code":619,"filename":214,"language":215,"meta":24,"style":24},"docker build -f docker\u002FDockerfile -t netignite-server .\n",[26,621,622],{"__ignoreMap":24},[108,623,624,626,629,631,634,637,639],{"class":110,"line":111},[108,625,223],{"class":222},[108,627,628],{"class":139}," build",[108,630,244],{"class":139},[108,632,633],{"class":139}," docker\u002FDockerfile",[108,635,636],{"class":139}," -t",[108,638,294],{"class":139},[108,640,641],{"class":139}," .\n",[14,643,644,645,483],{},"For a development server with hot reload, see ",[74,646,648],{"href":647},"\u002Fdocs\u002Freference\u002Fdevelopment","Development",[650,651,652],"style",{},"html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}",{"title":24,"searchDepth":122,"depth":122,"links":654},[655,656,657,658,659,660],{"id":97,"depth":122,"text":98},{"id":266,"depth":122,"text":267},{"id":343,"depth":122,"text":344},{"id":409,"depth":122,"text":410},{"id":486,"depth":122,"text":487},{"id":523,"depth":122,"text":524},"Run the NetIgnite server with Docker Compose, docker run, or from source with Bun.","md",{},{"title":5},"\u002Fdocs\u002Fserver\u002Finstallation",{"title":5,"description":661},"docs\u002Fserver\u002Finstallation","bKSIdnHwKif1CSQSo91-jv5O42_BGc2BVe-gdYQ-ZO8",1792355946171]