[{"data":1,"prerenderedAt":1293},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fgetting-started\u002Fdeployment":143,"\u002Fdocs\u002Fgetting-started\u002Fdeployment-surround":1288},[4],{"title":5,"path":6,"stem":7,"children":8,"page":32},"Docs","\u002Fdocs","docs",[9,33,58,79,112,117],{"title":10,"path":11,"stem":12,"children":13,"page":32},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002Fgetting-started",[14,18,23,28],{"title":10,"path":15,"stem":16,"order":17},"\u002Fdocs\u002Fgetting-started\u002F_dir","docs\u002Fgetting-started\u002F_dir",1,{"title":19,"path":20,"stem":21,"order":22},"Configuration Reference","\u002Fdocs\u002Fgetting-started\u002Fconfiguration","docs\u002Fgetting-started\u002Fconfiguration",2,{"title":24,"path":25,"stem":26,"order":27},"Deployment Guide","\u002Fdocs\u002Fgetting-started\u002Fdeployment","docs\u002Fgetting-started\u002Fdeployment",3,{"title":29,"path":30,"stem":31,"order":17},"Quick Start","\u002Fdocs\u002Fgetting-started\u002Fquick-start","docs\u002Fgetting-started\u002Fquick-start",false,{"title":34,"path":35,"stem":36,"children":37,"page":32},"Guides","\u002Fdocs\u002Fguides","docs\u002Fguides",[38,41,45,49,54],{"title":34,"path":39,"stem":40,"order":22},"\u002Fdocs\u002Fguides\u002F_dir","docs\u002Fguides\u002F_dir",{"title":42,"path":43,"stem":44,"order":22},"Notifications","\u002Fdocs\u002Fguides\u002Fnotifications","docs\u002Fguides\u002Fnotifications",{"title":46,"path":47,"stem":48,"order":17},"Scoring Algorithm","\u002Fdocs\u002Fguides\u002Fscoring","docs\u002Fguides\u002Fscoring",{"title":50,"path":51,"stem":52,"order":53},"Sunset Mode","\u002Fdocs\u002Fguides\u002Fsunset-mode","docs\u002Fguides\u002Fsunset-mode",4,{"title":55,"path":56,"stem":57,"order":27},"Troubleshooting","\u002Fdocs\u002Fguides\u002Ftroubleshooting","docs\u002Fguides\u002Ftroubleshooting",{"title":59,"path":60,"stem":61,"children":62,"page":32},"Project","\u002Fdocs\u002Fproject","docs\u002Fproject",[63,67,71,75],{"title":59,"path":64,"stem":65,"order":66},"\u002Fdocs\u002Fproject\u002F_dir","docs\u002Fproject\u002F_dir",6,{"title":68,"path":69,"stem":70,"order":27},"Changelog","\u002Fdocs\u002Fproject\u002Fchangelog","docs\u002Fproject\u002Fchangelog",{"title":72,"path":73,"stem":74,"order":17},"Contributing","\u002Fdocs\u002Fproject\u002Fcontributing","docs\u002Fproject\u002Fcontributing",{"title":76,"path":77,"stem":78,"order":22},"Contributors","\u002Fdocs\u002Fproject\u002Fcontributors","docs\u002Fproject\u002Fcontributors",{"title":80,"path":81,"stem":82,"children":83,"page":32},"Reference","\u002Fdocs\u002Freference","docs\u002Freference",[84,87,108],{"title":80,"path":85,"stem":86,"order":27},"\u002Fdocs\u002Freference\u002F_dir","docs\u002Freference\u002F_dir",{"title":88,"path":89,"stem":90,"children":91,"page":32},"Api","\u002Fdocs\u002Freference\u002Fapi","docs\u002Freference\u002Fapi",[92,96,100,104],{"title":93,"path":94,"stem":95,"order":22},"API Reference","\u002Fdocs\u002Freference\u002Fapi\u002F_dir","docs\u002Freference\u002Fapi\u002F_dir",{"title":97,"path":98,"stem":99,"order":22},"API Examples","\u002Fdocs\u002Freference\u002Fapi\u002Fexamples","docs\u002Freference\u002Fapi\u002Fexamples",{"title":101,"path":102,"stem":103,"order":53},"API Versioning & Stability Guarantees","\u002Fdocs\u002Freference\u002Fapi\u002Fversioning","docs\u002Freference\u002Fapi\u002Fversioning",{"title":105,"path":106,"stem":107,"order":27},"Common Workflows","\u002Fdocs\u002Freference\u002Fapi\u002Fworkflows","docs\u002Freference\u002Fapi\u002Fworkflows",{"title":109,"path":110,"stem":111,"order":17},"Architecture","\u002Fdocs\u002Freference\u002Farchitecture","docs\u002Freference\u002Farchitecture",{"title":113,"path":114,"stem":115,"order":116},"Release Workflow","\u002Fdocs\u002Freleasing","docs\u002Freleasing",5,{"title":118,"path":119,"stem":120,"children":121,"order":17},"Security Policy","\u002Fdocs\u002Fsecurity","docs\u002Fsecurity\u002Findex",[122,123,127,131,134,137,140],{"title":118,"path":119,"stem":120,"order":17},{"title":124,"path":125,"stem":126,"order":53},"Security","\u002Fdocs\u002Fsecurity\u002F_dir","docs\u002Fsecurity\u002F_dir",{"title":128,"path":129,"stem":130,"order":22},"OWASP ZAP API Scan — Baseline Report","\u002Fdocs\u002Fsecurity\u002Fzap-baseline-20260310","docs\u002Fsecurity\u002Fzap-baseline-20260310",{"title":128,"path":132,"stem":133,"order":27},"\u002Fdocs\u002Fsecurity\u002Fzap-baseline-20260316","docs\u002Fsecurity\u002Fzap-baseline-20260316",{"title":128,"path":135,"stem":136,"order":53},"\u002Fdocs\u002Fsecurity\u002Fzap-baseline-20260323","docs\u002Fsecurity\u002Fzap-baseline-20260323",{"title":128,"path":138,"stem":139,"order":116},"\u002Fdocs\u002Fsecurity\u002Fzap-baseline-20260324","docs\u002Fsecurity\u002Fzap-baseline-20260324",{"title":128,"path":141,"stem":142},"\u002Fdocs\u002Fsecurity\u002Fzap-baseline-20260406","docs\u002Fsecurity\u002Fzap-baseline-20260406",{"id":144,"title":24,"body":145,"description":356,"extension":1282,"links":1283,"meta":1284,"navigation":1285,"path":25,"seo":1286,"stem":26,"__hash__":1287},"docs\u002Fdocs\u002Fgetting-started\u002Fdeployment.md",{"type":146,"value":147,"toc":1263},"minimark",[148,153,326,329,333,338,345,350,470,474,482,485,547,551,560,610,616,619,643,664,667,673,694,697,816,818,822,832,835,842,901,904,907,911,918,922,925,939,941,945,948,954,998,1042,1047,1065,1076,1078,1082,1088,1092,1096,1099,1138,1142,1145,1174,1178,1181,1237,1241,1259],[149,150,152],"h2",{"id":151},"environment-variables","Environment Variables",[154,155,156,172],"table",{},[157,158,159],"thead",{},[160,161,162,166,169],"tr",{},[163,164,165],"th",{},"Variable",[163,167,168],{},"Default",[163,170,171],{},"Description",[173,174,175,192,207,222,235,254,271,285,297,312],"tbody",{},[160,176,177,184,189],{},[178,179,180],"td",{},[181,182,183],"code",{},"PORT",[178,185,186],{},[181,187,188],{},"2187",[178,190,191],{},"HTTP listen port",[160,193,194,199,204],{},[178,195,196],{},[181,197,198],{},"BASE_URL",[178,200,201],{},[181,202,203],{},"\u002F",[178,205,206],{},"Base URL path for reverse proxy subdirectory deployments",[160,208,209,214,219],{},[178,210,211],{},[181,212,213],{},"DB_PATH",[178,215,216],{},[181,217,218],{},"\u002Fconfig\u002Fcapacitarr.db",[178,220,221],{},"SQLite database file path",[160,223,224,229,232],{},[178,225,226],{},[181,227,228],{},"JWT_SECRET",[178,230,231],{},"(auto-generated)",[178,233,234],{},"Secret for signing JWT tokens. Set for persistent sessions across restarts",[160,236,237,242,247],{},[178,238,239],{},[181,240,241],{},"SECURE_COOKIES",[178,243,244],{},[181,245,246],{},"false",[178,248,249,250,253],{},"Set to ",[181,251,252],{},"true"," when serving over HTTPS",[160,255,256,261,264],{},[178,257,258],{},[181,259,260],{},"CORS_ORIGINS",[178,262,263],{},"(none)",[178,265,266,267,270],{},"Comma-separated CORS origins (e.g. ",[181,268,269],{},"http:\u002F\u002Flocalhost:3000",")",[160,272,273,278,282],{},[178,274,275],{},[181,276,277],{},"DEBUG",[178,279,280],{},[181,281,246],{},[178,283,284],{},"Enable debug logging",[160,286,287,292,294],{},[178,288,289],{},[181,290,291],{},"AUTH_HEADER",[178,293,263],{},[178,295,296],{},"Trusted reverse proxy authentication header name",[160,298,299,304,309],{},[178,300,301],{},[181,302,303],{},"PUID",[178,305,306],{},[181,307,308],{},"1000",[178,310,311],{},"User ID for the container process (Docker only)",[160,313,314,319,323],{},[178,315,316],{},[181,317,318],{},"PGID",[178,320,321],{},[181,322,308],{},[178,324,325],{},"Group ID for the container process (Docker only)",[327,328],"hr",{},[149,330,332],{"id":331},"reverse-proxy-configuration","Reverse Proxy Configuration",[334,335,337],"h3",{"id":336},"subdomain-deployment","Subdomain Deployment",[339,340,341,342,344],"p",{},"The simplest approach — no ",[181,343,198],{}," configuration required.",[346,347,349],"h4",{"id":348},"traefik-docker-labels","Traefik (Docker labels)",[351,352,357],"pre",{"className":353,"code":354,"language":355,"meta":356,"style":356},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","services:\n  capacitarr:\n    image: ghcr.io\u002Fghent\u002Fcapacitarr:stable\n    environment:\n      - JWT_SECRET=your-secret-here\n      - SECURE_COOKIES=true\n    labels:\n      - \"traefik.enable=true\"\n      - \"traefik.http.routers.capacitarr.rule=Host(`capacitarr.example.com`)\"\n      - \"traefik.http.routers.capacitarr.tls=true\"\n      - \"traefik.http.services.capacitarr.loadbalancer.server.port=2187\"\n","yaml","",[181,358,359,371,378,390,397,405,412,420,434,446,458],{"__ignoreMap":356},[360,361,363,367],"span",{"class":362,"line":17},"line",[360,364,366],{"class":365},"swJcz","services",[360,368,370],{"class":369},"sMK4o",":\n",[360,372,373,376],{"class":362,"line":22},[360,374,375],{"class":365},"  capacitarr",[360,377,370],{"class":369},[360,379,380,383,386],{"class":362,"line":27},[360,381,382],{"class":365},"    image",[360,384,385],{"class":369},":",[360,387,389],{"class":388},"sfazB"," ghcr.io\u002Fghent\u002Fcapacitarr:stable\n",[360,391,392,395],{"class":362,"line":53},[360,393,394],{"class":365},"    environment",[360,396,370],{"class":369},[360,398,399,402],{"class":362,"line":116},[360,400,401],{"class":369},"      -",[360,403,404],{"class":388}," JWT_SECRET=your-secret-here\n",[360,406,407,409],{"class":362,"line":66},[360,408,401],{"class":369},[360,410,411],{"class":388}," SECURE_COOKIES=true\n",[360,413,415,418],{"class":362,"line":414},7,[360,416,417],{"class":365},"    labels",[360,419,370],{"class":369},[360,421,423,425,428,431],{"class":362,"line":422},8,[360,424,401],{"class":369},[360,426,427],{"class":369}," \"",[360,429,430],{"class":388},"traefik.enable=true",[360,432,433],{"class":369},"\"\n",[360,435,437,439,441,444],{"class":362,"line":436},9,[360,438,401],{"class":369},[360,440,427],{"class":369},[360,442,443],{"class":388},"traefik.http.routers.capacitarr.rule=Host(`capacitarr.example.com`)",[360,445,433],{"class":369},[360,447,449,451,453,456],{"class":362,"line":448},10,[360,450,401],{"class":369},[360,452,427],{"class":369},[360,454,455],{"class":388},"traefik.http.routers.capacitarr.tls=true",[360,457,433],{"class":369},[360,459,461,463,465,468],{"class":362,"line":460},11,[360,462,401],{"class":369},[360,464,427],{"class":369},[360,466,467],{"class":388},"traefik.http.services.capacitarr.loadbalancer.server.port=2187",[360,469,433],{"class":369},[346,471,473],{"id":472},"caddy","Caddy",[351,475,480],{"className":476,"code":478,"language":479},[477],"language-text","capacitarr.example.com {\n    reverse_proxy capacitarr:2187\n}\n","text",[181,481,478],{"__ignoreMap":356},[346,483,484],{"id":484},"nginx",[351,486,489],{"className":487,"code":488,"language":484,"meta":356,"style":356},"language-nginx shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","server {\n    server_name capacitarr.example.com;\n\n    location \u002F {\n        proxy_pass http:\u002F\u002F127.0.0.1:2187;\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",[181,490,491,496,501,507,512,517,522,527,532,537,542],{"__ignoreMap":356},[360,492,493],{"class":362,"line":17},[360,494,495],{},"server {\n",[360,497,498],{"class":362,"line":22},[360,499,500],{},"    server_name capacitarr.example.com;\n",[360,502,503],{"class":362,"line":27},[360,504,506],{"emptyLinePlaceholder":505},true,"\n",[360,508,509],{"class":362,"line":53},[360,510,511],{},"    location \u002F {\n",[360,513,514],{"class":362,"line":116},[360,515,516],{},"        proxy_pass http:\u002F\u002F127.0.0.1:2187;\n",[360,518,519],{"class":362,"line":66},[360,520,521],{},"        proxy_set_header Host $host;\n",[360,523,524],{"class":362,"line":414},[360,525,526],{},"        proxy_set_header X-Real-IP $remote_addr;\n",[360,528,529],{"class":362,"line":422},[360,530,531],{},"        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n",[360,533,534],{"class":362,"line":436},[360,535,536],{},"        proxy_set_header X-Forwarded-Proto $scheme;\n",[360,538,539],{"class":362,"line":448},[360,540,541],{},"    }\n",[360,543,544],{"class":362,"line":460},[360,545,546],{},"}\n",[334,548,550],{"id":549},"subdirectory-deployment","Subdirectory Deployment",[339,552,553,554,557,558,385],{},"When serving Capacitarr at a subdirectory (e.g. ",[181,555,556],{},"https:\u002F\u002Fexample.com\u002Fcapacitarr\u002F","), set ",[181,559,198],{},[351,561,563],{"className":353,"code":562,"language":355,"meta":356,"style":356},"services:\n  capacitarr:\n    image: ghcr.io\u002Fghent\u002Fcapacitarr:stable\n    environment:\n      - BASE_URL=\u002Fcapacitarr\u002F\n      - JWT_SECRET=your-secret-here\n      - SECURE_COOKIES=true\n",[181,564,565,571,577,585,591,598,604],{"__ignoreMap":356},[360,566,567,569],{"class":362,"line":17},[360,568,366],{"class":365},[360,570,370],{"class":369},[360,572,573,575],{"class":362,"line":22},[360,574,375],{"class":365},[360,576,370],{"class":369},[360,578,579,581,583],{"class":362,"line":27},[360,580,382],{"class":365},[360,582,385],{"class":369},[360,584,389],{"class":388},[360,586,587,589],{"class":362,"line":53},[360,588,394],{"class":365},[360,590,370],{"class":369},[360,592,593,595],{"class":362,"line":116},[360,594,401],{"class":369},[360,596,597],{"class":388}," BASE_URL=\u002Fcapacitarr\u002F\n",[360,599,600,602],{"class":362,"line":66},[360,601,401],{"class":369},[360,603,404],{"class":388},[360,605,606,608],{"class":362,"line":414},[360,607,401],{"class":369},[360,609,411],{"class":388},[339,611,612,613,615],{},"Only ",[181,614,198],{}," is needed — the frontend HTML is automatically rewritten at startup to use the correct asset paths, API base URL, and Vue Router base path.",[346,617,349],{"id":618},"traefik-docker-labels-1",[351,620,622],{"className":353,"code":621,"language":355,"meta":356,"style":356},"labels:\n  - \"traefik.http.routers.capacitarr.rule=Host(`example.com`) && PathPrefix(`\u002Fcapacitarr`)\"\n",[181,623,624,631],{"__ignoreMap":356},[360,625,626,629],{"class":362,"line":17},[360,627,628],{"class":365},"labels",[360,630,370],{"class":369},[360,632,633,636,638,641],{"class":362,"line":22},[360,634,635],{"class":369},"  -",[360,637,427],{"class":369},[360,639,640],{"class":388},"traefik.http.routers.capacitarr.rule=Host(`example.com`) && PathPrefix(`\u002Fcapacitarr`)",[360,642,433],{"class":369},[644,645,646],"blockquote",{},[339,647,648,652,653,656,657,660,661,663],{},[649,650,651],"strong",{},"Note:"," Do ",[649,654,655],{},"not"," use a ",[181,658,659],{},"stripprefix"," middleware with Capacitarr. When ",[181,662,198],{}," is set, the application expects to receive the full prefixed path and handles routing internally. Stripping the prefix causes asset and API route mismatches.",[346,665,473],{"id":666},"caddy-1",[351,668,671],{"className":669,"code":670,"language":479},[477],"example.com {\n    handle \u002Fcapacitarr\u002F* {\n        reverse_proxy capacitarr:2187\n    }\n}\n",[181,672,670],{"__ignoreMap":356},[644,674,675],{},[339,676,677,679,680,683,684,687,688,690,691,693],{},[649,678,651],{}," Use ",[181,681,682],{},"handle"," (not ",[181,685,686],{},"handle_path","). The ",[181,689,686],{}," directive strips the prefix before forwarding, but Capacitarr expects to receive the full prefixed path when ",[181,692,198],{}," is set.",[346,695,484],{"id":696},"nginx-1",[351,698,700],{"className":487,"code":699,"language":484,"meta":356,"style":356},"location \u002Fcapacitarr\u002F {\n    proxy_pass http:\u002F\u002F127.0.0.1:2187\u002Fcapacitarr\u002F;\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# SSE endpoint — disable buffering for real-time event streaming\nlocation \u002Fcapacitarr\u002Fapi\u002Fv1\u002Fevents {\n    proxy_pass http:\u002F\u002F127.0.0.1:2187\u002Fcapacitarr\u002Fapi\u002Fv1\u002Fevents;\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    proxy_set_header Connection '';\n    proxy_http_version 1.1;\n    chunked_transfer_encoding off;\n    proxy_buffering off;\n    proxy_cache off;\n    proxy_read_timeout 86400s;\n}\n",[181,701,702,707,712,717,722,727,732,736,740,745,750,755,760,765,770,775,781,787,793,799,805,811],{"__ignoreMap":356},[360,703,704],{"class":362,"line":17},[360,705,706],{},"location \u002Fcapacitarr\u002F {\n",[360,708,709],{"class":362,"line":22},[360,710,711],{},"    proxy_pass http:\u002F\u002F127.0.0.1:2187\u002Fcapacitarr\u002F;\n",[360,713,714],{"class":362,"line":27},[360,715,716],{},"    proxy_set_header Host $host;\n",[360,718,719],{"class":362,"line":53},[360,720,721],{},"    proxy_set_header X-Real-IP $remote_addr;\n",[360,723,724],{"class":362,"line":116},[360,725,726],{},"    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n",[360,728,729],{"class":362,"line":66},[360,730,731],{},"    proxy_set_header X-Forwarded-Proto $scheme;\n",[360,733,734],{"class":362,"line":414},[360,735,546],{},[360,737,738],{"class":362,"line":422},[360,739,506],{"emptyLinePlaceholder":505},[360,741,742],{"class":362,"line":436},[360,743,744],{},"# SSE endpoint — disable buffering for real-time event streaming\n",[360,746,747],{"class":362,"line":448},[360,748,749],{},"location \u002Fcapacitarr\u002Fapi\u002Fv1\u002Fevents {\n",[360,751,752],{"class":362,"line":460},[360,753,754],{},"    proxy_pass http:\u002F\u002F127.0.0.1:2187\u002Fcapacitarr\u002Fapi\u002Fv1\u002Fevents;\n",[360,756,758],{"class":362,"line":757},12,[360,759,716],{},[360,761,763],{"class":362,"line":762},13,[360,764,721],{},[360,766,768],{"class":362,"line":767},14,[360,769,726],{},[360,771,773],{"class":362,"line":772},15,[360,774,731],{},[360,776,778],{"class":362,"line":777},16,[360,779,780],{},"    proxy_set_header Connection '';\n",[360,782,784],{"class":362,"line":783},17,[360,785,786],{},"    proxy_http_version 1.1;\n",[360,788,790],{"class":362,"line":789},18,[360,791,792],{},"    chunked_transfer_encoding off;\n",[360,794,796],{"class":362,"line":795},19,[360,797,798],{},"    proxy_buffering off;\n",[360,800,802],{"class":362,"line":801},20,[360,803,804],{},"    proxy_cache off;\n",[360,806,808],{"class":362,"line":807},21,[360,809,810],{},"    proxy_read_timeout 86400s;\n",[360,812,814],{"class":362,"line":813},22,[360,815,546],{},[327,817],{},[149,819,821],{"id":820},"sse-server-sent-events-proxy-configuration","SSE (Server-Sent Events) Proxy Configuration",[339,823,824,825,828,829,831],{},"Capacitarr uses Server-Sent Events (SSE) for real-time updates via ",[181,826,827],{},"GET \u002Fapi\u002Fv1\u002Fevents",". SSE requires that reverse proxies do ",[649,830,655],{}," buffer responses — otherwise events will queue up and arrive in batches instead of streaming in real-time.",[334,833,484],{"id":834},"nginx-2",[339,836,837,838,841],{},"Add ",[181,839,840],{},"proxy_buffering off"," and increase timeouts for the SSE endpoint:",[351,843,845],{"className":487,"code":844,"language":484,"meta":356,"style":356},"location \u002Fapi\u002Fv1\u002Fevents {\n    proxy_pass http:\u002F\u002F127.0.0.1:2187;\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    proxy_set_header Connection '';\n    proxy_http_version 1.1;\n    chunked_transfer_encoding off;\n    proxy_buffering off;\n    proxy_cache off;\n    proxy_read_timeout 86400s;\n}\n",[181,846,847,852,857,861,865,869,873,877,881,885,889,893,897],{"__ignoreMap":356},[360,848,849],{"class":362,"line":17},[360,850,851],{},"location \u002Fapi\u002Fv1\u002Fevents {\n",[360,853,854],{"class":362,"line":22},[360,855,856],{},"    proxy_pass http:\u002F\u002F127.0.0.1:2187;\n",[360,858,859],{"class":362,"line":27},[360,860,716],{},[360,862,863],{"class":362,"line":53},[360,864,721],{},[360,866,867],{"class":362,"line":116},[360,868,726],{},[360,870,871],{"class":362,"line":66},[360,872,731],{},[360,874,875],{"class":362,"line":414},[360,876,780],{},[360,878,879],{"class":362,"line":422},[360,880,786],{},[360,882,883],{"class":362,"line":436},[360,884,792],{},[360,886,887],{"class":362,"line":448},[360,888,798],{},[360,890,891],{"class":362,"line":460},[360,892,804],{},[360,894,895],{"class":362,"line":757},[360,896,810],{},[360,898,899],{"class":362,"line":762},[360,900,546],{},[334,902,473],{"id":903},"caddy-2",[339,905,906],{},"Caddy handles SSE correctly by default — no special configuration is needed. Caddy does not buffer proxied responses, so events stream through immediately.",[334,908,910],{"id":909},"traefik","Traefik",[339,912,913,914,917],{},"Traefik handles SSE correctly by default. If you have custom middleware that buffers responses, ensure it does not apply to the ",[181,915,916],{},"\u002Fapi\u002Fv1\u002Fevents"," path.",[334,919,921],{"id":920},"cloudflare","Cloudflare",[339,923,924],{},"If you use Cloudflare in front of your reverse proxy, note that Cloudflare's free plan buffers HTTP responses. SSE connections will work but events may arrive with latency. To avoid this:",[926,927,928,936],"ul",{},[929,930,931,932,935],"li",{},"Use a Cloudflare ",[649,933,934],{},"orange cloud off"," (DNS only) rule for the SSE path",[929,937,938],{},"Or upgrade to a plan that supports streaming responses",[327,940],{},[149,942,944],{"id":943},"proxy-authentication-authelia-authentik-organizr","Proxy Authentication (Authelia \u002F Authentik \u002F Organizr)",[339,946,947],{},"If you run an authentication proxy (Authelia, Authentik, Organizr, etc.) in front of Capacitarr, you can configure it to trust the proxy's authentication header instead of requiring users to log in again.",[339,949,950,951,953],{},"Set ",[181,952,291],{}," to the name of the header your auth proxy sets:",[154,955,956,966],{},[157,957,958],{},[160,959,960,963],{},[163,961,962],{},"Auth Proxy",[163,964,965],{},"Typical Header",[173,967,968,978,988],{},[160,969,970,973],{},[178,971,972],{},"Authelia",[178,974,975],{},[181,976,977],{},"Remote-User",[160,979,980,983],{},[178,981,982],{},"Authentik",[178,984,985],{},[181,986,987],{},"X-authentik-username",[160,989,990,993],{},[178,991,992],{},"Organizr",[178,994,995],{},[181,996,997],{},"X-WEBAUTH-USER",[351,999,1001],{"className":353,"code":1000,"language":355,"meta":356,"style":356},"services:\n  capacitarr:\n    image: ghcr.io\u002Fghent\u002Fcapacitarr:stable\n    environment:\n      - AUTH_HEADER=Remote-User\n      - JWT_SECRET=your-secret-here\n",[181,1002,1003,1009,1015,1023,1029,1036],{"__ignoreMap":356},[360,1004,1005,1007],{"class":362,"line":17},[360,1006,366],{"class":365},[360,1008,370],{"class":369},[360,1010,1011,1013],{"class":362,"line":22},[360,1012,375],{"class":365},[360,1014,370],{"class":369},[360,1016,1017,1019,1021],{"class":362,"line":27},[360,1018,382],{"class":365},[360,1020,385],{"class":369},[360,1022,389],{"class":388},[360,1024,1025,1027],{"class":362,"line":53},[360,1026,394],{"class":365},[360,1028,370],{"class":369},[360,1030,1031,1033],{"class":362,"line":116},[360,1032,401],{"class":369},[360,1034,1035],{"class":388}," AUTH_HEADER=Remote-User\n",[360,1037,1038,1040],{"class":362,"line":66},[360,1039,401],{"class":369},[360,1041,404],{"class":388},[339,1043,1044],{},[649,1045,1046],{},"How it works:",[1048,1049,1050,1056,1059,1062],"ol",{},[929,1051,1052,1053,1055],{},"When ",[181,1054,291],{}," is set and the configured header is present in a request, Capacitarr trusts the header value as the authenticated username",[929,1057,1058],{},"If the user doesn't exist in the database, Capacitarr auto-creates a user record",[929,1060,1061],{},"JWT validation is skipped entirely for requests with the trusted header",[929,1063,1064],{},"Built-in JWT authentication continues to work as a fallback",[644,1066,1067],{},[339,1068,1069,1072,1073,1075],{},[649,1070,1071],{},"⚠️ Security:"," Only enable ",[181,1074,291],{}," when Capacitarr is exclusively accessible through your auth proxy. If Capacitarr is also directly reachable, an attacker could forge the header and bypass authentication.",[327,1077],{},[149,1079,1081],{"id":1080},"database-backups","Database Backups",[339,1083,1084,1085,1087],{},"Capacitarr stores all configuration, rules, audit history, and statistics in a single SQLite database file at ",[181,1086,218],{},". This is the only file you need to back up.",[334,1089,1091],{"id":1090},"backup-methods","Backup Methods",[346,1093,1095],{"id":1094},"simple-file-copy","Simple File Copy",[339,1097,1098],{},"SQLite uses WAL (Write-Ahead Logging) mode, which allows safe file copies while the application is running:",[351,1100,1104],{"className":1101,"code":1102,"language":1103,"meta":356,"style":356},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Copy the database file (safe while Capacitarr is running)\ncp \u002Fpath\u002Fto\u002Fconfig\u002Fcapacitarr.db \u002Fpath\u002Fto\u002Fbackup\u002Fcapacitarr-$(date +%Y%m%d).db\n","bash",[181,1105,1106,1112],{"__ignoreMap":356},[360,1107,1108],{"class":362,"line":17},[360,1109,1111],{"class":1110},"sHwdD","# Copy the database file (safe while Capacitarr is running)\n",[360,1113,1114,1118,1121,1124,1127,1130,1133,1135],{"class":362,"line":22},[360,1115,1117],{"class":1116},"sBMFI","cp",[360,1119,1120],{"class":388}," \u002Fpath\u002Fto\u002Fconfig\u002Fcapacitarr.db",[360,1122,1123],{"class":388}," \u002Fpath\u002Fto\u002Fbackup\u002Fcapacitarr-",[360,1125,1126],{"class":369},"$(",[360,1128,1129],{"class":1116},"date",[360,1131,1132],{"class":388}," +%Y%m%d",[360,1134,270],{"class":369},[360,1136,1137],{"class":388},".db\n",[346,1139,1141],{"id":1140},"sqlite-backup-command","SQLite Backup Command",[339,1143,1144],{},"For a guaranteed-consistent backup, use the SQLite backup command:",[351,1146,1148],{"className":1101,"code":1147,"language":1103,"meta":356,"style":356},"docker exec capacitarr sqlite3 \u002Fconfig\u002Fcapacitarr.db \".backup \u002Fconfig\u002Fcapacitarr-backup.db\"\n",[181,1149,1150],{"__ignoreMap":356},[360,1151,1152,1155,1158,1161,1164,1167,1169,1172],{"class":362,"line":17},[360,1153,1154],{"class":1116},"docker",[360,1156,1157],{"class":388}," exec",[360,1159,1160],{"class":388}," capacitarr",[360,1162,1163],{"class":388}," sqlite3",[360,1165,1166],{"class":388}," \u002Fconfig\u002Fcapacitarr.db",[360,1168,427],{"class":369},[360,1170,1171],{"class":388},".backup \u002Fconfig\u002Fcapacitarr-backup.db",[360,1173,433],{"class":369},[334,1175,1177],{"id":1176},"whats-included","What's Included",[339,1179,1180],{},"The database contains:",[926,1182,1183,1189,1195,1201,1207,1213,1219,1225,1231],{},[929,1184,1185,1188],{},[649,1186,1187],{},"Authentication:"," User credentials and API keys",[929,1190,1191,1194],{},[649,1192,1193],{},"Integrations:"," Connection URLs and API keys for *arr apps, Plex, Tautulli, etc.",[929,1196,1197,1200],{},[649,1198,1199],{},"Preferences:"," Scoring weights, execution mode, poll interval, thresholds",[929,1202,1203,1206],{},[649,1204,1205],{},"Custom Rules:"," All user-defined keep\u002Fremove rules",[929,1208,1209,1212],{},[649,1210,1211],{},"Notification Channels:"," Discord\u002FApprise webhook configurations",[929,1214,1215,1218],{},[649,1216,1217],{},"Audit Log:"," History of all deletions and dry-runs",[929,1220,1221,1224],{},[649,1222,1223],{},"Approval Queue:"," Pending, approved, and snoozed items",[929,1226,1227,1230],{},[649,1228,1229],{},"Engine Statistics:"," Run history and lifetime counters",[929,1232,1233,1236],{},[649,1234,1235],{},"Disk Groups:"," Detected mount points and threshold settings",[334,1238,1240],{"id":1239},"backup-recommendations","Backup Recommendations",[926,1242,1243,1246,1249,1256],{},[929,1244,1245],{},"Back up before upgrading Capacitarr to a new version",[929,1247,1248],{},"Schedule regular backups (daily or weekly) for production use",[929,1250,1251,1252,1255],{},"Store backups in a separate location from the ",[181,1253,1254],{},"\u002Fconfig"," volume",[929,1257,1258],{},"The database file is typically small (under 50 MB) even with extensive history",[1260,1261,1262],"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 .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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":356,"searchDepth":17,"depth":22,"links":1264},[1265,1266,1270,1276,1277],{"id":151,"depth":22,"text":152},{"id":331,"depth":22,"text":332,"children":1267},[1268,1269],{"id":336,"depth":27,"text":337},{"id":549,"depth":27,"text":550},{"id":820,"depth":22,"text":821,"children":1271},[1272,1273,1274,1275],{"id":834,"depth":27,"text":484},{"id":903,"depth":27,"text":473},{"id":909,"depth":27,"text":910},{"id":920,"depth":27,"text":921},{"id":943,"depth":22,"text":944},{"id":1080,"depth":22,"text":1081,"children":1278},[1279,1280,1281],{"id":1090,"depth":27,"text":1091},{"id":1176,"depth":27,"text":1177},{"id":1239,"depth":27,"text":1240},"md",null,{},{"order":27},{"title":24,"description":356},"fwoNd3HII3_-QLJDNHuLOPEm3bhQ6ZX2DWppHOuLWK8",[1289,1291],{"title":19,"path":20,"stem":21,"description":1290,"order":22,"children":-1},"Capacitarr is configured entirely through environment variables. All variables are optional — sensible defaults are used when a variable is not set.",{"title":29,"path":30,"stem":31,"description":1292,"order":17,"children":-1},"Get Capacitarr running in under 60 seconds.",1776649613243]