[{"data":1,"prerenderedAt":1175},["ShallowReactive",2],{"\u002Fdocs\u002Fself-hosting\u002Fdocker":3},{"id":4,"title":5,"body":6,"description":1167,"extension":1168,"meta":1169,"navigation":1170,"path":1171,"seo":1172,"stem":1173,"__hash__":1174},"docs\u002Fdocs\u002Fself-hosting\u002Fdocker.md","Docker Compose",{"type":7,"value":8,"toc":1150},"minimark",[9,13,17,38,43,103,114,118,798,802,809,890,909,913,923,994,1000,1004,1009,1038,1048,1052,1120,1124,1146],[10,11,5],"h1",{"id":12},"docker-compose",[14,15,16],"p",{},"The fastest way to run Delivr is with the official container images and a single Compose file. This guide takes you from an empty server to a running instance.",[18,19,20],"note",{},[14,21,22,23,28,29,33,34,37],{},"This guide assumes you've read the ",[24,25,27],"a",{"href":26},"\u002Fdocs\u002Fself-hosting","Overview & Requirements"," and have two DNS names ready — we use ",[30,31,32],"code",{},"mail.example.com"," for the web client and ",[30,35,36],{},"api.mail.example.com"," for the API.",[39,40,42],"h2",{"id":41},"images","Images",[44,45,46,62],"table",{},[47,48,49],"thead",{},[50,51,52,56,59],"tr",{},[53,54,55],"th",{},"Image",[53,57,58],{},"Port",[53,60,61],{},"Volumes",[63,64,65,88],"tbody",{},[50,66,67,73,78],{},[68,69,70],"td",{},[30,71,72],{},"ghcr.io\u002Fdelivr-project\u002Fdelivr-api",[68,74,75],{},[30,76,77],{},"14123",[68,79,80,83,84,87],{},[30,81,82],{},"\u002Fopt\u002Fdelivr\u002Fapi\u002Fdata"," (database, logs) · ",[30,85,86],{},"\u002Fopt\u002Fdelivr\u002Fapi\u002Fconfig"," (setup files)",[50,89,90,95,100],{},[68,91,92],{},[30,93,94],{},"ghcr.io\u002Fdelivr-project\u002Fdelivr-web",[68,96,97],{},[30,98,99],{},"14128",[68,101,102],{},"— (stateless)",[14,104,105,106,109,110,113],{},"Both images are tagged with the release version (for example ",[30,107,108],{},":1.0.0",") and ",[30,111,112],{},":latest"," for the newest stable release. Both have a built-in health check.",[39,115,117],{"id":116},"installation","Installation",[119,120,122,127,166,170,191,198,587,591,611,623,632,636,639,670,677,681,713,720,724,736,740,747,790],"steps",{"level":121},"3",[123,124,126],"h3",{"id":125},"create-a-directory","Create a directory",[128,129,134],"pre",{"className":130,"code":131,"language":132,"meta":133,"style":133},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","sudo mkdir -p \u002Fopt\u002Fdelivr && cd \u002Fopt\u002Fdelivr\n","bash","",[30,135,136],{"__ignoreMap":133},[137,138,141,145,149,152,155,159,163],"span",{"class":139,"line":140},"line",1,[137,142,144],{"class":143},"sBMFI","sudo",[137,146,148],{"class":147},"sfazB"," mkdir",[137,150,151],{"class":147}," -p",[137,153,154],{"class":147}," \u002Fopt\u002Fdelivr",[137,156,158],{"class":157},"sMK4o"," &&",[137,160,162],{"class":161},"s2Zo4"," cd",[137,164,165],{"class":147}," \u002Fopt\u002Fdelivr\n",[123,167,169],{"id":168},"download-the-compose-file","Download the Compose file",[128,171,173],{"className":130,"code":172,"language":132,"meta":133,"style":133},"sudo curl -o docker-compose.yml https:\u002F\u002Fwww.delivr.email\u002Fstatic\u002Fdocker-compose.yml\n",[30,174,175],{"__ignoreMap":133},[137,176,177,179,182,185,188],{"class":139,"line":140},[137,178,144],{"class":143},[137,180,181],{"class":147}," curl",[137,183,184],{"class":147}," -o",[137,186,187],{"class":147}," docker-compose.yml",[137,189,190],{"class":147}," https:\u002F\u002Fwww.delivr.email\u002Fstatic\u002Fdocker-compose.yml\n",[14,192,193,194,197],{},"Or create ",[30,195,196],{},"docker-compose.yml"," yourself:",[128,199,203],{"className":200,"code":201,"filename":196,"language":202,"meta":133,"style":133},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","services:\n  delivr-api:\n    image: ghcr.io\u002Fdelivr-project\u002Fdelivr-api:latest\n    container_name: delivr-api\n    restart: unless-stopped\n    ports:\n      - \"127.0.0.1:14123:14123\"\n    environment:\n      DLA_APP_URL: \"https:\u002F\u002Fmail.example.com\"\n      DLA_ENCRYPTION_KEY: \"\" # openssl rand -hex 32\n      DLA_TRUST_PROXY: \"true\" # only reachable via your reverse proxy\n      DLA_LOG_LEVEL: \"info\"\n      DLA_DISABLE_DOCS: \"false\"\n      DLA_MAX_ATTACHMENT_SIZE_MB: \"25\"\n      # Optional: outbound system mail (password-reset emails)\n      # DLA_SMTP_HOST: \"smtp.example.com\"\n      # DLA_SMTP_PORT: \"465\"\n      # DLA_SMTP_SECURE: \"true\"\n      # DLA_SMTP_USERNAME: \"noreply@example.com\"\n      # DLA_SMTP_PASSWORD: \"\"\n      # DLA_SMTP_FROM: \"Delivr \u003Cnoreply@example.com>\"\n    volumes:\n      - .\u002Fdata:\u002Fopt\u002Fdelivr\u002Fapi\u002Fdata\n      - .\u002Fconfig:\u002Fopt\u002Fdelivr\u002Fapi\u002Fconfig\n\n  delivr-web:\n    image: ghcr.io\u002Fdelivr-project\u002Fdelivr-web:latest\n    container_name: delivr-web\n    restart: unless-stopped\n    ports:\n      - \"127.0.0.1:14128:14128\"\n    environment:\n      NUXT_PUBLIC_API_URL: \"https:\u002F\u002Fapi.mail.example.com\u002Fv1\"\n      NUXT_PUBLIC_APP_URL: \"https:\u002F\u002Fmail.example.com\"\n      NUXT_PUBLIC_IS_SIGNUP_ENABLED: \"false\"\n    depends_on:\n      delivr-api:\n        condition: service_healthy\n","yaml",[30,204,205,214,222,234,245,256,264,279,287,302,317,336,351,366,381,387,393,399,405,411,417,423,431,439,447,454,462,472,482,491,498,510,517,532,546,560,568,576],{"__ignoreMap":133},[137,206,207,211],{"class":139,"line":140},[137,208,210],{"class":209},"swJcz","services",[137,212,213],{"class":157},":\n",[137,215,217,220],{"class":139,"line":216},2,[137,218,219],{"class":209},"  delivr-api",[137,221,213],{"class":157},[137,223,225,228,231],{"class":139,"line":224},3,[137,226,227],{"class":209},"    image",[137,229,230],{"class":157},":",[137,232,233],{"class":147}," ghcr.io\u002Fdelivr-project\u002Fdelivr-api:latest\n",[137,235,237,240,242],{"class":139,"line":236},4,[137,238,239],{"class":209},"    container_name",[137,241,230],{"class":157},[137,243,244],{"class":147}," delivr-api\n",[137,246,248,251,253],{"class":139,"line":247},5,[137,249,250],{"class":209},"    restart",[137,252,230],{"class":157},[137,254,255],{"class":147}," unless-stopped\n",[137,257,259,262],{"class":139,"line":258},6,[137,260,261],{"class":209},"    ports",[137,263,213],{"class":157},[137,265,267,270,273,276],{"class":139,"line":266},7,[137,268,269],{"class":157},"      -",[137,271,272],{"class":157}," \"",[137,274,275],{"class":147},"127.0.0.1:14123:14123",[137,277,278],{"class":157},"\"\n",[137,280,282,285],{"class":139,"line":281},8,[137,283,284],{"class":209},"    environment",[137,286,213],{"class":157},[137,288,290,293,295,297,300],{"class":139,"line":289},9,[137,291,292],{"class":209},"      DLA_APP_URL",[137,294,230],{"class":157},[137,296,272],{"class":157},[137,298,299],{"class":147},"https:\u002F\u002Fmail.example.com",[137,301,278],{"class":157},[137,303,305,308,310,313],{"class":139,"line":304},10,[137,306,307],{"class":209},"      DLA_ENCRYPTION_KEY",[137,309,230],{"class":157},[137,311,312],{"class":157}," \"\"",[137,314,316],{"class":315},"sHwdD"," # openssl rand -hex 32\n",[137,318,320,323,325,327,330,333],{"class":139,"line":319},11,[137,321,322],{"class":209},"      DLA_TRUST_PROXY",[137,324,230],{"class":157},[137,326,272],{"class":157},[137,328,329],{"class":147},"true",[137,331,332],{"class":157},"\"",[137,334,335],{"class":315}," # only reachable via your reverse proxy\n",[137,337,339,342,344,346,349],{"class":139,"line":338},12,[137,340,341],{"class":209},"      DLA_LOG_LEVEL",[137,343,230],{"class":157},[137,345,272],{"class":157},[137,347,348],{"class":147},"info",[137,350,278],{"class":157},[137,352,354,357,359,361,364],{"class":139,"line":353},13,[137,355,356],{"class":209},"      DLA_DISABLE_DOCS",[137,358,230],{"class":157},[137,360,272],{"class":157},[137,362,363],{"class":147},"false",[137,365,278],{"class":157},[137,367,369,372,374,376,379],{"class":139,"line":368},14,[137,370,371],{"class":209},"      DLA_MAX_ATTACHMENT_SIZE_MB",[137,373,230],{"class":157},[137,375,272],{"class":157},[137,377,378],{"class":147},"25",[137,380,278],{"class":157},[137,382,384],{"class":139,"line":383},15,[137,385,386],{"class":315},"      # Optional: outbound system mail (password-reset emails)\n",[137,388,390],{"class":139,"line":389},16,[137,391,392],{"class":315},"      # DLA_SMTP_HOST: \"smtp.example.com\"\n",[137,394,396],{"class":139,"line":395},17,[137,397,398],{"class":315},"      # DLA_SMTP_PORT: \"465\"\n",[137,400,402],{"class":139,"line":401},18,[137,403,404],{"class":315},"      # DLA_SMTP_SECURE: \"true\"\n",[137,406,408],{"class":139,"line":407},19,[137,409,410],{"class":315},"      # DLA_SMTP_USERNAME: \"noreply@example.com\"\n",[137,412,414],{"class":139,"line":413},20,[137,415,416],{"class":315},"      # DLA_SMTP_PASSWORD: \"\"\n",[137,418,420],{"class":139,"line":419},21,[137,421,422],{"class":315},"      # DLA_SMTP_FROM: \"Delivr \u003Cnoreply@example.com>\"\n",[137,424,426,429],{"class":139,"line":425},22,[137,427,428],{"class":209},"    volumes",[137,430,213],{"class":157},[137,432,434,436],{"class":139,"line":433},23,[137,435,269],{"class":157},[137,437,438],{"class":147}," .\u002Fdata:\u002Fopt\u002Fdelivr\u002Fapi\u002Fdata\n",[137,440,442,444],{"class":139,"line":441},24,[137,443,269],{"class":157},[137,445,446],{"class":147}," .\u002Fconfig:\u002Fopt\u002Fdelivr\u002Fapi\u002Fconfig\n",[137,448,450],{"class":139,"line":449},25,[137,451,453],{"emptyLinePlaceholder":452},true,"\n",[137,455,457,460],{"class":139,"line":456},26,[137,458,459],{"class":209},"  delivr-web",[137,461,213],{"class":157},[137,463,465,467,469],{"class":139,"line":464},27,[137,466,227],{"class":209},[137,468,230],{"class":157},[137,470,471],{"class":147}," ghcr.io\u002Fdelivr-project\u002Fdelivr-web:latest\n",[137,473,475,477,479],{"class":139,"line":474},28,[137,476,239],{"class":209},[137,478,230],{"class":157},[137,480,481],{"class":147}," delivr-web\n",[137,483,485,487,489],{"class":139,"line":484},29,[137,486,250],{"class":209},[137,488,230],{"class":157},[137,490,255],{"class":147},[137,492,494,496],{"class":139,"line":493},30,[137,495,261],{"class":209},[137,497,213],{"class":157},[137,499,501,503,505,508],{"class":139,"line":500},31,[137,502,269],{"class":157},[137,504,272],{"class":157},[137,506,507],{"class":147},"127.0.0.1:14128:14128",[137,509,278],{"class":157},[137,511,513,515],{"class":139,"line":512},32,[137,514,284],{"class":209},[137,516,213],{"class":157},[137,518,520,523,525,527,530],{"class":139,"line":519},33,[137,521,522],{"class":209},"      NUXT_PUBLIC_API_URL",[137,524,230],{"class":157},[137,526,272],{"class":157},[137,528,529],{"class":147},"https:\u002F\u002Fapi.mail.example.com\u002Fv1",[137,531,278],{"class":157},[137,533,535,538,540,542,544],{"class":139,"line":534},34,[137,536,537],{"class":209},"      NUXT_PUBLIC_APP_URL",[137,539,230],{"class":157},[137,541,272],{"class":157},[137,543,299],{"class":147},[137,545,278],{"class":157},[137,547,549,552,554,556,558],{"class":139,"line":548},35,[137,550,551],{"class":209},"      NUXT_PUBLIC_IS_SIGNUP_ENABLED",[137,553,230],{"class":157},[137,555,272],{"class":157},[137,557,363],{"class":147},[137,559,278],{"class":157},[137,561,563,566],{"class":139,"line":562},36,[137,564,565],{"class":209},"    depends_on",[137,567,213],{"class":157},[137,569,571,574],{"class":139,"line":570},37,[137,572,573],{"class":209},"      delivr-api",[137,575,213],{"class":157},[137,577,579,582,584],{"class":139,"line":578},38,[137,580,581],{"class":209},"        condition",[137,583,230],{"class":157},[137,585,586],{"class":147}," service_healthy\n",[123,588,590],{"id":589},"generate-an-encryption-key","Generate an encryption key",[128,592,594],{"className":130,"code":593,"language":132,"meta":133,"style":133},"openssl rand -hex 32\n",[30,595,596],{"__ignoreMap":133},[137,597,598,601,604,607],{"class":139,"line":140},[137,599,600],{"class":143},"openssl",[137,602,603],{"class":147}," rand",[137,605,606],{"class":147}," -hex",[137,608,610],{"class":609},"sbssI"," 32\n",[14,612,613,614,617,618,622],{},"Paste the output into ",[30,615,616],{},"DLA_ENCRYPTION_KEY",". It must be ",[619,620,621],"strong",{},"at least 32 characters"," long.",[624,625,626],"warning",{},[14,627,628,631],{},[619,629,630],{},"Back up this key somewhere safe, separately from the server."," It encrypts every stored IMAP\u002FSMTP password. If you lose it, users must re-enter the credentials of all their mail accounts. If it leaks together with a database backup, those credentials are exposed.",[123,633,635],{"id":634},"set-your-domains","Set your domains",[14,637,638],{},"Replace the example domains:",[640,641,642,655],"ul",{},[643,644,645,648,649,652,653],"li",{},[30,646,647],{},"DLA_APP_URL"," and ",[30,650,651],{},"NUXT_PUBLIC_APP_URL"," → the web client's public URL, e.g. ",[30,654,299],{},[643,656,657,660,661,667,668],{},[30,658,659],{},"NUXT_PUBLIC_API_URL"," → the API's public URL ",[619,662,663,664],{},"including ",[30,665,666],{},"\u002Fv1",", e.g. ",[30,669,529],{},[14,671,672,673,676],{},"Use ",[30,674,675],{},"https:\u002F\u002F"," URLs without a trailing slash.",[123,678,680],{"id":679},"start-delivr","Start Delivr",[128,682,684],{"className":130,"code":683,"language":132,"meta":133,"style":133},"sudo docker compose up -d\nsudo docker compose ps\n",[30,685,686,702],{"__ignoreMap":133},[137,687,688,690,693,696,699],{"class":139,"line":140},[137,689,144],{"class":143},[137,691,692],{"class":147}," docker",[137,694,695],{"class":147}," compose",[137,697,698],{"class":147}," up",[137,700,701],{"class":147}," -d\n",[137,703,704,706,708,710],{"class":139,"line":216},[137,705,144],{"class":143},[137,707,692],{"class":147},[137,709,695],{"class":147},[137,711,712],{"class":147}," ps\n",[14,714,715,716,719],{},"After a few seconds both containers should report ",[30,717,718],{},"healthy",". On first start, the API creates its database and runs all migrations automatically.",[123,721,723],{"id":722},"put-a-reverse-proxy-in-front","Put a reverse proxy in front",[14,725,726,727,730,731,735],{},"Both ports are bound to ",[30,728,729],{},"127.0.0.1",", so nothing is reachable from outside yet. Configure your reverse proxy to serve both domains over HTTPS — see ",[24,732,734],{"href":733},"\u002Fdocs\u002Fself-hosting\u002Freverse-proxy","Reverse Proxy & HTTPS"," for ready-made Caddy, Nginx, Traefik, and Apache configurations.",[123,737,739],{"id":738},"claim-the-admin-account","Claim the admin account",[14,741,742,743,746],{},"On first start, Delivr creates an ",[30,744,745],{},"admin"," user and prints a one-time link to set its password:",[128,748,750],{"className":130,"code":749,"language":132,"meta":133,"style":133},"sudo docker compose logs delivr-api | grep reset-password\n# or\nsudo cat .\u002Fconfig\u002Finitial_admin_password_reset_token.txt\n",[30,751,752,775,780],{"__ignoreMap":133},[137,753,754,756,758,760,763,766,769,772],{"class":139,"line":140},[137,755,144],{"class":143},[137,757,692],{"class":147},[137,759,695],{"class":147},[137,761,762],{"class":147}," logs",[137,764,765],{"class":147}," delivr-api",[137,767,768],{"class":157}," |",[137,770,771],{"class":143}," grep",[137,773,774],{"class":147}," reset-password\n",[137,776,777],{"class":139,"line":216},[137,778,779],{"class":315},"# or\n",[137,781,782,784,787],{"class":139,"line":224},[137,783,144],{"class":143},[137,785,786],{"class":147}," cat",[137,788,789],{"class":147}," .\u002Fconfig\u002Finitial_admin_password_reset_token.txt\n",[14,791,792,793,797],{},"Open the link in your browser, set a password, and sign in. Continue with ",[24,794,796],{"href":795},"\u002Fdocs\u002Fself-hosting\u002Ffirst-run","First Run & Admin Setup",".",[39,799,801],{"id":800},"running-behind-a-containerized-proxy","Running behind a containerized proxy",[14,803,804,805,808],{},"If your reverse proxy runs in Docker too (for example Traefik or Caddy), you don't need to publish any ports. Put Delivr on the proxy's network instead and remove the ",[30,806,807],{},"ports:"," sections:",[128,810,813],{"className":200,"code":811,"filename":812,"language":202,"meta":133,"style":133},"services:\n  delivr-api:\n    networks: [proxy]\n  delivr-web:\n    networks: [proxy]\n\nnetworks:\n  proxy:\n    external: true\n","docker-compose.override.yml",[30,814,815,821,827,843,849,861,865,872,879],{"__ignoreMap":133},[137,816,817,819],{"class":139,"line":140},[137,818,210],{"class":209},[137,820,213],{"class":157},[137,822,823,825],{"class":139,"line":216},[137,824,219],{"class":209},[137,826,213],{"class":157},[137,828,829,832,834,837,840],{"class":139,"line":224},[137,830,831],{"class":209},"    networks",[137,833,230],{"class":157},[137,835,836],{"class":157}," [",[137,838,839],{"class":147},"proxy",[137,841,842],{"class":157},"]\n",[137,844,845,847],{"class":139,"line":236},[137,846,459],{"class":209},[137,848,213],{"class":157},[137,850,851,853,855,857,859],{"class":139,"line":247},[137,852,831],{"class":209},[137,854,230],{"class":157},[137,856,836],{"class":157},[137,858,839],{"class":147},[137,860,842],{"class":157},[137,862,863],{"class":139,"line":258},[137,864,453],{"emptyLinePlaceholder":452},[137,866,867,870],{"class":139,"line":266},[137,868,869],{"class":209},"networks",[137,871,213],{"class":157},[137,873,874,877],{"class":139,"line":281},[137,875,876],{"class":209},"  proxy",[137,878,213],{"class":157},[137,880,881,884,886],{"class":139,"line":289},[137,882,883],{"class":209},"    external",[137,885,230],{"class":157},[137,887,889],{"class":888},"sfNiH"," true\n",[14,891,892,893,648,896,899,900,903,904,908],{},"The proxy can then reach the services at ",[30,894,895],{},"http:\u002F\u002Fdelivr-api:14123",[30,897,898],{},"http:\u002F\u002Fdelivr-web:14128",". The ",[619,901,902],{},"Traefik"," tab under ",[24,905,907],{"href":906},"\u002Fdocs\u002Fself-hosting\u002Freverse-proxy#configurations","Reverse Proxy → Configurations"," shows a complete setup with labels.",[39,910,912],{"id":911},"using-an-env-file","Using an env file",[14,914,915,916,918,919,922],{},"To keep secrets out of ",[30,917,196],{},", move them into a ",[30,920,921],{},".env"," file next to it and reference them:",[924,925,926,952],"code-group",{},[128,927,929],{"className":130,"code":928,"filename":921,"language":132,"meta":133,"style":133},"DLA_ENCRYPTION_KEY=3f6c…your-generated-key…9a1d\nDLA_SMTP_PASSWORD=super-secret\n",[30,930,931,942],{"__ignoreMap":133},[137,932,933,936,939],{"class":139,"line":140},[137,934,616],{"class":935},"sTEyZ",[137,937,938],{"class":157},"=",[137,940,941],{"class":147},"3f6c…your-generated-key…9a1d\n",[137,943,944,947,949],{"class":139,"line":216},[137,945,946],{"class":935},"DLA_SMTP_PASSWORD",[137,948,938],{"class":157},[137,950,951],{"class":147},"super-secret\n",[128,953,955],{"className":200,"code":954,"filename":196,"language":202,"meta":133,"style":133},"services:\n  delivr-api:\n    environment:\n      DLA_ENCRYPTION_KEY: ${DLA_ENCRYPTION_KEY}\n      DLA_SMTP_PASSWORD: ${DLA_SMTP_PASSWORD}\n",[30,956,957,963,969,975,984],{"__ignoreMap":133},[137,958,959,961],{"class":139,"line":140},[137,960,210],{"class":209},[137,962,213],{"class":157},[137,964,965,967],{"class":139,"line":216},[137,966,219],{"class":209},[137,968,213],{"class":157},[137,970,971,973],{"class":139,"line":224},[137,972,284],{"class":209},[137,974,213],{"class":157},[137,976,977,979,981],{"class":139,"line":236},[137,978,307],{"class":209},[137,980,230],{"class":157},[137,982,983],{"class":147}," ${DLA_ENCRYPTION_KEY}\n",[137,985,986,989,991],{"class":139,"line":247},[137,987,988],{"class":209},"      DLA_SMTP_PASSWORD",[137,990,230],{"class":157},[137,992,993],{"class":147}," ${DLA_SMTP_PASSWORD}\n",[14,995,996,997,797],{},"Restrict the file's permissions with ",[30,998,999],{},"chmod 600 .env",[39,1001,1003],{"id":1002},"pinning-a-version","Pinning a version",[14,1005,1006,1008],{},[30,1007,112],{}," always points to the newest stable release. For predictable upgrades, pin both images to the same version:",[128,1010,1012],{"className":200,"code":1011,"language":202,"meta":133,"style":133},"image: ghcr.io\u002Fdelivr-project\u002Fdelivr-api:1.0.0\n# …\nimage: ghcr.io\u002Fdelivr-project\u002Fdelivr-web:1.0.0\n",[30,1013,1014,1024,1029],{"__ignoreMap":133},[137,1015,1016,1019,1021],{"class":139,"line":140},[137,1017,1018],{"class":209},"image",[137,1020,230],{"class":157},[137,1022,1023],{"class":147}," ghcr.io\u002Fdelivr-project\u002Fdelivr-api:1.0.0\n",[137,1025,1026],{"class":139,"line":216},[137,1027,1028],{"class":315},"# …\n",[137,1030,1031,1033,1035],{"class":139,"line":224},[137,1032,1018],{"class":209},[137,1034,230],{"class":157},[137,1036,1037],{"class":147}," ghcr.io\u002Fdelivr-project\u002Fdelivr-web:1.0.0\n",[1039,1040,1041],"tip",{},[14,1042,1043,1044,1047],{},"Always run the API and the web client at the ",[619,1045,1046],{},"same version",". The web client is generated from the API's OpenAPI spec, so mismatched versions can break features.",[39,1049,1051],{"id":1050},"useful-commands","Useful commands",[44,1053,1054,1064],{},[47,1055,1056],{},[50,1057,1058,1061],{},[53,1059,1060],{},"Command",[53,1062,1063],{},"What it does",[63,1065,1066,1076,1086,1096,1106],{},[50,1067,1068,1073],{},[68,1069,1070],{},[30,1071,1072],{},"docker compose ps",[68,1074,1075],{},"Show container status and health.",[50,1077,1078,1083],{},[68,1079,1080],{},[30,1081,1082],{},"docker compose logs -f delivr-api",[68,1084,1085],{},"Follow the API logs.",[50,1087,1088,1093],{},[68,1089,1090],{},[30,1091,1092],{},"docker compose pull && docker compose up -d",[68,1094,1095],{},"Update to the latest images.",[50,1097,1098,1103],{},[68,1099,1100],{},[30,1101,1102],{},"docker compose restart delivr-api",[68,1104,1105],{},"Restart the API (e.g. after changing variables).",[50,1107,1108,1113],{},[68,1109,1110],{},[30,1111,1112],{},"docker compose down",[68,1114,1115,1116,1119],{},"Stop and remove the containers. Your data in ",[30,1117,1118],{},".\u002Fdata"," is kept.",[39,1121,1123],{"id":1122},"next-steps","Next steps",[640,1125,1126,1130,1134,1140],{},[643,1127,1128],{},[24,1129,734],{"href":733},[643,1131,1132],{},[24,1133,796],{"href":795},[643,1135,1136],{},[24,1137,1139],{"href":1138},"\u002Fdocs\u002Fconfiguration","Configuration Reference",[643,1141,1142],{},[24,1143,1145],{"href":1144},"\u002Fdocs\u002Fself-hosting\u002Fhardening","Production Hardening",[1147,1148,1149],"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 pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":133,"searchDepth":216,"depth":216,"links":1151},[1152,1153,1162,1163,1164,1165,1166],{"id":41,"depth":216,"text":42},{"id":116,"depth":216,"text":117,"children":1154},[1155,1156,1157,1158,1159,1160,1161],{"id":125,"depth":224,"text":126},{"id":168,"depth":224,"text":169},{"id":589,"depth":224,"text":590},{"id":634,"depth":224,"text":635},{"id":679,"depth":224,"text":680},{"id":722,"depth":224,"text":723},{"id":738,"depth":224,"text":739},{"id":800,"depth":216,"text":801},{"id":911,"depth":216,"text":912},{"id":1002,"depth":216,"text":1003},{"id":1050,"depth":216,"text":1051},{"id":1122,"depth":216,"text":1123},"Install Delivr with Docker Compose using the official API and web client images from the GitHub Container Registry.","md",{},{"title":5},"\u002Fdocs\u002Fself-hosting\u002Fdocker",{"title":5,"description":1167},"docs\u002Fself-hosting\u002Fdocker","I8JmVuI8Ko2EWXc0TSNlQSr7Jo0ZtY--BaLokAwt0hs",1791069426921]