[{"data":1,"prerenderedAt":1993},["ShallowReactive",2],{"navigation_docs_en":3,"-en-serveex-monitoring-upsnap-":377,"-en-serveex-monitoring-upsnap--surround":1988},[4,16,94,262,271,332],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":15},"About","i-noto-star","\u002Fen\u002Fabout","en\u002F1.about",[10],{"title":11,"path":12,"stem":13,"icon":14},"Welcome","\u002Fen\u002Fabout\u002Fwelcome","en\u002F1.about\u002F1.welcome","i-lucide-home",false,{"title":17,"icon":18,"path":19,"stem":20,"children":21,"page":15},"General","i-noto-open-book","\u002Fen\u002Fgeneral","en\u002F2.general",[22,26,44,58,76],{"title":17,"path":23,"stem":24,"icon":25},"\u002Fen\u002Fgeneral\u002Fsummary","en\u002F2.general\u002F1.summary","i-lucide-bookmark",{"title":27,"icon":28,"path":29,"stem":30,"children":31,"page":15},"Networking","i-lucide-network","\u002Fen\u002Fgeneral\u002Fnetworking","en\u002F2.general\u002F2.networking",[32,36,40],{"title":33,"path":34,"stem":35},"NAT & DHCP","\u002Fen\u002Fgeneral\u002Fnetworking\u002Fnat","en\u002F2.general\u002F2.networking\u002F1.nat",{"title":37,"path":38,"stem":39},"DNS Zone","\u002Fen\u002Fgeneral\u002Fnetworking\u002Fdns","en\u002F2.general\u002F2.networking\u002F2.dns",{"title":41,"path":42,"stem":43},"Samba","\u002Fen\u002Fgeneral\u002Fnetworking\u002Fsamba","en\u002F2.general\u002F2.networking\u002F3.samba",{"title":45,"icon":46,"path":47,"stem":48,"children":49,"page":15},"Storage","i-lucide-hard-drive","\u002Fen\u002Fgeneral\u002Fstorage","en\u002F2.general\u002F3.storage",[50,54],{"title":51,"path":52,"stem":53},"RAID","\u002Fen\u002Fgeneral\u002Fstorage\u002Fraid","en\u002F2.general\u002F3.storage\u002F1.raid",{"title":55,"path":56,"stem":57},"ZFS","\u002Fen\u002Fgeneral\u002Fstorage\u002Fzfs","en\u002F2.general\u002F3.storage\u002F2.zfs",{"title":59,"icon":60,"path":61,"stem":62,"children":63,"page":15},"Hardware","i-lucide-server","\u002Fen\u002Fgeneral\u002Fhardware","en\u002F2.general\u002F4.hardware",[64,68,72],{"title":65,"path":66,"stem":67},"The Basics","\u002Fen\u002Fgeneral\u002Fhardware\u002Fbasics","en\u002F2.general\u002F4.hardware\u002F1.basics",{"title":69,"path":70,"stem":71},"Network","\u002Fen\u002Fgeneral\u002Fhardware\u002Fnetwork","en\u002F2.general\u002F4.hardware\u002F2.network",{"title":73,"path":74,"stem":75},"The ProloNAS","\u002Fen\u002Fgeneral\u002Fhardware\u002Fprolonas","en\u002F2.general\u002F4.hardware\u002F3.prolonas",{"title":77,"icon":78,"path":79,"stem":80,"children":81,"page":15},"Linux tips for dummies","i-lucide-terminal","\u002Fen\u002Fgeneral\u002Flinux","en\u002F2.general\u002F5.linux",[82,86,90],{"title":83,"path":84,"stem":85},"Command line basics","\u002Fen\u002Fgeneral\u002Flinux\u002Fcli-basics","en\u002F2.general\u002F5.linux\u002F1.cli-basics",{"title":87,"path":88,"stem":89},"Folders and partitions","\u002Fen\u002Fgeneral\u002Flinux\u002Ffilesystem","en\u002F2.general\u002F5.linux\u002F2.filesystem",{"title":91,"path":92,"stem":93},"Handy CLI tools","\u002Fen\u002Fgeneral\u002Flinux\u002Fhandy-tools","en\u002F2.general\u002F5.linux\u002F3.handy-tools",{"title":95,"icon":96,"path":97,"stem":98,"children":99,"page":15},"Serveex","i-noto-microscope","\u002Fen\u002Fserveex","en\u002F3.serveex",[100,104,126,144,170,188,202,216,234,248],{"title":101,"path":102,"stem":103,"icon":25},"Introduction","\u002Fen\u002Fserveex\u002Fintroduction","en\u002F3.serveex\u002F1.introduction",{"title":105,"icon":106,"path":107,"stem":108,"children":109,"page":15},"Server core","i-lucide-server-cog","\u002Fen\u002Fserveex\u002Fcore","en\u002F3.serveex\u002F2.core",[110,114,118,122],{"title":111,"path":112,"stem":113},"Debian 13","\u002Fen\u002Fserveex\u002Fcore\u002Finstallation","en\u002F3.serveex\u002F2.core\u002F1.installation",{"title":115,"path":116,"stem":117},"Docker","\u002Fen\u002Fserveex\u002Fcore\u002Fdocker","en\u002F3.serveex\u002F2.core\u002F2.docker",{"title":119,"path":120,"stem":121},"Wireguard","\u002Fen\u002Fserveex\u002Fcore\u002Fwireguard","en\u002F3.serveex\u002F2.core\u002F3.wireguard",{"title":123,"path":124,"stem":125},"SWAG","\u002Fen\u002Fserveex\u002Fcore\u002Fswag","en\u002F3.serveex\u002F2.core\u002F4.swag",{"title":127,"icon":128,"path":129,"stem":130,"children":131,"page":15},"Security","i-lucide-shield","\u002Fen\u002Fserveex\u002Fsecurity","en\u002F3.serveex\u002F3.security",[132,136,140],{"title":133,"path":134,"stem":135},"Cloudflare Zero Trust","\u002Fen\u002Fserveex\u002Fsecurity\u002Fcloudflare","en\u002F3.serveex\u002F3.security\u002F2.cloudflare",{"title":137,"path":138,"stem":139},"TinyAuth","\u002Fen\u002Fserveex\u002Fsecurity\u002Ftinyauth","en\u002F3.serveex\u002F3.security\u002F3.tinyauth",{"title":141,"path":142,"stem":143},"Pocket ID","\u002Fen\u002Fserveex\u002Fsecurity\u002Fpocket-id","en\u002F3.serveex\u002F3.security\u002F4.pocket-id",{"title":145,"icon":146,"path":147,"stem":148,"children":149,"page":15},"Monitoring","i-lucide-chart-no-axes-column","\u002Fen\u002Fserveex\u002Fmonitoring","en\u002F3.serveex\u002F4.monitoring",[150,154,158,162,166],{"title":151,"path":152,"stem":153},"Uptime-Kuma","\u002Fen\u002Fserveex\u002Fmonitoring\u002Fuptime-kuma","en\u002F3.serveex\u002F4.monitoring\u002F1.uptime-kuma",{"title":155,"path":156,"stem":157},"Dozzle","\u002Fen\u002Fserveex\u002Fmonitoring\u002Fdozzle","en\u002F3.serveex\u002F4.monitoring\u002F2.dozzle",{"title":159,"path":160,"stem":161},"Speedtest Tracker","\u002Fen\u002Fserveex\u002Fmonitoring\u002Fspeedtest-tracker","en\u002F3.serveex\u002F4.monitoring\u002F3.speedtest-tracker",{"title":163,"path":164,"stem":165},"Beszel","\u002Fen\u002Fserveex\u002Fmonitoring\u002Fbeszel","en\u002F3.serveex\u002F4.monitoring\u002F4.beszel",{"title":167,"path":168,"stem":169},"UpSnap","\u002Fen\u002Fserveex\u002Fmonitoring\u002Fupsnap","en\u002F3.serveex\u002F4.monitoring\u002F5.upsnap",{"title":171,"icon":172,"path":173,"stem":174,"children":175,"page":15},"Media & Seedbox","i-lucide-list-video","\u002Fen\u002Fserveex\u002Fmedia","en\u002F3.serveex\u002F5.media",[176,180,184],{"title":177,"path":178,"stem":179},"Jellyfin","\u002Fen\u002Fserveex\u002Fmedia\u002Fjellyfin","en\u002F3.serveex\u002F5.media\u002F1.jellyfin",{"title":181,"path":182,"stem":183},"Qbittorrent","\u002Fen\u002Fserveex\u002Fmedia\u002Fqbittorrent","en\u002F3.serveex\u002F5.media\u002F2.qbittorrent",{"title":185,"path":186,"stem":187},"Automation","\u002Fen\u002Fserveex\u002Fmedia\u002Fservarr","en\u002F3.serveex\u002F5.media\u002F3.servarr",{"title":189,"icon":190,"path":191,"stem":192,"children":193,"page":15},"Cloud Drive & Photos","i-lucide-cloud-upload","\u002Fen\u002Fserveex\u002Fcloud","en\u002F3.serveex\u002F6.cloud",[194,198],{"title":195,"path":196,"stem":197},"Immich","\u002Fen\u002Fserveex\u002Fcloud\u002Fimmich","en\u002F3.serveex\u002F6.cloud\u002F1.immich",{"title":199,"path":200,"stem":201},"Nextcloud","\u002Fen\u002Fserveex\u002Fcloud\u002Fnextcloud","en\u002F3.serveex\u002F6.cloud\u002F2.nextcloud",{"title":203,"icon":204,"path":205,"stem":206,"children":207,"page":15},"File & share","i-lucide-folder-tree","\u002Fen\u002Fserveex\u002Ffiles","en\u002F3.serveex\u002F7.files",[208,212],{"title":209,"path":210,"stem":211},"File Browser Quantum","\u002Fen\u002Fserveex\u002Ffiles\u002Ffile-browser-quantum","en\u002F3.serveex\u002F7.files\u002F1.file-browser-quantum",{"title":213,"path":214,"stem":215},"Pingvin","\u002Fen\u002Fserveex\u002Ffiles\u002Fpingvin","en\u002F3.serveex\u002F7.files\u002F2.pingvin",{"title":217,"icon":218,"path":219,"stem":220,"children":221,"page":15},"Developpement","i-lucide-code-xml","\u002Fen\u002Fserveex\u002Fdevelopment","en\u002F3.serveex\u002F8.development",[222,226,230],{"title":223,"path":224,"stem":225},"Code-Server","\u002Fen\u002Fserveex\u002Fdevelopment\u002Fcode-server","en\u002F3.serveex\u002F8.development\u002F1.code-server",{"title":227,"path":228,"stem":229},"Forgejo","\u002Fen\u002Fserveex\u002Fdevelopment\u002Fforgejo","en\u002F3.serveex\u002F8.development\u002F2.forgejo",{"title":231,"path":232,"stem":233},"IT Tools","\u002Fen\u002Fserveex\u002Fdevelopment\u002Fit-tools","en\u002F3.serveex\u002F8.development\u002F3.it-tools",{"title":235,"icon":236,"path":237,"stem":238,"children":239,"page":15},"Useful Apps","i-lucide-award","\u002Fen\u002Fserveex\u002Fapps","en\u002F3.serveex\u002F9.apps",[240,244],{"title":241,"path":242,"stem":243},"Adguard Home","\u002Fen\u002Fserveex\u002Fapps\u002Fadguard","en\u002F3.serveex\u002F9.apps\u002F1.adguard",{"title":245,"path":246,"stem":247},"Vaultwarden","\u002Fen\u002Fserveex\u002Fapps\u002Fvaultwarden","en\u002F3.serveex\u002F9.apps\u002F2.vaultwarden",{"title":249,"icon":250,"path":251,"stem":252,"children":253,"page":15},"Advanced","i-lucide-flask-conical","\u002Fen\u002Fserveex\u002Fadvanced","en\u002F3.serveex\u002F91.advanced",[254,258],{"title":255,"path":256,"stem":257},"Authentik","\u002Fen\u002Fserveex\u002Fadvanced\u002Fauthentik","en\u002F3.serveex\u002F91.advanced\u002F1.authentik",{"title":259,"path":260,"stem":261},"Arcane","\u002Fen\u002Fserveex\u002Fadvanced\u002Farcane","en\u002F3.serveex\u002F91.advanced\u002F2.arcane",{"title":263,"icon":264,"path":265,"stem":266,"children":267,"page":15},"Stockeex","i-noto-computer-disk","\u002Fen\u002Fstockeex","en\u002F4.stockeex",[268],{"title":101,"path":269,"stem":270,"icon":25},"\u002Fen\u002Fstockeex\u002Fintroduction","en\u002F4.stockeex\u002F1.introduction",{"title":272,"icon":273,"path":274,"stem":275,"children":276,"page":15},"My nonsense","i-noto-test-tube","\u002Fen\u002Fnonsense","en\u002F5.nonsense",[277,280,302],{"title":272,"path":278,"stem":279,"icon":25},"\u002Fen\u002Fnonsense\u002Fsummary","en\u002F5.nonsense\u002F1.summary",{"title":281,"icon":282,"path":283,"stem":284,"children":285,"page":15},"Python","i-lucide-file-code-2","\u002Fen\u002Fnonsense\u002Fpython","en\u002F5.nonsense\u002F2.python",[286,290,294,298],{"title":287,"path":288,"stem":289},"Nvidia Stock Bot","\u002Fen\u002Fnonsense\u002Fpython\u002Fnvidia-stock-bot","en\u002F5.nonsense\u002F2.python\u002F1.nvidia-stock-bot",{"title":291,"path":292,"stem":293},"Adguard CIDRE","\u002Fen\u002Fnonsense\u002Fpython\u002Fadguard-cidre","en\u002F5.nonsense\u002F2.python\u002F2.adguard-cidre",{"title":295,"path":296,"stem":297},"Lumeex","\u002Fen\u002Fnonsense\u002Fpython\u002Flumeex","en\u002F5.nonsense\u002F2.python\u002F3.lumeex",{"title":299,"path":300,"stem":301},"Instameex","\u002Fen\u002Fnonsense\u002Fpython\u002Finstameex","en\u002F5.nonsense\u002F2.python\u002F4.instameex",{"title":303,"icon":304,"path":305,"stem":306,"children":307,"page":15},"Bash","i-lucide-file-terminal","\u002Fen\u002Fnonsense\u002Fbash","en\u002F5.nonsense\u002F3.bash",[308,312,316,320,324,328],{"title":309,"path":310,"stem":311},"Servarr corrector","\u002Fen\u002Fnonsense\u002Fbash\u002Fservarr-duplicates","en\u002F5.nonsense\u002F3.bash\u002F1.servarr-duplicates",{"title":313,"path":314,"stem":315},"LUKS Backup","\u002Fen\u002Fnonsense\u002Fbash\u002Fluks-backup","en\u002F5.nonsense\u002F3.bash\u002F2.luks-backup",{"title":317,"path":318,"stem":319},"Socat Proxy","\u002Fen\u002Fnonsense\u002Fbash\u002Fsocat-proxy","en\u002F5.nonsense\u002F3.bash\u002F3.socat-proxy",{"title":321,"path":322,"stem":323},"HotDisk","\u002Fen\u002Fnonsense\u002Fbash\u002Fhotdisk","en\u002F5.nonsense\u002F3.bash\u002F4.hotdisk",{"title":325,"path":326,"stem":327},"Backrest Docker Stop","\u002Fen\u002Fnonsense\u002Fbash\u002Fbackrest-docker-stop","en\u002F5.nonsense\u002F3.bash\u002F5.backrest-docker-stop",{"title":329,"path":330,"stem":331},"rm Confirmation Guard","\u002Fen\u002Fnonsense\u002Fbash\u002Frm-confirmation","en\u002F5.nonsense\u002F3.bash\u002F6.rm-confirmation",{"title":333,"icon":334,"path":335,"stem":336,"children":337,"page":15},"Recycled","i-noto-recycling-symbol","\u002Fen\u002Frecycled","en\u002F6.recycled",[338,341,355],{"title":333,"path":339,"stem":340,"icon":25},"\u002Fen\u002Frecycled\u002Fsummary","en\u002F6.recycled\u002F1.summary",{"title":342,"icon":343,"path":344,"stem":345,"children":346,"page":15},"Deprecated","i-lucide-trash-2","\u002Fen\u002Frecycled\u002Fdeprecated","en\u002F6.recycled\u002F2.deprecated",[347,351],{"title":348,"path":349,"stem":350},"Wireguard 14","\u002Fen\u002Frecycled\u002Fdeprecated\u002Fwireguard-14","en\u002F6.recycled\u002F2.deprecated\u002F1.wireguard-14",{"title":352,"path":353,"stem":354},"File Browser","\u002Fen\u002Frecycled\u002Fdeprecated\u002Ffile-browser","en\u002F6.recycled\u002F2.deprecated\u002F2.file-browser",{"title":356,"icon":357,"path":358,"stem":359,"children":360,"page":15},"Alternatives","i-lucide-arrow-left-right","\u002Fen\u002Frecycled\u002Falternatives","en\u002F6.recycled\u002F3.alternatives",[361,365,369,373],{"title":362,"path":363,"stem":364},"Plex","\u002Fen\u002Frecycled\u002Falternatives\u002Fplex","en\u002F6.recycled\u002F3.alternatives\u002F1.plex",{"title":366,"path":367,"stem":368},"Qbittorrent for Plex","\u002Fen\u002Frecycled\u002Falternatives\u002Fqbittorrent-for-plex","en\u002F6.recycled\u002F3.alternatives\u002F2.qbittorrent for plex",{"title":370,"path":371,"stem":372},"Servarr for Plex","\u002Fen\u002Frecycled\u002Falternatives\u002Fservarr-for-plex","en\u002F6.recycled\u002F3.alternatives\u002F3.servarr for plex",{"title":374,"path":375,"stem":376},"Gitea","\u002Fen\u002Frecycled\u002Falternatives\u002Fgitea","en\u002F6.recycled\u002F3.alternatives\u002F4.gitea",{"id":378,"title":167,"body":379,"contributors":1980,"description":1982,"extension":1983,"hideCopyPage":15,"hideHeader":15,"hideToc":15,"links":1984,"meta":1985,"navigation":679,"path":168,"seo":1986,"stem":169,"__hash__":1987},"docs_en\u002Fen\u002F3.serveex\u002F4.monitoring\u002F5.upsnap.md",{"type":380,"value":381,"toc":1967},"minimark",[382,390,400,406,411,415,751,758,762,778,781,823,1400,1403,1407,1420,1907,1923,1963],[383,384],"ellipsis",{"blur":385,"left":386,"top":387,"width":388,"z-index":389},"140px","0px","10rem","40rem","60",[391,392,393,399],"p",{},[394,395,167],"a",{"href":396,"rel":397},"https:\u002F\u002Fgithub.com\u002Fseriousm4x\u002FUpSnap",[398],"nofollow"," is a container that allows you to remotely power on, shut down, or put your machines to sleep. It mainly uses Wake-On-Lan (WoL) over the network and offers advanced features.",[391,401,402],{},[403,404],"img",{"alt":163,"src":405},"\u002Fimg\u002Fserveex\u002Fupsnap.webp",[407,408,410],"h2",{"id":409},"installation","Installation",[412,413],"file-tree",{":tree":414},"{\"\u002F\":[{\"srv\":[{\"docker\":[{\"upsnap\":[\"compose.yaml\",\".env\",\"data\u002F\"]}]}]}]}",[416,417,419,424,436,634,694,698,705,740,747],"steps",{"level":418},"3",[420,421,423],"h3",{"id":422},"deploy-the-stack","Deploy the stack",[391,425,426,427,431,432,435],{},"Open Dockge, click on ",[428,429,430],"code",{},"compose",", name the stack ",[428,433,434],{},"upsnap",", then copy and paste the following:",[437,438,444],"pre",{"className":439,"code":440,"filename":441,"language":442,"meta":443,"style":443},"language-yaml shiki shiki-themes github-dark material-theme github-dark","---\nservices:\n  upsnap:\n    container_name: upsnap\n    image: ghcr.io\u002Fseriousm4x\u002Fupsnap:5\n    network_mode: host\n    restart: unless-stopped\n    volumes:\n      - \u002Fsrv\u002Fdocker\u002Fupsnap\u002Fdata:\u002Fapp\u002Fpb_data\n    environment:\n      - TZ=Europe\u002FParis\n      - UPSNAP_SCAN_RANGE=${SCAN_RANGE}\n      - UPSNAP_SCAN_TIMEOUT=500ms\n      - UPSNAP_PING_PRIVILEGED=true\n    dns:\n      - ${DNS}\n    entrypoint: \u002Fbin\u002Fsh -c \".\u002Fupsnap serve --http 0.0.0.0:8095\"\n    healthcheck:\n      test: curl -fs \"http:\u002F\u002Flocalhost:8095\u002Fapi\u002Fhealth\" || exit 1\n      interval: 10s\n","compose.yaml","yaml","",[428,445,446,455,466,474,487,498,509,520,528,537,545,553,561,569,577,585,593,604,612,623],{"__ignoreMap":443},[447,448,451],"span",{"class":449,"line":450},"line",1,[447,452,454],{"class":453},"sEgDM","---\n",[447,456,458,462],{"class":449,"line":457},2,[447,459,461],{"class":460},"sRuoG","services",[447,463,465],{"class":464},"s8jd1",":\n",[447,467,469,472],{"class":449,"line":468},3,[447,470,471],{"class":460},"  upsnap",[447,473,465],{"class":464},[447,475,477,480,483],{"class":449,"line":476},4,[447,478,479],{"class":460},"    container_name",[447,481,482],{"class":464},":",[447,484,486],{"class":485},"s11XM"," upsnap\n",[447,488,490,493,495],{"class":449,"line":489},5,[447,491,492],{"class":460},"    image",[447,494,482],{"class":464},[447,496,497],{"class":485}," ghcr.io\u002Fseriousm4x\u002Fupsnap:5\n",[447,499,501,504,506],{"class":449,"line":500},6,[447,502,503],{"class":460},"    network_mode",[447,505,482],{"class":464},[447,507,508],{"class":485}," host\n",[447,510,512,515,517],{"class":449,"line":511},7,[447,513,514],{"class":460},"    restart",[447,516,482],{"class":464},[447,518,519],{"class":485}," unless-stopped\n",[447,521,523,526],{"class":449,"line":522},8,[447,524,525],{"class":460},"    volumes",[447,527,465],{"class":464},[447,529,531,534],{"class":449,"line":530},9,[447,532,533],{"class":464},"      -",[447,535,536],{"class":485}," \u002Fsrv\u002Fdocker\u002Fupsnap\u002Fdata:\u002Fapp\u002Fpb_data\n",[447,538,540,543],{"class":449,"line":539},10,[447,541,542],{"class":460},"    environment",[447,544,465],{"class":464},[447,546,548,550],{"class":449,"line":547},11,[447,549,533],{"class":464},[447,551,552],{"class":485}," TZ=Europe\u002FParis\n",[447,554,556,558],{"class":449,"line":555},12,[447,557,533],{"class":464},[447,559,560],{"class":485}," UPSNAP_SCAN_RANGE=${SCAN_RANGE}\n",[447,562,564,566],{"class":449,"line":563},13,[447,565,533],{"class":464},[447,567,568],{"class":485}," UPSNAP_SCAN_TIMEOUT=500ms\n",[447,570,572,574],{"class":449,"line":571},14,[447,573,533],{"class":464},[447,575,576],{"class":485}," UPSNAP_PING_PRIVILEGED=true\n",[447,578,580,583],{"class":449,"line":579},15,[447,581,582],{"class":460},"    dns",[447,584,465],{"class":464},[447,586,588,590],{"class":449,"line":587},16,[447,589,533],{"class":464},[447,591,592],{"class":485}," ${DNS}\n",[447,594,596,599,601],{"class":449,"line":595},17,[447,597,598],{"class":460},"    entrypoint",[447,600,482],{"class":464},[447,602,603],{"class":485}," \u002Fbin\u002Fsh -c \".\u002Fupsnap serve --http 0.0.0.0:8095\"\n",[447,605,607,610],{"class":449,"line":606},18,[447,608,609],{"class":460},"    healthcheck",[447,611,465],{"class":464},[447,613,615,618,620],{"class":449,"line":614},19,[447,616,617],{"class":460},"      test",[447,619,482],{"class":464},[447,621,622],{"class":485}," curl -fs \"http:\u002F\u002Flocalhost:8095\u002Fapi\u002Fhealth\" || exit 1\n",[447,624,626,629,631],{"class":449,"line":625},20,[447,627,628],{"class":460},"      interval",[447,630,482],{"class":464},[447,632,633],{"class":485}," 10s\n",[635,636,637,645],"tip",{"icon":443},[391,638,639,640,644],{},"✨ ",[641,642,643],"strong",{},"Tip:"," Add the watchtower label to each container to automate updates",[437,646,648],{"className":439,"code":647,"filename":441,"language":442,"meta":443,"style":443},"services:\n  upsnap:\n    #...\n    labels:\n\n      - com.centurylinklabs.watchtower.enable=true\n```\n",[428,649,650,656,662,668,675,681,688],{"__ignoreMap":443},[447,651,652,654],{"class":449,"line":450},[447,653,461],{"class":460},[447,655,465],{"class":464},[447,657,658,660],{"class":449,"line":457},[447,659,471],{"class":460},[447,661,465],{"class":464},[447,663,664],{"class":449,"line":468},[447,665,667],{"class":666},"sDvJj","    #...\n",[447,669,670,673],{"class":449,"line":476},[447,671,672],{"class":460},"    labels",[447,674,465],{"class":464},[447,676,677],{"class":449,"line":489},[447,678,680],{"emptyLinePlaceholder":679},true,"\n",[447,682,683,685],{"class":449,"line":500},[447,684,533],{"class":464},[447,686,687],{"class":485}," com.centurylinklabs.watchtower.enable=true\n",[447,689,690],{"class":449,"line":511},[447,691,693],{"class":692},"slcoZ","```\n",[420,695,697],{"id":696},"set-your-environment-variables","Set your environment variables",[391,699,700,701,704],{},"Fill in the ",[428,702,703],{},".env",", for example:",[437,706,710],{"className":707,"code":708,"filename":703,"language":709,"meta":443,"style":443},"language-properties shiki shiki-themes github-dark material-theme github-dark","RANGE=192.168.1.0\u002F24 # scans all devices on the local network with an IP between 192.168.0.1 and 192.168.1.255\nDNS=192.168.1.1 # DNS IP to resolve domain names, typically your router’s IP\n","properties",[428,711,712,727],{"__ignoreMap":443},[447,713,714,718,721,724],{"class":449,"line":450},[447,715,717],{"class":716},"szyEh","RANGE",[447,719,720],{"class":464},"=",[447,722,723],{"class":692},"192.168.1.0\u002F24 ",[447,725,726],{"class":666},"# scans all devices on the local network with an IP between 192.168.0.1 and 192.168.1.255\n",[447,728,729,732,734,737],{"class":449,"line":457},[447,730,731],{"class":716},"DNS",[447,733,720],{"class":464},[447,735,736],{"class":692},"192.168.1.1 ",[447,738,739],{"class":666},"# DNS IP to resolve domain names, typically your router’s IP\n",[391,741,742,743,746],{},"Deploy the container and go to ",[428,744,745],{},"http:\u002F\u002Fyourserverip:8095",". Just follow the steps to create your account!",[420,748,750],{"id":749},"done","Done !",[752,753,754,757],"caution",{},[641,755,756],{},"If it fails:"," check your firewall rules.",[407,759,761],{"id":760},"exposing-upsnap-with-swag","Exposing UpSnap with Swag",[763,764,765,766,769,770,773,774,777],"warning",{},"UpSnap does not support multi-factor authentication. Exposing it on the internet could compromise connected machines. Do this only if you're using a multi-factor authentication system like ",[394,767,137],{"href":768},"\u002Fserveex\u002Fsecurity\u002Ftinyauth"," or ",[394,771,255],{"href":772},"\u002Fserveex\u002Fadvanced\u002Fauthentik\u002F",". Otherwise, avoid exposing it with SWAG and use a VPN like ",[394,775,119],{"href":776},"\u002Fserveex\u002Fcore\u002Fwireguard"," instead.",[391,779,780],{},"You may want to access it remotely from all your devices. To do so, we'll expose UpSnap via Swag.",[782,783,784,785,788,791,793,794,798,799,802,803,806,807,810,811,814,815,817,818,822],"note",{"icon":443},"📋 ",[641,786,787],{},"Beforehand:",[789,790],"br",{},[789,792],{},"\nWe assume you've created a subdomain in your ",[394,795,797],{"href":796},"\u002Fgeneral\u002Fnetworking\u002Fdns","DNS zone",", such as ",[428,800,801],{},"upsnap.yourdomain.com"," with a ",[428,804,805],{},"CNAME"," to ",[428,808,809],{},"yourdomain.com",". Also, unless you're using Cloudflare Zero Trust, you should have already forwarded port ",[428,812,813],{},"443"," from your router to port ",[428,816,813],{}," on your server in your ",[394,819,821],{"href":820},"\u002Fgeneral\u002Fnetworking\u002Fnat","NAT rules",".",[416,824,825,829,832,950,953,963,967,973,982,1001,1004,1381,1397],{"level":418},[420,826,828],{"id":827},"add-upsnaps-network-to-swag","Add UpSnap's network to SWAG",[391,830,831],{},"Go to Dockge, and edit the SWAG compose by adding the UpSnap network:",[437,833,835],{"className":439,"code":834,"filename":441,"language":442,"meta":443,"style":443},"---\nservices:\n  swag:\n     container_name: # ...\n      # ... \n     networks:                       # Connects the container to the custom network \n      # ...           \n      - upsnap                       # Network name declared in the stack\n    \nnetworks:                            # Defines the custom network\n  # ...\n  upsnap:                 # Network name declared in the stack\n    name: upsnap_default             # Actual name of the external network\n    external: true                   # Indicates it's an external network\n",[428,836,837,841,847,854,864,869,879,884,894,899,909,914,923,936],{"__ignoreMap":443},[447,838,839],{"class":449,"line":450},[447,840,454],{"class":453},[447,842,843,845],{"class":449,"line":457},[447,844,461],{"class":460},[447,846,465],{"class":464},[447,848,849,852],{"class":449,"line":468},[447,850,851],{"class":460},"  swag",[447,853,465],{"class":464},[447,855,856,859,861],{"class":449,"line":476},[447,857,858],{"class":460},"     container_name",[447,860,482],{"class":464},[447,862,863],{"class":666}," # ...\n",[447,865,866],{"class":449,"line":489},[447,867,868],{"class":666},"      # ... \n",[447,870,871,874,876],{"class":449,"line":500},[447,872,873],{"class":460},"     networks",[447,875,482],{"class":464},[447,877,878],{"class":666},"                       # Connects the container to the custom network \n",[447,880,881],{"class":449,"line":511},[447,882,883],{"class":666},"      # ...           \n",[447,885,886,888,891],{"class":449,"line":522},[447,887,533],{"class":464},[447,889,890],{"class":485}," upsnap",[447,892,893],{"class":666},"                       # Network name declared in the stack\n",[447,895,896],{"class":449,"line":530},[447,897,898],{"class":692},"    \n",[447,900,901,904,906],{"class":449,"line":539},[447,902,903],{"class":460},"networks",[447,905,482],{"class":464},[447,907,908],{"class":666},"                            # Defines the custom network\n",[447,910,911],{"class":449,"line":547},[447,912,913],{"class":666},"  # ...\n",[447,915,916,918,920],{"class":449,"line":555},[447,917,471],{"class":460},[447,919,482],{"class":464},[447,921,922],{"class":666},"                 # Network name declared in the stack\n",[447,924,925,928,930,933],{"class":449,"line":563},[447,926,927],{"class":460},"    name",[447,929,482],{"class":464},[447,931,932],{"class":485}," upsnap_default",[447,934,935],{"class":666},"             # Actual name of the external network\n",[447,937,938,941,943,947],{"class":449,"line":571},[447,939,940],{"class":460},"    external",[447,942,482],{"class":464},[447,944,946],{"class":945},"s08Ry"," true",[447,948,949],{"class":666},"                   # Indicates it's an external network\n",[391,951,952],{},"Restart the stack by clicking \"deploy\" and wait for SWAG to be fully operational.",[782,954,955,956,959,960,822],{},"Here we assume the network name for upsnap is ",[428,957,958],{},"upsnap_default",". You can check the connection in the SWAG dashboard at ",[428,961,962],{},"http:\u002F\u002Fyourserverip:81",[420,964,966],{"id":965},"create-the-subdomainconf-file","Create the subdomain.conf file",[391,968,969,970,822],{},"In the Swag folders, create the file ",[428,971,972],{},"upsnap.subdomain.conf",[635,974,639,976,978,979,981],{"icon":443,"to":975},"\u002Fserveex\u002Ffiles\u002Ffile-browser-quantum",[641,977,643],{}," You can use ",[641,980,209],{}," to navigate your files and edit documents instead of using terminal commands.",[437,983,988],{"className":984,"code":985,"filename":986,"language":987,"meta":443,"style":443},"language-bash shiki shiki-themes github-dark material-theme github-dark","sudo nano \u002Fsrv\u002Fdocker\u002Fswag\u002Fconfig\u002Fnginx\u002Fproxy-confs\u002Fupsnap.subdomain.conf\n","Terminal","bash",[428,989,990],{"__ignoreMap":443},[447,991,992,995,998],{"class":449,"line":450},[447,993,994],{"class":453},"sudo",[447,996,997],{"class":485}," nano",[447,999,1000],{"class":485}," \u002Fsrv\u002Fdocker\u002Fswag\u002Fconfig\u002Fnginx\u002Fproxy-confs\u002Fupsnap.subdomain.conf\n",[391,1002,1003],{},"And paste the following configuration:",[437,1005,1009],{"className":1006,"code":1007,"filename":972,"language":1008,"meta":443,"style":443},"language-nginx shiki shiki-themes github-dark material-theme github-dark","## Version 2023\u002F12\u002F19\n\nserver {\n    listen 443 ssl;\n    listen [::]:443 ssl;\n\n    server_name upsnap.*;\n\n    include \u002Fconfig\u002Fnginx\u002Fssl.conf;\n\n    client_max_body_size 0;\n\n    #if ($lan-ip = yes) { set $geo-whitelist yes; }\n    #if ($geo-whitelist = no) { return 404; }\n    if ($geo-blacklist = no) { return 404; }\n\n    # enable for ldap auth (requires ldap-location.conf in the location block)\n    #include \u002Fconfig\u002Fnginx\u002Fldap-server.conf;\n\n    # enable for Authelia (requires authelia-location.conf in the location block)\n    #include \u002Fconfig\u002Fnginx\u002Fauthelia-server.conf;\n\n    # enable for Authentik (requires authentik-location.conf in the location block)\n    #include \u002Fconfig\u002Fnginx\u002Fauthentik-server.conf;\n\n    location \u002F {\n        # enable the next two lines for http auth\n        #auth_basic \"Restricted\";\n        #auth_basic_user_file \u002Fconfig\u002Fnginx\u002F.htpasswd;\n\n        # enable for ldap auth (requires ldap-server.conf in the server block)\n        #include \u002Fconfig\u002Fnginx\u002Fldap-location.conf;\n\n        # enable for Authelia (requires authelia-server.conf in the server block)\n        #include \u002Fconfig\u002Fnginx\u002Fauthelia-location.conf;\n\n        # enable for Authentik (requires authentik-server.conf in the server block)\n        #include \u002Fconfig\u002Fnginx\u002Fauthentik-location.conf;\n\n        include \u002Fconfig\u002Fnginx\u002Fproxy.conf;\n        include \u002Fconfig\u002Fnginx\u002Fresolver.conf;\n        set $upstream_app upsnap;\n        set $upstream_port 8095;\n        set $upstream_proto http;\n        proxy_pass $upstream_proto:\u002F\u002F$upstream_app:$upstream_port;\n\n    }\n}\n","nginx",[428,1010,1011,1016,1020,1029,1044,1053,1057,1067,1071,1081,1085,1095,1099,1104,1109,1143,1147,1152,1157,1161,1166,1172,1177,1183,1189,1194,1206,1212,1218,1224,1229,1235,1241,1246,1252,1258,1263,1269,1275,1280,1291,1301,1314,1329,1341,1364,1369,1375],{"__ignoreMap":443},[447,1012,1013],{"class":449,"line":450},[447,1014,1015],{"class":666},"## Version 2023\u002F12\u002F19\n",[447,1017,1018],{"class":449,"line":457},[447,1019,680],{"emptyLinePlaceholder":679},[447,1021,1022,1026],{"class":449,"line":468},[447,1023,1025],{"class":1024},"sAoO4","server",[447,1027,1028],{"class":692}," {\n",[447,1030,1031,1035,1038,1041],{"class":449,"line":476},[447,1032,1034],{"class":1033},"sJPTy","    listen ",[447,1036,813],{"class":1037},"swwWl",[447,1039,1040],{"class":692}," ssl",[447,1042,1043],{"class":464},";\n",[447,1045,1046,1048,1051],{"class":449,"line":489},[447,1047,1034],{"class":1033},[447,1049,1050],{"class":692},"[::]:443 ssl",[447,1052,1043],{"class":464},[447,1054,1055],{"class":449,"line":500},[447,1056,680],{"emptyLinePlaceholder":679},[447,1058,1059,1062,1065],{"class":449,"line":511},[447,1060,1061],{"class":1033},"    server_name ",[447,1063,1064],{"class":692},"upsnap.*",[447,1066,1043],{"class":464},[447,1068,1069],{"class":449,"line":522},[447,1070,680],{"emptyLinePlaceholder":679},[447,1072,1073,1076,1079],{"class":449,"line":530},[447,1074,1075],{"class":1033},"    include ",[447,1077,1078],{"class":692},"\u002Fconfig\u002Fnginx\u002Fssl.conf",[447,1080,1043],{"class":464},[447,1082,1083],{"class":449,"line":539},[447,1084,680],{"emptyLinePlaceholder":679},[447,1086,1087,1090,1093],{"class":449,"line":547},[447,1088,1089],{"class":1033},"    client_max_body_size ",[447,1091,1092],{"class":1037},"0",[447,1094,1043],{"class":464},[447,1096,1097],{"class":449,"line":555},[447,1098,680],{"emptyLinePlaceholder":679},[447,1100,1101],{"class":449,"line":563},[447,1102,1103],{"class":666},"    #if ($lan-ip = yes) { set $geo-whitelist yes; }\n",[447,1105,1106],{"class":449,"line":571},[447,1107,1108],{"class":666},"    #if ($geo-whitelist = no) { return 404; }\n",[447,1110,1111,1115,1118,1121,1124,1127,1130,1134,1137,1140],{"class":449,"line":579},[447,1112,1114],{"class":1113},"sJLGa","    if",[447,1116,1117],{"class":692}," (",[447,1119,1120],{"class":464},"$",[447,1122,1123],{"class":692},"geo-blacklist ",[447,1125,1126],{"class":1033},"= ",[447,1128,1129],{"class":692},"no) ",[447,1131,1133],{"class":1132},"sSoIa","{ ",[447,1135,1136],{"class":1113},"return",[447,1138,1139],{"class":1037}," 404",[447,1141,1142],{"class":1132},"; }\n",[447,1144,1145],{"class":449,"line":587},[447,1146,680],{"emptyLinePlaceholder":679},[447,1148,1149],{"class":449,"line":595},[447,1150,1151],{"class":666},"    # enable for ldap auth (requires ldap-location.conf in the location block)\n",[447,1153,1154],{"class":449,"line":606},[447,1155,1156],{"class":666},"    #include \u002Fconfig\u002Fnginx\u002Fldap-server.conf;\n",[447,1158,1159],{"class":449,"line":614},[447,1160,680],{"emptyLinePlaceholder":679},[447,1162,1163],{"class":449,"line":625},[447,1164,1165],{"class":666},"    # enable for Authelia (requires authelia-location.conf in the location block)\n",[447,1167,1169],{"class":449,"line":1168},21,[447,1170,1171],{"class":666},"    #include \u002Fconfig\u002Fnginx\u002Fauthelia-server.conf;\n",[447,1173,1175],{"class":449,"line":1174},22,[447,1176,680],{"emptyLinePlaceholder":679},[447,1178,1180],{"class":449,"line":1179},23,[447,1181,1182],{"class":666},"    # enable for Authentik (requires authentik-location.conf in the location block)\n",[447,1184,1186],{"class":449,"line":1185},24,[447,1187,1188],{"class":666},"    #include \u002Fconfig\u002Fnginx\u002Fauthentik-server.conf;\n",[447,1190,1192],{"class":449,"line":1191},25,[447,1193,680],{"emptyLinePlaceholder":679},[447,1195,1197,1200,1203],{"class":449,"line":1196},26,[447,1198,1199],{"class":1024},"    location",[447,1201,1202],{"class":453}," \u002F ",[447,1204,1205],{"class":692},"{\n",[447,1207,1209],{"class":449,"line":1208},27,[447,1210,1211],{"class":666},"        # enable the next two lines for http auth\n",[447,1213,1215],{"class":449,"line":1214},28,[447,1216,1217],{"class":666},"        #auth_basic \"Restricted\";\n",[447,1219,1221],{"class":449,"line":1220},29,[447,1222,1223],{"class":666},"        #auth_basic_user_file \u002Fconfig\u002Fnginx\u002F.htpasswd;\n",[447,1225,1227],{"class":449,"line":1226},30,[447,1228,680],{"emptyLinePlaceholder":679},[447,1230,1232],{"class":449,"line":1231},31,[447,1233,1234],{"class":666},"        # enable for ldap auth (requires ldap-server.conf in the server block)\n",[447,1236,1238],{"class":449,"line":1237},32,[447,1239,1240],{"class":666},"        #include \u002Fconfig\u002Fnginx\u002Fldap-location.conf;\n",[447,1242,1244],{"class":449,"line":1243},33,[447,1245,680],{"emptyLinePlaceholder":679},[447,1247,1249],{"class":449,"line":1248},34,[447,1250,1251],{"class":666},"        # enable for Authelia (requires authelia-server.conf in the server block)\n",[447,1253,1255],{"class":449,"line":1254},35,[447,1256,1257],{"class":666},"        #include \u002Fconfig\u002Fnginx\u002Fauthelia-location.conf;\n",[447,1259,1261],{"class":449,"line":1260},36,[447,1262,680],{"emptyLinePlaceholder":679},[447,1264,1266],{"class":449,"line":1265},37,[447,1267,1268],{"class":666},"        # enable for Authentik (requires authentik-server.conf in the server block)\n",[447,1270,1272],{"class":449,"line":1271},38,[447,1273,1274],{"class":666},"        #include \u002Fconfig\u002Fnginx\u002Fauthentik-location.conf;\n",[447,1276,1278],{"class":449,"line":1277},39,[447,1279,680],{"emptyLinePlaceholder":679},[447,1281,1283,1286,1289],{"class":449,"line":1282},40,[447,1284,1285],{"class":1033},"        include ",[447,1287,1288],{"class":692},"\u002Fconfig\u002Fnginx\u002Fproxy.conf",[447,1290,1043],{"class":464},[447,1292,1294,1296,1299],{"class":449,"line":1293},41,[447,1295,1285],{"class":1033},[447,1297,1298],{"class":692},"\u002Fconfig\u002Fnginx\u002Fresolver.conf",[447,1300,1043],{"class":464},[447,1302,1304,1307,1309,1312],{"class":449,"line":1303},42,[447,1305,1306],{"class":1033},"        set ",[447,1308,1120],{"class":464},[447,1310,1311],{"class":692},"upstream_app upsnap",[447,1313,1043],{"class":464},[447,1315,1317,1319,1321,1324,1327],{"class":449,"line":1316},43,[447,1318,1306],{"class":1033},[447,1320,1120],{"class":464},[447,1322,1323],{"class":692},"upstream_port ",[447,1325,1326],{"class":1037},"8095",[447,1328,1043],{"class":464},[447,1330,1332,1334,1336,1339],{"class":449,"line":1331},44,[447,1333,1306],{"class":1033},[447,1335,1120],{"class":464},[447,1337,1338],{"class":692},"upstream_proto http",[447,1340,1043],{"class":464},[447,1342,1344,1347,1349,1352,1354,1357,1359,1362],{"class":449,"line":1343},45,[447,1345,1346],{"class":1033},"        proxy_pass ",[447,1348,1120],{"class":464},[447,1350,1351],{"class":692},"upstream_proto:\u002F\u002F",[447,1353,1120],{"class":464},[447,1355,1356],{"class":692},"upstream_app:",[447,1358,1120],{"class":464},[447,1360,1361],{"class":692},"upstream_port",[447,1363,1043],{"class":464},[447,1365,1367],{"class":449,"line":1366},46,[447,1368,680],{"emptyLinePlaceholder":679},[447,1370,1372],{"class":449,"line":1371},47,[447,1373,1374],{"class":692},"    }\n",[447,1376,1378],{"class":449,"line":1377},48,[447,1379,1380],{"class":692},"}\n",[391,1382,1383,1384,1388,1389,1392,1393,1396],{},"Press ",[1385,1386],"kbd",{"value":1387},"Ctrl+O",", then ",[1385,1390],{"value":1391},"Enter"," to save, and ",[1385,1394],{"value":1395},"Ctrl+X"," to exit.",[420,1398,750],{"id":1399},"done-1",[391,1401,1402],{},"And that’s it! You’ve exposed UpSnap!",[407,1404,1406],{"id":1405},"protecting-upsnap-with-tinyauth","Protecting UpSnap with TinyAuth",[391,1408,1409,1410,1412,1413,1415,1416,482],{},"Add ",[394,1411,137],{"href":768},"'s forward-auth check directly to ",[428,1414,972],{},", the same way as ",[394,1417,1419],{"href":1418},"\u002Fserveex\u002Fsecurity\u002Ftinyauth#protecting-an-app-via-reverse-proxy","the TinyAuth guide",[437,1421,1424],{"className":1006,"code":1422,"filename":972,"highlights":1423,"language":1008,"meta":443,"style":443},"## Version 2023\u002F12\u002F19\n\nserver {\n    listen 443 ssl;\n    listen [::]:443 ssl;\n\n    server_name upsnap.*;\n\n    include \u002Fconfig\u002Fnginx\u002Fssl.conf;\n\n    client_max_body_size 0;\n\n    #if ($lan-ip = yes) { set $geo-whitelist yes; }\n    #if ($geo-whitelist = no) { return 404; }\n    if ($geo-blacklist = no) { return 404; }\n\n    # enable for ldap auth (requires ldap-location.conf in the location block)\n    #include \u002Fconfig\u002Fnginx\u002Fldap-server.conf;\n\n    # enable for Authelia (requires authelia-location.conf in the location block)\n    #include \u002Fconfig\u002Fnginx\u002Fauthelia-server.conf;\n\n    # enable for Authentik (requires authentik-location.conf in the location block)\n    #include \u002Fconfig\u002Fnginx\u002Fauthentik-server.conf;\n\n    location \u002Ftinyauth {\n        internal;\n        proxy_pass http:\u002F\u002Ftinyauth:3000\u002Fapi\u002Fauth\u002Fnginx;\n        proxy_pass_request_body off;\n        proxy_set_header Content-Length \"\";\n        proxy_set_header X-Forwarded-Proto $scheme;\n        proxy_set_header X-Forwarded-Host $http_host;\n        proxy_set_header X-Forwarded-Uri $request_uri;\n    }\n\n    location @tinyauth_login {\n        return 302 https:\u002F\u002Ftinyauth.mydomain.com\u002Flogin?redirect_uri=$scheme:\u002F\u002F$http_host$request_uri;\n    }\n\n    location \u002F {\n        auth_request \u002Ftinyauth;\n        error_page 401 = @tinyauth_login;\n\n        # enable the next two lines for http auth\n        #auth_basic \"Restricted\";\n        #auth_basic_user_file \u002Fconfig\u002Fnginx\u002F.htpasswd;\n\n        # enable for ldap auth (requires ldap-server.conf in the server block)\n        #include \u002Fconfig\u002Fnginx\u002Fldap-location.conf;\n\n        # enable for Authelia (requires authelia-server.conf in the server block)\n        #include \u002Fconfig\u002Fnginx\u002Fauthelia-location.conf;\n\n        # enable for Authentik (requires authentik-server.conf in the server block)\n        #include \u002Fconfig\u002Fnginx\u002Fauthentik-location.conf;\n\n        include \u002Fconfig\u002Fnginx\u002Fproxy.conf;\n        include \u002Fconfig\u002Fnginx\u002Fresolver.conf;\n        set $upstream_app upsnap;\n        set $upstream_port 8095;\n        set $upstream_proto http;\n        proxy_pass $upstream_proto:\u002F\u002F$upstream_app:$upstream_port;\n\n    }\n}\n",[1196,1208,1214,1220,1226,1231,1237,1243,1248,1254,1260,1265,1271,1293,1303],[428,1425,1426,1430,1434,1440,1450,1458,1462,1470,1474,1482,1486,1494,1498,1502,1506,1528,1532,1536,1540,1544,1548,1552,1556,1560,1564,1568,1579,1587,1597,1609,1623,1638,1653,1668,1673,1678,1688,1714,1719,1723,1731,1742,1756,1760,1764,1768,1772,1776,1780,1785,1790,1795,1800,1805,1810,1815,1820,1829,1838,1849,1862,1873,1892,1897,1902],{"__ignoreMap":443},[447,1427,1428],{"class":449,"line":450},[447,1429,1015],{"class":666},[447,1431,1432],{"class":449,"line":457},[447,1433,680],{"emptyLinePlaceholder":679},[447,1435,1436,1438],{"class":449,"line":468},[447,1437,1025],{"class":1024},[447,1439,1028],{"class":692},[447,1441,1442,1444,1446,1448],{"class":449,"line":476},[447,1443,1034],{"class":1033},[447,1445,813],{"class":1037},[447,1447,1040],{"class":692},[447,1449,1043],{"class":464},[447,1451,1452,1454,1456],{"class":449,"line":489},[447,1453,1034],{"class":1033},[447,1455,1050],{"class":692},[447,1457,1043],{"class":464},[447,1459,1460],{"class":449,"line":500},[447,1461,680],{"emptyLinePlaceholder":679},[447,1463,1464,1466,1468],{"class":449,"line":511},[447,1465,1061],{"class":1033},[447,1467,1064],{"class":692},[447,1469,1043],{"class":464},[447,1471,1472],{"class":449,"line":522},[447,1473,680],{"emptyLinePlaceholder":679},[447,1475,1476,1478,1480],{"class":449,"line":530},[447,1477,1075],{"class":1033},[447,1479,1078],{"class":692},[447,1481,1043],{"class":464},[447,1483,1484],{"class":449,"line":539},[447,1485,680],{"emptyLinePlaceholder":679},[447,1487,1488,1490,1492],{"class":449,"line":547},[447,1489,1089],{"class":1033},[447,1491,1092],{"class":1037},[447,1493,1043],{"class":464},[447,1495,1496],{"class":449,"line":555},[447,1497,680],{"emptyLinePlaceholder":679},[447,1499,1500],{"class":449,"line":563},[447,1501,1103],{"class":666},[447,1503,1504],{"class":449,"line":571},[447,1505,1108],{"class":666},[447,1507,1508,1510,1512,1514,1516,1518,1520,1522,1524,1526],{"class":449,"line":579},[447,1509,1114],{"class":1113},[447,1511,1117],{"class":692},[447,1513,1120],{"class":464},[447,1515,1123],{"class":692},[447,1517,1126],{"class":1033},[447,1519,1129],{"class":692},[447,1521,1133],{"class":1132},[447,1523,1136],{"class":1113},[447,1525,1139],{"class":1037},[447,1527,1142],{"class":1132},[447,1529,1530],{"class":449,"line":587},[447,1531,680],{"emptyLinePlaceholder":679},[447,1533,1534],{"class":449,"line":595},[447,1535,1151],{"class":666},[447,1537,1538],{"class":449,"line":606},[447,1539,1156],{"class":666},[447,1541,1542],{"class":449,"line":614},[447,1543,680],{"emptyLinePlaceholder":679},[447,1545,1546],{"class":449,"line":625},[447,1547,1165],{"class":666},[447,1549,1550],{"class":449,"line":1168},[447,1551,1171],{"class":666},[447,1553,1554],{"class":449,"line":1174},[447,1555,680],{"emptyLinePlaceholder":679},[447,1557,1558],{"class":449,"line":1179},[447,1559,1182],{"class":666},[447,1561,1562],{"class":449,"line":1185},[447,1563,1188],{"class":666},[447,1565,1566],{"class":449,"line":1191},[447,1567,680],{"emptyLinePlaceholder":679},[447,1569,1572,1574,1577],{"class":1570,"line":1196},[449,1571],"highlight",[447,1573,1199],{"class":1024},[447,1575,1576],{"class":453}," \u002Ftinyauth ",[447,1578,1205],{"class":692},[447,1580,1582,1585],{"class":1581,"line":1208},[449,1571],[447,1583,1584],{"class":1033},"        internal",[447,1586,1043],{"class":464},[447,1588,1590,1592,1595],{"class":1589,"line":1214},[449,1571],[447,1591,1346],{"class":1033},[447,1593,1594],{"class":692},"http:\u002F\u002Ftinyauth:3000\u002Fapi\u002Fauth\u002Fnginx",[447,1596,1043],{"class":464},[447,1598,1600,1603,1607],{"class":1599,"line":1220},[449,1571],[447,1601,1602],{"class":1033},"        proxy_pass_request_body ",[447,1604,1606],{"class":1605},"soUAX","off",[447,1608,1043],{"class":464},[447,1610,1612,1615,1618,1621],{"class":1611,"line":1226},[449,1571],[447,1613,1614],{"class":1033},"        proxy_set_header ",[447,1616,1617],{"class":692},"Content-Length ",[447,1619,1620],{"class":485},"\"\"",[447,1622,1043],{"class":464},[447,1624,1626,1628,1631,1633,1636],{"class":1625,"line":1231},[449,1571],[447,1627,1614],{"class":1033},[447,1629,1630],{"class":692},"X-Forwarded-Proto ",[447,1632,1120],{"class":464},[447,1634,1635],{"class":692},"scheme",[447,1637,1043],{"class":464},[447,1639,1641,1643,1646,1648,1651],{"class":1640,"line":1237},[449,1571],[447,1642,1614],{"class":1033},[447,1644,1645],{"class":692},"X-Forwarded-Host ",[447,1647,1120],{"class":464},[447,1649,1650],{"class":692},"http_host",[447,1652,1043],{"class":464},[447,1654,1656,1658,1661,1663,1666],{"class":1655,"line":1243},[449,1571],[447,1657,1614],{"class":1033},[447,1659,1660],{"class":692},"X-Forwarded-Uri ",[447,1662,1120],{"class":464},[447,1664,1665],{"class":692},"request_uri",[447,1667,1043],{"class":464},[447,1669,1671],{"class":1670,"line":1248},[449,1571],[447,1672,1374],{"class":692},[447,1674,1676],{"class":1675,"line":1254},[449,1571],[447,1677,680],{"emptyLinePlaceholder":679},[447,1679,1681,1683,1686],{"class":1680,"line":1260},[449,1571],[447,1682,1199],{"class":1024},[447,1684,1685],{"class":453}," @tinyauth_login ",[447,1687,1205],{"class":692},[447,1689,1691,1694,1697,1700,1702,1705,1707,1709,1711],{"class":1690,"line":1265},[449,1571],[447,1692,1693],{"class":1113},"        return",[447,1695,1696],{"class":1037}," 302",[447,1698,1699],{"class":692}," https:\u002F\u002Ftinyauth.mydomain.com\u002Flogin?redirect_uri=",[447,1701,1120],{"class":464},[447,1703,1704],{"class":692},"scheme:\u002F\u002F",[447,1706,1120],{"class":464},[447,1708,1650],{"class":692},[447,1710,1120],{"class":464},[447,1712,1713],{"class":692},"request_uri;\n",[447,1715,1717],{"class":1716,"line":1271},[449,1571],[447,1718,1374],{"class":692},[447,1720,1721],{"class":449,"line":1277},[447,1722,680],{"emptyLinePlaceholder":679},[447,1724,1725,1727,1729],{"class":449,"line":1282},[447,1726,1199],{"class":1024},[447,1728,1202],{"class":453},[447,1730,1205],{"class":692},[447,1732,1734,1737,1740],{"class":1733,"line":1293},[449,1571],[447,1735,1736],{"class":1033},"        auth_request ",[447,1738,1739],{"class":692},"\u002Ftinyauth",[447,1741,1043],{"class":464},[447,1743,1745,1748,1751,1754],{"class":1744,"line":1303},[449,1571],[447,1746,1747],{"class":1033},"        error_page ",[447,1749,1750],{"class":1037},"401",[447,1752,1753],{"class":692}," = @tinyauth_login",[447,1755,1043],{"class":464},[447,1757,1758],{"class":449,"line":1316},[447,1759,680],{"emptyLinePlaceholder":679},[447,1761,1762],{"class":449,"line":1331},[447,1763,1211],{"class":666},[447,1765,1766],{"class":449,"line":1343},[447,1767,1217],{"class":666},[447,1769,1770],{"class":449,"line":1366},[447,1771,1223],{"class":666},[447,1773,1774],{"class":449,"line":1371},[447,1775,680],{"emptyLinePlaceholder":679},[447,1777,1778],{"class":449,"line":1377},[447,1779,1234],{"class":666},[447,1781,1783],{"class":449,"line":1782},49,[447,1784,1240],{"class":666},[447,1786,1788],{"class":449,"line":1787},50,[447,1789,680],{"emptyLinePlaceholder":679},[447,1791,1793],{"class":449,"line":1792},51,[447,1794,1251],{"class":666},[447,1796,1798],{"class":449,"line":1797},52,[447,1799,1257],{"class":666},[447,1801,1803],{"class":449,"line":1802},53,[447,1804,680],{"emptyLinePlaceholder":679},[447,1806,1808],{"class":449,"line":1807},54,[447,1809,1268],{"class":666},[447,1811,1813],{"class":449,"line":1812},55,[447,1814,1274],{"class":666},[447,1816,1818],{"class":449,"line":1817},56,[447,1819,680],{"emptyLinePlaceholder":679},[447,1821,1823,1825,1827],{"class":449,"line":1822},57,[447,1824,1285],{"class":1033},[447,1826,1288],{"class":692},[447,1828,1043],{"class":464},[447,1830,1832,1834,1836],{"class":449,"line":1831},58,[447,1833,1285],{"class":1033},[447,1835,1298],{"class":692},[447,1837,1043],{"class":464},[447,1839,1841,1843,1845,1847],{"class":449,"line":1840},59,[447,1842,1306],{"class":1033},[447,1844,1120],{"class":464},[447,1846,1311],{"class":692},[447,1848,1043],{"class":464},[447,1850,1852,1854,1856,1858,1860],{"class":449,"line":1851},60,[447,1853,1306],{"class":1033},[447,1855,1120],{"class":464},[447,1857,1323],{"class":692},[447,1859,1326],{"class":1037},[447,1861,1043],{"class":464},[447,1863,1865,1867,1869,1871],{"class":449,"line":1864},61,[447,1866,1306],{"class":1033},[447,1868,1120],{"class":464},[447,1870,1338],{"class":692},[447,1872,1043],{"class":464},[447,1874,1876,1878,1880,1882,1884,1886,1888,1890],{"class":449,"line":1875},62,[447,1877,1346],{"class":1033},[447,1879,1120],{"class":464},[447,1881,1351],{"class":692},[447,1883,1120],{"class":464},[447,1885,1356],{"class":692},[447,1887,1120],{"class":464},[447,1889,1361],{"class":692},[447,1891,1043],{"class":464},[447,1893,1895],{"class":449,"line":1894},63,[447,1896,680],{"emptyLinePlaceholder":679},[447,1898,1900],{"class":449,"line":1899},64,[447,1901,1374],{"class":692},[447,1903,1905],{"class":449,"line":1904},65,[447,1906,1380],{"class":692},[782,1908,1910,1911,1914,1915,1918,1919,1922],{"to":1909},"\u002Fserveex\u002Fsecurity\u002Ftinyauth#exposing-tinyauth-with-swag","The ",[428,1912,1913],{},"location \u002Ftinyauth"," block runs inside SWAG's own container, so SWAG needs to be on TinyAuth's Docker network to reach it by name (",[428,1916,1917],{},"tinyauth"," here). This should already be set up from ",[641,1920,1921],{},"exposing TinyAuth itself",". If you run into an error, double-check SWAG's compose file still has that network attached.",[635,1924,1925,1926,1929,1930,1932,1933,1936,1937,1948,1949,1958,1959,822],{"icon":443},"✨ You can protect this app with ",[394,1927,255],{"href":1928},"\u002Fserveex\u002Fadvanced\u002Fauthentik"," instead of TinyAuth by opening ",[428,1931,972],{}," and removing the ",[428,1934,1935],{},"#"," in front of ",[428,1938,1939,1942,1945],{"className":1006,"language":1008,"style":443},[447,1940,1941],{"class":1033},"include ",[447,1943,1944],{"class":692},"\u002Fconfig\u002Fnginx\u002Fauthentik-server.conf",[447,1946,1947],{"class":464},";"," and ",[428,1950,1951,1953,1956],{"className":1006,"language":1008,"style":443},[447,1952,1941],{"class":1033},[447,1954,1955],{"class":692},"\u002Fconfig\u002Fnginx\u002Fauthentik-location.conf",[447,1957,1947],{"class":464},". Don’t forget to ",[394,1960,1962],{"href":1961},"\u002Fserveex\u002Fadvanced\u002Fauthentik#protecting-an-app-via-reverse-proxy","create an application and provider in Authentik",[1964,1965,1966],"style",{},"html pre.shiki code .sEgDM, html code.shiki .sEgDM{--shiki-light:#B392F0;--shiki-default:#FFCB6B;--shiki-dark:#B392F0}html pre.shiki code .sRuoG, html code.shiki .sRuoG{--shiki-light:#85E89D;--shiki-default:#F07178;--shiki-dark:#85E89D}html pre.shiki code .s8jd1, html code.shiki .s8jd1{--shiki-light:#E1E4E8;--shiki-default:#89DDFF;--shiki-dark:#E1E4E8}html pre.shiki code .s11XM, html code.shiki .s11XM{--shiki-light:#9ECBFF;--shiki-default:#C3E88D;--shiki-dark:#9ECBFF}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 .sDvJj, html code.shiki .sDvJj{--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .slcoZ, html code.shiki .slcoZ{--shiki-light:#E1E4E8;--shiki-default:#EEFFFF;--shiki-dark:#E1E4E8}html pre.shiki code .szyEh, html code.shiki .szyEh{--shiki-light:#F97583;--shiki-default:#F07178;--shiki-dark:#F97583}html pre.shiki code .s08Ry, html code.shiki .s08Ry{--shiki-light:#79B8FF;--shiki-default:#FF9CAC;--shiki-dark:#79B8FF}html pre.shiki code .sAoO4, html code.shiki .sAoO4{--shiki-light:#F97583;--shiki-default:#C792EA;--shiki-dark:#F97583}html pre.shiki code .sJPTy, html code.shiki .sJPTy{--shiki-light:#F97583;--shiki-default:#89DDFF;--shiki-dark:#F97583}html pre.shiki code .swwWl, html code.shiki .swwWl{--shiki-light:#79B8FF;--shiki-default:#F78C6C;--shiki-dark:#79B8FF}html pre.shiki code .sJLGa, html code.shiki .sJLGa{--shiki-light:#F97583;--shiki-light-font-style:inherit;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .sSoIa, html code.shiki .sSoIa{--shiki-light:#E1E4E8;--shiki-default:#F07178;--shiki-dark:#E1E4E8}html pre.shiki code .soUAX, html code.shiki .soUAX{--shiki-light:#79B8FF;--shiki-default:#89DDFF;--shiki-dark:#79B8FF}",{"title":443,"searchDepth":457,"depth":457,"links":1968},[1969,1974,1979],{"id":409,"depth":457,"text":410,"children":1970},[1971,1972,1973],{"id":422,"depth":468,"text":423},{"id":696,"depth":468,"text":697},{"id":749,"depth":468,"text":750},{"id":760,"depth":457,"text":761,"children":1975},[1976,1977,1978],{"id":827,"depth":468,"text":828},{"id":965,"depth":468,"text":966},{"id":1399,"depth":468,"text":750},{"id":1405,"depth":457,"text":1406},[1981],"Djeex","Install UpSnap to remotely wake up machines on your local network via Wake-on-LAN, exposed with SWAG.","md",null,{},{"title":167,"description":1982},"0pcadaIZjJ-HRQfAZKdCQnUZfUKZoyuTSdWWEBJ5Y2s",[1989,1991],{"title":163,"path":164,"stem":165,"description":1990,"children":-1},"Install Beszel to monitor server CPU, RAM, disk, and network metrics, including remote servers, with a lightweight web dashboard.",{"title":177,"path":178,"stem":179,"description":1992,"children":-1},"Install Jellyfin, a free and open-source media server, to stream your movies and TV shows from anywhere without a paid subscription.",1788645847220]