[{"data":1,"prerenderedAt":1913},["ShallowReactive",2],{"navigation_docs_en":3,"-en-serveex-monitoring-dozzle-":377,"-en-serveex-monitoring-dozzle--surround":1908},[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":155,"body":379,"contributors":1900,"description":1902,"extension":1903,"hideCopyPage":15,"hideHeader":15,"hideToc":15,"links":1904,"meta":1905,"navigation":608,"path":156,"seo":1906,"stem":157,"__hash__":1907},"docs_en\u002Fen\u002F3.serveex\u002F4.monitoring\u002F2.dozzle.md",{"type":380,"value":381,"toc":1887},"minimark",[382,390,400,406,411,415,664,668,684,687,733,1318,1321,1325,1338,1825,1841,1883],[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,155],"a",{"href":396,"rel":397},"https:\u002F\u002Fdozzle.dev\u002F",[398],"nofollow"," is a container that lets you access logs from your other containers and display them in real time through a user-friendly interface. It's a simple way to browse logs and retrieve information from the history.",[391,401,402],{},[403,404],"img",{"alt":155,"src":405},"https:\u002F\u002Fblog.unixhost.pro\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002Fimage-5.png",[407,408,410],"h2",{"id":409},"installation","Installation",[412,413],"file-tree",{":tree":414},"{\"\u002F\":[{\"srv\":[{\"docker\":[{\"dozzle\":[\"compose.yaml\",\".env\",\"data\u002F\"]}]}]}]}",[416,417,419,424,436,563,623,627,634,653,660],"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],{},"dozzle",", 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  dozzle:\n    container_name: dozzle\n    image: amir20\u002Fdozzle:latest\n    ports:\n      - 9135:8080\n    env_file:\n      - .env\n    environment:\n      - DOZZLE_HOSTNAME=${DOMAIN}\n    volumes:\n      - \u002Fvar\u002Frun\u002Fdocker.sock:\u002Fvar\u002Frun\u002Fdocker.sock\n","compose.yaml","yaml","",[428,445,446,455,466,474,487,498,506,515,523,531,539,547,555],{"__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},"  dozzle",[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"," dozzle\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}," amir20\u002Fdozzle:latest\n",[447,499,501,504],{"class":449,"line":500},6,[447,502,503],{"class":460},"    ports",[447,505,465],{"class":464},[447,507,509,512],{"class":449,"line":508},7,[447,510,511],{"class":464},"      -",[447,513,514],{"class":485}," 9135:8080\n",[447,516,518,521],{"class":449,"line":517},8,[447,519,520],{"class":460},"    env_file",[447,522,465],{"class":464},[447,524,526,528],{"class":449,"line":525},9,[447,527,511],{"class":464},[447,529,530],{"class":485}," .env\n",[447,532,534,537],{"class":449,"line":533},10,[447,535,536],{"class":460},"    environment",[447,538,465],{"class":464},[447,540,542,544],{"class":449,"line":541},11,[447,543,511],{"class":464},[447,545,546],{"class":485}," DOZZLE_HOSTNAME=${DOMAIN}\n",[447,548,550,553],{"class":449,"line":549},12,[447,551,552],{"class":460},"    volumes",[447,554,465],{"class":464},[447,556,558,560],{"class":449,"line":557},13,[447,559,511],{"class":464},[447,561,562],{"class":485}," \u002Fvar\u002Frun\u002Fdocker.sock:\u002Fvar\u002Frun\u002Fdocker.sock\n",[564,565,566,574],"tip",{"icon":443},[391,567,568,569,573],{},"✨ ",[570,571,572],"strong",{},"Tip:"," Add the watchtower label to each container to automate updates",[437,575,577],{"className":439,"code":576,"filename":441,"language":442,"meta":443,"style":443},"services:\n  dozzle:\n    #...\n    labels:\n\n      - com.centurylinklabs.watchtower.enable=true\n```\n",[428,578,579,585,591,597,604,610,617],{"__ignoreMap":443},[447,580,581,583],{"class":449,"line":450},[447,582,461],{"class":460},[447,584,465],{"class":464},[447,586,587,589],{"class":449,"line":457},[447,588,471],{"class":460},[447,590,465],{"class":464},[447,592,593],{"class":449,"line":468},[447,594,596],{"class":595},"sDvJj","    #...\n",[447,598,599,602],{"class":449,"line":476},[447,600,601],{"class":460},"    labels",[447,603,465],{"class":464},[447,605,606],{"class":449,"line":489},[447,607,609],{"emptyLinePlaceholder":608},true,"\n",[447,611,612,614],{"class":449,"line":500},[447,613,511],{"class":464},[447,615,616],{"class":485}," com.centurylinklabs.watchtower.enable=true\n",[447,618,619],{"class":449,"line":508},[447,620,622],{"class":621},"slcoZ","```\n",[420,624,626],{"id":625},"set-your-environment-variables","Set your environment variables",[391,628,629,630,633],{},"Fill in your domain name in the ",[428,631,632],{},".env"," file, for example:",[437,635,639],{"className":636,"code":637,"filename":632,"language":638,"meta":443,"style":443},"language-properties shiki shiki-themes github-dark material-theme github-dark","DOMAIN=dozzle.mydomain.com\n","properties",[428,640,641],{"__ignoreMap":443},[447,642,643,647,650],{"class":449,"line":450},[447,644,646],{"class":645},"szyEh","DOMAIN",[447,648,649],{"class":464},"=",[447,651,652],{"class":621},"dozzle.mydomain.com\n",[391,654,655,656,659],{},"Deploy the container. Go to ",[428,657,658],{},"http:\u002F\u002Fyourserverip:9135",". Voilà, your Dozzle web UI is up and running!",[420,661,663],{"id":662},"done","Done !",[407,665,667],{"id":666},"exposing-dozzle-with-swag","Exposing Dozzle with Swag",[669,670,671,672,675,676,679,680,683],"warning",{},"Dozzle does not use multi-factor authentication. Exposing Dozzle to the internet could compromise the connected machines. Only do this if you use a multi-factor authentication system like ",[394,673,137],{"href":674},"\u002Fserveex\u002Fsecurity\u002Ftinyauth"," or ",[394,677,255],{"href":678},"\u002Fserveex\u002Fadvanced\u002Fauthentik\u002F",". Otherwise, do not expose it with SWAG and instead use a VPN like ",[394,681,119],{"href":682},"\u002Fserveex\u002Fcore\u002Fwireguard",".",[391,685,686],{},"You may want to access Dozzle remotely and on all your devices. To do so, we’ll expose Dozzle via Swag.",[688,689,690,691,694,697,699,700,703,704,708,709,712,713,716,717,721,722,725,726,728,729,683],"note",{"icon":443},"📋 ",[570,692,693],{},"Before you begin:",[695,696],"br",{},[695,698],{},"\nWe assume you have created a subdomain like ",[428,701,702],{},"dozzle.mydomain.com"," in your ",[394,705,707],{"href":706},"\u002Fgeneral\u002Fnetworking\u002Fdns","DNS zone"," with a ",[428,710,711],{},"CNAME"," pointing to ",[428,714,715],{},"mydomain.com"," and that, ",[394,718,720],{"href":719},"\u002Fserveex\u002Fsecurity\u002Fcloudflare","unless you're using Cloudflare Zero Trust",", you’ve redirected port ",[428,723,724],{},"443"," from your router to port ",[428,727,724],{}," on your server in your ",[394,730,732],{"href":731},"\u002Fgeneral\u002Fnetworking\u002Fnat","NAT rules",[416,734,735,739,742,861,864,874,878,885,894,913,916,1299,1315],{"level":418},[420,736,738],{"id":737},"add-dozzles-network-to-swag","Add Dozzle's network to SWAG",[391,740,741],{},"Go to Dockge and edit the SWAG compose file to add Dozzle’s network:",[437,743,745],{"className":439,"code":744,"filename":441,"language":442,"meta":443,"style":443},"---\nservices:\n  swag:\n     container_name: # ...\n      # ... \n     networks:                 # Connects the container to a custom network\n      # ...           \n      - dozzle                 # Network name declared in the stack\n    \nnetworks:                      # Defines the custom network\n  # ...\n  dozzle:                      # Network name declared in the stack\n    name: dozzle_default       # Actual name of the external network\n    external: true             # Indicates it's an externally defined network\n",[428,746,747,751,757,764,774,779,789,794,804,809,819,824,833,846],{"__ignoreMap":443},[447,748,749],{"class":449,"line":450},[447,750,454],{"class":453},[447,752,753,755],{"class":449,"line":457},[447,754,461],{"class":460},[447,756,465],{"class":464},[447,758,759,762],{"class":449,"line":468},[447,760,761],{"class":460},"  swag",[447,763,465],{"class":464},[447,765,766,769,771],{"class":449,"line":476},[447,767,768],{"class":460},"     container_name",[447,770,482],{"class":464},[447,772,773],{"class":595}," # ...\n",[447,775,776],{"class":449,"line":489},[447,777,778],{"class":595},"      # ... \n",[447,780,781,784,786],{"class":449,"line":500},[447,782,783],{"class":460},"     networks",[447,785,482],{"class":464},[447,787,788],{"class":595},"                 # Connects the container to a custom network\n",[447,790,791],{"class":449,"line":508},[447,792,793],{"class":595},"      # ...           \n",[447,795,796,798,801],{"class":449,"line":517},[447,797,511],{"class":464},[447,799,800],{"class":485}," dozzle",[447,802,803],{"class":595},"                 # Network name declared in the stack\n",[447,805,806],{"class":449,"line":525},[447,807,808],{"class":621},"    \n",[447,810,811,814,816],{"class":449,"line":533},[447,812,813],{"class":460},"networks",[447,815,482],{"class":464},[447,817,818],{"class":595},"                      # Defines the custom network\n",[447,820,821],{"class":449,"line":541},[447,822,823],{"class":595},"  # ...\n",[447,825,826,828,830],{"class":449,"line":549},[447,827,471],{"class":460},[447,829,482],{"class":464},[447,831,832],{"class":595},"                      # Network name declared in the stack\n",[447,834,835,838,840,843],{"class":449,"line":557},[447,836,837],{"class":460},"    name",[447,839,482],{"class":464},[447,841,842],{"class":485}," dozzle_default",[447,844,845],{"class":595},"       # Actual name of the external network\n",[447,847,849,852,854,858],{"class":449,"line":848},14,[447,850,851],{"class":460},"    external",[447,853,482],{"class":464},[447,855,857],{"class":856},"s08Ry"," true",[447,859,860],{"class":595},"             # Indicates it's an externally defined network\n",[391,862,863],{},"Redeploy the stack by clicking “Deploy” and wait for SWAG to be fully operational.",[688,865,866,867,870,871,683],{},"We assume the Dozzle network name is ",[428,868,869],{},"dozzle_default",". You can verify the connection is working by visiting the SWAG dashboard at ",[428,872,873],{},"http:\u002F\u002Fyourserverip:81",[420,875,877],{"id":876},"create-the-subdomainconf-file","Create the subdomain.conf file",[391,879,880,881,884],{},"In the Swag folder, create the ",[428,882,883],{},"dozzle.subdomain.conf"," file.",[564,886,568,888,890,891,893],{"icon":443,"to":887},"\u002Fserveex\u002Ffiles\u002Ffile-browser-quantum",[570,889,572],{}," You can use ",[570,892,209],{}," to browse and edit files instead of using terminal commands.",[437,895,900],{"className":896,"code":897,"filename":898,"language":899,"meta":443,"style":443},"language-bash shiki shiki-themes github-dark material-theme github-dark","sudo nano \u002Fsrv\u002Fdocker\u002Fswag\u002Fconfig\u002Fnginx\u002Fproxy-confs\u002Fdozzle.subdomain.conf\n","Terminal","bash",[428,901,902],{"__ignoreMap":443},[447,903,904,907,910],{"class":449,"line":450},[447,905,906],{"class":453},"sudo",[447,908,909],{"class":485}," nano",[447,911,912],{"class":485}," \u002Fsrv\u002Fdocker\u002Fswag\u002Fconfig\u002Fnginx\u002Fproxy-confs\u002Fdozzle.subdomain.conf\n",[391,914,915],{},"Paste the configuration below:",[437,917,921],{"className":918,"code":919,"filename":883,"language":920,"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 dozzle.*;\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 dozzle;\n        set $upstream_port 8080;\n        set $upstream_proto http;\n        proxy_pass $upstream_proto:\u002F\u002F$upstream_app:$upstream_port;\n\n    }\n}\n","nginx",[428,922,923,928,932,941,956,965,969,979,983,993,997,1007,1011,1016,1021,1056,1061,1067,1073,1078,1084,1090,1095,1101,1107,1112,1124,1130,1136,1142,1147,1153,1159,1164,1170,1176,1181,1187,1193,1198,1209,1219,1232,1247,1259,1282,1287,1293],{"__ignoreMap":443},[447,924,925],{"class":449,"line":450},[447,926,927],{"class":595},"## Version 2023\u002F12\u002F19\n",[447,929,930],{"class":449,"line":457},[447,931,609],{"emptyLinePlaceholder":608},[447,933,934,938],{"class":449,"line":468},[447,935,937],{"class":936},"sAoO4","server",[447,939,940],{"class":621}," {\n",[447,942,943,947,950,953],{"class":449,"line":476},[447,944,946],{"class":945},"sJPTy","    listen ",[447,948,724],{"class":949},"swwWl",[447,951,952],{"class":621}," ssl",[447,954,955],{"class":464},";\n",[447,957,958,960,963],{"class":449,"line":489},[447,959,946],{"class":945},[447,961,962],{"class":621},"[::]:443 ssl",[447,964,955],{"class":464},[447,966,967],{"class":449,"line":500},[447,968,609],{"emptyLinePlaceholder":608},[447,970,971,974,977],{"class":449,"line":508},[447,972,973],{"class":945},"    server_name ",[447,975,976],{"class":621},"dozzle.*",[447,978,955],{"class":464},[447,980,981],{"class":449,"line":517},[447,982,609],{"emptyLinePlaceholder":608},[447,984,985,988,991],{"class":449,"line":525},[447,986,987],{"class":945},"    include ",[447,989,990],{"class":621},"\u002Fconfig\u002Fnginx\u002Fssl.conf",[447,992,955],{"class":464},[447,994,995],{"class":449,"line":533},[447,996,609],{"emptyLinePlaceholder":608},[447,998,999,1002,1005],{"class":449,"line":541},[447,1000,1001],{"class":945},"    client_max_body_size ",[447,1003,1004],{"class":949},"0",[447,1006,955],{"class":464},[447,1008,1009],{"class":449,"line":549},[447,1010,609],{"emptyLinePlaceholder":608},[447,1012,1013],{"class":449,"line":557},[447,1014,1015],{"class":595},"    #if ($lan-ip = yes) { set $geo-whitelist yes; }\n",[447,1017,1018],{"class":449,"line":848},[447,1019,1020],{"class":595},"    #if ($geo-whitelist = no) { return 404; }\n",[447,1022,1024,1028,1031,1034,1037,1040,1043,1047,1050,1053],{"class":449,"line":1023},15,[447,1025,1027],{"class":1026},"sJLGa","    if",[447,1029,1030],{"class":621}," (",[447,1032,1033],{"class":464},"$",[447,1035,1036],{"class":621},"geo-blacklist ",[447,1038,1039],{"class":945},"= ",[447,1041,1042],{"class":621},"no) ",[447,1044,1046],{"class":1045},"sSoIa","{ ",[447,1048,1049],{"class":1026},"return",[447,1051,1052],{"class":949}," 404",[447,1054,1055],{"class":1045},"; }\n",[447,1057,1059],{"class":449,"line":1058},16,[447,1060,609],{"emptyLinePlaceholder":608},[447,1062,1064],{"class":449,"line":1063},17,[447,1065,1066],{"class":595},"    # enable for ldap auth (requires ldap-location.conf in the location block)\n",[447,1068,1070],{"class":449,"line":1069},18,[447,1071,1072],{"class":595},"    #include \u002Fconfig\u002Fnginx\u002Fldap-server.conf;\n",[447,1074,1076],{"class":449,"line":1075},19,[447,1077,609],{"emptyLinePlaceholder":608},[447,1079,1081],{"class":449,"line":1080},20,[447,1082,1083],{"class":595},"    # enable for Authelia (requires authelia-location.conf in the location block)\n",[447,1085,1087],{"class":449,"line":1086},21,[447,1088,1089],{"class":595},"    #include \u002Fconfig\u002Fnginx\u002Fauthelia-server.conf;\n",[447,1091,1093],{"class":449,"line":1092},22,[447,1094,609],{"emptyLinePlaceholder":608},[447,1096,1098],{"class":449,"line":1097},23,[447,1099,1100],{"class":595},"    # enable for Authentik (requires authentik-location.conf in the location block)\n",[447,1102,1104],{"class":449,"line":1103},24,[447,1105,1106],{"class":595},"    #include \u002Fconfig\u002Fnginx\u002Fauthentik-server.conf;\n",[447,1108,1110],{"class":449,"line":1109},25,[447,1111,609],{"emptyLinePlaceholder":608},[447,1113,1115,1118,1121],{"class":449,"line":1114},26,[447,1116,1117],{"class":936},"    location",[447,1119,1120],{"class":453}," \u002F ",[447,1122,1123],{"class":621},"{\n",[447,1125,1127],{"class":449,"line":1126},27,[447,1128,1129],{"class":595},"        # enable the next two lines for http auth\n",[447,1131,1133],{"class":449,"line":1132},28,[447,1134,1135],{"class":595},"        #auth_basic \"Restricted\";\n",[447,1137,1139],{"class":449,"line":1138},29,[447,1140,1141],{"class":595},"        #auth_basic_user_file \u002Fconfig\u002Fnginx\u002F.htpasswd;\n",[447,1143,1145],{"class":449,"line":1144},30,[447,1146,609],{"emptyLinePlaceholder":608},[447,1148,1150],{"class":449,"line":1149},31,[447,1151,1152],{"class":595},"        # enable for ldap auth (requires ldap-server.conf in the server block)\n",[447,1154,1156],{"class":449,"line":1155},32,[447,1157,1158],{"class":595},"        #include \u002Fconfig\u002Fnginx\u002Fldap-location.conf;\n",[447,1160,1162],{"class":449,"line":1161},33,[447,1163,609],{"emptyLinePlaceholder":608},[447,1165,1167],{"class":449,"line":1166},34,[447,1168,1169],{"class":595},"        # enable for Authelia (requires authelia-server.conf in the server block)\n",[447,1171,1173],{"class":449,"line":1172},35,[447,1174,1175],{"class":595},"        #include \u002Fconfig\u002Fnginx\u002Fauthelia-location.conf;\n",[447,1177,1179],{"class":449,"line":1178},36,[447,1180,609],{"emptyLinePlaceholder":608},[447,1182,1184],{"class":449,"line":1183},37,[447,1185,1186],{"class":595},"        # enable for Authentik (requires authentik-server.conf in the server block)\n",[447,1188,1190],{"class":449,"line":1189},38,[447,1191,1192],{"class":595},"        #include \u002Fconfig\u002Fnginx\u002Fauthentik-location.conf;\n",[447,1194,1196],{"class":449,"line":1195},39,[447,1197,609],{"emptyLinePlaceholder":608},[447,1199,1201,1204,1207],{"class":449,"line":1200},40,[447,1202,1203],{"class":945},"        include ",[447,1205,1206],{"class":621},"\u002Fconfig\u002Fnginx\u002Fproxy.conf",[447,1208,955],{"class":464},[447,1210,1212,1214,1217],{"class":449,"line":1211},41,[447,1213,1203],{"class":945},[447,1215,1216],{"class":621},"\u002Fconfig\u002Fnginx\u002Fresolver.conf",[447,1218,955],{"class":464},[447,1220,1222,1225,1227,1230],{"class":449,"line":1221},42,[447,1223,1224],{"class":945},"        set ",[447,1226,1033],{"class":464},[447,1228,1229],{"class":621},"upstream_app dozzle",[447,1231,955],{"class":464},[447,1233,1235,1237,1239,1242,1245],{"class":449,"line":1234},43,[447,1236,1224],{"class":945},[447,1238,1033],{"class":464},[447,1240,1241],{"class":621},"upstream_port ",[447,1243,1244],{"class":949},"8080",[447,1246,955],{"class":464},[447,1248,1250,1252,1254,1257],{"class":449,"line":1249},44,[447,1251,1224],{"class":945},[447,1253,1033],{"class":464},[447,1255,1256],{"class":621},"upstream_proto http",[447,1258,955],{"class":464},[447,1260,1262,1265,1267,1270,1272,1275,1277,1280],{"class":449,"line":1261},45,[447,1263,1264],{"class":945},"        proxy_pass ",[447,1266,1033],{"class":464},[447,1268,1269],{"class":621},"upstream_proto:\u002F\u002F",[447,1271,1033],{"class":464},[447,1273,1274],{"class":621},"upstream_app:",[447,1276,1033],{"class":464},[447,1278,1279],{"class":621},"upstream_port",[447,1281,955],{"class":464},[447,1283,1285],{"class":449,"line":1284},46,[447,1286,609],{"emptyLinePlaceholder":608},[447,1288,1290],{"class":449,"line":1289},47,[447,1291,1292],{"class":621},"    }\n",[447,1294,1296],{"class":449,"line":1295},48,[447,1297,1298],{"class":621},"}\n",[391,1300,1301,1302,1306,1307,1310,1311,1314],{},"Press ",[1303,1304],"kbd",{"value":1305},"Ctrl+O",", then ",[1303,1308],{"value":1309},"Enter"," to save, and ",[1303,1312],{"value":1313},"Ctrl+X"," to exit.",[420,1316,663],{"id":1317},"done-1",[391,1319,1320],{},"And there you go, Dozzle is now exposed!",[407,1322,1324],{"id":1323},"protecting-dozzle-with-tinyauth","Protecting Dozzle with TinyAuth",[391,1326,1327,1328,1330,1331,1333,1334,482],{},"Add ",[394,1329,137],{"href":674},"'s forward-auth check directly to ",[428,1332,883],{},", the same way as ",[394,1335,1337],{"href":1336},"\u002Fserveex\u002Fsecurity\u002Ftinyauth#protecting-an-app-via-reverse-proxy","the TinyAuth guide",[437,1339,1342],{"className":918,"code":1340,"filename":883,"highlights":1341,"language":920,"meta":443,"style":443},"## Version 2023\u002F12\u002F19\n\nserver {\n    listen 443 ssl;\n    listen [::]:443 ssl;\n\n    server_name dozzle.*;\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 dozzle;\n        set $upstream_port 8080;\n        set $upstream_proto http;\n        proxy_pass $upstream_proto:\u002F\u002F$upstream_app:$upstream_port;\n\n    }\n}\n",[1114,1126,1132,1138,1144,1149,1155,1161,1166,1172,1178,1183,1189,1211,1221],[428,1343,1344,1348,1352,1358,1368,1376,1380,1388,1392,1400,1404,1412,1416,1420,1424,1446,1450,1454,1458,1462,1466,1470,1474,1478,1482,1486,1497,1505,1515,1527,1541,1556,1571,1586,1591,1596,1606,1632,1637,1641,1649,1660,1674,1678,1682,1686,1690,1694,1698,1703,1708,1713,1718,1723,1728,1733,1738,1747,1756,1767,1780,1791,1810,1815,1820],{"__ignoreMap":443},[447,1345,1346],{"class":449,"line":450},[447,1347,927],{"class":595},[447,1349,1350],{"class":449,"line":457},[447,1351,609],{"emptyLinePlaceholder":608},[447,1353,1354,1356],{"class":449,"line":468},[447,1355,937],{"class":936},[447,1357,940],{"class":621},[447,1359,1360,1362,1364,1366],{"class":449,"line":476},[447,1361,946],{"class":945},[447,1363,724],{"class":949},[447,1365,952],{"class":621},[447,1367,955],{"class":464},[447,1369,1370,1372,1374],{"class":449,"line":489},[447,1371,946],{"class":945},[447,1373,962],{"class":621},[447,1375,955],{"class":464},[447,1377,1378],{"class":449,"line":500},[447,1379,609],{"emptyLinePlaceholder":608},[447,1381,1382,1384,1386],{"class":449,"line":508},[447,1383,973],{"class":945},[447,1385,976],{"class":621},[447,1387,955],{"class":464},[447,1389,1390],{"class":449,"line":517},[447,1391,609],{"emptyLinePlaceholder":608},[447,1393,1394,1396,1398],{"class":449,"line":525},[447,1395,987],{"class":945},[447,1397,990],{"class":621},[447,1399,955],{"class":464},[447,1401,1402],{"class":449,"line":533},[447,1403,609],{"emptyLinePlaceholder":608},[447,1405,1406,1408,1410],{"class":449,"line":541},[447,1407,1001],{"class":945},[447,1409,1004],{"class":949},[447,1411,955],{"class":464},[447,1413,1414],{"class":449,"line":549},[447,1415,609],{"emptyLinePlaceholder":608},[447,1417,1418],{"class":449,"line":557},[447,1419,1015],{"class":595},[447,1421,1422],{"class":449,"line":848},[447,1423,1020],{"class":595},[447,1425,1426,1428,1430,1432,1434,1436,1438,1440,1442,1444],{"class":449,"line":1023},[447,1427,1027],{"class":1026},[447,1429,1030],{"class":621},[447,1431,1033],{"class":464},[447,1433,1036],{"class":621},[447,1435,1039],{"class":945},[447,1437,1042],{"class":621},[447,1439,1046],{"class":1045},[447,1441,1049],{"class":1026},[447,1443,1052],{"class":949},[447,1445,1055],{"class":1045},[447,1447,1448],{"class":449,"line":1058},[447,1449,609],{"emptyLinePlaceholder":608},[447,1451,1452],{"class":449,"line":1063},[447,1453,1066],{"class":595},[447,1455,1456],{"class":449,"line":1069},[447,1457,1072],{"class":595},[447,1459,1460],{"class":449,"line":1075},[447,1461,609],{"emptyLinePlaceholder":608},[447,1463,1464],{"class":449,"line":1080},[447,1465,1083],{"class":595},[447,1467,1468],{"class":449,"line":1086},[447,1469,1089],{"class":595},[447,1471,1472],{"class":449,"line":1092},[447,1473,609],{"emptyLinePlaceholder":608},[447,1475,1476],{"class":449,"line":1097},[447,1477,1100],{"class":595},[447,1479,1480],{"class":449,"line":1103},[447,1481,1106],{"class":595},[447,1483,1484],{"class":449,"line":1109},[447,1485,609],{"emptyLinePlaceholder":608},[447,1487,1490,1492,1495],{"class":1488,"line":1114},[449,1489],"highlight",[447,1491,1117],{"class":936},[447,1493,1494],{"class":453}," \u002Ftinyauth ",[447,1496,1123],{"class":621},[447,1498,1500,1503],{"class":1499,"line":1126},[449,1489],[447,1501,1502],{"class":945},"        internal",[447,1504,955],{"class":464},[447,1506,1508,1510,1513],{"class":1507,"line":1132},[449,1489],[447,1509,1264],{"class":945},[447,1511,1512],{"class":621},"http:\u002F\u002Ftinyauth:3000\u002Fapi\u002Fauth\u002Fnginx",[447,1514,955],{"class":464},[447,1516,1518,1521,1525],{"class":1517,"line":1138},[449,1489],[447,1519,1520],{"class":945},"        proxy_pass_request_body ",[447,1522,1524],{"class":1523},"soUAX","off",[447,1526,955],{"class":464},[447,1528,1530,1533,1536,1539],{"class":1529,"line":1144},[449,1489],[447,1531,1532],{"class":945},"        proxy_set_header ",[447,1534,1535],{"class":621},"Content-Length ",[447,1537,1538],{"class":485},"\"\"",[447,1540,955],{"class":464},[447,1542,1544,1546,1549,1551,1554],{"class":1543,"line":1149},[449,1489],[447,1545,1532],{"class":945},[447,1547,1548],{"class":621},"X-Forwarded-Proto ",[447,1550,1033],{"class":464},[447,1552,1553],{"class":621},"scheme",[447,1555,955],{"class":464},[447,1557,1559,1561,1564,1566,1569],{"class":1558,"line":1155},[449,1489],[447,1560,1532],{"class":945},[447,1562,1563],{"class":621},"X-Forwarded-Host ",[447,1565,1033],{"class":464},[447,1567,1568],{"class":621},"http_host",[447,1570,955],{"class":464},[447,1572,1574,1576,1579,1581,1584],{"class":1573,"line":1161},[449,1489],[447,1575,1532],{"class":945},[447,1577,1578],{"class":621},"X-Forwarded-Uri ",[447,1580,1033],{"class":464},[447,1582,1583],{"class":621},"request_uri",[447,1585,955],{"class":464},[447,1587,1589],{"class":1588,"line":1166},[449,1489],[447,1590,1292],{"class":621},[447,1592,1594],{"class":1593,"line":1172},[449,1489],[447,1595,609],{"emptyLinePlaceholder":608},[447,1597,1599,1601,1604],{"class":1598,"line":1178},[449,1489],[447,1600,1117],{"class":936},[447,1602,1603],{"class":453}," @tinyauth_login ",[447,1605,1123],{"class":621},[447,1607,1609,1612,1615,1618,1620,1623,1625,1627,1629],{"class":1608,"line":1183},[449,1489],[447,1610,1611],{"class":1026},"        return",[447,1613,1614],{"class":949}," 302",[447,1616,1617],{"class":621}," https:\u002F\u002Ftinyauth.mydomain.com\u002Flogin?redirect_uri=",[447,1619,1033],{"class":464},[447,1621,1622],{"class":621},"scheme:\u002F\u002F",[447,1624,1033],{"class":464},[447,1626,1568],{"class":621},[447,1628,1033],{"class":464},[447,1630,1631],{"class":621},"request_uri;\n",[447,1633,1635],{"class":1634,"line":1189},[449,1489],[447,1636,1292],{"class":621},[447,1638,1639],{"class":449,"line":1195},[447,1640,609],{"emptyLinePlaceholder":608},[447,1642,1643,1645,1647],{"class":449,"line":1200},[447,1644,1117],{"class":936},[447,1646,1120],{"class":453},[447,1648,1123],{"class":621},[447,1650,1652,1655,1658],{"class":1651,"line":1211},[449,1489],[447,1653,1654],{"class":945},"        auth_request ",[447,1656,1657],{"class":621},"\u002Ftinyauth",[447,1659,955],{"class":464},[447,1661,1663,1666,1669,1672],{"class":1662,"line":1221},[449,1489],[447,1664,1665],{"class":945},"        error_page ",[447,1667,1668],{"class":949},"401",[447,1670,1671],{"class":621}," = @tinyauth_login",[447,1673,955],{"class":464},[447,1675,1676],{"class":449,"line":1234},[447,1677,609],{"emptyLinePlaceholder":608},[447,1679,1680],{"class":449,"line":1249},[447,1681,1129],{"class":595},[447,1683,1684],{"class":449,"line":1261},[447,1685,1135],{"class":595},[447,1687,1688],{"class":449,"line":1284},[447,1689,1141],{"class":595},[447,1691,1692],{"class":449,"line":1289},[447,1693,609],{"emptyLinePlaceholder":608},[447,1695,1696],{"class":449,"line":1295},[447,1697,1152],{"class":595},[447,1699,1701],{"class":449,"line":1700},49,[447,1702,1158],{"class":595},[447,1704,1706],{"class":449,"line":1705},50,[447,1707,609],{"emptyLinePlaceholder":608},[447,1709,1711],{"class":449,"line":1710},51,[447,1712,1169],{"class":595},[447,1714,1716],{"class":449,"line":1715},52,[447,1717,1175],{"class":595},[447,1719,1721],{"class":449,"line":1720},53,[447,1722,609],{"emptyLinePlaceholder":608},[447,1724,1726],{"class":449,"line":1725},54,[447,1727,1186],{"class":595},[447,1729,1731],{"class":449,"line":1730},55,[447,1732,1192],{"class":595},[447,1734,1736],{"class":449,"line":1735},56,[447,1737,609],{"emptyLinePlaceholder":608},[447,1739,1741,1743,1745],{"class":449,"line":1740},57,[447,1742,1203],{"class":945},[447,1744,1206],{"class":621},[447,1746,955],{"class":464},[447,1748,1750,1752,1754],{"class":449,"line":1749},58,[447,1751,1203],{"class":945},[447,1753,1216],{"class":621},[447,1755,955],{"class":464},[447,1757,1759,1761,1763,1765],{"class":449,"line":1758},59,[447,1760,1224],{"class":945},[447,1762,1033],{"class":464},[447,1764,1229],{"class":621},[447,1766,955],{"class":464},[447,1768,1770,1772,1774,1776,1778],{"class":449,"line":1769},60,[447,1771,1224],{"class":945},[447,1773,1033],{"class":464},[447,1775,1241],{"class":621},[447,1777,1244],{"class":949},[447,1779,955],{"class":464},[447,1781,1783,1785,1787,1789],{"class":449,"line":1782},61,[447,1784,1224],{"class":945},[447,1786,1033],{"class":464},[447,1788,1256],{"class":621},[447,1790,955],{"class":464},[447,1792,1794,1796,1798,1800,1802,1804,1806,1808],{"class":449,"line":1793},62,[447,1795,1264],{"class":945},[447,1797,1033],{"class":464},[447,1799,1269],{"class":621},[447,1801,1033],{"class":464},[447,1803,1274],{"class":621},[447,1805,1033],{"class":464},[447,1807,1279],{"class":621},[447,1809,955],{"class":464},[447,1811,1813],{"class":449,"line":1812},63,[447,1814,609],{"emptyLinePlaceholder":608},[447,1816,1818],{"class":449,"line":1817},64,[447,1819,1292],{"class":621},[447,1821,1823],{"class":449,"line":1822},65,[447,1824,1298],{"class":621},[688,1826,1828,1829,1832,1833,1836,1837,1840],{"to":1827},"\u002Fserveex\u002Fsecurity\u002Ftinyauth#exposing-tinyauth-with-swag","The ",[428,1830,1831],{},"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,1834,1835],{},"tinyauth"," here). This should already be set up from ",[570,1838,1839],{},"exposing TinyAuth itself",". If you run into an error, double-check SWAG's compose file still has that network attached.",[564,1842,568,1843,1845,1846,1849,1850,1852,1853,1856,1857,1868,1869,1878,1879,683],{"icon":443},[570,1844,572],{}," You can protect this app with ",[394,1847,255],{"href":1848},"\u002Fserveex\u002Fadvanced\u002Fauthentik"," instead of TinyAuth by opening ",[428,1851,883],{}," and removing the ",[428,1854,1855],{},"#"," in front of ",[428,1858,1859,1862,1865],{"className":918,"language":920,"style":443},[447,1860,1861],{"class":945},"include ",[447,1863,1864],{"class":621},"\u002Fconfig\u002Fnginx\u002Fauthentik-server.conf",[447,1866,1867],{"class":464},";"," and ",[428,1870,1871,1873,1876],{"className":918,"language":920,"style":443},[447,1872,1861],{"class":945},[447,1874,1875],{"class":621},"\u002Fconfig\u002Fnginx\u002Fauthentik-location.conf",[447,1877,1867],{"class":464},". Don’t forget to ",[394,1880,1882],{"href":1881},"\u002Fserveex\u002Fadvanced\u002Fauthentik#protecting-an-app-via-reverse-proxy","create an application and a provider in Authentik",[1884,1885,1886],"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":1888},[1889,1894,1899],{"id":409,"depth":457,"text":410,"children":1890},[1891,1892,1893],{"id":422,"depth":468,"text":423},{"id":625,"depth":468,"text":626},{"id":662,"depth":468,"text":663},{"id":666,"depth":457,"text":667,"children":1895},[1896,1897,1898],{"id":737,"depth":468,"text":738},{"id":876,"depth":468,"text":877},{"id":1317,"depth":468,"text":663},{"id":1323,"depth":457,"text":1324},[1901],"Djeex","Install Dozzle to monitor Docker container logs in real time from a clean web interface, exposed via SWAG.","md",null,{},{"title":155,"description":1902},"nNfGkt4PcG7_wGSIWgjxdQ6zz_kcCW6mU2uBkM_F-H4",[1909,1911],{"title":151,"path":152,"stem":153,"description":1910,"children":-1},"Install Uptime-Kuma to monitor your self-hosted services uptime, set up alerts, and optionally protect the dashboard with Tinyauth or Authentik",{"title":159,"path":160,"stem":161,"description":1912,"children":-1},"Install Speedtest Tracker to automatically measure and log your internet connection speed over time, exposed with SWAG.",1788645846652]