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