[{"data":1,"prerenderedAt":1188},["ShallowReactive",2],{"\u002Fdocs\u002Fself-hosting\u002Fmanual":3},{"id":4,"title":5,"body":6,"description":1180,"extension":1181,"meta":1182,"navigation":1183,"path":1184,"seo":1185,"stem":1186,"__hash__":1187},"docs\u002Fdocs\u002Fself-hosting\u002Fmanual.md","Manual Installation",{"type":7,"value":8,"toc":1162},"minimark",[9,13,25,35,40,80,84,91,164,168,201,205,643,647,918,922,982,986,1151,1158],[10,11,5],"h1",{"id":12},"manual-installation",[14,15,16,17,24],"p",{},"Prefer not to use containers, or running on ARM64? You can run Delivr directly with ",[18,19,23],"a",{"href":20,"rel":21},"https:\u002F\u002Fbun.sh",[22],"nofollow","Bun"," and let systemd keep it running. This guide uses Debian\u002FUbuntu commands; other distributions work the same way.",[26,27,28],"note",{},[14,29,30,34],{},[18,31,33],{"href":32},"\u002Fdocs\u002Fself-hosting\u002Fdocker","Docker Compose"," is the recommended path for most people — updates are a single command. Choose the manual route if you want full control over the runtime.",[36,37,39],"h2",{"id":38},"prerequisites","Prerequisites",[41,42,43,61,69],"ul",{},[44,45,46,50,51,50,54,57,58],"li",{},[47,48,49],"code",{},"git",", ",[47,52,53],{},"curl",[47,55,56],{},"openssl",", and ",[47,59,60],{},"unzip",[44,62,63,64,68],{},"A ",[18,65,67],{"href":66},"\u002Fdocs\u002Fself-hosting\u002Freverse-proxy","reverse proxy"," for HTTPS",[44,70,71,72,75,76,79],{},"Two DNS names — we use ",[47,73,74],{},"mail.example.com"," (web) and ",[47,77,78],{},"api.mail.example.com"," (API)",[36,81,83],{"id":82},"_1-install-bun-system-wide","1. Install Bun system-wide",[14,85,86,87,90],{},"Installing Bun into ",[47,88,89],{},"\u002Fusr\u002Flocal"," makes it available to the service user:",[92,93,98],"pre",{"className":94,"code":95,"language":96,"meta":97,"style":97},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","sudo apt install -y git curl openssl unzip\ncurl -fsSL https:\u002F\u002Fbun.sh\u002Finstall | sudo BUN_INSTALL=\u002Fusr\u002Flocal bash\nbun --version\n","bash","",[47,99,100,131,155],{"__ignoreMap":97},[101,102,105,109,113,116,119,122,125,128],"span",{"class":103,"line":104},"line",1,[101,106,108],{"class":107},"sBMFI","sudo",[101,110,112],{"class":111},"sfazB"," apt",[101,114,115],{"class":111}," install",[101,117,118],{"class":111}," -y",[101,120,121],{"class":111}," git",[101,123,124],{"class":111}," curl",[101,126,127],{"class":111}," openssl",[101,129,130],{"class":111}," unzip\n",[101,132,134,136,139,142,146,149,152],{"class":103,"line":133},2,[101,135,53],{"class":107},[101,137,138],{"class":111}," -fsSL",[101,140,141],{"class":111}," https:\u002F\u002Fbun.sh\u002Finstall",[101,143,145],{"class":144},"sMK4o"," |",[101,147,148],{"class":107}," sudo",[101,150,151],{"class":111}," BUN_INSTALL=\u002Fusr\u002Flocal",[101,153,154],{"class":111}," bash\n",[101,156,158,161],{"class":103,"line":157},3,[101,159,160],{"class":107},"bun",[101,162,163],{"class":111}," --version\n",[36,165,167],{"id":166},"_2-create-a-service-user","2. Create a service user",[92,169,171],{"className":94,"code":170,"language":96,"meta":97,"style":97},"sudo useradd --system --create-home --home-dir \u002Fopt\u002Fdelivr --shell \u002Fusr\u002Fsbin\u002Fnologin delivr\n",[47,172,173],{"__ignoreMap":97},[101,174,175,177,180,183,186,189,192,195,198],{"class":103,"line":104},[101,176,108],{"class":107},[101,178,179],{"class":111}," useradd",[101,181,182],{"class":111}," --system",[101,184,185],{"class":111}," --create-home",[101,187,188],{"class":111}," --home-dir",[101,190,191],{"class":111}," \u002Fopt\u002Fdelivr",[101,193,194],{"class":111}," --shell",[101,196,197],{"class":111}," \u002Fusr\u002Fsbin\u002Fnologin",[101,199,200],{"class":111}," delivr\n",[36,202,204],{"id":203},"_3-install-the-api","3. Install the API",[206,207,209,214,302,309,313,365,368,438,451,461,465,591,602,606],"steps",{"level":208},"3",[210,211,213],"h3",{"id":212},"clone-and-install-dependencies","Clone and install dependencies",[92,215,217],{"className":94,"code":216,"language":96,"meta":97,"style":97},"sudo -u delivr git clone https:\u002F\u002Fgithub.com\u002FDelivr-Project\u002FDelivr-API.git \u002Fopt\u002Fdelivr\u002Fapi\ncd \u002Fopt\u002Fdelivr\u002Fapi\nsudo -u delivr git checkout \"$(sudo -u delivr git describe --tags --abbrev=0 2>\u002Fdev\u002Fnull || echo main)\"\nsudo -u delivr bun install\n",[47,218,219,240,248,287],{"__ignoreMap":97},[101,220,221,223,226,229,231,234,237],{"class":103,"line":104},[101,222,108],{"class":107},[101,224,225],{"class":111}," -u",[101,227,228],{"class":111}," delivr",[101,230,121],{"class":111},[101,232,233],{"class":111}," clone",[101,235,236],{"class":111}," https:\u002F\u002Fgithub.com\u002FDelivr-Project\u002FDelivr-API.git",[101,238,239],{"class":111}," \u002Fopt\u002Fdelivr\u002Fapi\n",[101,241,242,246],{"class":103,"line":133},[101,243,245],{"class":244},"s2Zo4","cd",[101,247,239],{"class":111},[101,249,250,252,254,256,258,261,264,266,269,272,275,278,281,284],{"class":103,"line":157},[101,251,108],{"class":107},[101,253,225],{"class":111},[101,255,228],{"class":111},[101,257,121],{"class":111},[101,259,260],{"class":111}," checkout",[101,262,263],{"class":144}," \"$(",[101,265,108],{"class":107},[101,267,268],{"class":111}," -u delivr git describe --tags --abbrev=0 ",[101,270,271],{"class":144},"2>",[101,273,274],{"class":111},"\u002Fdev\u002Fnull ",[101,276,277],{"class":144},"||",[101,279,280],{"class":244}," echo",[101,282,283],{"class":111}," main",[101,285,286],{"class":144},")\"\n",[101,288,290,292,294,296,299],{"class":103,"line":289},4,[101,291,108],{"class":107},[101,293,225],{"class":111},[101,295,228],{"class":111},[101,297,298],{"class":111}," bun",[101,300,301],{"class":111}," install\n",[14,303,304,305,308],{},"The ",[47,306,307],{},"checkout"," line switches to the latest release tag when there is one.",[210,310,312],{"id":311},"configure","Configure",[92,314,316],{"className":94,"code":315,"language":96,"meta":97,"style":97},"sudo -u delivr cp example.env .env\nsudo -u delivr chmod 600 .env\nsudo -u delivr nano .env\n",[47,317,318,335,352],{"__ignoreMap":97},[101,319,320,322,324,326,329,332],{"class":103,"line":104},[101,321,108],{"class":107},[101,323,225],{"class":111},[101,325,228],{"class":111},[101,327,328],{"class":111}," cp",[101,330,331],{"class":111}," example.env",[101,333,334],{"class":111}," .env\n",[101,336,337,339,341,343,346,350],{"class":103,"line":133},[101,338,108],{"class":107},[101,340,225],{"class":111},[101,342,228],{"class":111},[101,344,345],{"class":111}," chmod",[101,347,349],{"class":348},"sbssI"," 600",[101,351,334],{"class":111},[101,353,354,356,358,360,363],{"class":103,"line":157},[101,355,108],{"class":107},[101,357,225],{"class":111},[101,359,228],{"class":111},[101,361,362],{"class":111}," nano",[101,364,334],{"class":111},[14,366,367],{},"Set at least these values:",[92,369,374],{"className":370,"code":371,"filename":372,"language":373,"meta":97,"style":97},"language-dotenv shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","DLA_APP_URL=https:\u002F\u002Fmail.example.com\nDLA_ENCRYPTION_KEY=\u003Coutput of: openssl rand -hex 32>\n\n# Only listen on localhost — the reverse proxy is the public entry point\nDLA_API_HOST=127.0.0.1\nDLA_API_PORT=14123\n# Only the local reverse proxy can reach the API, so trust the client address it forwards\nDLA_TRUST_PROXY=true\n\nDLA_DB_CONNECTION_URL=.\u002Fdata\u002Fdb.sqlite\nDLA_DB_MIGRATION_DIR=.\u002Fdrizzle\u002Fmigrations\u002Fsqlite\n","\u002Fopt\u002Fdelivr\u002Fapi\u002F.env","dotenv",[47,375,376,381,386,392,397,403,409,415,421,426,432],{"__ignoreMap":97},[101,377,378],{"class":103,"line":104},[101,379,380],{},"DLA_APP_URL=https:\u002F\u002Fmail.example.com\n",[101,382,383],{"class":103,"line":133},[101,384,385],{},"DLA_ENCRYPTION_KEY=\u003Coutput of: openssl rand -hex 32>\n",[101,387,388],{"class":103,"line":157},[101,389,391],{"emptyLinePlaceholder":390},true,"\n",[101,393,394],{"class":103,"line":289},[101,395,396],{},"# Only listen on localhost — the reverse proxy is the public entry point\n",[101,398,400],{"class":103,"line":399},5,[101,401,402],{},"DLA_API_HOST=127.0.0.1\n",[101,404,406],{"class":103,"line":405},6,[101,407,408],{},"DLA_API_PORT=14123\n",[101,410,412],{"class":103,"line":411},7,[101,413,414],{},"# Only the local reverse proxy can reach the API, so trust the client address it forwards\n",[101,416,418],{"class":103,"line":417},8,[101,419,420],{},"DLA_TRUST_PROXY=true\n",[101,422,424],{"class":103,"line":423},9,[101,425,391],{"emptyLinePlaceholder":390},[101,427,429],{"class":103,"line":428},10,[101,430,431],{},"DLA_DB_CONNECTION_URL=.\u002Fdata\u002Fdb.sqlite\n",[101,433,435],{"class":103,"line":434},11,[101,436,437],{},"DLA_DB_MIGRATION_DIR=.\u002Fdrizzle\u002Fmigrations\u002Fsqlite\n",[14,439,440,441,445,446,450],{},"See the ",[18,442,444],{"href":443},"\u002Fdocs\u002Fconfiguration#delivr-api","Configuration Reference"," for every option, including ",[18,447,449],{"href":448},"\u002Fdocs\u002Fconfiguration#system-email-smtp","system email",".",[452,453,454],"warning",{},[14,455,456,457,460],{},"Back up ",[47,458,459],{},"DLA_ENCRYPTION_KEY"," somewhere other than this server. Without it, stored mail-account credentials cannot be decrypted.",[210,462,464],{"id":463},"create-the-systemd-service","Create the systemd service",[92,466,471],{"className":467,"code":468,"filename":469,"language":470,"meta":97,"style":97},"language-ini shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[Unit]\nDescription=Delivr API\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nType=simple\nUser=delivr\nGroup=delivr\nWorkingDirectory=\u002Fopt\u002Fdelivr\u002Fapi\nExecStart=\u002Fusr\u002Flocal\u002Fbin\u002Fbun run start\nRestart=on-failure\nRestartSec=5\n\n# Hardening\nNoNewPrivileges=true\nPrivateTmp=true\nProtectSystem=full\nProtectHome=true\n\n[Install]\nWantedBy=multi-user.target\n","\u002Fetc\u002Fsystemd\u002Fsystem\u002Fdelivr-api.service","ini",[47,472,473,478,483,488,493,497,502,507,512,517,522,527,533,539,544,550,556,562,568,574,579,585],{"__ignoreMap":97},[101,474,475],{"class":103,"line":104},[101,476,477],{},"[Unit]\n",[101,479,480],{"class":103,"line":133},[101,481,482],{},"Description=Delivr API\n",[101,484,485],{"class":103,"line":157},[101,486,487],{},"After=network-online.target\n",[101,489,490],{"class":103,"line":289},[101,491,492],{},"Wants=network-online.target\n",[101,494,495],{"class":103,"line":399},[101,496,391],{"emptyLinePlaceholder":390},[101,498,499],{"class":103,"line":405},[101,500,501],{},"[Service]\n",[101,503,504],{"class":103,"line":411},[101,505,506],{},"Type=simple\n",[101,508,509],{"class":103,"line":417},[101,510,511],{},"User=delivr\n",[101,513,514],{"class":103,"line":423},[101,515,516],{},"Group=delivr\n",[101,518,519],{"class":103,"line":428},[101,520,521],{},"WorkingDirectory=\u002Fopt\u002Fdelivr\u002Fapi\n",[101,523,524],{"class":103,"line":434},[101,525,526],{},"ExecStart=\u002Fusr\u002Flocal\u002Fbin\u002Fbun run start\n",[101,528,530],{"class":103,"line":529},12,[101,531,532],{},"Restart=on-failure\n",[101,534,536],{"class":103,"line":535},13,[101,537,538],{},"RestartSec=5\n",[101,540,542],{"class":103,"line":541},14,[101,543,391],{"emptyLinePlaceholder":390},[101,545,547],{"class":103,"line":546},15,[101,548,549],{},"# Hardening\n",[101,551,553],{"class":103,"line":552},16,[101,554,555],{},"NoNewPrivileges=true\n",[101,557,559],{"class":103,"line":558},17,[101,560,561],{},"PrivateTmp=true\n",[101,563,565],{"class":103,"line":564},18,[101,566,567],{},"ProtectSystem=full\n",[101,569,571],{"class":103,"line":570},19,[101,572,573],{},"ProtectHome=true\n",[101,575,577],{"class":103,"line":576},20,[101,578,391],{"emptyLinePlaceholder":390},[101,580,582],{"class":103,"line":581},21,[101,583,584],{},"[Install]\n",[101,586,588],{"class":103,"line":587},22,[101,589,590],{},"WantedBy=multi-user.target\n",[14,592,593,594,597,598,601],{},"Bun loads ",[47,595,596],{},".env"," from the working directory automatically. ",[47,599,600],{},"bun run start"," always applies pending database migrations before the server starts.",[210,603,605],{"id":604},"start-it","Start it",[92,607,609],{"className":94,"code":608,"language":96,"meta":97,"style":97},"sudo systemctl daemon-reload\nsudo systemctl enable --now delivr-api\ncurl http:\u002F\u002F127.0.0.1:14123\u002Fhealth\n",[47,610,611,621,636],{"__ignoreMap":97},[101,612,613,615,618],{"class":103,"line":104},[101,614,108],{"class":107},[101,616,617],{"class":111}," systemctl",[101,619,620],{"class":111}," daemon-reload\n",[101,622,623,625,627,630,633],{"class":103,"line":133},[101,624,108],{"class":107},[101,626,617],{"class":111},[101,628,629],{"class":111}," enable",[101,631,632],{"class":111}," --now",[101,634,635],{"class":111}," delivr-api\n",[101,637,638,640],{"class":103,"line":157},[101,639,53],{"class":107},[101,641,642],{"class":111}," http:\u002F\u002F127.0.0.1:14123\u002Fhealth\n",[36,644,646],{"id":645},"_4-install-the-web-client","4. Install the web client",[206,648,649,653,740,746,749,756,879,882],{"level":208},[210,650,652],{"id":651},"clone-install-and-build","Clone, install, and build",[92,654,656],{"className":94,"code":655,"language":96,"meta":97,"style":97},"sudo -u delivr git clone https:\u002F\u002Fgithub.com\u002FDelivr-Project\u002FDelivr-Web.git \u002Fopt\u002Fdelivr\u002Fweb\ncd \u002Fopt\u002Fdelivr\u002Fweb\nsudo -u delivr git checkout \"$(sudo -u delivr git describe --tags --abbrev=0 2>\u002Fdev\u002Fnull || echo main)\"\nsudo -u delivr bun install\nsudo -u delivr bun run build\n",[47,657,658,676,682,712,724],{"__ignoreMap":97},[101,659,660,662,664,666,668,670,673],{"class":103,"line":104},[101,661,108],{"class":107},[101,663,225],{"class":111},[101,665,228],{"class":111},[101,667,121],{"class":111},[101,669,233],{"class":111},[101,671,672],{"class":111}," https:\u002F\u002Fgithub.com\u002FDelivr-Project\u002FDelivr-Web.git",[101,674,675],{"class":111}," \u002Fopt\u002Fdelivr\u002Fweb\n",[101,677,678,680],{"class":103,"line":133},[101,679,245],{"class":244},[101,681,675],{"class":111},[101,683,684,686,688,690,692,694,696,698,700,702,704,706,708,710],{"class":103,"line":157},[101,685,108],{"class":107},[101,687,225],{"class":111},[101,689,228],{"class":111},[101,691,121],{"class":111},[101,693,260],{"class":111},[101,695,263],{"class":144},[101,697,108],{"class":107},[101,699,268],{"class":111},[101,701,271],{"class":144},[101,703,274],{"class":111},[101,705,277],{"class":144},[101,707,280],{"class":244},[101,709,283],{"class":111},[101,711,286],{"class":144},[101,713,714,716,718,720,722],{"class":103,"line":289},[101,715,108],{"class":107},[101,717,225],{"class":111},[101,719,228],{"class":111},[101,721,298],{"class":111},[101,723,301],{"class":111},[101,725,726,728,730,732,734,737],{"class":103,"line":399},[101,727,108],{"class":107},[101,729,225],{"class":111},[101,731,228],{"class":111},[101,733,298],{"class":111},[101,735,736],{"class":111}," run",[101,738,739],{"class":111}," build\n",[14,741,742,743,450],{},"The build output lands in ",[47,744,745],{},".output\u002F",[210,747,464],{"id":748},"create-the-systemd-service-1",[14,750,751,752,755],{},"The web client is configured at runtime with ",[47,753,754],{},"NUXT_PUBLIC_*"," variables, so one build works for any domain:",[92,757,760],{"className":467,"code":758,"filename":759,"language":470,"meta":97,"style":97},"[Unit]\nDescription=Delivr Web\nAfter=network-online.target delivr-api.service\nWants=network-online.target\n\n[Service]\nType=simple\nUser=delivr\nGroup=delivr\nWorkingDirectory=\u002Fopt\u002Fdelivr\u002Fweb\nEnvironment=NUXT_PUBLIC_API_URL=https:\u002F\u002Fapi.mail.example.com\u002Fv1\nEnvironment=NUXT_PUBLIC_APP_URL=https:\u002F\u002Fmail.example.com\nEnvironment=NUXT_PUBLIC_IS_SIGNUP_ENABLED=false\nEnvironment=NITRO_HOST=127.0.0.1\nEnvironment=NITRO_PORT=14128\nExecStart=\u002Fusr\u002Flocal\u002Fbin\u002Fbun run .output\u002Fserver\u002Findex.mjs\nRestart=on-failure\nRestartSec=5\n\nNoNewPrivileges=true\nPrivateTmp=true\nProtectSystem=full\nProtectHome=true\n\n[Install]\nWantedBy=multi-user.target\n","\u002Fetc\u002Fsystemd\u002Fsystem\u002Fdelivr-web.service",[47,761,762,766,771,776,780,784,788,792,796,800,805,810,815,820,825,830,835,839,843,847,851,855,859,864,869,874],{"__ignoreMap":97},[101,763,764],{"class":103,"line":104},[101,765,477],{},[101,767,768],{"class":103,"line":133},[101,769,770],{},"Description=Delivr Web\n",[101,772,773],{"class":103,"line":157},[101,774,775],{},"After=network-online.target delivr-api.service\n",[101,777,778],{"class":103,"line":289},[101,779,492],{},[101,781,782],{"class":103,"line":399},[101,783,391],{"emptyLinePlaceholder":390},[101,785,786],{"class":103,"line":405},[101,787,501],{},[101,789,790],{"class":103,"line":411},[101,791,506],{},[101,793,794],{"class":103,"line":417},[101,795,511],{},[101,797,798],{"class":103,"line":423},[101,799,516],{},[101,801,802],{"class":103,"line":428},[101,803,804],{},"WorkingDirectory=\u002Fopt\u002Fdelivr\u002Fweb\n",[101,806,807],{"class":103,"line":434},[101,808,809],{},"Environment=NUXT_PUBLIC_API_URL=https:\u002F\u002Fapi.mail.example.com\u002Fv1\n",[101,811,812],{"class":103,"line":529},[101,813,814],{},"Environment=NUXT_PUBLIC_APP_URL=https:\u002F\u002Fmail.example.com\n",[101,816,817],{"class":103,"line":535},[101,818,819],{},"Environment=NUXT_PUBLIC_IS_SIGNUP_ENABLED=false\n",[101,821,822],{"class":103,"line":541},[101,823,824],{},"Environment=NITRO_HOST=127.0.0.1\n",[101,826,827],{"class":103,"line":546},[101,828,829],{},"Environment=NITRO_PORT=14128\n",[101,831,832],{"class":103,"line":552},[101,833,834],{},"ExecStart=\u002Fusr\u002Flocal\u002Fbin\u002Fbun run .output\u002Fserver\u002Findex.mjs\n",[101,836,837],{"class":103,"line":558},[101,838,532],{},[101,840,841],{"class":103,"line":564},[101,842,538],{},[101,844,845],{"class":103,"line":570},[101,846,391],{"emptyLinePlaceholder":390},[101,848,849],{"class":103,"line":576},[101,850,555],{},[101,852,853],{"class":103,"line":581},[101,854,561],{},[101,856,857],{"class":103,"line":587},[101,858,567],{},[101,860,862],{"class":103,"line":861},23,[101,863,573],{},[101,865,867],{"class":103,"line":866},24,[101,868,391],{"emptyLinePlaceholder":390},[101,870,872],{"class":103,"line":871},25,[101,873,584],{},[101,875,877],{"class":103,"line":876},26,[101,878,590],{},[210,880,605],{"id":881},"start-it-1",[92,883,885],{"className":94,"code":884,"language":96,"meta":97,"style":97},"sudo systemctl daemon-reload\nsudo systemctl enable --now delivr-web\ncurl -I http:\u002F\u002F127.0.0.1:14128\n",[47,886,887,895,908],{"__ignoreMap":97},[101,888,889,891,893],{"class":103,"line":104},[101,890,108],{"class":107},[101,892,617],{"class":111},[101,894,620],{"class":111},[101,896,897,899,901,903,905],{"class":103,"line":133},[101,898,108],{"class":107},[101,900,617],{"class":111},[101,902,629],{"class":111},[101,904,632],{"class":111},[101,906,907],{"class":111}," delivr-web\n",[101,909,910,912,915],{"class":103,"line":157},[101,911,53],{"class":107},[101,913,914],{"class":111}," -I",[101,916,917],{"class":111}," http:\u002F\u002F127.0.0.1:14128\n",[36,919,921],{"id":920},"_5-finish-up","5. Finish up",[923,924,925,931,975],"ol",{},[44,926,927,928,930],{},"Configure your ",[18,929,67],{"href":66}," for both domains.",[44,932,933,934],{},"Find the one-time admin setup link:",[92,935,937],{"className":94,"code":936,"language":96,"meta":97,"style":97},"sudo journalctl -u delivr-api | grep reset-password\n# or\nsudo cat \u002Fopt\u002Fdelivr\u002Fapi\u002Fconfig\u002Finitial_admin_password_reset_token.txt\n",[47,938,939,959,965],{"__ignoreMap":97},[101,940,941,943,946,948,951,953,956],{"class":103,"line":104},[101,942,108],{"class":107},[101,944,945],{"class":111}," journalctl",[101,947,225],{"class":111},[101,949,950],{"class":111}," delivr-api",[101,952,145],{"class":144},[101,954,955],{"class":107}," grep",[101,957,958],{"class":111}," reset-password\n",[101,960,961],{"class":103,"line":133},[101,962,964],{"class":963},"sHwdD","# or\n",[101,966,967,969,972],{"class":103,"line":157},[101,968,108],{"class":107},[101,970,971],{"class":111}," cat",[101,973,974],{"class":111}," \u002Fopt\u002Fdelivr\u002Fapi\u002Fconfig\u002Finitial_admin_password_reset_token.txt\n",[44,976,977,978,450],{},"Continue with ",[18,979,981],{"href":980},"\u002Fdocs\u002Fself-hosting\u002Ffirst-run","First Run & Admin Setup",[36,983,985],{"id":984},"updating-a-manual-installation","Updating a manual installation",[92,987,989],{"className":94,"code":988,"language":96,"meta":97,"style":97},"# API\ncd \u002Fopt\u002Fdelivr\u002Fapi\nsudo -u delivr git fetch --tags\nsudo -u delivr git checkout \u003Cnew-version-tag>\nsudo -u delivr bun install\nsudo systemctl restart delivr-api\n\n# Web\ncd \u002Fopt\u002Fdelivr\u002Fweb\nsudo -u delivr git fetch --tags\nsudo -u delivr git checkout \u003Cnew-version-tag>\nsudo -u delivr bun install\nsudo -u delivr bun run build\nsudo systemctl restart delivr-web\n",[47,990,991,996,1002,1018,1043,1055,1066,1070,1075,1081,1095,1115,1127,1141],{"__ignoreMap":97},[101,992,993],{"class":103,"line":104},[101,994,995],{"class":963},"# API\n",[101,997,998,1000],{"class":103,"line":133},[101,999,245],{"class":244},[101,1001,239],{"class":111},[101,1003,1004,1006,1008,1010,1012,1015],{"class":103,"line":157},[101,1005,108],{"class":107},[101,1007,225],{"class":111},[101,1009,228],{"class":111},[101,1011,121],{"class":111},[101,1013,1014],{"class":111}," fetch",[101,1016,1017],{"class":111}," --tags\n",[101,1019,1020,1022,1024,1026,1028,1030,1033,1036,1040],{"class":103,"line":289},[101,1021,108],{"class":107},[101,1023,225],{"class":111},[101,1025,228],{"class":111},[101,1027,121],{"class":111},[101,1029,260],{"class":111},[101,1031,1032],{"class":144}," \u003C",[101,1034,1035],{"class":111},"new-version-ta",[101,1037,1039],{"class":1038},"sTEyZ","g",[101,1041,1042],{"class":144},">\n",[101,1044,1045,1047,1049,1051,1053],{"class":103,"line":399},[101,1046,108],{"class":107},[101,1048,225],{"class":111},[101,1050,228],{"class":111},[101,1052,298],{"class":111},[101,1054,301],{"class":111},[101,1056,1057,1059,1061,1064],{"class":103,"line":405},[101,1058,108],{"class":107},[101,1060,617],{"class":111},[101,1062,1063],{"class":111}," restart",[101,1065,635],{"class":111},[101,1067,1068],{"class":103,"line":411},[101,1069,391],{"emptyLinePlaceholder":390},[101,1071,1072],{"class":103,"line":417},[101,1073,1074],{"class":963},"# Web\n",[101,1076,1077,1079],{"class":103,"line":423},[101,1078,245],{"class":244},[101,1080,675],{"class":111},[101,1082,1083,1085,1087,1089,1091,1093],{"class":103,"line":428},[101,1084,108],{"class":107},[101,1086,225],{"class":111},[101,1088,228],{"class":111},[101,1090,121],{"class":111},[101,1092,1014],{"class":111},[101,1094,1017],{"class":111},[101,1096,1097,1099,1101,1103,1105,1107,1109,1111,1113],{"class":103,"line":434},[101,1098,108],{"class":107},[101,1100,225],{"class":111},[101,1102,228],{"class":111},[101,1104,121],{"class":111},[101,1106,260],{"class":111},[101,1108,1032],{"class":144},[101,1110,1035],{"class":111},[101,1112,1039],{"class":1038},[101,1114,1042],{"class":144},[101,1116,1117,1119,1121,1123,1125],{"class":103,"line":529},[101,1118,108],{"class":107},[101,1120,225],{"class":111},[101,1122,228],{"class":111},[101,1124,298],{"class":111},[101,1126,301],{"class":111},[101,1128,1129,1131,1133,1135,1137,1139],{"class":103,"line":535},[101,1130,108],{"class":107},[101,1132,225],{"class":111},[101,1134,228],{"class":111},[101,1136,298],{"class":111},[101,1138,736],{"class":111},[101,1140,739],{"class":111},[101,1142,1143,1145,1147,1149],{"class":103,"line":541},[101,1144,108],{"class":107},[101,1146,617],{"class":111},[101,1148,1063],{"class":111},[101,1150,907],{"class":111},[14,1152,1153,1154,450],{},"Back up first — see ",[18,1155,1157],{"href":1156},"\u002Fdocs\u002Fself-hosting\u002Fupgrading","Updates & Backups",[1159,1160,1161],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":97,"searchDepth":133,"depth":133,"links":1163},[1164,1165,1166,1167,1173,1178,1179],{"id":38,"depth":133,"text":39},{"id":82,"depth":133,"text":83},{"id":166,"depth":133,"text":167},{"id":203,"depth":133,"text":204,"children":1168},[1169,1170,1171,1172],{"id":212,"depth":157,"text":213},{"id":311,"depth":157,"text":312},{"id":463,"depth":157,"text":464},{"id":604,"depth":157,"text":605},{"id":645,"depth":133,"text":646,"children":1174},[1175,1176,1177],{"id":651,"depth":157,"text":652},{"id":748,"depth":157,"text":464},{"id":881,"depth":157,"text":605},{"id":920,"depth":133,"text":921},{"id":984,"depth":133,"text":985},"Install Delivr from source with Bun and run the API and the web client as systemd services.","md",{},{"title":5},"\u002Fdocs\u002Fself-hosting\u002Fmanual",{"title":5,"description":1180},"docs\u002Fself-hosting\u002Fmanual","fEAxVzcvpbScYxqWQ0jgB3FlYapISGfIpVt_CmNmqcc",1791069427473]