[{"data":1,"prerenderedAt":1646},["ShallowReactive",2],{"navigation_docs_en":3,"-en-serveex-files-pingvin-":377,"-en-serveex-files-pingvin--surround":1641},[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":213,"body":379,"contributors":1633,"description":1635,"extension":1636,"hideCopyPage":15,"hideHeader":15,"hideToc":15,"links":1637,"meta":1638,"navigation":612,"path":214,"seo":1639,"stem":215,"__hash__":1640},"docs_en\u002Fen\u002F3.serveex\u002F7.files\u002F2.pingvin.md",{"type":380,"value":381,"toc":1617},"minimark",[382,390,405,412,417,751,758,762,765,811,1390,1393,1397,1400,1484,1487,1613],[383,384],"ellipsis",{"blur":385,"left":386,"top":387,"width":388,"z-index":389},"140px","0px","10rem","40rem","60",[391,392,393,399,400,404],"p",{},[394,395,213],"a",{"href":396,"rel":397},"https:\u002F\u002Fgithub.com\u002Fstonith404\u002Fpingvin-share",[398],"nofollow"," is a tool for quickly sharing files, similar to WeTransfer. Its many sharing options (password, expiration time, custom link, etc.) make it the ideal tool for sharing files quickly. Pingvin can also create ",[401,402,403],"em",{},"upload requests",", i.e. a shareable link you can send to someone so they can upload their files for you to retrieve.",[391,406,407],{},[408,409],"img",{"alt":410,"src":411},"picture","\u002Fimg\u002Fserveex\u002Fpingvin.png",[413,414,416],"h2",{"id":415},"installation","Installation",[418,419,421,426,438,644,652,740,747],"steps",{"level":420},"3",[422,423,425],"h3",{"id":424},"deploy-the-stack","Deploy the stack",[391,427,428,429,433,434,437],{},"Open Dockge, click ",[430,431,432],"code",{},"compose",", name the stack ",[430,435,436],{},"pingvin",", then copy-paste this:",[439,440,446],"pre",{"className":441,"code":442,"filename":443,"language":444,"meta":445,"style":445},"language-yaml shiki shiki-themes github-dark material-theme github-dark","---\nservices:\n  pingvin-share:\n    container_name: pingvin\n    image: stonith404\u002Fpingvin-share\n    restart: unless-stopped\n    ports:\n      - 3600:3000\n    volumes:\n      - \u002Fsrv\u002Fdocker\u002Fpingvin\u002Fdata:\u002Fopt\u002Fapp\u002Fbackend\u002Fdata\n      - \u002Fsrv\u002Fdocker\u002Fpingvin\u002Fdata\u002Fimg:\u002Fopt\u002Fapp\u002Ffrontend\u002Fpublic\u002Fimg\n      - \u002Fsrv\u002Fdocker\u002Fpingvin\u002Fuploads:\u002Fopt\u002Fapp\u002Fbackend\u002Fuploads # path to the folder where you want to store files uploaded to pingvin. Change to your preference.\n    depends_on:\n      clamav:\n        condition: service_healthy\n    networks:\n      - swag\n\n  clamav: #antivirus for the files\n    restart: unless-stopped\n    image: clamav\u002Fclamav\n","compose.yaml","yaml","",[430,447,448,457,468,476,489,500,511,519,528,536,544,552,564,572,580,591,599,607,614,625,634],{"__ignoreMap":445},[449,450,453],"span",{"class":451,"line":452},"line",1,[449,454,456],{"class":455},"sEgDM","---\n",[449,458,460,464],{"class":451,"line":459},2,[449,461,463],{"class":462},"sRuoG","services",[449,465,467],{"class":466},"s8jd1",":\n",[449,469,471,474],{"class":451,"line":470},3,[449,472,473],{"class":462},"  pingvin-share",[449,475,467],{"class":466},[449,477,479,482,485],{"class":451,"line":478},4,[449,480,481],{"class":462},"    container_name",[449,483,484],{"class":466},":",[449,486,488],{"class":487},"s11XM"," pingvin\n",[449,490,492,495,497],{"class":451,"line":491},5,[449,493,494],{"class":462},"    image",[449,496,484],{"class":466},[449,498,499],{"class":487}," stonith404\u002Fpingvin-share\n",[449,501,503,506,508],{"class":451,"line":502},6,[449,504,505],{"class":462},"    restart",[449,507,484],{"class":466},[449,509,510],{"class":487}," unless-stopped\n",[449,512,514,517],{"class":451,"line":513},7,[449,515,516],{"class":462},"    ports",[449,518,467],{"class":466},[449,520,522,525],{"class":451,"line":521},8,[449,523,524],{"class":466},"      -",[449,526,527],{"class":487}," 3600:3000\n",[449,529,531,534],{"class":451,"line":530},9,[449,532,533],{"class":462},"    volumes",[449,535,467],{"class":466},[449,537,539,541],{"class":451,"line":538},10,[449,540,524],{"class":466},[449,542,543],{"class":487}," \u002Fsrv\u002Fdocker\u002Fpingvin\u002Fdata:\u002Fopt\u002Fapp\u002Fbackend\u002Fdata\n",[449,545,547,549],{"class":451,"line":546},11,[449,548,524],{"class":466},[449,550,551],{"class":487}," \u002Fsrv\u002Fdocker\u002Fpingvin\u002Fdata\u002Fimg:\u002Fopt\u002Fapp\u002Ffrontend\u002Fpublic\u002Fimg\n",[449,553,555,557,560],{"class":451,"line":554},12,[449,556,524],{"class":466},[449,558,559],{"class":487}," \u002Fsrv\u002Fdocker\u002Fpingvin\u002Fuploads:\u002Fopt\u002Fapp\u002Fbackend\u002Fuploads",[449,561,563],{"class":562},"sDvJj"," # path to the folder where you want to store files uploaded to pingvin. Change to your preference.\n",[449,565,567,570],{"class":451,"line":566},13,[449,568,569],{"class":462},"    depends_on",[449,571,467],{"class":466},[449,573,575,578],{"class":451,"line":574},14,[449,576,577],{"class":462},"      clamav",[449,579,467],{"class":466},[449,581,583,586,588],{"class":451,"line":582},15,[449,584,585],{"class":462},"        condition",[449,587,484],{"class":466},[449,589,590],{"class":487}," service_healthy\n",[449,592,594,597],{"class":451,"line":593},16,[449,595,596],{"class":462},"    networks",[449,598,467],{"class":466},[449,600,602,604],{"class":451,"line":601},17,[449,603,524],{"class":466},[449,605,606],{"class":487}," swag\n",[449,608,610],{"class":451,"line":609},18,[449,611,613],{"emptyLinePlaceholder":612},true,"\n",[449,615,617,620,622],{"class":451,"line":616},19,[449,618,619],{"class":462},"  clamav",[449,621,484],{"class":466},[449,623,624],{"class":562}," #antivirus for the files\n",[449,626,628,630,632],{"class":451,"line":627},20,[449,629,505],{"class":462},[449,631,484],{"class":466},[449,633,510],{"class":487},[449,635,637,639,641],{"class":451,"line":636},21,[449,638,494],{"class":462},[449,640,484],{"class":466},[449,642,643],{"class":487}," clamav\u002Fclamav\n",[645,646,647,648,651],"note",{},"From here on, we assume the network name for Swag is ",[430,649,650],{},"swag_default",".",[653,654,655,663],"tip",{"icon":445},[391,656,657,658,662],{},"✨ ",[659,660,661],"strong",{},"Tip:"," Add the watchtower label to each container to automate updates.",[439,664,666],{"className":441,"code":665,"filename":443,"language":444,"meta":445,"style":445},"services:\n  pingvin-share:\n    #...\n    labels:\n\n      - com.centurylinklabs.watchtower.enable=true\n  \n  clamav:\n    #...\n    labels:\n\n      - com.centurylinklabs.watchtower.enable=true\n```\n",[430,667,668,674,680,685,692,696,703,709,715,719,725,729,735],{"__ignoreMap":445},[449,669,670,672],{"class":451,"line":452},[449,671,463],{"class":462},[449,673,467],{"class":466},[449,675,676,678],{"class":451,"line":459},[449,677,473],{"class":462},[449,679,467],{"class":466},[449,681,682],{"class":451,"line":470},[449,683,684],{"class":562},"    #...\n",[449,686,687,690],{"class":451,"line":478},[449,688,689],{"class":462},"    labels",[449,691,467],{"class":466},[449,693,694],{"class":451,"line":491},[449,695,613],{"emptyLinePlaceholder":612},[449,697,698,700],{"class":451,"line":502},[449,699,524],{"class":466},[449,701,702],{"class":487}," com.centurylinklabs.watchtower.enable=true\n",[449,704,705],{"class":451,"line":513},[449,706,708],{"class":707},"slcoZ","  \n",[449,710,711,713],{"class":451,"line":521},[449,712,619],{"class":462},[449,714,467],{"class":466},[449,716,717],{"class":451,"line":530},[449,718,684],{"class":562},[449,720,721,723],{"class":451,"line":538},[449,722,689],{"class":462},[449,724,467],{"class":466},[449,726,727],{"class":451,"line":546},[449,728,613],{"emptyLinePlaceholder":612},[449,730,731,733],{"class":451,"line":554},[449,732,524],{"class":466},[449,734,702],{"class":487},[449,736,737],{"class":451,"line":566},[449,738,739],{"class":707},"```\n",[391,741,742,743,746],{},"Deploy the container and go to ",[430,744,745],{},"http:\u002F\u002Fyourserverip:3600",". That's it! Your Pingvin web UI instance is up and running!",[422,748,750],{"id":749},"done","Done !",[752,753,754,757],"caution",{},[659,755,756],{},"If it fails:"," check your firewall rules.",[413,759,761],{"id":760},"exposing-pingvin-with-swag","Exposing Pingvin with Swag",[391,763,764],{},"The whole point of a solution like this is being able to access it remotely, from all your devices. To do this, we'll expose Pingvin through Swag.",[645,766,767,768,771,772,775,777,778,781,782,785,786,789,790,794,795,799,800,803,804,806,807,651],{"icon":445},"📋 ",[659,769,770],{},"Prerequisite:"," ",[773,774],"br",{},[773,776],{},"\nWe assume you have the subdomain ",[430,779,780],{},"pingvin.mydomain.com"," with a ",[430,783,784],{},"CNAME"," pointing to ",[430,787,788],{},"mydomain.com"," in your ",[394,791,793],{"href":792},"\u002Fgeneral\u002Fnetworking\u002Fdns","DNS zone",". And of course, ",[394,796,798],{"href":797},"\u002Fserveex\u002Fsecurity\u002Fcloudflare","unless you're using Cloudflare Zero Trust",", port ",[430,801,802],{},"443"," on your router is forwarded to port ",[430,805,802],{}," on your server via ",[394,808,810],{"href":809},"\u002Fgeneral\u002Fnetworking\u002Fnat","NAT rules",[418,812,813,817,820,939,950,953,957,964,973,992,995,1371,1387],{"level":420},[422,814,816],{"id":815},"add-pingvins-network-to-swag","Add Pingvin's network to SWAG",[391,818,819],{},"In Dockge, go to the SWAG stack and edit the compose file to add the pingvin network:",[439,821,823],{"className":441,"code":822,"filename":443,"language":444,"meta":445,"style":445},"---\nservices:\n  swag:\n     container_name: # ...\n      # ... \n     networks:             # Connects the container to the custom network \n      # ...           \n      - pingvin            # Name of the network declared in the stack\n    \nnetworks:                  # Defines the custom network\n  # ...\n  pingvin:                 # Name of the network declared in the stack\n    name: pingvin_default  # Actual name of the external network\n    external: true         # States that it's a network to look up externally\n",[430,824,825,829,835,842,852,857,867,872,882,887,897,902,912,925],{"__ignoreMap":445},[449,826,827],{"class":451,"line":452},[449,828,456],{"class":455},[449,830,831,833],{"class":451,"line":459},[449,832,463],{"class":462},[449,834,467],{"class":466},[449,836,837,840],{"class":451,"line":470},[449,838,839],{"class":462},"  swag",[449,841,467],{"class":466},[449,843,844,847,849],{"class":451,"line":478},[449,845,846],{"class":462},"     container_name",[449,848,484],{"class":466},[449,850,851],{"class":562}," # ...\n",[449,853,854],{"class":451,"line":491},[449,855,856],{"class":562},"      # ... \n",[449,858,859,862,864],{"class":451,"line":502},[449,860,861],{"class":462},"     networks",[449,863,484],{"class":466},[449,865,866],{"class":562},"             # Connects the container to the custom network \n",[449,868,869],{"class":451,"line":513},[449,870,871],{"class":562},"      # ...           \n",[449,873,874,876,879],{"class":451,"line":521},[449,875,524],{"class":466},[449,877,878],{"class":487}," pingvin",[449,880,881],{"class":562},"            # Name of the network declared in the stack\n",[449,883,884],{"class":451,"line":530},[449,885,886],{"class":707},"    \n",[449,888,889,892,894],{"class":451,"line":538},[449,890,891],{"class":462},"networks",[449,893,484],{"class":466},[449,895,896],{"class":562},"                  # Defines the custom network\n",[449,898,899],{"class":451,"line":546},[449,900,901],{"class":562},"  # ...\n",[449,903,904,907,909],{"class":451,"line":554},[449,905,906],{"class":462},"  pingvin",[449,908,484],{"class":466},[449,910,911],{"class":562},"                 # Name of the network declared in the stack\n",[449,913,914,917,919,922],{"class":451,"line":566},[449,915,916],{"class":462},"    name",[449,918,484],{"class":466},[449,920,921],{"class":487}," pingvin_default",[449,923,924],{"class":562},"  # Actual name of the external network\n",[449,926,927,930,932,936],{"class":451,"line":574},[449,928,929],{"class":462},"    external",[449,931,484],{"class":466},[449,933,935],{"class":934},"s08Ry"," true",[449,937,938],{"class":562},"         # States that it's a network to look up externally\n",[645,940,941,942,945,946,651],{},"From here on, we assume the pingvin network name is ",[430,943,944],{},"pingvin_default",". You can verify the connection is working by visiting the SWAG dashboard at ",[394,947,948],{"href":948,"rel":949},"http:\u002F\u002Fyourserverip:81",[398],[391,951,952],{},"Redeploy the stack by clicking \"deploy\" and wait for SWAG to be fully up.",[422,954,956],{"id":955},"create-the-subdomainconf-file","Create the subdomain.conf file",[391,958,959,960,963],{},"In the Swag folders, create the ",[430,961,962],{},"pingvin.subdomain.conf"," file.",[653,965,657,967,969,970,972],{"icon":445,"to":966},"\u002Fserveex\u002Ffiles\u002Ffile-browser-quantum",[659,968,661],{}," you can use ",[659,971,209],{}," to browse your files and edit your documents instead of using terminal commands.",[439,974,979],{"className":975,"code":976,"filename":977,"language":978,"meta":445,"style":445},"language-bash shiki shiki-themes github-dark material-theme github-dark","sudo nano \u002Fsrv\u002Fdocker\u002Fswag\u002Fconfig\u002Fnginx\u002Fproxy-confs\u002Fpingvin.subdomain.conf\n","Terminal","bash",[430,980,981],{"__ignoreMap":445},[449,982,983,986,989],{"class":451,"line":452},[449,984,985],{"class":455},"sudo",[449,987,988],{"class":487}," nano",[449,990,991],{"class":487}," \u002Fsrv\u002Fdocker\u002Fswag\u002Fconfig\u002Fnginx\u002Fproxy-confs\u002Fpingvin.subdomain.conf\n",[391,993,994],{},"Paste the configuration below:",[439,996,1000],{"className":997,"code":998,"filename":962,"language":999,"meta":445,"style":445},"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 pingvin.*;\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 pingvin;\n        set $upstream_port 3000;\n        set $upstream_proto http;\n        proxy_pass $upstream_proto:\u002F\u002F$upstream_app:$upstream_port;\n\n    }\n}\n\n","nginx",[430,1001,1002,1007,1011,1020,1035,1044,1048,1058,1062,1072,1076,1086,1090,1095,1100,1134,1138,1143,1148,1152,1157,1162,1167,1173,1179,1184,1196,1202,1208,1214,1219,1225,1231,1236,1242,1248,1253,1259,1265,1270,1281,1291,1304,1319,1331,1354,1359,1365],{"__ignoreMap":445},[449,1003,1004],{"class":451,"line":452},[449,1005,1006],{"class":562},"## Version 2023\u002F12\u002F19\n",[449,1008,1009],{"class":451,"line":459},[449,1010,613],{"emptyLinePlaceholder":612},[449,1012,1013,1017],{"class":451,"line":470},[449,1014,1016],{"class":1015},"sAoO4","server",[449,1018,1019],{"class":707}," {\n",[449,1021,1022,1026,1029,1032],{"class":451,"line":478},[449,1023,1025],{"class":1024},"sJPTy","    listen ",[449,1027,802],{"class":1028},"swwWl",[449,1030,1031],{"class":707}," ssl",[449,1033,1034],{"class":466},";\n",[449,1036,1037,1039,1042],{"class":451,"line":491},[449,1038,1025],{"class":1024},[449,1040,1041],{"class":707},"[::]:443 ssl",[449,1043,1034],{"class":466},[449,1045,1046],{"class":451,"line":502},[449,1047,613],{"emptyLinePlaceholder":612},[449,1049,1050,1053,1056],{"class":451,"line":513},[449,1051,1052],{"class":1024},"    server_name ",[449,1054,1055],{"class":707},"pingvin.*",[449,1057,1034],{"class":466},[449,1059,1060],{"class":451,"line":521},[449,1061,613],{"emptyLinePlaceholder":612},[449,1063,1064,1067,1070],{"class":451,"line":530},[449,1065,1066],{"class":1024},"    include ",[449,1068,1069],{"class":707},"\u002Fconfig\u002Fnginx\u002Fssl.conf",[449,1071,1034],{"class":466},[449,1073,1074],{"class":451,"line":538},[449,1075,613],{"emptyLinePlaceholder":612},[449,1077,1078,1081,1084],{"class":451,"line":546},[449,1079,1080],{"class":1024},"    client_max_body_size ",[449,1082,1083],{"class":1028},"0",[449,1085,1034],{"class":466},[449,1087,1088],{"class":451,"line":554},[449,1089,613],{"emptyLinePlaceholder":612},[449,1091,1092],{"class":451,"line":566},[449,1093,1094],{"class":562},"    #if ($lan-ip = yes) { set $geo-whitelist yes; }\n",[449,1096,1097],{"class":451,"line":574},[449,1098,1099],{"class":562},"    #if ($geo-whitelist = no) { return 404; }\n",[449,1101,1102,1106,1109,1112,1115,1118,1121,1125,1128,1131],{"class":451,"line":582},[449,1103,1105],{"class":1104},"sJLGa","    if",[449,1107,1108],{"class":707}," (",[449,1110,1111],{"class":466},"$",[449,1113,1114],{"class":707},"geo-blacklist ",[449,1116,1117],{"class":1024},"= ",[449,1119,1120],{"class":707},"no) ",[449,1122,1124],{"class":1123},"sSoIa","{ ",[449,1126,1127],{"class":1104},"return",[449,1129,1130],{"class":1028}," 404",[449,1132,1133],{"class":1123},"; }\n",[449,1135,1136],{"class":451,"line":593},[449,1137,613],{"emptyLinePlaceholder":612},[449,1139,1140],{"class":451,"line":601},[449,1141,1142],{"class":562},"    # enable for ldap auth (requires ldap-location.conf in the location block)\n",[449,1144,1145],{"class":451,"line":609},[449,1146,1147],{"class":562},"    #include \u002Fconfig\u002Fnginx\u002Fldap-server.conf;\n",[449,1149,1150],{"class":451,"line":616},[449,1151,613],{"emptyLinePlaceholder":612},[449,1153,1154],{"class":451,"line":627},[449,1155,1156],{"class":562},"    # enable for Authelia (requires authelia-location.conf in the location block)\n",[449,1158,1159],{"class":451,"line":636},[449,1160,1161],{"class":562},"    #include \u002Fconfig\u002Fnginx\u002Fauthelia-server.conf;\n",[449,1163,1165],{"class":451,"line":1164},22,[449,1166,613],{"emptyLinePlaceholder":612},[449,1168,1170],{"class":451,"line":1169},23,[449,1171,1172],{"class":562},"    # enable for Authentik (requires authentik-location.conf in the location block)\n",[449,1174,1176],{"class":451,"line":1175},24,[449,1177,1178],{"class":562},"    #include \u002Fconfig\u002Fnginx\u002Fauthentik-server.conf;\n",[449,1180,1182],{"class":451,"line":1181},25,[449,1183,613],{"emptyLinePlaceholder":612},[449,1185,1187,1190,1193],{"class":451,"line":1186},26,[449,1188,1189],{"class":1015},"    location",[449,1191,1192],{"class":455}," \u002F ",[449,1194,1195],{"class":707},"{\n",[449,1197,1199],{"class":451,"line":1198},27,[449,1200,1201],{"class":562},"        # enable the next two lines for http auth\n",[449,1203,1205],{"class":451,"line":1204},28,[449,1206,1207],{"class":562},"        #auth_basic \"Restricted\";\n",[449,1209,1211],{"class":451,"line":1210},29,[449,1212,1213],{"class":562},"        #auth_basic_user_file \u002Fconfig\u002Fnginx\u002F.htpasswd;\n",[449,1215,1217],{"class":451,"line":1216},30,[449,1218,613],{"emptyLinePlaceholder":612},[449,1220,1222],{"class":451,"line":1221},31,[449,1223,1224],{"class":562},"        # enable for ldap auth (requires ldap-server.conf in the server block)\n",[449,1226,1228],{"class":451,"line":1227},32,[449,1229,1230],{"class":562},"        #include \u002Fconfig\u002Fnginx\u002Fldap-location.conf;\n",[449,1232,1234],{"class":451,"line":1233},33,[449,1235,613],{"emptyLinePlaceholder":612},[449,1237,1239],{"class":451,"line":1238},34,[449,1240,1241],{"class":562},"        # enable for Authelia (requires authelia-server.conf in the server block)\n",[449,1243,1245],{"class":451,"line":1244},35,[449,1246,1247],{"class":562},"        #include \u002Fconfig\u002Fnginx\u002Fauthelia-location.conf;\n",[449,1249,1251],{"class":451,"line":1250},36,[449,1252,613],{"emptyLinePlaceholder":612},[449,1254,1256],{"class":451,"line":1255},37,[449,1257,1258],{"class":562},"        # enable for Authentik (requires authentik-server.conf in the server block)\n",[449,1260,1262],{"class":451,"line":1261},38,[449,1263,1264],{"class":562},"        #include \u002Fconfig\u002Fnginx\u002Fauthentik-location.conf;\n",[449,1266,1268],{"class":451,"line":1267},39,[449,1269,613],{"emptyLinePlaceholder":612},[449,1271,1273,1276,1279],{"class":451,"line":1272},40,[449,1274,1275],{"class":1024},"        include ",[449,1277,1278],{"class":707},"\u002Fconfig\u002Fnginx\u002Fproxy.conf",[449,1280,1034],{"class":466},[449,1282,1284,1286,1289],{"class":451,"line":1283},41,[449,1285,1275],{"class":1024},[449,1287,1288],{"class":707},"\u002Fconfig\u002Fnginx\u002Fresolver.conf",[449,1290,1034],{"class":466},[449,1292,1294,1297,1299,1302],{"class":451,"line":1293},42,[449,1295,1296],{"class":1024},"        set ",[449,1298,1111],{"class":466},[449,1300,1301],{"class":707},"upstream_app pingvin",[449,1303,1034],{"class":466},[449,1305,1307,1309,1311,1314,1317],{"class":451,"line":1306},43,[449,1308,1296],{"class":1024},[449,1310,1111],{"class":466},[449,1312,1313],{"class":707},"upstream_port ",[449,1315,1316],{"class":1028},"3000",[449,1318,1034],{"class":466},[449,1320,1322,1324,1326,1329],{"class":451,"line":1321},44,[449,1323,1296],{"class":1024},[449,1325,1111],{"class":466},[449,1327,1328],{"class":707},"upstream_proto http",[449,1330,1034],{"class":466},[449,1332,1334,1337,1339,1342,1344,1347,1349,1352],{"class":451,"line":1333},45,[449,1335,1336],{"class":1024},"        proxy_pass ",[449,1338,1111],{"class":466},[449,1340,1341],{"class":707},"upstream_proto:\u002F\u002F",[449,1343,1111],{"class":466},[449,1345,1346],{"class":707},"upstream_app:",[449,1348,1111],{"class":466},[449,1350,1351],{"class":707},"upstream_port",[449,1353,1034],{"class":466},[449,1355,1357],{"class":451,"line":1356},46,[449,1358,613],{"emptyLinePlaceholder":612},[449,1360,1362],{"class":451,"line":1361},47,[449,1363,1364],{"class":707},"    }\n",[449,1366,1368],{"class":451,"line":1367},48,[449,1369,1370],{"class":707},"}\n",[391,1372,1373,1374,1378,1379,1382,1383,1386],{},"Press ",[1375,1376],"kbd",{"value":1377},"Ctrl+O",", then ",[1375,1380],{"value":1381},"Enter"," to save, and ",[1375,1384],{"value":1385},"Ctrl+X"," to exit.",[422,1388,750],{"id":1389},"done-1",[391,1391,1392],{},"That's it, you've exposed Pingvin!",[413,1394,1396],{"id":1395},"protecting-pingvin-with-pocket-id","Protecting Pingvin with Pocket ID",[391,1398,1399],{},"Pingvin supports OIDC natively, so you can require a Pocket ID login before letting anyone share or receive files, instead of (or alongside) the app's own accounts.",[418,1401,1402,1406,1416,1424,1428,1435,1481],{"level":420},[422,1403,1405],{"id":1404},"register-pingvin-as-an-oidc-client","Register Pingvin as an OIDC client",[391,1407,1408,1412,1413,1415],{},[394,1409,1411],{"href":1410},"\u002Fserveex\u002Fsecurity\u002Fpocket-id#registering-an-oidc-client","Register an OIDC client in Pocket ID"," named ",[430,1414,436],{},", with this callback URL:",[439,1417,1422],{"className":1418,"code":1420,"language":1421,"meta":445},[1419],"language-text","https:\u002F\u002Fpingvin.yourdomain.com\u002Fapi\u002Foauth\u002Fcallback\u002Foidc\n","text",[430,1423,1420],{"__ignoreMap":445},[422,1425,1427],{"id":1426},"enable-social-login-in-pingvin","Enable Social Login in Pingvin",[391,1429,1430,1431,1434],{},"In Pingvin, go to ",[401,1432,1433],{},"Administration > Configuration > Social Login"," and fill in:",[1436,1437,1438,1451],"table",{},[1439,1440,1441],"thead",{},[1442,1443,1444,1448],"tr",{},[1445,1446,1447],"th",{},"Field",[1445,1449,1450],{},"Value",[1452,1453,1454,1463,1471],"tbody",{},[1442,1455,1456,1460],{},[1457,1458,1459],"td",{},"OpenID Connect",[1457,1461,1462],{},"Enabled",[1442,1464,1465,1468],{},[1457,1466,1467],{},"Discovery URI",[1457,1469,1470],{},"Pocket ID's OIDC discovery URL",[1442,1472,1473,1476],{},[1457,1474,1475],{},"Scope",[1457,1477,1478],{},[430,1479,1480],{},"openid email profile groups",[422,1482,750],{"id":1483},"done-2",[391,1485,1486],{},"That's it! From now on, when you log in to Pingvin, an \"Open ID\" button will be available below the login form.",[653,1488,1489,1496],{"icon":445},[391,1490,1491,1492,1495],{},"✨ You can use ",[394,1493,255],{"href":1494},"\u002Fserveex\u002Fadvanced\u002Fauthentik"," instead of Pocket ID:",[1497,1498,1500],"collapsible",{"name":1499},"the Authentik setup steps",[418,1501,1503,1508,1511,1515,1529,1540,1544,1550,1555,1559,1562,1566,1573,1610],{"level":1502},"4",[1504,1505,1507],"h4",{"id":1506},"create-an-oauth2openid-provider","Create an OAuth2\u002FOpenID provider",[391,1509,1510],{},"In your Authentik admin area, create an OAuth2\u002FOpenID provider.",[1504,1512,1514],{"id":1513},"configure-the-provider","Configure the provider",[391,1516,1517,1518,1520,1521,1524,1525,1528],{},"Fill in each section as follows, replacing ",[430,1519,788],{}," with your own domain. Copy the ",[430,1522,1523],{},"Client ID"," and ",[430,1526,1527],{},"Client Secret"," fields somewhere safe.",[391,1530,1531,1534,1537],{},[408,1532],{"alt":410,"src":1533},"\u002Fimg\u002Fserveex\u002Fpingvin-auth1.png",[408,1535],{"alt":410,"src":1536},"\u002Fimg\u002Fserveex\u002Fpingvin-auth2.png",[408,1538],{"alt":410,"src":1539},"\u002Fimg\u002Fserveex\u002Fpingvin-auth3.png",[1504,1541,1543],{"id":1542},"create-the-application","Create the application",[391,1545,1546,1547,1549],{},"Save and create a ",[430,1548,436],{}," application as follows.",[391,1551,1552],{},[408,1553],{"alt":410,"src":1554},"\u002Fimg\u002Fserveex\u002Fpingvin-auth4.png",[1504,1556,1558],{"id":1557},"add-the-provider-to-your-outpost","Add the provider to your outpost",[391,1560,1561],{},"Save and go to your list of outposts. Add the pingvin provider to your outpost.",[1504,1563,1565],{"id":1564},"configure-pingvins-oauth-settings","Configure Pingvin's OAuth settings",[391,1567,1568,1569,1572],{},"Leave Authentik, and go to Pingvin's admin interface. In the ",[401,1570,1571],{},"\"OAuth\""," section, fill in the following fields:",[1574,1575,1576,1590,1598,1604],"ul",{},[1577,1578,1579,1582,1583,1586,1587,1589],"li",{},[430,1580,1581],{},"OpenID discovery URI"," with ",[430,1584,1585],{},"https:\u002F\u002Fpingvin.mydomain.com\u002Fapplication\u002Fo\u002Fpingvin\u002F.well-known\u002Fopenid-configuration"," (don't forget to replace ",[430,1588,788],{}," with your own domain)",[1577,1591,1592,1582,1595],{},[430,1593,1594],{},"OpenID username claim",[430,1596,1597],{},"preferred_username",[1577,1599,1600,1603],{},[430,1601,1602],{},"OpenID client ID"," with the ID you copied in step 2.",[1577,1605,1606,1609],{},[430,1607,1608],{},"OpenID client secret"," with the token you copied in step 2.",[1504,1611,750],{"id":1612},"done-3",[1614,1615,1616],"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 .s08Ry, html code.shiki .s08Ry{--shiki-light:#79B8FF;--shiki-default:#FF9CAC;--shiki-dark:#79B8FF}html pre.shiki code .sAoO4, html code.shiki .sAoO4{--shiki-light:#F97583;--shiki-default:#C792EA;--shiki-dark:#F97583}html pre.shiki code .sJPTy, html code.shiki .sJPTy{--shiki-light:#F97583;--shiki-default:#89DDFF;--shiki-dark:#F97583}html pre.shiki code .swwWl, html code.shiki .swwWl{--shiki-light:#79B8FF;--shiki-default:#F78C6C;--shiki-dark:#79B8FF}html pre.shiki code .sJLGa, html code.shiki .sJLGa{--shiki-light:#F97583;--shiki-light-font-style:inherit;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .sSoIa, html code.shiki .sSoIa{--shiki-light:#E1E4E8;--shiki-default:#F07178;--shiki-dark:#E1E4E8}",{"title":445,"searchDepth":459,"depth":459,"links":1618},[1619,1623,1628],{"id":415,"depth":459,"text":416,"children":1620},[1621,1622],{"id":424,"depth":470,"text":425},{"id":749,"depth":470,"text":750},{"id":760,"depth":459,"text":761,"children":1624},[1625,1626,1627],{"id":815,"depth":470,"text":816},{"id":955,"depth":470,"text":956},{"id":1389,"depth":470,"text":750},{"id":1395,"depth":459,"text":1396,"children":1629},[1630,1631,1632],{"id":1404,"depth":470,"text":1405},{"id":1426,"depth":470,"text":1427},{"id":1483,"depth":470,"text":750},[1634],"Djeex","Install Pingvin Share, a self-hosted file sharing platform to send files securely without relying on WeTransfer or Google Drive.","md",null,{},{"title":213,"description":1635},"2eK6HGvFxFU2m-VEMOtf0MIp_K-2QzP_hhe8ZvTqx4o",[1642,1644],{"title":209,"path":210,"stem":211,"description":1643,"children":-1},"Install File Browser Quantum, a modernized fork of File Browser, to browse and manage your server files from a fast web interface.",{"title":223,"path":224,"stem":225,"description":1645,"children":-1},"Install code-server to run VS Code in your browser from your homelab, mount folders and expose it securely with SWAG.",1788645847900]