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