[{"data":1,"prerenderedAt":2579},["ShallowReactive",2],{"navigation_docs_en":3,"-en-serveex-core-swag-":377,"-en-serveex-core-swag--surround":2574},[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":123,"body":379,"contributors":2566,"description":2568,"extension":2569,"hideCopyPage":15,"hideHeader":15,"hideToc":15,"links":2570,"meta":2571,"navigation":726,"path":124,"seo":2572,"stem":125,"__hash__":2573},"docs_en\u002Fen\u002F3.serveex\u002F2.core\u002F4.swag.md",{"type":380,"value":381,"toc":2543},"minimark",[382,390,407,421,424,429,436,441,455,460,1173,1177,1189,1195,1199,1215,1218,1221,1690,1699,1924,1928,1970,1980,1994,2454,2458,2465,2492,2522,2539],[383,384],"ellipsis",{"blur":385,"left":386,"top":387,"width":388,"z-index":389},"140px","0px","10rem","40rem","60",[391,392,393,400,401,406],"p",{},[394,395,399],"a",{"href":396,"rel":397},"https:\u002F\u002Fdocs.linuxserver.io\u002Fgeneral\u002Fswag\u002F",[398],"nofollow","Swag"," is the core of this homelab. It’s a powerful reverse proxy that allows you to expose services on the internet using domain names, handling SSL certificate issuance (for encrypted connections), request routing, and access security (via HTTP auth or SSO like Authelia or Authentik). All the necessary documentation is ",[394,402,405],{"href":403,"rel":404},"https:\u002F\u002Fdocs.linuxserver.io\u002Fgeneral\u002Fswag",[398],"available here",".",[408,409,411,412,416,417,406],"warning",{"to":410},"\u002Fserveex\u002Fcore\u002Fwireguard","SWAG is only useful for exposing your services to the internet, i.e. accessing them via a public URL like ",[413,414,415],"code",{},"https:\u002F\u002Fservice.mydomain.com",". If you don’t want to expose your services and prefer to always use a VPN to connect remotely, you can go ",[418,419,420],"strong",{},"here instead",[391,422,423],{},"Below is an example exposing Dockge. We will install SWAG along with the dbip mod for geolocation-based blocking, and the dashboard mod for managing swag, fail2ban, and geolocation.",[391,425,426],{},[418,427,428],{},"Reverse proxy principle and its application in our case:",[391,430,431],{},[432,433],"img",{"alt":434,"src":435},"Picture","\u002Fimg\u002Fserveex\u002Freverse-proxy.svg",[437,438,440],"h2",{"id":439},"installation","Installation",[442,443,444,445,448,449,451,452,406],"note",{},"This tutorial assumes you have a domain name pointing to your server, and that your router has a NAT rule forwarding port ",[413,446,447],{},"443"," to your server's IP and port ",[413,450,447],{},". The example domain will be ",[413,453,454],{},"mydomain.com",[456,457],"file-tree",{":tree":458,"label":459},"{\"\u002F\":[{\"srv\":[{\"docker\":[{\"swag\":[{\"config\":[{\"dns-conf\":[\"ovh.ini\"]},{\"nginx\":[\"dbip.conf\",\"nginx.conf\",{\"proxy-confs\":[\"dockge.subdomain.conf\"]}]}]},\"compose.yml\",\".env\"]}]}]}]}","File structure to modify",[461,462,464,469,480,754,805,809,816,853,856,944,948,961,966,976,995,998,1052,1060,1063,1087,1105,1116,1120,1126,1140,1147,1166,1169],"steps",{"level":463},"3",[465,466,468],"h3",{"id":467},"deploy-the-stack","Deploy the stack",[391,470,471,472,475,476,479],{},"Open Dockge in your browser, click on ",[413,473,474],{},"compose",", name the stack ",[413,477,478],{},"swag",", and copy the following config:",[481,482,488],"pre",{"className":483,"code":484,"filename":485,"language":486,"meta":487,"style":487},"language-yaml shiki shiki-themes github-dark material-theme github-dark","---\nservices:\n  swag:\n    image: lscr.io\u002Flinuxserver\u002Fswag:latest\n    container_name: swag\n    cap_add:\n      - NET_ADMIN\n    env_file:\n      - .env\n    environment:\n      - TZ=Europe\u002FParis\n      - URL=${DOMAIN}\n      - EXTRA_DOMAINS=${DOMAINS}\n      - SUBDOMAINS=wildcard\n      - VALIDATION=dns\n      - DNSPLUGIN=${PLUGIN}\n      - EMAIL=${EMAIL}\n      - DOCKER_MODS=linuxserver\u002Fmods:swag-dbip|linuxserver\u002Fmods:swag-dashboard|linuxserver\u002Fmods:swag-auto-reload\n    volumes:\n      - \u002Fsrv\u002Fdocker\u002Fswag\u002Fconfig:\u002Fconfig\n    ports:\n      - 80:80\n      - 443:443\n      - 81:81\n    restart: unless-stopped\n    networks:\n      - swag\n\nnetworks:\n  swag:\n    name: swag_default\n","compose.yaml","yaml","",[413,489,490,499,510,518,531,542,550,559,567,575,583,591,599,607,615,623,631,639,647,655,663,671,679,687,695,706,714,721,728,736,743],{"__ignoreMap":487},[491,492,495],"span",{"class":493,"line":494},"line",1,[491,496,498],{"class":497},"sEgDM","---\n",[491,500,502,506],{"class":493,"line":501},2,[491,503,505],{"class":504},"sRuoG","services",[491,507,509],{"class":508},"s8jd1",":\n",[491,511,513,516],{"class":493,"line":512},3,[491,514,515],{"class":504},"  swag",[491,517,509],{"class":508},[491,519,521,524,527],{"class":493,"line":520},4,[491,522,523],{"class":504},"    image",[491,525,526],{"class":508},":",[491,528,530],{"class":529},"s11XM"," lscr.io\u002Flinuxserver\u002Fswag:latest\n",[491,532,534,537,539],{"class":493,"line":533},5,[491,535,536],{"class":504},"    container_name",[491,538,526],{"class":508},[491,540,541],{"class":529}," swag\n",[491,543,545,548],{"class":493,"line":544},6,[491,546,547],{"class":504},"    cap_add",[491,549,509],{"class":508},[491,551,553,556],{"class":493,"line":552},7,[491,554,555],{"class":508},"      -",[491,557,558],{"class":529}," NET_ADMIN\n",[491,560,562,565],{"class":493,"line":561},8,[491,563,564],{"class":504},"    env_file",[491,566,509],{"class":508},[491,568,570,572],{"class":493,"line":569},9,[491,571,555],{"class":508},[491,573,574],{"class":529}," .env\n",[491,576,578,581],{"class":493,"line":577},10,[491,579,580],{"class":504},"    environment",[491,582,509],{"class":508},[491,584,586,588],{"class":493,"line":585},11,[491,587,555],{"class":508},[491,589,590],{"class":529}," TZ=Europe\u002FParis\n",[491,592,594,596],{"class":493,"line":593},12,[491,595,555],{"class":508},[491,597,598],{"class":529}," URL=${DOMAIN}\n",[491,600,602,604],{"class":493,"line":601},13,[491,603,555],{"class":508},[491,605,606],{"class":529}," EXTRA_DOMAINS=${DOMAINS}\n",[491,608,610,612],{"class":493,"line":609},14,[491,611,555],{"class":508},[491,613,614],{"class":529}," SUBDOMAINS=wildcard\n",[491,616,618,620],{"class":493,"line":617},15,[491,619,555],{"class":508},[491,621,622],{"class":529}," VALIDATION=dns\n",[491,624,626,628],{"class":493,"line":625},16,[491,627,555],{"class":508},[491,629,630],{"class":529}," DNSPLUGIN=${PLUGIN}\n",[491,632,634,636],{"class":493,"line":633},17,[491,635,555],{"class":508},[491,637,638],{"class":529}," EMAIL=${EMAIL}\n",[491,640,642,644],{"class":493,"line":641},18,[491,643,555],{"class":508},[491,645,646],{"class":529}," DOCKER_MODS=linuxserver\u002Fmods:swag-dbip|linuxserver\u002Fmods:swag-dashboard|linuxserver\u002Fmods:swag-auto-reload\n",[491,648,650,653],{"class":493,"line":649},19,[491,651,652],{"class":504},"    volumes",[491,654,509],{"class":508},[491,656,658,660],{"class":493,"line":657},20,[491,659,555],{"class":508},[491,661,662],{"class":529}," \u002Fsrv\u002Fdocker\u002Fswag\u002Fconfig:\u002Fconfig\n",[491,664,666,669],{"class":493,"line":665},21,[491,667,668],{"class":504},"    ports",[491,670,509],{"class":508},[491,672,674,676],{"class":493,"line":673},22,[491,675,555],{"class":508},[491,677,678],{"class":529}," 80:80\n",[491,680,682,684],{"class":493,"line":681},23,[491,683,555],{"class":508},[491,685,686],{"class":529}," 443:443\n",[491,688,690,692],{"class":493,"line":689},24,[491,691,555],{"class":508},[491,693,694],{"class":529}," 81:81\n",[491,696,698,701,703],{"class":493,"line":697},25,[491,699,700],{"class":504},"    restart",[491,702,526],{"class":508},[491,704,705],{"class":529}," unless-stopped\n",[491,707,709,712],{"class":493,"line":708},26,[491,710,711],{"class":504},"    networks",[491,713,509],{"class":508},[491,715,717,719],{"class":493,"line":716},27,[491,718,555],{"class":508},[491,720,541],{"class":529},[491,722,724],{"class":493,"line":723},28,[491,725,727],{"emptyLinePlaceholder":726},true,"\n",[491,729,731,734],{"class":493,"line":730},29,[491,732,733],{"class":504},"networks",[491,735,509],{"class":508},[491,737,739,741],{"class":493,"line":738},30,[491,740,515],{"class":504},[491,742,509],{"class":508},[491,744,746,749,751],{"class":493,"line":745},31,[491,747,748],{"class":504},"    name",[491,750,526],{"class":508},[491,752,753],{"class":529}," swag_default\n",[755,756,757,764],"tip",{"icon":487},[391,758,759,760,763],{},"✨ ",[418,761,762],{},"Tip:","\nAdd the watchtower label to each container to enable automatic updates",[481,765,767],{"className":483,"code":766,"filename":485,"language":486,"meta":487,"style":487},"---\nservices:\n  swag:\n    #...\n    labels:\n      - com.centurylinklabs.watchtower.enable=true\n",[413,768,769,773,779,785,791,798],{"__ignoreMap":487},[491,770,771],{"class":493,"line":494},[491,772,498],{"class":497},[491,774,775,777],{"class":493,"line":501},[491,776,505],{"class":504},[491,778,509],{"class":508},[491,780,781,783],{"class":493,"line":512},[491,782,515],{"class":504},[491,784,509],{"class":508},[491,786,787],{"class":493,"line":520},[491,788,790],{"class":789},"sDvJj","    #...\n",[491,792,793,796],{"class":493,"line":533},[491,794,795],{"class":504},"    labels",[491,797,509],{"class":508},[491,799,800,802],{"class":493,"line":544},[491,801,555],{"class":508},[491,803,804],{"class":529}," com.centurylinklabs.watchtower.enable=true\n",[465,806,808],{"id":807},"set-your-environment-variables","Set your environment variables",[391,810,811,812,815],{},"Then in the ",[413,813,814],{},".env"," file:",[481,817,821],{"className":818,"code":819,"filename":814,"language":820,"meta":487,"style":487},"language-properties shiki shiki-themes github-dark material-theme github-dark","DOMAIN=\nDOMAINS=\nEMAIL=\nPLUGIN=\n","properties",[413,822,823,832,839,846],{"__ignoreMap":487},[491,824,825,829],{"class":493,"line":494},[491,826,828],{"class":827},"szyEh","DOMAIN",[491,830,831],{"class":508},"=\n",[491,833,834,837],{"class":493,"line":501},[491,835,836],{"class":827},"DOMAINS",[491,838,831],{"class":508},[491,840,841,844],{"class":493,"line":512},[491,842,843],{"class":827},"EMAIL",[491,845,831],{"class":508},[491,847,848,851],{"class":493,"line":520},[491,849,850],{"class":827},"PLUGIN",[491,852,831],{"class":508},[391,854,855],{},"Fill out the variables as follows:",[857,858,859,875],"table",{},[860,861,862],"thead",{},[863,864,865,869,872],"tr",{},[866,867,868],"th",{},"Property",[866,870,871],{},"Value",[866,873,874],{},"Examples",[876,877,878,892,906,920],"tbody",{},[863,879,880,885,888],{},[881,882,883],"td",{},[413,884,828],{},[881,886,887],{},"Your domain (covers all subdomains too)",[881,889,890],{},[413,891,454],{},[863,893,894,898,901],{},[881,895,896],{},[413,897,836],{},[881,899,900],{},"Any additional domains",[881,902,903],{},[413,904,905],{},"myseconddomain.com",[863,907,908,912,915],{},[881,909,910],{},[413,911,843],{},[881,913,914],{},"Your email for generating the certificate",[881,916,917],{},[413,918,919],{},"your@email.com",[863,921,922,926,933],{},[881,923,924],{},[413,925,850],{},[881,927,928,929],{},"Plugin for certificate generation, depends on your ",[394,930,932],{"href":396,"rel":931},[398],"DNS provider",[881,934,935,938,941],{},[413,936,937],{},"ovh",[939,940],"br",{},[413,942,943],{},"cloudflare",[465,945,947],{"id":946},"configure-the-ovh-dns-plugin","Configure the OVH DNS plugin",[391,949,950,951,956,957,960],{},"Assuming your DNS zone is managed by OVH (if not, please check for your ",[394,952,955],{"href":953,"rel":954},"https:\u002F\u002Fgithub.com\u002Flinuxserver\u002Fdocker-swag\u002Ftree\u002Fmaster\u002Froot\u002Fdefaults\u002Fdns-conf",[398],"provider","), deploy the stack once. The logs will show a failure in creating the SSL certificate due to a missing ",[413,958,959],{},"ovh.ini"," configuration. Stop the stack.",[391,962,963,964,815],{},"In CLI, go to the dns-conf folder and edit the ",[413,965,959],{},[755,967,759,969,972,973,975],{"icon":487,"to":968},"\u002Fserveex\u002Ffiles\u002Ffile-browser-quantum",[418,970,971],{},"Tip for terminal-shy users:","\nYou can use ",[418,974,209],{}," to browse and edit files instead of using terminal commands.",[481,977,982],{"className":978,"code":979,"filename":980,"language":981,"meta":487,"style":487},"language-bash shiki shiki-themes github-dark material-theme github-dark","sudo nano \u002Fsrv\u002Fdocker\u002Fswag\u002Fconfig\u002Fdns-conf\u002Fovh.ini\n","Terminal","bash",[413,983,984],{"__ignoreMap":487},[491,985,986,989,992],{"class":493,"line":494},[491,987,988],{"class":497},"sudo",[491,990,991],{"class":529}," nano",[491,993,994],{"class":529}," \u002Fsrv\u002Fdocker\u002Fswag\u002Fconfig\u002Fdns-conf\u002Fovh.ini\n",[391,996,997],{},"You should see:",[481,999,1001],{"className":818,"code":1000,"filename":959,"language":820,"meta":487,"style":487},"# Instructions: https:\u002F\u002Fgithub.com\u002Fcertbot\u002Fcertbot\u002Fblob\u002Fmaster\u002Fcertbot-dns-ovh\u002Fcertbot_dns_ovh\u002F__init__.py#L20\n# Replace with your values\ndns_ovh_endpoint = ovh-eu\ndns_ovh_application_key = \ndns_ovh_application_secret = \ndns_ovh_consumer_key = \n",[413,1002,1003,1008,1013,1025,1035,1044],{"__ignoreMap":487},[491,1004,1005],{"class":493,"line":494},[491,1006,1007],{"class":789},"# Instructions: https:\u002F\u002Fgithub.com\u002Fcertbot\u002Fcertbot\u002Fblob\u002Fmaster\u002Fcertbot-dns-ovh\u002Fcertbot_dns_ovh\u002F__init__.py#L20\n",[491,1009,1010],{"class":493,"line":501},[491,1011,1012],{"class":789},"# Replace with your values\n",[491,1014,1015,1018,1021],{"class":493,"line":512},[491,1016,1017],{"class":827},"dns_ovh_endpoint",[491,1019,1020],{"class":508}," =",[491,1022,1024],{"class":1023},"slcoZ"," ovh-eu\n",[491,1026,1027,1030,1032],{"class":493,"line":520},[491,1028,1029],{"class":827},"dns_ovh_application_key",[491,1031,1020],{"class":508},[491,1033,1034],{"class":1023}," \n",[491,1036,1037,1040,1042],{"class":493,"line":533},[491,1038,1039],{"class":827},"dns_ovh_application_secret",[491,1041,1020],{"class":508},[491,1043,1034],{"class":1023},[491,1045,1046,1049],{"class":493,"line":544},[491,1047,1048],{"class":827},"dns_ovh_consumer_key",[491,1050,1051],{"class":508}," =\n",[391,1053,1054,1055,406],{},"Authenticate and create ",[394,1056,1059],{"href":1057,"rel":1058},"https:\u002F\u002Fwww.ovh.com\u002Fauth\u002F?onsuccess=https%3A%2F%2Fwww.ovh.com%2Fauth%2Fapi%2FcreateToken",[398],"your token here",[391,1061,1062],{},"Set the following permissions:",[1064,1065,1066,1072,1077,1082],"ul",{},[1067,1068,1069],"li",{},[413,1070,1071],{},"GET \u002Fdomain\u002Fzone\u002F*",[1067,1073,1074],{},[413,1075,1076],{},"PUT \u002Fdomain\u002Fzone\u002F*",[1067,1078,1079],{},[413,1080,1081],{},"POST \u002Fdomain\u002Fzone\u002F*",[1067,1083,1084],{},[413,1085,1086],{},"DELETE \u002Fdomain\u002Fzone\u002F*",[391,1088,1089,1090,1092,1093,1097,1098,1097,1101,1104],{},"Note the 3 keys temporarily and enter them in ",[413,1091,959],{},". (In nano, just start typing, then ",[1094,1095],"kbd",{"value":1096},"Ctrl+O",", ",[1094,1099],{"value":1100},"Enter",[1094,1102],{"value":1103},"Ctrl+X"," to save and exit)",[391,1106,1107,1108,1110,1111,1113,1114,406],{},"Save with ",[1094,1109],{"value":1096},", then ",[1094,1112],{"value":1100},", and exit with ",[1094,1115],{"value":1103},[465,1117,1119],{"id":1118},"enable-dbip-in-nginxconf","Enable DBIP in nginx.conf",[391,1121,1122,1123,815],{},"Now configure swag to access DBIP, the geolocation-based access control module. Open the ",[413,1124,1125],{},"nginx.conf",[481,1127,1129],{"className":978,"code":1128,"filename":980,"language":981,"meta":487,"style":487},"sudo nano \u002Fsrv\u002Fdocker\u002Fswag\u002Fconfig\u002Fnginx\u002Fnginx.conf\n",[413,1130,1131],{"__ignoreMap":487},[491,1132,1133,1135,1137],{"class":493,"line":494},[491,1134,988],{"class":497},[491,1136,991],{"class":529},[491,1138,1139],{"class":529}," \u002Fsrv\u002Fdocker\u002Fswag\u002Fconfig\u002Fnginx\u002Fnginx.conf\n",[391,1141,1142,1143,1146],{},"Add the following line below the ",[413,1144,1145],{},"http"," section:",[481,1148,1152],{"className":1149,"code":1150,"filename":1125,"language":1151,"meta":487,"style":487},"language-nginx shiki shiki-themes github-dark material-theme github-dark","include \u002Fconfig\u002Fnginx\u002Fdbip.conf;\n","nginx",[413,1153,1154],{"__ignoreMap":487},[491,1155,1156,1160,1163],{"class":493,"line":494},[491,1157,1159],{"class":1158},"sJPTy","include ",[491,1161,1162],{"class":1023},"\u002Fconfig\u002Fnginx\u002Fdbip.conf",[491,1164,1165],{"class":508},";\n",[391,1167,1168],{},"Restart the stack in Dockge. This time, the SSL certificate should be successfully generated! Check the logs to confirm the server is ready.",[465,1170,1172],{"id":1171},"done","Done !",[437,1174,1176],{"id":1175},"dashboard","Dashboard",[391,1178,1179,1180,1183,1184,406],{},"Access the dashboard locally by going to ",[413,1181,1182],{},"http:\u002F\u002Fyourserverip:81","\nOn the left, you'll see a list of currently \"proxied\" services (none yet). On the right, the list of banned IPs. Below, various indicators. For more details, ",[394,1185,1188],{"href":1186,"rel":1187},"https:\u002F\u002Fwww.linuxserver.io\u002Fblog\u002Fintroducing-swag-dashboard",[398],"click here",[391,1190,1191],{},[432,1192],{"alt":1193,"src":1194},"picture","https:\u002F\u002Fwww.linuxserver.io\u002Fuser\u002Fpages\u002F03.blog\u002Fintroducing-swag-dashboard\u002Fexample.png",[437,1196,1198],{"id":1197},"dbip","DBIP",[391,1200,1201,1202,1205,1206,1209,1210,406],{},"DBIP allows you to block connections based on countries. It relies on the configuration file named ",[413,1203,1204],{},"dbip.conf"," located in ",[413,1207,1208],{},"\u002Fsrv\u002Fdocker\u002Fswag\u002Fconfig\u002Fnginx",". ",[394,1211,1214],{"href":1212,"rel":1213},"https:\u002F\u002Fvirtualize.link\u002Fsecure\u002F",[398],"More info here",[391,1216,1217],{},"In this example, we’ll configure it to block a list of countries known to be the source of most malicious traffic. We’ll also configure a variable to allow internal server traffic, your box’s local network, and a potential VPN in the 10.x.x.x range to access your services, but not the open internet.",[391,1219,1220],{},"This configuration can be enabled or disabled per service (see the Dockge example below).",[461,1222,1223,1227,1241,1245,1254,1680,1684,1687],{"level":463},[465,1224,1226],{"id":1225},"open-dbipconf","Open dbip.conf",[481,1228,1230],{"className":978,"code":1229,"filename":980,"language":981,"meta":487,"style":487},"sudo nano \u002Fsrv\u002Fdocker\u002Fswag\u002Fconfig\u002Fnginx\u002Fdbip.conf\n",[413,1231,1232],{"__ignoreMap":487},[491,1233,1234,1236,1238],{"class":493,"line":494},[491,1235,988],{"class":497},[491,1237,991],{"class":529},[491,1239,1240],{"class":529}," \u002Fsrv\u002Fdocker\u002Fswag\u002Fconfig\u002Fnginx\u002Fdbip.conf\n",[465,1242,1244],{"id":1243},"make-your-changes","Make your changes",[391,1246,1247,1248,1253],{},"Refer to the ",[394,1249,1252],{"href":1250,"rel":1251},"https:\u002F\u002Fgithub.com\u002Flinuxserver\u002Fdocker-mods\u002Ftree\u002Fswag-dbip",[398],"documentation",", or use the following example:",[481,1255,1257],{"className":1149,"code":1256,"filename":1204,"language":1151,"meta":487,"style":487},"geoip2 \u002Fconfig\u002Fgeoip2db\u002Fdbip-country-lite.mmdb {\n    auto_reload 1w;\n    $geoip2_data_continent_code   continent code;\n    $geoip2_data_country_iso_code country iso_code;\n}\n\n# Country Codes: https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FISO_3166-2\n\nmap $geoip2_data_country_iso_code $geo-whitelist {\n    default no;\n    FR yes;\n}\n\nmap $geoip2_data_country_iso_code $geo-blacklist {\n    default yes;\n    CN no; #China\n    RU no; #Russia\n    HK no; #Hong Kong\n    IN no; #India\n    IR no; #Iran\n    VN no; #Vietnam\n    TR no; #Turkey\n    EG no; #Egypt\n    MX no; #Mexico\n    JP no; #Japan\n    KR no; #South Korea\n    KP no; #North Korea\n    PE no; #Peru\n    BR no; #Brazil\n    UA no; #Ukraine\n    ID no; #Indonesia\n    TH no; #Thailand\n}\n\ngeo $lan-ip {\n    default no;\n    10.0.0.0\u002F8 yes;\n    172.16.0.0\u002F12 yes;\n    192.168.0.0\u002F16 yes;\n    127.0.0.1 yes;\n}\n",[413,1258,1259,1267,1277,1290,1302,1307,1311,1316,1320,1337,1347,1357,1361,1365,1378,1386,1399,1411,1423,1435,1447,1459,1471,1483,1495,1507,1519,1531,1543,1555,1567,1579,1592,1597,1602,1613,1623,1636,1649,1662,1675],{"__ignoreMap":487},[491,1260,1261,1264],{"class":493,"line":494},[491,1262,1263],{"class":1158},"geoip2",[491,1265,1266],{"class":1023}," \u002Fconfig\u002Fgeoip2db\u002Fdbip-country-lite.mmdb {\n",[491,1268,1269,1272,1275],{"class":493,"line":501},[491,1270,1271],{"class":1158},"    auto_reload",[491,1273,1274],{"class":1023}," 1w",[491,1276,1165],{"class":508},[491,1278,1279,1282,1285,1288],{"class":493,"line":512},[491,1280,1281],{"class":1023},"    $",[491,1283,1284],{"class":1158},"geoip2_data_continent_code",[491,1286,1287],{"class":1023},"   continent code",[491,1289,1165],{"class":508},[491,1291,1292,1294,1297,1300],{"class":493,"line":520},[491,1293,1281],{"class":1023},[491,1295,1296],{"class":1158},"geoip2_data_country_iso_code",[491,1298,1299],{"class":1023}," country iso_code",[491,1301,1165],{"class":508},[491,1303,1304],{"class":493,"line":533},[491,1305,1306],{"class":1023},"}\n",[491,1308,1309],{"class":493,"line":544},[491,1310,727],{"emptyLinePlaceholder":726},[491,1312,1313],{"class":493,"line":552},[491,1314,1315],{"class":789},"# Country Codes: https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FISO_3166-2\n",[491,1317,1318],{"class":493,"line":561},[491,1319,727],{"emptyLinePlaceholder":726},[491,1321,1322,1325,1328,1331,1334],{"class":493,"line":569},[491,1323,1324],{"class":1158},"map",[491,1326,1327],{"class":508}," $",[491,1329,1330],{"class":1023},"geoip2_data_country_iso_code ",[491,1332,1333],{"class":508},"$",[491,1335,1336],{"class":1023},"geo-whitelist {\n",[491,1338,1339,1342,1345],{"class":493,"line":577},[491,1340,1341],{"class":1158},"    default",[491,1343,1344],{"class":1023}," no",[491,1346,1165],{"class":508},[491,1348,1349,1352,1355],{"class":493,"line":585},[491,1350,1351],{"class":1158},"    FR",[491,1353,1354],{"class":1023}," yes",[491,1356,1165],{"class":508},[491,1358,1359],{"class":493,"line":593},[491,1360,1306],{"class":1023},[491,1362,1363],{"class":493,"line":601},[491,1364,727],{"emptyLinePlaceholder":726},[491,1366,1367,1369,1371,1373,1375],{"class":493,"line":609},[491,1368,1324],{"class":1158},[491,1370,1327],{"class":508},[491,1372,1330],{"class":1023},[491,1374,1333],{"class":508},[491,1376,1377],{"class":1023},"geo-blacklist {\n",[491,1379,1380,1382,1384],{"class":493,"line":617},[491,1381,1341],{"class":1158},[491,1383,1354],{"class":1023},[491,1385,1165],{"class":508},[491,1387,1388,1391,1393,1396],{"class":493,"line":625},[491,1389,1390],{"class":1158},"    CN",[491,1392,1344],{"class":1023},[491,1394,1395],{"class":508},";",[491,1397,1398],{"class":789}," #China\n",[491,1400,1401,1404,1406,1408],{"class":493,"line":633},[491,1402,1403],{"class":1158},"    RU",[491,1405,1344],{"class":1023},[491,1407,1395],{"class":508},[491,1409,1410],{"class":789}," #Russia\n",[491,1412,1413,1416,1418,1420],{"class":493,"line":641},[491,1414,1415],{"class":1158},"    HK",[491,1417,1344],{"class":1023},[491,1419,1395],{"class":508},[491,1421,1422],{"class":789}," #Hong Kong\n",[491,1424,1425,1428,1430,1432],{"class":493,"line":649},[491,1426,1427],{"class":1158},"    IN",[491,1429,1344],{"class":1023},[491,1431,1395],{"class":508},[491,1433,1434],{"class":789}," #India\n",[491,1436,1437,1440,1442,1444],{"class":493,"line":657},[491,1438,1439],{"class":1158},"    IR",[491,1441,1344],{"class":1023},[491,1443,1395],{"class":508},[491,1445,1446],{"class":789}," #Iran\n",[491,1448,1449,1452,1454,1456],{"class":493,"line":665},[491,1450,1451],{"class":1158},"    VN",[491,1453,1344],{"class":1023},[491,1455,1395],{"class":508},[491,1457,1458],{"class":789}," #Vietnam\n",[491,1460,1461,1464,1466,1468],{"class":493,"line":673},[491,1462,1463],{"class":1158},"    TR",[491,1465,1344],{"class":1023},[491,1467,1395],{"class":508},[491,1469,1470],{"class":789}," #Turkey\n",[491,1472,1473,1476,1478,1480],{"class":493,"line":681},[491,1474,1475],{"class":1158},"    EG",[491,1477,1344],{"class":1023},[491,1479,1395],{"class":508},[491,1481,1482],{"class":789}," #Egypt\n",[491,1484,1485,1488,1490,1492],{"class":493,"line":689},[491,1486,1487],{"class":1158},"    MX",[491,1489,1344],{"class":1023},[491,1491,1395],{"class":508},[491,1493,1494],{"class":789}," #Mexico\n",[491,1496,1497,1500,1502,1504],{"class":493,"line":697},[491,1498,1499],{"class":1158},"    JP",[491,1501,1344],{"class":1023},[491,1503,1395],{"class":508},[491,1505,1506],{"class":789}," #Japan\n",[491,1508,1509,1512,1514,1516],{"class":493,"line":708},[491,1510,1511],{"class":1158},"    KR",[491,1513,1344],{"class":1023},[491,1515,1395],{"class":508},[491,1517,1518],{"class":789}," #South Korea\n",[491,1520,1521,1524,1526,1528],{"class":493,"line":716},[491,1522,1523],{"class":1158},"    KP",[491,1525,1344],{"class":1023},[491,1527,1395],{"class":508},[491,1529,1530],{"class":789}," #North Korea\n",[491,1532,1533,1536,1538,1540],{"class":493,"line":723},[491,1534,1535],{"class":1158},"    PE",[491,1537,1344],{"class":1023},[491,1539,1395],{"class":508},[491,1541,1542],{"class":789}," #Peru\n",[491,1544,1545,1548,1550,1552],{"class":493,"line":730},[491,1546,1547],{"class":1158},"    BR",[491,1549,1344],{"class":1023},[491,1551,1395],{"class":508},[491,1553,1554],{"class":789}," #Brazil\n",[491,1556,1557,1560,1562,1564],{"class":493,"line":738},[491,1558,1559],{"class":1158},"    UA",[491,1561,1344],{"class":1023},[491,1563,1395],{"class":508},[491,1565,1566],{"class":789}," #Ukraine\n",[491,1568,1569,1572,1574,1576],{"class":493,"line":745},[491,1570,1571],{"class":1158},"    ID",[491,1573,1344],{"class":1023},[491,1575,1395],{"class":508},[491,1577,1578],{"class":789}," #Indonesia\n",[491,1580,1582,1585,1587,1589],{"class":493,"line":1581},32,[491,1583,1584],{"class":1158},"    TH",[491,1586,1344],{"class":1023},[491,1588,1395],{"class":508},[491,1590,1591],{"class":789}," #Thailand\n",[491,1593,1595],{"class":493,"line":1594},33,[491,1596,1306],{"class":1023},[491,1598,1600],{"class":493,"line":1599},34,[491,1601,727],{"emptyLinePlaceholder":726},[491,1603,1605,1608,1610],{"class":493,"line":1604},35,[491,1606,1607],{"class":1158},"geo ",[491,1609,1333],{"class":508},[491,1611,1612],{"class":1023},"lan-ip {\n",[491,1614,1616,1619,1621],{"class":493,"line":1615},36,[491,1617,1341],{"class":1618},"soUAX",[491,1620,1344],{"class":1023},[491,1622,1165],{"class":508},[491,1624,1626,1629,1632,1634],{"class":493,"line":1625},37,[491,1627,1628],{"class":1023},"    10.0.0.0\u002F",[491,1630,1631],{"class":1158},"8",[491,1633,1354],{"class":1023},[491,1635,1165],{"class":508},[491,1637,1639,1642,1645,1647],{"class":493,"line":1638},38,[491,1640,1641],{"class":1023},"    172.16.0.0\u002F",[491,1643,1644],{"class":1158},"12",[491,1646,1354],{"class":1023},[491,1648,1165],{"class":508},[491,1650,1652,1655,1658,1660],{"class":493,"line":1651},39,[491,1653,1654],{"class":1023},"    192.168.0.0\u002F",[491,1656,1657],{"class":1158},"16",[491,1659,1354],{"class":1023},[491,1661,1165],{"class":508},[491,1663,1665,1668,1671,1673],{"class":493,"line":1664},40,[491,1666,1667],{"class":1023},"    127.0.0.",[491,1669,1670],{"class":1158},"1",[491,1672,1354],{"class":1023},[491,1674,1165],{"class":508},[491,1676,1678],{"class":493,"line":1677},41,[491,1679,1306],{"class":1023},[465,1681,1683],{"id":1682},"save-and-restart","Save and restart",[391,1685,1686],{},"Save and close the file, then restart the stack.",[465,1688,1172],{"id":1689},"done-1",[391,1691,1692,1693,1698],{},"In the domain config files (see next section), you can enable or disable the whitelist or blacklist (",[394,1694,1697],{"href":1695,"rel":1696},"https:\u002F\u002Fwww.forum-nas.fr\u002Fthreads\u002Ftuto-installer-swag-en-docker-reverse-proxy.15057\u002F",[398],"see documentation here","). In our case, the whitelist allows only French requests. The blacklist blocks only the listed countries. We'll use the blacklist, like so:",[481,1700,1704],{"className":1149,"code":1701,"filename":1702,"highlights":1703,"language":1151,"meta":487,"style":487},"server {\n    listen 443 ssl;\n    listen [::]:443 ssl;\n\n    server_name some-app.*;\n\n    include \u002Fconfig\u002Fnginx\u002Fssl.conf;\n\n    client_max_body_size 0;\n\n    if ($geo-blacklist = no) { return 404; }\n\n    location \u002F {\n        include \u002Fconfig\u002Fnginx\u002Fproxy.conf;\n        include \u002Fconfig\u002Fnginx\u002Fresolver.conf;\n\n        set $upstream_app some-app;\n        set $upstream_port 1234;\n        set $upstream_proto http;\n        proxy_pass $upstream_proto:\u002F\u002F$upstream_app:$upstream_port;\n    }\n}\n","some-app.subdomain.conf",[585],[413,1705,1706,1715,1728,1737,1741,1751,1755,1765,1769,1779,1783,1818,1822,1833,1843,1852,1856,1868,1882,1893,1915,1920],{"__ignoreMap":487},[491,1707,1708,1712],{"class":493,"line":494},[491,1709,1711],{"class":1710},"sAoO4","server",[491,1713,1714],{"class":1023}," {\n",[491,1716,1717,1720,1723,1726],{"class":493,"line":501},[491,1718,1719],{"class":1158},"    listen ",[491,1721,447],{"class":1722},"swwWl",[491,1724,1725],{"class":1023}," ssl",[491,1727,1165],{"class":508},[491,1729,1730,1732,1735],{"class":493,"line":512},[491,1731,1719],{"class":1158},[491,1733,1734],{"class":1023},"[::]:443 ssl",[491,1736,1165],{"class":508},[491,1738,1739],{"class":493,"line":520},[491,1740,727],{"emptyLinePlaceholder":726},[491,1742,1743,1746,1749],{"class":493,"line":533},[491,1744,1745],{"class":1158},"    server_name ",[491,1747,1748],{"class":1023},"some-app.*",[491,1750,1165],{"class":508},[491,1752,1753],{"class":493,"line":544},[491,1754,727],{"emptyLinePlaceholder":726},[491,1756,1757,1760,1763],{"class":493,"line":552},[491,1758,1759],{"class":1158},"    include ",[491,1761,1762],{"class":1023},"\u002Fconfig\u002Fnginx\u002Fssl.conf",[491,1764,1165],{"class":508},[491,1766,1767],{"class":493,"line":561},[491,1768,727],{"emptyLinePlaceholder":726},[491,1770,1771,1774,1777],{"class":493,"line":569},[491,1772,1773],{"class":1158},"    client_max_body_size ",[491,1775,1776],{"class":1722},"0",[491,1778,1165],{"class":508},[491,1780,1781],{"class":493,"line":577},[491,1782,727],{"emptyLinePlaceholder":726},[491,1784,1787,1791,1794,1796,1799,1802,1805,1809,1812,1815],{"class":1785,"line":585},[493,1786],"highlight",[491,1788,1790],{"class":1789},"sJLGa","    if",[491,1792,1793],{"class":1023}," (",[491,1795,1333],{"class":508},[491,1797,1798],{"class":1023},"geo-blacklist ",[491,1800,1801],{"class":1158},"= ",[491,1803,1804],{"class":1023},"no) ",[491,1806,1808],{"class":1807},"sSoIa","{ ",[491,1810,1811],{"class":1789},"return",[491,1813,1814],{"class":1722}," 404",[491,1816,1817],{"class":1807},"; }\n",[491,1819,1820],{"class":493,"line":593},[491,1821,727],{"emptyLinePlaceholder":726},[491,1823,1824,1827,1830],{"class":493,"line":601},[491,1825,1826],{"class":1710},"    location",[491,1828,1829],{"class":497}," \u002F ",[491,1831,1832],{"class":1023},"{\n",[491,1834,1835,1838,1841],{"class":493,"line":609},[491,1836,1837],{"class":1158},"        include ",[491,1839,1840],{"class":1023},"\u002Fconfig\u002Fnginx\u002Fproxy.conf",[491,1842,1165],{"class":508},[491,1844,1845,1847,1850],{"class":493,"line":617},[491,1846,1837],{"class":1158},[491,1848,1849],{"class":1023},"\u002Fconfig\u002Fnginx\u002Fresolver.conf",[491,1851,1165],{"class":508},[491,1853,1854],{"class":493,"line":625},[491,1855,727],{"emptyLinePlaceholder":726},[491,1857,1858,1861,1863,1866],{"class":493,"line":633},[491,1859,1860],{"class":1158},"        set ",[491,1862,1333],{"class":508},[491,1864,1865],{"class":1023},"upstream_app some-app",[491,1867,1165],{"class":508},[491,1869,1870,1872,1874,1877,1880],{"class":493,"line":641},[491,1871,1860],{"class":1158},[491,1873,1333],{"class":508},[491,1875,1876],{"class":1023},"upstream_port ",[491,1878,1879],{"class":1722},"1234",[491,1881,1165],{"class":508},[491,1883,1884,1886,1888,1891],{"class":493,"line":649},[491,1885,1860],{"class":1158},[491,1887,1333],{"class":508},[491,1889,1890],{"class":1023},"upstream_proto http",[491,1892,1165],{"class":508},[491,1894,1895,1898,1900,1903,1905,1908,1910,1913],{"class":493,"line":657},[491,1896,1897],{"class":1158},"        proxy_pass ",[491,1899,1333],{"class":508},[491,1901,1902],{"class":1023},"upstream_proto:\u002F\u002F",[491,1904,1333],{"class":508},[491,1906,1907],{"class":1023},"upstream_app:",[491,1909,1333],{"class":508},[491,1911,1912],{"class":1023},"upstream_port",[491,1914,1165],{"class":508},[491,1916,1917],{"class":493,"line":665},[491,1918,1919],{"class":1023},"    }\n",[491,1921,1922],{"class":493,"line":673},[491,1923,1306],{"class":1023},[437,1925,1927],{"id":1926},"optional-exposing-dockge","(Optional) Exposing Dockge",[442,1929,1930,1931,1934,1935,1937,1939,1940,1943,1944,1948,1949,1952,1953,1955,1956,1959,1960,1962,1963,1965,1966,406],{"icon":487},"📋 ",[418,1932,1933],{},"Prerequisite:"," ",[939,1936],{},[939,1938],{},"\nWe assume that you have created a subdomain like ",[413,1941,1942],{},"dockge.mydomain.com"," in your ",[394,1945,1947],{"href":1946},"\u002Fgeneral\u002Fnetworking\u002Fdns","DNS zone",", with a ",[413,1950,1951],{},"CNAME"," pointing to ",[413,1954,454],{},". Unless you're using ",[394,1957,133],{"href":1958},"\u002Fserveex\u002Fsecurity\u002Fcloudflare",", we also assume you've forwarded port ",[413,1961,447],{}," from your router to the server's ",[413,1964,447],{}," in ",[394,1967,1969],{"href":1968},"\u002Fgeneral\u002Fnetworking\u002Fnat","your NAT rules",[391,1971,1972,1973,1975,1976,1952,1978,406],{},"Now it's time to expose Dockge on the internet so you can access and manage your containers remotely. We assume you've set up the subdomain ",[413,1974,1942],{}," with a ",[413,1977,1951],{},[413,1979,454],{},[408,1981,1982,1983,1986,1987,1990,1991,1993],{},"Dockge does not support multi-factor authentication. Exposing it online could compromise all connected machines. Only do this if you're using an MFA solution like ",[394,1984,137],{"href":1985},"\u002Fserveex\u002Fsecurity\u002Ftinyauth"," or ",[394,1988,255],{"href":1989},"\u002Fserveex\u002Fadvanced\u002Fauthentik\u002F",". Otherwise, don’t expose it with SWAG. Use a VPN like ",[394,1992,119],{"href":410}," instead.",[461,1995,1996,2000,2006,2020,2023,2293,2296,2302,2306,2316,2425,2434,2437,2441,2451],{"level":463},[465,1997,1999],{"id":1998},"create-the-subdomainconf-file","Create the subdomain.conf file",[391,2001,2002,2003,815],{},"Open the ",[413,2004,2005],{},"dockge.subdomain.conf",[481,2007,2009],{"className":978,"code":2008,"filename":980,"language":981,"meta":487,"style":487},"sudo nano \u002Fsrv\u002Fdocker\u002Fswag\u002Fconfig\u002Fnginx\u002Fproxy-confs\u002Fdockge.subdomain.conf\n",[413,2010,2011],{"__ignoreMap":487},[491,2012,2013,2015,2017],{"class":493,"line":494},[491,2014,988],{"class":497},[491,2016,991],{"class":529},[491,2018,2019],{"class":529}," \u002Fsrv\u002Fdocker\u002Fswag\u002Fconfig\u002Fnginx\u002Fproxy-confs\u002Fdockge.subdomain.conf\n",[391,2021,2022],{},"Configure it like this:",[481,2024,2026],{"className":1149,"code":2025,"filename":2005,"language":1151,"meta":487,"style":487},"## Version 2023\u002F12\u002F19\n\nserver {\n    listen 443 ssl;\n    listen [::]:443 ssl;\n    \n    server_name dockge.*;  # define the subdomain to redirect\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; } # all countries un blacklist are forbidden\n\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        #auth_basic \"Restricted\";\n        #auth_basic_user_file \u002Fconfig\u002Fnginx\u002F.htpasswd;\n\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 dockge; # container name\n        set $upstream_port 5001; # internal container port (not exposed port)\n        set $upstream_proto http;\n        proxy_pass $upstream_proto:\u002F\u002F$upstream_app:$upstream_port;\n    }\n}\n",[413,2027,2028,2033,2037,2043,2053,2061,2066,2078,2082,2090,2094,2102,2106,2111,2116,2142,2146,2151,2156,2161,2165,2173,2178,2183,2187,2192,2197,2202,2206,2214,2222,2227,2241,2257,2267,2285,2289],{"__ignoreMap":487},[491,2029,2030],{"class":493,"line":494},[491,2031,2032],{"class":789},"## Version 2023\u002F12\u002F19\n",[491,2034,2035],{"class":493,"line":501},[491,2036,727],{"emptyLinePlaceholder":726},[491,2038,2039,2041],{"class":493,"line":512},[491,2040,1711],{"class":1710},[491,2042,1714],{"class":1023},[491,2044,2045,2047,2049,2051],{"class":493,"line":520},[491,2046,1719],{"class":1158},[491,2048,447],{"class":1722},[491,2050,1725],{"class":1023},[491,2052,1165],{"class":508},[491,2054,2055,2057,2059],{"class":493,"line":533},[491,2056,1719],{"class":1158},[491,2058,1734],{"class":1023},[491,2060,1165],{"class":508},[491,2062,2063],{"class":493,"line":544},[491,2064,2065],{"class":1023},"    \n",[491,2067,2068,2070,2073,2075],{"class":493,"line":552},[491,2069,1745],{"class":1158},[491,2071,2072],{"class":1023},"dockge.*",[491,2074,1395],{"class":508},[491,2076,2077],{"class":789},"  # define the subdomain to redirect\n",[491,2079,2080],{"class":493,"line":561},[491,2081,727],{"emptyLinePlaceholder":726},[491,2083,2084,2086,2088],{"class":493,"line":569},[491,2085,1759],{"class":1158},[491,2087,1762],{"class":1023},[491,2089,1165],{"class":508},[491,2091,2092],{"class":493,"line":577},[491,2093,727],{"emptyLinePlaceholder":726},[491,2095,2096,2098,2100],{"class":493,"line":585},[491,2097,1773],{"class":1158},[491,2099,1776],{"class":1722},[491,2101,1165],{"class":508},[491,2103,2104],{"class":493,"line":593},[491,2105,727],{"emptyLinePlaceholder":726},[491,2107,2108],{"class":493,"line":601},[491,2109,2110],{"class":789},"    #if ($lan-ip = yes) { set $geo-whitelist yes; }\n",[491,2112,2113],{"class":493,"line":609},[491,2114,2115],{"class":789},"    #if ($geo-whitelist = no) { return 404; }\n",[491,2117,2118,2120,2122,2124,2126,2128,2130,2132,2134,2136,2139],{"class":493,"line":617},[491,2119,1790],{"class":1789},[491,2121,1793],{"class":1023},[491,2123,1333],{"class":508},[491,2125,1798],{"class":1023},[491,2127,1801],{"class":1158},[491,2129,1804],{"class":1023},[491,2131,1808],{"class":1807},[491,2133,1811],{"class":1789},[491,2135,1814],{"class":1722},[491,2137,2138],{"class":1807},"; }",[491,2140,2141],{"class":789}," # all countries un blacklist are forbidden\n",[491,2143,2144],{"class":493,"line":625},[491,2145,727],{"emptyLinePlaceholder":726},[491,2147,2148],{"class":493,"line":633},[491,2149,2150],{"class":789},"    #include \u002Fconfig\u002Fnginx\u002Fldap-server.conf;\n",[491,2152,2153],{"class":493,"line":641},[491,2154,2155],{"class":789},"    #include \u002Fconfig\u002Fnginx\u002Fauthelia-server.conf;\n",[491,2157,2158],{"class":493,"line":649},[491,2159,2160],{"class":789},"    #include \u002Fconfig\u002Fnginx\u002Fauthentik-server.conf;\n",[491,2162,2163],{"class":493,"line":657},[491,2164,727],{"emptyLinePlaceholder":726},[491,2166,2167,2169,2171],{"class":493,"line":665},[491,2168,1826],{"class":1710},[491,2170,1829],{"class":497},[491,2172,1832],{"class":1023},[491,2174,2175],{"class":493,"line":673},[491,2176,2177],{"class":789},"        #auth_basic \"Restricted\";\n",[491,2179,2180],{"class":493,"line":681},[491,2181,2182],{"class":789},"        #auth_basic_user_file \u002Fconfig\u002Fnginx\u002F.htpasswd;\n",[491,2184,2185],{"class":493,"line":689},[491,2186,727],{"emptyLinePlaceholder":726},[491,2188,2189],{"class":493,"line":697},[491,2190,2191],{"class":789},"        #include \u002Fconfig\u002Fnginx\u002Fldap-location.conf;\n",[491,2193,2194],{"class":493,"line":708},[491,2195,2196],{"class":789},"        #include \u002Fconfig\u002Fnginx\u002Fauthelia-location.conf;\n",[491,2198,2199],{"class":493,"line":716},[491,2200,2201],{"class":789},"        #include \u002Fconfig\u002Fnginx\u002Fauthentik-location.conf;\n",[491,2203,2204],{"class":493,"line":723},[491,2205,727],{"emptyLinePlaceholder":726},[491,2207,2208,2210,2212],{"class":493,"line":730},[491,2209,1837],{"class":1158},[491,2211,1840],{"class":1023},[491,2213,1165],{"class":508},[491,2215,2216,2218,2220],{"class":493,"line":738},[491,2217,1837],{"class":1158},[491,2219,1849],{"class":1023},[491,2221,1165],{"class":508},[491,2223,2224],{"class":493,"line":745},[491,2225,2226],{"class":1023},"        \n",[491,2228,2229,2231,2233,2236,2238],{"class":493,"line":1581},[491,2230,1860],{"class":1158},[491,2232,1333],{"class":508},[491,2234,2235],{"class":1023},"upstream_app dockge",[491,2237,1395],{"class":508},[491,2239,2240],{"class":789}," # container name\n",[491,2242,2243,2245,2247,2249,2252,2254],{"class":493,"line":1594},[491,2244,1860],{"class":1158},[491,2246,1333],{"class":508},[491,2248,1876],{"class":1023},[491,2250,2251],{"class":1722},"5001",[491,2253,1395],{"class":508},[491,2255,2256],{"class":789}," # internal container port (not exposed port)\n",[491,2258,2259,2261,2263,2265],{"class":493,"line":1599},[491,2260,1860],{"class":1158},[491,2262,1333],{"class":508},[491,2264,1890],{"class":1023},[491,2266,1165],{"class":508},[491,2268,2269,2271,2273,2275,2277,2279,2281,2283],{"class":493,"line":1604},[491,2270,1897],{"class":1158},[491,2272,1333],{"class":508},[491,2274,1902],{"class":1023},[491,2276,1333],{"class":508},[491,2278,1907],{"class":1023},[491,2280,1333],{"class":508},[491,2282,1912],{"class":1023},[491,2284,1165],{"class":508},[491,2286,2287],{"class":493,"line":1615},[491,2288,1919],{"class":1023},[491,2290,2291],{"class":493,"line":1625},[491,2292,1306],{"class":1023},[391,2294,2295],{},"Save and exit. The configuration will update within a few seconds.",[442,2297,2298,2299,406],{},"By default, SWAG doesn’t recognize the name \"dockge\". You’ll need to add Dockge’s network to SWAG’s ",[413,2300,2301],{},"compose.yml",[465,2303,2305],{"id":2304},"add-dockges-network-to-swag","Add Dockge's network to SWAG",[391,2307,2308,2309,2312,2313,2315],{},"Go to the SWAG stack, click ",[413,2310,2311],{},"edit",", and modify the config file like this (note the ",[413,2314,733],{}," section):",[481,2317,2319],{"className":483,"code":2318,"filename":485,"language":486,"meta":487,"style":487},"---\nservices:\n  swag:\n    container_name: #...\n    # ...\n    networks:            # Link the container to the custom network\n\n      - dockge           # Network name as defined in the stack\n\nnetworks:                # Define the custom network\n  # ...\n  dockge:                # Network name as defined in the stack\n    name: dockge_default # True external network name\n    external: true\n",[413,2320,2321,2325,2331,2337,2346,2351,2360,2364,2374,2378,2387,2392,2402,2414],{"__ignoreMap":487},[491,2322,2323],{"class":493,"line":494},[491,2324,498],{"class":497},[491,2326,2327,2329],{"class":493,"line":501},[491,2328,505],{"class":504},[491,2330,509],{"class":508},[491,2332,2333,2335],{"class":493,"line":512},[491,2334,515],{"class":504},[491,2336,509],{"class":508},[491,2338,2339,2341,2343],{"class":493,"line":520},[491,2340,536],{"class":504},[491,2342,526],{"class":508},[491,2344,2345],{"class":789}," #...\n",[491,2347,2348],{"class":493,"line":533},[491,2349,2350],{"class":789},"    # ...\n",[491,2352,2353,2355,2357],{"class":493,"line":544},[491,2354,711],{"class":504},[491,2356,526],{"class":508},[491,2358,2359],{"class":789},"            # Link the container to the custom network\n",[491,2361,2362],{"class":493,"line":552},[491,2363,727],{"emptyLinePlaceholder":726},[491,2365,2366,2368,2371],{"class":493,"line":561},[491,2367,555],{"class":508},[491,2369,2370],{"class":529}," dockge",[491,2372,2373],{"class":789},"           # Network name as defined in the stack\n",[491,2375,2376],{"class":493,"line":569},[491,2377,727],{"emptyLinePlaceholder":726},[491,2379,2380,2382,2384],{"class":493,"line":577},[491,2381,733],{"class":504},[491,2383,526],{"class":508},[491,2385,2386],{"class":789},"                # Define the custom network\n",[491,2388,2389],{"class":493,"line":585},[491,2390,2391],{"class":789},"  # ...\n",[491,2393,2394,2397,2399],{"class":493,"line":593},[491,2395,2396],{"class":504},"  dockge",[491,2398,526],{"class":508},[491,2400,2401],{"class":789},"                # Network name as defined in the stack\n",[491,2403,2404,2406,2408,2411],{"class":493,"line":601},[491,2405,748],{"class":504},[491,2407,526],{"class":508},[491,2409,2410],{"class":529}," dockge_default",[491,2412,2413],{"class":789}," # True external network name\n",[491,2415,2416,2419,2421],{"class":493,"line":609},[491,2417,2418],{"class":504},"    external",[491,2420,526],{"class":508},[491,2422,2424],{"class":2423},"s08Ry"," true\n",[442,2426,2427,2428,2431,2432,406],{},"We assume the Dockge network is named ",[413,2429,2430],{},"dockge_default",". You can verify the setup works by checking the SWAG dashboard at ",[413,2433,1182],{},[391,2435,2436],{},"Redeploy the SWAG stack.",[465,2438,2440],{"id":2439},"visit-your-new-subdomain","Visit your new subdomain",[391,2442,2443,2444,2447,2448,2450],{},"Wait a moment, then visit ",[413,2445,2446],{},"https:\u002F\u002Fdockge.mydomain.com"," in your browser. You should be redirected to Dockge. You can also check the service status from the dashboard (",[413,2449,1182],{}," on your local network).",[465,2452,1172],{"id":2453},"done-2",[437,2455,2457],{"id":2456},"exposing-another-service-with-swag","Exposing Another Service with SWAG",[391,2459,2460,2461,2464],{},"SWAG includes templates for most known services, named ",[413,2462,2463],{},"servicename.subdomain.conf.sample",". Just create the subdomain in your registrar's DNS zone (like OVH), point it to your main domain via a CNAME, then copy and rename the sample file:",[481,2466,2468],{"className":978,"code":2467,"filename":980,"language":981,"meta":487,"style":487},"cd \u002Fsrv\u002Fdocker\u002Fswag\u002Fconfig\u002Fproxy-confs\nsudo cp servicename.subdomain.conf.sample servicename.subdomain.conf\n",[413,2469,2470,2479],{"__ignoreMap":487},[491,2471,2472,2476],{"class":493,"line":494},[491,2473,2475],{"class":2474},"sJGgK","cd",[491,2477,2478],{"class":529}," \u002Fsrv\u002Fdocker\u002Fswag\u002Fconfig\u002Fproxy-confs\n",[491,2480,2481,2483,2486,2489],{"class":493,"line":501},[491,2482,988],{"class":497},[491,2484,2485],{"class":529}," cp",[491,2487,2488],{"class":529}," servicename.subdomain.conf.sample",[491,2490,2491],{"class":529}," servicename.subdomain.conf\n",[2493,2494,2495,2500],"caution",{},[391,2496,2497],{},[418,2498,2499],{},"If the subdomain is not redirected properly",[1064,2501,2502,2517],{},[1067,2503,2504,2505],{},"Open the file and verify the container name in ",[413,2506,2507,2510,2512,2515],{"className":1149,"language":1151,"style":487},[491,2508,2509],{"class":1158},"set ",[491,2511,1333],{"class":508},[491,2513,2514],{"class":1023},"upstream_app containername",[491,2516,1395],{"class":508},[1067,2518,2519,2520],{},"Make sure you added the container's network in SWAG’s ",[413,2521,2301],{},[391,2523,2524,2525,2535,2536,406],{},"You can also customize the subdomain by editing ",[413,2526,2527,2530,2533],{"className":1149,"language":1151,"style":487},[491,2528,2529],{"class":1158},"server_name ",[491,2531,2532],{"class":1023},"yoursubdomain.*",[491,2534,1395],{"class":508}," and renaming the file to ",[413,2537,2538],{},"yoursubdomain.subdomain.conf",[2540,2541,2542],"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 .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 .s08Ry, html code.shiki .s08Ry{--shiki-light:#79B8FF;--shiki-default:#FF9CAC;--shiki-dark:#79B8FF}html pre.shiki code .sJGgK, html code.shiki .sJGgK{--shiki-light:#79B8FF;--shiki-default:#82AAFF;--shiki-dark:#79B8FF}html pre.shiki code .sJPTy, html code.shiki .sJPTy{--shiki-light:#F97583;--shiki-default:#89DDFF;--shiki-dark:#F97583}html pre.shiki code .soUAX, html code.shiki .soUAX{--shiki-light:#79B8FF;--shiki-default:#89DDFF;--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 .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}",{"title":487,"searchDepth":501,"depth":501,"links":2544},[2545,2552,2553,2559,2565],{"id":439,"depth":501,"text":440,"children":2546},[2547,2548,2549,2550,2551],{"id":467,"depth":512,"text":468},{"id":807,"depth":512,"text":808},{"id":946,"depth":512,"text":947},{"id":1118,"depth":512,"text":1119},{"id":1171,"depth":512,"text":1172},{"id":1175,"depth":501,"text":1176},{"id":1197,"depth":501,"text":1198,"children":2554},[2555,2556,2557,2558],{"id":1225,"depth":512,"text":1226},{"id":1243,"depth":512,"text":1244},{"id":1682,"depth":512,"text":1683},{"id":1689,"depth":512,"text":1172},{"id":1926,"depth":501,"text":1927,"children":2560},[2561,2562,2563,2564],{"id":1998,"depth":512,"text":1999},{"id":2304,"depth":512,"text":2305},{"id":2439,"depth":512,"text":2440},{"id":2453,"depth":512,"text":1172},{"id":2456,"depth":501,"text":2457},[2567],"Djeex","Set up SWAG as a reverse proxy with automatic SSL, expose your services securely, and configure geo-blocking on your homelab.","md",null,{},{"title":123,"description":2568},"TtK_9XZ6x-iUXr7sc5M2jGG8a0z1TZhgGexDPeTZde4",[2575,2577],{"title":119,"path":120,"stem":121,"description":2576,"children":-1},"Install and configure WireGuard VPN to securely access your homelab from anywhere and connect all your devices to your private network.",{"title":133,"path":134,"stem":135,"description":2578,"children":-1},"Use Cloudflare Tunnels and Zero Trust to expose homelab services without opening ports, configure SWAG and manage multiple tunnels.",1788645845748]