ç§ã¯ãã€ããŠã§ãäžã«å人çãªã¹ããŒã¹ãæã¡ãããšæã£ãŠããŸããããã¹ãŠãç§ã«ãšã£ãŠäŸ¿å©ãªããã«é 眮ãããå Žæãç§ã¯ãèªåã®ããŒãºã«å¿ããŠè£ åã§ããå®äŸ¡ãªVPSãšããŠæè¯ã®ãœãªã¥ãŒã·ã§ã³ãèŠãŸãããé·ãéããã®åé¡ã®è§£æ±ºçã«åãçµãããšã¯ã§ããŸããã§ããããã©ãããããããæãéãã®ãœãããŠã§ã¢ç°å¢ãæŽçã§ããããŒã«ã®ã»ãããæãæµ®ãã³ãŸããã
ãããã¯ãŒã¯äžã«ç¬èªã®ããŒãœãã«ã¹ããŒã¹ãäœæãããããã©ãããå§ããã°ãããããããªãå ŽåããŸãã¯DockerãPortainerãTraefikãªã©ã®ãã°ããããœãããŠã§ã¢è£œåã«èå³ãããå Žåã¯ãcatã®äžã§æè¿ããŸãã
åæžã
æ£çŽãªãšãããç§ã¯ã³ãã³ãã©ã€ã³ãããŸã奜ãã§ã¯ãããŸãããã€ãŸãããªãœãŒã¹ãã»ãšãã©å¿ èŠãšããªãã軜ããŠãããã«ã§ãŠãããŒãµã«ãªã€ã³ã¿ãŒãã§ãŒã¹ã®ã¢ã€ãã¢ã奜ãã§ãããã«ãŒãœã«ãç¹æ» ããŠããé»ããŠã£ã³ããŠã¯ãã€ã©ã€ã©ããŠç¡åã«æããŸãããããŠãç§ã¯ãããã©ãããæã«å ¥ããã®ãããç¥ã£ãŠããŸãã
ç§ãç ç©¶æã§å匷ããŠãããšãïŒããã¯ã«ãŒãã䜿ã£ãã€ã³ã¿ãŒããããšæåã®ã€ã³ã¿ãŒãããã«ãã§ãç§ã®è¡ã«çŸããã°ããã®æã§ãïŒããã®æãŸã§ã«åŠç§ã®ç ç©¶å®€å©æãšããŠä»äºãåŸãããšãã§ããç§ã®å人ã³ã³ãã¥ãŒã¿ãµã€ãšã³ã¹ã¯ãç©æ¥µçã«ç§ãLinuxã«å€¢äžã«ãããããšããŸããããããŠãããã§ç§ã¯ãèªåèªèº«ãé«åºŠãªã³ã³ãã¥ãŒã¿ãŒãµã€ãšã³ãã£ã¹ããšèããŠãããããããäœçŸãã®Windowsã€ã³ã¹ããŒã«ã®çµéšãããã忥åŸã«åž°å® ããèªä¿¡ãæã£ãŠLinuxãã£ã¹ããªãã¥ãŒã·ã§ã³ãããã®ãã£ã¹ã¯ããã©ã€ãã«æ¿å ¥ããŸã...ã§ã¯ãã©ãããŸããïŒãããŠäœãã
äœå¹Žãã®éãç§ã¯ãã¹ãŠã®è©³çްãèŠããŠããŸãããããããããã確ç«ããããšããã§ããŸãããããããããã倱æããããŸãã-ç§ã¯ãã äœããã¹ããçè§£ããŠããŸããã§ããã Windowsã§æ©èœããŠããéåžžã®æ¹æ³-ãã¹ãŠãæ©èœãããŸã§ïŒãŸãã¯å®å šã«æ©èœããªããªããŸã§ãããŸããŸãªèšå®ãå«ããŠã³ã³ãããŒã«ããã«ãã©ã³ãã ã«èª¿ã¹ãŸãããWindowsãåã€ã³ã¹ããŒã«ããŠæåããããçŽãããšãã§ããŸããïŒãããã§ã¯æ©èœããŸããã§ãããç§ãæã£ãŠããã®ã¯ãäœåºŠãäœåºŠãç©äºã埮調æŽãã詊ã¿ãæåŠããã³ã³ãœãŒã«ã ãã§ããã Linuxã«é¢ããæ¬ãæã£ãŠããã®ãèŠããŠããŸãããããããŸã£ãã圹ã«ç«ã¡ãŸããã§ãããããã§äžããããã³ãã³ãã¯ãäœããã®çç±ã§ãäœããã®çç±ã§æ©èœããŸããã§ãããäžè¬çã«ãæ°æ¥éèŠããã åŸãç§ã¯Linuxã¯ããçš®ã®ãã³ã»ã³ã¹ã§ãããšèªåã§å€æããå®å¿ããŠéåžžã®Windowsã«æ»ããŸããã
Linuxããã¹ã¿ãŒããããšãã詊ã¿ããããäœåºŠãäœåºŠã圌ã®ãã¡ã³ãšäžç·ã«ç§ãé£ããŠè¡ãã圌ãã¯ç§ã圌ãã®ãã£ã³ãã«åŒããã蟌ãããšããŸãããç§ã¯ã©ããããããã²ã³ããå ¥ããããšããŸããïŒãã¡ãããç§ã¯ãããè¡ãæ¹æ³ã®ã¹ããããã€ã¹ãããã¬ã€ãïŒããããã³ã³ãœãŒã«ã®åªããç§ã®äžã«æµ®ããã§ã倱æãããã³ã«åãç¡åæã匷ããªããŸããããã¹ãŠã®èšå®ãäžç®ã§ãããWindowsã®ã°ã©ãã£ã«ã«ã€ã³ã¿ãŒãã§ã€ã¹ãã³ã³ãœãŒã«ãšè¡çªããåŸãèŠç¥ãã¬å Žæã§ã¿ããããŠèªåã®éãèŠã€ããããšããŠãç§ã¯ç²ç®ã§ããããã®ãããéåžžã«é·ãéãç§ã¯Microsoftãã¯ãããžã¹ã¿ãã¯ã®ãµããŒã¿ãŒã§ãããVisualStudioã䜿çšããŠ.netã§ããã°ã©ãã³ã°ããŠããŸããïŒãŽãŒãžã£ã¹ã§ãã³ã³ãœãŒã«ã¯ãããŸããïŒãå³å¯ã«å€æããªãã§ãã ãããããããããã®ãšãã«Linuxãä»®æ³ãã·ã³ã«é 眮ããæ©äŒããã£ãã®ã§ã¯ãªãã§ããããããããšæå ã«ãããŸãšããªã€ã³ã¿ãŒãããã«å·éã«å¯ŸåŠããããã«ããã®è©±ã¯å®å šã«ç°ãªãæ¹åã«é²ãã§ãããã
ä»ããã¹ãŠãå€ãããŸãããçŸä»£çãªåœ¢ã®Webãç§ãã¡ã®ç掻ã«ç»å Žããã®ã§ãç§ã¯Node.jsã«åãæ¿ããwilly-nillyã¯ã³ã³ãœãŒã«ãšLinuxã®ã€ããªãã®ãŒã«æã¿èŸŒã¿å§ããŸãããéçºããã¹ãããããã«VPSãå¿ èŠã§ããããWindowsãæèŒããVPSã®æ¹ãã¯ããã«é«äŸ¡ã§ããããšã倿ãããããã³ã³ãœãŒã«ã«å¯Ÿããæ¬²æ±äžæºãããã¬ãšã«ãäžåããé«éã€ã³ã¿ãŒãããã®ååšã«ãããæ°ããçããå³åº§ã«èŠã€ããããšãã§ããŸããã質åã
ç§ã¯sshã®äœ¿ãæ¹ãåŠã³ãgitã®åã«æ°ã¥ããdockerãç©æ¥µçã«äœ¿ãå§ããŸããããã¿ã¹ã¯ã«ã°ã©ãã£ã«ã«ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããããšã奜ãã§ãããã®èšäºã§ã¯ã次ã®ããšãã§ãããã°ãããããŒã«ã»ããã玹ä»ããŸããããäžåºŠã³ã³ãœãŒã«ãåç §ããã®ã§ã¯ãªããæ¥åžžã®ã¿ã¹ã¯ã解決ããŸãã
æºå
äžã®ïŒ20ã®ã¬ãã€ãïŒ1åã®ã³ã¢ãRAMïŒ1 GBãã®NVMeã®vCPUïŒIã¯ãæå°æ§æã®VPSãäœæ macloudãVPSã«ã€ã³ã¹ããŒã«ããå Žåã¯ãDebian 10ãã£ã¹ããªãã¥ãŒã·ã§ã³ãéžæããŸãããã€ã³ã¹ããŒã«ãããšãã¯ãããã«ã³ã³ãããŒã«ããã«ããSSHããŒã远å ããã®ã§ãSSHã¯ã©ã€ã¢ã³ãã䜿çšããŠã³ã³ãœãŒã«ã«å ¥ãã®ã«äŸ¿å©ã§ããããã«å®éšããã«ã¯ã次ã®ãã®ãå¿ èŠã«ãªããŸãã
- ã·ã¹ãã ãæŽæ°ãã
- dockerãšdocker-composeãã€ã³ã¹ããŒã«ããŸã
- ã¹ã¯ãããã¡ã€ã«ãå«ããŸãã
次ã®ã³ãã³ãã䜿çšããŠããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãæŽæ°ã§ããŸãã
# apt update
# apt upgrade
, .
dockerãã€ã³ã¹ããŒã«ããã«ã¯ãå ¬åŒã®æé https://docs.docker.com/engine/install/debian/ã« åŸã£ãŠ ãã ããã
å¿ èŠãªäŸåé¢ä¿ãã€ã³ã¹ããŒã«ããŸãã
# apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
å ¬åŒã®DockerGPGããŒã远å ããŸãã
# curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
ãªããžããªã远å ããŸãã
# echo «deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable» | tee /etc/apt/sources.list.d/docker.list > /dev/null
ããã±ãŒãžãªã¹ããæŽæ°ããå¿ èŠããããŸãã
# apt-get update
Dockerãã€ã³ã¹ããŒã«ããŸãã
# apt-get install docker-ce docker-ce-cli containerd.io
次ã®ã³ãã³ããå®è¡ãããšããã¹ãŠãæ£ããã€ã³ã¹ããŒã«ãããŠããããšã確èªã§ããŸãã
# docker run hello-world
æšæ¶ã衚瀺ãããã°ããã¹ãŠããŸããããŸããããã®èšäºã®å·çæç¹ã§ã¯ã次ã®ããŒãžã§ã³ãã€ã³ã¹ããŒã«ãããŠããŸãã
# docker -v
Docker version 20.10.6, build 370c289
次ã«ãdocker-composeãã€ã³ã¹ããŒã«ããå¿ èŠããããŸãããããè¡ãã«ã¯ãå ¬åŒã®æé ã䜿çšããŸãïŒ
https ïŒ //docs.docker.com/compose/install/
ãŸããdocker-composeã®ææ°ãªãªãŒã¹ãžã®ãªã³ã¯ãååŸããå¿ èŠããããŸãããªãªãŒã¹ã®ãªã¹ãã¯ããã«ãããŸãïŒhttps ïŒ //github.com/docker/compose/releases
ãã®èšäºã®å·çæç¹ã§ã¯ãææ°ããŒãžã§ã³ã¯1.29.2ã§ãããLinuxããŒãžã§ã³ãå¿ èŠãªã®ã§ãdocker-compose-Linux-x86_64ãšãããã¡ã€ã«ãéžæããŸãããªã³ã¯ãã³ããŒããŸããããæ¬¡ã«ãã³ã³ãœãŒã«ã§æ¬¡ã®ã³ãã³ããå ¥åããå¿ èŠããããŸãïŒäžèšã§åãåã£ããªã³ã¯ãé©åãªå Žæã«è²Œãä»ããŸãïŒã
# curl -L "< >" -o /usr/local/bin/docker-compose
ç§ã®å Žåãæ¬¡ã®ããã«ãªããŸããã
# curl -L «https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64» -o /usr/local/bin/docker-compose
ã³ãã³ããå®è¡ããdocker-composeãã€ããªãããŠã³ããŒãããŸãã
æåŸã®ã¹ãããã¯ãå®è¡æš©éãèšå®ããããšã§ããããã¯ã次ã®ã³ãã³ãã§å®è¡ã§ããŸãã
# chmod +x /usr/local/bin/docker-compose
ãã¹ãŠãããŸãããã°ãã€ã³ã¹ããŒã«ããã»ã¹ã¯çµäºããdocker-composeã®ããŒãžã§ã³ã確èªã§ããŸããç§ã¯ããããã®ããã«æã«å ¥ããŸããïŒ
# docker-compose -v
docker-compose version 1.29.2, build 5becea4c
æåŸã®ã¹ãããã¯ãããŒãžã³ã°ãã¡ã€ã«ãæå¹ã«ããããšã§ããã¡ã¢ãªã®éãå°ãªãå Žåãããã¯ééããªãäžèŠã§ã¯ãããŸããã4GBã®
ãã¡ã€ã«ãäœæããŸãã
# fallocate -l 4G /swapfile
ããã«å¿ èŠãªæš©å©ãå²ãåœãŠãŸãããïŒ
# chmod 600 /swapfile
ã¹ã¯ãããã¡ã€ã«ãšããŠåæåããŸãããïŒ
# mkswap /swapfile
æåŸã«ã以äžãã¢ã¯ãã£ãã«ããŸãã
# swapon /swapfile
freeã³ãã³ãã䜿çšããŠãããŒãžã³ã°ãã¡ã€ã«ãã·ã¹ãã ã«è¡šç€ºãããŠãããã©ããã確èªã§ããŸããç§ã¯ããããã¹ãŠæã«å ¥ããŸããïŒ
# free
total used free shared buff/cache available
Mem: 1010900 150500 143788 2892 716612 714916
Swap: 4194300 0 4194300
æåŸã®ã¹ãããã1ã€æ®ã£ãŠããŸããåèµ·ååŸãããŒãžã³ã°ãã¡ã€ã«ãã¢ã¯ãã£ããªãŸãŸã«ããã«ã¯ã/ etc / fstabãã¡ã€ã«ã«æ¬¡ã®è¡ã远å ããŸãã
/swapfile swap swap defaults 0 0
ãã®ãããªã¿ã¹ã¯ã«ã¯ãMidnightCommanderãã¡ã€ã«ãããŒãžã£ãŒã䜿çšããã®ã奜ãã§ããããã¯ãã¯ã©ã·ãã¯ãªã€ã³ã¿ãŒãã§ã€ã¹ãåããã³ã³ãœãŒã«ãã¡ã€ã«ãããŒãžã£ãŒã§ããNorton Commander / FAR / TotalCommanderã«åºããããããšãããã°ããã®äœ¿ç𿹿³ãç°¡åã«çè§£ã§ããŸããæ¬¡ã®ã³ãã³ãã§ã€ã³ã¹ããŒã«ã§ããŸãã
# apt-get install mc
ãããŠãã³ãã³ãã§å®è¡ããŸã
# mc
çã ããã»ã©ããªãã¿ã®åçãèŠãŠã¿ãŸãããã
次ã«ãå¿ èŠãªãã¡ã€ã«ãèŠã€ããŠç·šéããŸãã
ããã§äºåèšå®ã¯å®äºã§ããæ¬¡ã«é²ãããšãã§ããŸãã
ããŒãããŒ
æåã«ç޹ä»ãããããŒã«ã¯Portainerã§ãã Portainerã¯ãDockerãSwarmãKubernetesãããã³AzureACIã®ã³ã³ãããŒç®¡çããŒã«ã§ãã Portainerã®ããã¥ã¡ã³ãã«ã¯ã
ããŠãŒã¶ãŒãã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããããYAMLãèšè¿°ãããããããã§ã¹ããçè§£ãããããå¿ èŠããªããããPortainerã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³ã®ãããã€ãšãã©ãã«ã·ã¥ãŒãã£ã³ã°ãéåžžã«ç°¡åã«ãªãã誰ã§ãå®è¡ã§ããããã«ãªããŸããã
ç§ã®ç®çã§ã¯ãPortainerã¯å®ç§ã§ãã圌ã®ããšããã£ãšããç¥ããŸããããããã¥ã¡ã³ãhttps://documentation.portainer.io/v2.0/deploy/ceinstalldocker/ã«ãããšã ãããè¡ãæãç°¡åãªæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
ããŒã¿ãä¿åããããã®ããªã¥ãŒã ãäœæããŸãã
# docker volume create portainer_data
ããã§ã次ã®ã³ãã³ãã§Portainerãèµ·åã§ããŸãã
# docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
Portainerãèµ·åãããšã次ã®å Žæã§å©çšã§ããããã«ãªããŸãã//<server ip>ïŒ9000 /
åããŠPortainerãèµ·åãããšã管çè ãã¹ã¯ãŒãã®æå®ãæ±ãããããã®åŸãæ¥ç¶æ¹æ³ãå°ããããŸããç°å¢ïŒ
ããŒã«ã«ã®Dockerã«æ¥ç¶ãããªãã·ã§ã³ãéžæããåŸãPortainerã®ããŒã ç»é¢ã衚瀺ãããŸããã
ã芧ã®ãšãããããŒã«ã«ãšã³ããã€ã³ããå©çšå¯èœã§ããåŸã§ãå¿ èŠã«å¿ããŠä»ã®ããŒããžã®æ¥ç¶ã远å ã§ããŸãã
ããã«å ¥ããšãèŠçŽæ å ±ãå«ã䟿å©ãªããã·ã¥ããŒãã衚瀺ãããŸãã
ããã§ãDockerã®åäœã®ãã¹ãŠã®åŽé¢ã管çã§ããŸããã³ã³ããã«äœããããèŠãŠã¿ãŸãããã
ãããŸã§ã®ãšããã1ã€ã®ã³ã³ããã¯Portainerèªäœã§ãããã®ã€ã³ã¿ãŒãã§ãŒã¹ã¯ãã³ã³ãããŒã衚瀺ããã³ç®¡çããã®ã«éåžžã«äŸ¿å©ã§ãããæ°ããã³ã³ãããŒã远å ããæ©èœããããŸããæ®ãã®ã¿ãã«ç®ãéããPortainerã®äŸ¿å©ã§ææ ®æ·±ãã€ã³ã¿ãŒãã§ãŒã¹ã確èªã§ããŸãã
æãè峿·±ãã®ã¯[ã¹ã¿ãã¯]ã¿ãã§ããã¹ã¿ãã¯ã¯ãçžäºæ¥ç¶ãããã³ã³ãããŒã®ã³ã¬ã¯ã·ã§ã³ã§ãããäžç·ã«å®è¡ããã³åäœããŸããå®éãããã¯Docker Composeãšåãã§ããDockerComposeã®æ§æã¯ãdocker-compose.ymlãã¡ã€ã«ã§èª¬æããdocker-composeupã³ãã³ãã§å®è¡ããŸãã
Portainerã䜿çšãããšãçµã¿èŸŒã¿ã®ãšãã£ã¿ãŒã§ã®ç·šéããgithubããã®ããŠã³ããŒããŸã§ãããŸããŸãªæ¹æ³ã§ã·ã¹ãã ã«ã¹ã¿ãã¯ã远å ã§ããŸãã
docker-compose圢åŒã¯ãã¹ã¿ãã¯ãå®çŸ©ããããã«äœ¿çšãããŸããããã¯ãããã§å éšçã«æ©èœãããã®ã§ãããã®æ©èœã䜿çšãããšãã³ã³ããããå¿ èŠãªã€ã³ãã©ã¹ãã©ã¯ãã£ãæ§ç¯ããã®ãæã䟿å©ã§ãã
ãã®æç¹ã§ãç§ã¯ä»ã®ãšãããããŒã¿ãŒã®èœåãç ç©¶ããããšããéžè±ããããšãææ¡ããŸãããããæ·±å»ãªããŒã«ã§ããããšã¯ãã§ã«èŠãŠãããšæããŸãããã®ãããã§ãDockerCLIã®äœ¿çšãã»ãŒå®å šã«æŸæ£ããããšãã§ããŸããããã§ã¯ããã®VPSã§çµæãšããŠåŸãããã®ãç°¡åã«èŠãŠã¿ãŸãããã
ç§ã¯å®æçã«ãéãããããžã§ã¯ããéçºããå¿ èŠããããŸããããã¯ç§ãæ·±ãç ç©¶ãå¿ èŠãšããªããããžã§ã¯ããšåŒãã§ãããã®ã§ãããããã¯ãå®éšãå°ããªãµã€ããããããæ å ±ã³ã¬ã¯ã¿ãŒãªã©ã§ãã CI / CDãã§ãŒã³ã®æ§ç¯ãå¿ èŠãšããªããã®ããã®ãããªã¢ããªã±ãŒã·ã§ã³ããããããæ©èœããå Žæã§éçºããã³ãããã°ããããšã¯ãç§ã«ãšã£ãŠéåžžã«äŸ¿å©ã§ãããŸããéçºç°å¢ãæŽã£ãç¶æ ã§è·å Žãé¢ããŠããããšããããããŸããããããã®ãããžã§ã¯ãã§äœããããŸããããªããªã£ãå Žåã¯ãããã«ç¶æ³ãææ¡ããŠåé¡ã解決ããããšæããŸãããŸãã¯ããã©ãŠã¶ãšã€ã³ã¿ãŒãããã¢ã¯ã»ã¹ä»¥å€ã«äœããªãå Žåã§ããä»»æã®ã³ã³ãã¥ãŒã¿ãã1åéèªç±ã«ãããžã§ã¯ãã«åãçµãããšãã§ããŸãã
ã¢ã¯ã»ã¹ã容æã«ããããã«ãè³Œå ¥ãããã¡ã€ã³åãæã£ãŠããŸããããšãã°ãportainerãportainer.example.comã§å©çšã§ããããã«ãããŸããŸãªããŒã«ã®ç¬¬3ã¬ãã«ãã¡ã€ã³ãæ§æããããšæããŸãããŸãããã¹ãŠãhttpsãä»ããŠæ©èœããããã«ãããã®ã§ãSSLèšŒææžãããããè³Œå ¥ããªãããã«ããã«ã¯ãLet'sEncryptã䜿çšããŸãããã1ã€ã®èŠä»¶ã¯ãå ¬çã«ã¢ã¯ã»ã¹å¯èœã§ãããšæ³å®ãããŠããªããã¹ãŠã®ãã®ãèªèšŒã«ãã£ãŠéããããããšã§ãã
ããããã¹ãŠãå®è£ ããããã«ã次ã®åªããããŒã«ãçè§£ããŸããããããâŠ
Traefik
Traefikã¯ãã³ã³ããåŠççšã«èª¿æŽããããªããŒã¹ãããã·ãµãŒããŒã§ããæ¬¡ã®æ©èœã¯ç§ã«ãšã£ãŠéèŠã§ãã
- ãªã³ã¶ãã©ã€ã®æ§ææŽæ°
- æ§æãããã€ããŒãšããŠã®DockerãµããŒã
- ç®±ããåºããŠæå·åããŸããã
portainerã§traefikãå®è¡ããã«ã¯ãportainerã®ããã¥ã¡ã³ãã§æäŸãããŠããdocker-compose.ymlã®äŸã䜿çšããŸãïŒhttpsïŒ//documentation.portainer.io/v2.0/ad/traefik/rp-traefik/
version: «3.9»
services:
traefik:
container_name: traefik
image: «traefik:latest»
container_name: traefik
command:
- «--entrypoints.web.address=:80»
- «--entrypoints.websecure.address=:443»
- «--providers.docker=true»
- «--providers.docker.exposedbydefault=false»
- «--log.level=ERROR»
- «--certificatesresolvers.leresolver.acme.httpchallenge=true»
- «--certificatesresolvers.leresolver.acme.email=user@mymail.com»
- «--certificatesresolvers.leresolver.acme.storage=./acme.json»
- «--certificatesresolvers.leresolver.acme.httpchallenge.entrypoint=web»
- «--entrypoints.web.http.redirections.entryPoint.to=websecure»
- «--entrypoints.web.http.redirections.entryPoint.scheme=https»
- «--metrics.prometheus=true»
ports:
- «80:80»
- «443:443»
volumes:
- «/var/run/docker.sock:/var/run/docker.sock:ro»
- «./acme.json:/acme.json»
networks:
- intranet
labels:
- «traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)»
- «traefik.http.routers.http-catchall.entrypoints=web»
- «traefik.http.routers.http-catchall.middlewares=redirect-to-https»
- «traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https»
portainer:
image: portainer/portainer-ce:2.5.0-alpine
container_name: portainer
command: -H unix:///var/run/docker.sock
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
networks:
- intranet
labels:
- «traefik.enable=true»
- «traefik.http.routers.frontend.rule=Host(`portainer.example.com`)»
- «traefik.http.routers.frontend.entrypoints=websecure»
- «traefik.http.services.frontend.loadbalancer.server.port=9000»
- «traefik.http.routers.frontend.service=frontend»
- «traefik.http.routers.frontend.tls.certresolver=leresolver»
volumes:
portainer_data:
networks:
intranet:
name: intranet
Let's EncryptèšŒææžãååŸããããã»ã¹ãæåãããã«ã¯ãéå§ããåã«DNSã¬ã³ãŒããæ£ããæ§æãããŠããããšã確èªããå¿ èŠããããŸããç§ã¯ãããã®ç®çã§cloudflareã䜿çšããŠããããã®äžã§æ§æã¯æ¬¡ã®ããã«ãªããŸãã
ãã³ã³ãã³ããåã«ã¯ãVPSã®ã¢ãã¬ã¹ãå«ãŸããŠããå¿ èŠããããŸãã
ããã§ãçµæã®docker-compose.ymlããµãŒããŒã«ã³ããŒããå Žåã¯ã次ã®ã³ãã³ããå®è¡ããŸãã
# docker-compose up -d
次ã«ãportainer.example.comã§èµ·åããåŸ ãæ¬¡ã®ç»åã衚瀺ãããŸãã
ããã«ãLet'sEncryptèšŒææžã«ãã£ãŠãã§ã«ä¿è·ãããŠããŸãã
Traefikã«ã¯ãæ§æèšå®ãæ£ããé©çšãããŠãããã©ãããçè§£ããã®ã«åœ¹ç«ã€éåžžã«äŸ¿å©ãªããã·ã¥ããŒãããããŸãããããã¢ã¯ãã£ãã«ããã«ã¯ãdocker-compose.ymlã«æ¬¡ã®è¡ã远å ããå¿ èŠããããŸãã
services:
traefik:
...
command:
...
- «--api.dashboard=true»
labels:
...
- «traefik.enable=true»
- «traefik.http.routers.traefik.entrypoints=websecure»
- «traefik.http.routers.traefik.rule=Host(`traefik.example.com`)»
- «traefik.http.routers.traefik.tls=true»
- «traefik.http.routers.traefik.service=api@internal»
- «traefik.http.routers.traefik.tls.certresolver=leresolver»
- «traefik.http.services.traefik.loadbalancer.server.port=8080»
ãŸããDNSèšå®ã«ç¬¬3ã¬ãã«ãã¡ã€ã³traefik.example.comã远å ããå¿ èŠããããŸããããã¯ãportainerã®ãã¡ã€ã³ã以åã«è¿œå ãããæ¹æ³ãšã®é¡æšã«ãã£ãŠè¡ãããšãã§ããŸããtraefik.example.comã§èšå®ãé©çšãã ãšãããã·ã¥ããŒãã衚瀺ãããŸãã
ã芧ã®ãšãããTraefikã¯åªããããŒã«ã§ããããšã蚌æãããŠããŸããDockerãšç·å¯ã«é£æºããåçãªæ§ææ©èœã«ãããã«ãŒãã£ã³ã°èšå®ã®ããã®æ§æãã¡ã€ã«ã®äœ¿çšãå®å šã«æŸæ£ã§ããŸãã代ããã«ãå¿ èŠãªãã¹ãŠã®ãã©ã¡ãŒã¿ãŒãã«ã¹ã¿ã ãµãŒãã¹ã®ã©ãã«ãšããŠæžã蟌ãã ããªã®ã§ããã¹ãŠã®èšå®ã1ãæã«ãŸãšããããŸãã
ããã§ãåºæ¬çãªãµãŒãã¹ã®ã»ããã¢ããããå°ãé¢ããŠãã·ã¹ãã ã«éçºç°å¢ã远å ããããšãææ¡ããŸãããããªãâŠ
Visual Studio Code Server
ç§ã«ãšã£ãŠãéçºç°å¢ãŸãã¯IDEã¯åžžã«éåžžã«æ·±å»ãªãã®ã§ãããéçºè ã®ãã·ã³ã«ã€ã³ã¹ããŒã«ããã匷åãªãœãããŠã§ã¢ããã±ãŒãžã¯ãæ°ã®ã¬ãã€ãã®ãã£ã¹ã¯ã¹ããŒã¹ãšRAMãæ¶è²»ããŸããç§ãé·å¹Žäœ¿çšããŠããŠãMicrosoftãã¯ãããžã¹ã¿ãã¯ã䜿çšããå Žåã¯ãããæè¯ã®éžæã§ãããšä»ã§ãä¿¡ããŠãããã®ãããªIDEã®äŸã¯ãMicrosoftVisualStudioã§ãã Node.jsãåŠã³å§ãããšããVSCodeãçºèŠããŸãããé¢é£ããååã«ãããããããããã¯å®å šã«ç°ãªãIDEã§ãããå®å šã«ç°ãªãæŠå¿µãšæ©èœãåããŠããŸãã VSCodeãChromeãšã³ãžã³ã䜿çšããŠã€ã³ã¿ãŒãã§ãŒã¹ã衚瀺ãããšããäºå®ã«ãããVSCodeèªäœãé¢ãããšãã§ããŸãããã®ã¢ãŒããã¯ãã£ã®ãããã§ãVPSäžã§å®è¡ã§ããVisual Studio Code ServerãèªçããŸããããVSCodeã€ã³ã¿ãŒãã§ã€ã¹ã«ã¯ãã©ãŠã¶ãŒããã¢ã¯ã»ã¹ã§ããŸããããããããã¯å¥ã®ãªã³ã©ã€ã³ã³ãŒããšãã£ã¿ã§ã¯ãããŸãããããã¯ããã¹ãŠã®åªããæ©èœãåããæ¬æ ŒçãªVSCodeIDEã§ãã
VSCode ServerãVPSã«è¿œå ããã«ã¯ãPortainerã§æ°ããã¹ã¿ãã¯ãäœæãããããcode-serverãšåŒã³ãããã«æ¬¡ã®æ§æã远å ããŸãã
version: «3.9»
volumes:
codeserverdata:
codeappdir:
networks:
intranet:
external: true
services:
code-server:
image: ghcr.io/linuxserver/code-server
container_name: code-server
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/London
# â PASSWORD=password #optional
- SUDO_PASSWORD=password #optional
- PROXY_DOMAIN=code.example.com
volumes:
- codeserverdata:/config
- codeappdir:/app
extra_hosts:
host.docker.internal: host-gateway
restart: always
networks:
- intranet
labels:
- «traefik.enable=true»
- «traefik.http.routers.code.rule=Host(`code.example.com`)»
- «traefik.http.routers.code.tls=true»
- «traefik.http.routers.code.tls.certresolver=leresolver»
ãŸããéå§ããåã«ã第3ã¬ãã«ã®ãã¡ã€ã³code.example.comãDNSã¬ã³ãŒãã«è¿œå ããããšãå¿ããªãã§ãã ãããæ¬¡ã«ã[ã¹ã¿ãã¯ã®å±é]ãã¿ã³ãã¯ãªãã¯ããã ãã§ãã
ããã»ã¹ã®çµäºåŸãæ°ããã¹ã¿ãã¯ãportainerã«è¡šç€ºããã code.example.comã«ã¢ã¯ã»ã¹ãããšã次ã®ç»åã衚瀺ãããŸãïŒããã«ããŒã¯ããŒãããªã³ã«ããŸããïŒã
ããã§ã¯ããã¹ã¯ãããããŒãžã§ã³ã®VSCodeãšåãæ¹æ³ã§éçºã§ããŸããæŠããŠãç§ãééããå¯äžã®éãã¯ãããã€ãã®ããŒããŒãã·ã§ãŒãã«ããã®ããã©ã«ãã®ãã€ã³ãã£ã³ã°ã®éãã§ããã䜿çšããéçšã§ããã«ããã«æ £ããŸãã
䟿å®äžã/ appãã£ã¬ã¯ããªã«ããŠã³ãããããªã¥ãŒã ãã³ãŒããµãŒããŒã³ã³ããã«æ¥ç¶ããã®ã§ãããã®ãªããžããªãããããžã§ã¯ããäœæãŸãã¯è€è£œããããšããå§ãããŸããããããã°ãã³ã³ãããåäœæããŠãããŒã¿ã倱ãããããšã¯ãããŸããã -äœæããã
ãã®ã€ã¡ãŒãžã«ã¯ãã§ã«Node.jsãã€ã³ã¹ããŒã«ãããŠããã®ã§ãäœãããå¿ èŠã¯ãªããããã«ãããžã§ã¯ãã®äœæ¥ãéå§ã§ããŸããäœæ¥ã§ä»ã®YPãå¿ èŠãªå Žåã¯ããã®ã€ã¡ãŒãžã®äœæè ããããŸããŸãªãã©ãããã©ãŒã ã®ãµããŒãã远å ã§ããããã«ããmodã®ã«ã¿ãã°ãç¶æããŠããããšã«æ³šæããŠãã ããããããã®äœ¿ç𿹿³ã«ã€ããŠã¯ãDocker Hubã®ã€ã¡ãŒãžã®èª¬æãåç §ããŠ
ãã ãããå ¬åŒã®ã¢ããã®ãªã¹ãã¯ã次ã®å Žæã«ãããŸããmods.linuxserver.io / ïŒmod = code-serversudoãã¹ã¯ãŒãã¯ã³ã³ããèšå®..ããã¢ã³ã¹ãã¬ãŒã·ã§ã³ã®ããã«ãåçŽãªãŸãŸã«ããŸããããå®éã«ã¯ãè€éã«ãããããã¹ã¯ãŒããã¯ãªã¢ããã¹ãã§ä¿åããªãããã«SUDO_PASSWORD_HASHããããã£ã䜿çšããããšããå§ãããŸããããªãã¯ããã®ç»åã®èª¬æã§ãããè¡ãæ¹æ³ãèªãããšãã§ããŸãïŒ hub.docker.com/r/linuxserver/code-serverã
ãããããã§ã«ãæ°ã¥ããããããŸããããçŸæç¹ã§ã¯ã³ãŒããµãŒããŒãžã®ã¢ã¯ã»ã¹ã¯ãŸã£ããä¿è·ãããŠããããcode.example.comã«ã¢ã¯ã»ã¹ãããã¹ãŠã®äººãã¢ã¯ã»ã¹ã§ããããã«ãªããŸããããã¯éåžžã«æªããªãã·ã§ã³ã§ããç»åèšå®ã§ãã¹ã¯ãŒãã¢ã¯ã»ã¹ãæå¹ã«ããããšã¯ã§ããŸããããµãŒããŒäžã«ãããã¹ãŠã®ãªãœãŒã¹ã«ã¢ã¯ã»ã¹ããããã«1åã®ãã°ã€ã³ãå¿ èŠã§ãããããè¡ãããã«ãç§ã¯æ¬¡ã®ããŒã«ã«ç²Ÿéããããšãææ¡ããŸãããããªãâŠ
KeyCloak
KeyCloakã¯ãã·ã³ã°ã«ãµã€ã³ãªã³ãã¯ãããžãŒã䜿çšããŠåæ£ã·ã¹ãã ãžã®ã¢ã¯ã»ã¹ãæŽçããããã®ææ°ã®ããŒã«ã§ããå®éãããã¯ç§ãèŠã€ãããããªåŒ·åãªæ©èœãåããå¯äžã®ç¡æããŒã«ã§ããããªãã䟡å€ã®ããä»£æ¿æ¡ãç¥ã£ãŠãããªããã³ã¡ã³ãã«ããã«ã€ããŠæžãããšãå¿ããªãã§ãã ããã
ãããã·ã¹ãã ã«è¿œå ããããã«ãportainerã§authãšããæ°ããã¹ã¿ãã¯ãäœæããæ¬¡ã®æ§æã远å ããŸããã
version: '3.9'
networks:
intranet:
external: true
services:
keycloak:
image: jboss/keycloak
container_name: keycloak
restart: always
networks:
- intranet
environment:
KEYCLOAK_PASSWORD: password
PROXY_ADDRESS_FORWARDING: «true»
labels:
- «traefik.enable=true»
- «traefik.http.routers.keycloak.rule=Host(`auth.yourdomain.com`)»
- «traefik.http.routers.keycloak.tls=true»
- «traefik.http.routers.keycloak.tls.certresolver=leresolver»
é åã¹ã¿ãã¯]ãã¿ã³ãã¯ãªãã¯ããåŸãKeyCloakã¯ã§å©çšã§ããããã«ãªããŸã auth.example.comãããã«è¡ããšãKeyCloakã®ãŠã§ã«ã«ã ãŠã£ã³ããŠã衚瀺ãããŸãã
管çã³ã³ãœãŒã«ã«ç§»åããŸãããïŒ
ãŠãŒã¶ãŒåã¯adminã«ãªããåæãã¹ã¯ãŒãã¯KEYCLOAK_PASSWORDç°å¢å€æ°ã®ã¹ã¿ãã¯æ§æã§èšå®ãããã®ã§ãããã°ã€ã³åŸãKeyCloak管çããã«ã衚瀺ãããŸãã
Dockerçšã®KeyCloakã®åææ§æã«é¢ããæšå¥šäºé ã¯ãå ¬åŒããã¥ã¡ã³ã www.keycloak.org/getting-started/getting-started-dockerã«ãããŸãã
ã€ãŸããæ°ããã«ã¹ã¿ã ã¬ã«ã ãäœæãããã®äžã«ãŠãŒã¶ãŒãäœæããŠãæ°ããã¯ã©ã€ã¢ã³ãã远å ããå¿ èŠããããŸãã
ã¯ã©ã€ã¢ã³ãã®å Žåãã¢ã¯ã»ã¹ã¿ã€ãïŒæ©å¯ãèšå®ãããã¡ã€ã³ãæå¹ãªãªãã€ã¬ã¯ãURIã«è¿œå ããå¿ èŠããããŸãã ãããã¯ãhttps://traefik.example.com/*ãããã³ã code.example.com *ãã§ãã
Access TypeïŒconfidentialãã€ã³ã¹ããŒã«ãããšã[ã¯ã¬ãã³ã·ã£ã«]ã¿ãã衚瀺ãããã·ãŒã¯ã¬ãããååŸã§ããŸããåŸã§èšå®ãããšãã«åœ¹ç«ã¡ãŸãã
ããã§ãKeyCloakã®ã»ããã¢ããã¯ããã§çµããã§ããä»ãç§ãã¡ã¯Traefikãšåéãäœãå¿ èŠããããŸããèªèšŒãããŠããªããŠãŒã¶ãŒãcode.example.comãštraefik.example.comã«ã¢ã¯ã»ã¹ããã®ãé²ãããããšããç¥ããããŸãããããã®ç®çã®ããã«ãtraefikã«ã¯ForwardAuthããã«ãŠã§ã¢ããããå€éšãµãŒãã¹ãä»ããŠèªèšŒãæŽçã§ããŸãã KeyCloakã®çžäºäœçšã確å®ã«ããããã«ãäžéãµãŒãã¹ãå¿ èŠã§ããgithub.com/ thomseddon / traefik-forward-authã䜿çšã ãŸãã Docker Hubã§ã€ã¡ãŒãžãšããŠãå©çšã§ãããããæ¬¡ã®ãµãŒãã¹ã䜿çšããŠãPortainerã®èªèšŒã¹ã¿ãã¯æ§æã远å ããŸãã
traefik-forward-auth:
image: thomseddon/traefik-forward-auth
container_name: traefik-forward-auth
environment:
- DEFAULT_PROVIDER=oidc
- PROVIDERS_OIDC_ISSUER_URL=https://auth.example.com/auth/realms/example
- PROVIDERS_OIDC_CLIENT_ID=traefik
- PROVIDERS_OIDC_CLIENT_SECRET=d7fb86f0-71a9-44f7-ab04-967f086cd89e
- SECRET=something-random
- LOG_LEVEL=debug
labels:
- «traefik.enable=true»
- «traefik.http.middlewares.traefik-forward-auth.forwardauth.address=http://traefik-forward-auth:4181»
- «traefik.http.middlewares.traefik-forward-auth.forwardauth.authResponseHeaders=X-Forwarded-User»
- «traefik.http.services.traefik-forward-auth.loadbalancer.server.port=4181»
restart: always
ããã§ãPROVIDERS_OIDC_ISSUER_URL倿°ã«ã¯ãKeycloakã§ä»¥åã«äœæããã¬ã«ã ãžã®ãã¹ãå«ãŸããPROVIDERS_OIDC_CLIENT_IDã«ã¯ããã®ã¬ã«ã ã§ä»¥åã«äœæããã¯ã©ã€ã¢ã³ãã®ååãå«ãŸããPROVIDERS_OIDC_CLIENT_SECRETã¯ãã®ã¯ã©ã€ã¢ã³ãã®[è³æ Œæ å ±]ã¿ãããååŸãããŸããSECRET倿°ã§ã¯ãã©ã³ãã ãªæååãå ¥åããå¿ èŠããããŸãã
ããã§ãTraefikãæäŸãããµãŒãã¹ãã«ãŒãã£ã³ã°ãéããã«ã¯ãã©ãã«ã«æ¬¡ã®è¡ã远å ããã ãã§ååã§ãã
- "traefik.http.routers.< >.middlewares=traefik-forward-auth"
ãŸããèªèšŒã䜿çšããŠã³ãŒããµãŒããŒãéããããšã«ããŸããããã®ããã«ãã¹ã¿ãã¯ã«ç§»åããŠæ§æã远å ããŸãããçµæã¯æ¬¡ã®ããã«ãªããŸãïŒç°¡æœã«ããããã«ãã©ãã«ã®ã»ã¯ã·ã§ã³ã®ã¿ãåŒçšããŸãïŒã
labels:
- «traefik.enable=true»
- «traefik.http.routers.code.rule=Host(`code.example.com`)»
- «traefik.http.routers.code.tls=true»
- «traefik.http.routers.code.tls.certresolver=leresolver»
- «traefik.http.routers.code.middlewares=traefik-forward-auth»
[ã¹ã¿ãã¯ã®æŽæ°]ãã¿ã³ãã¯ãªãã¯ããŠãcode.example.comã«ã¢ã¯ã»ã¹ããŠã¿ãŠãã ããããã¹ãŠãæ£ããè¡ããããšããã°ã€ã³ãŠã£ã³ããŠã衚瀺ãããŸãã
æ£ãããŠãŒã¶ãŒåãšãã¹ã¯ãŒãïŒä»¥åã«KeyCloakã§æ§æãããã®ïŒãå ¥åããåŸãã³ãŒããµãŒããŒã€ã³ã¿ãŒãã§ã€ã¹ã«å ¥ããŸããããã¹ãŠãæ©èœããŠããŸãïŒ
åæ§ã«ãç§ã¯è©®çŽ¢å¥œããªç®ããtraefikããã·ã¥ããŒããéããŸããããããè¡ãã«ã¯ãã³ã³ãœãŒã«ã«ç§»åãïŒPortainerã¯ã圌ãäœæããã®ã§ã¯ãªãã¹ã¿ãã¯ã®æ§æã倿Žã§ããŸããããã³ã³ãœãŒã«ããTraefikãèµ·åããŸããïŒãåæ§ã«docker-compose.ymlãç·šéããå¿ èŠããããŸããã
labels:
- «traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)»
- «traefik.http.routers.http-catchall.entrypoints=web»
- «traefik.http.routers.http-catchall.middlewares=redirect-to-https»
- «traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https»
- «traefik.enable=true»
- «traefik.http.routers.traefik.entrypoints=websecure»
- «traefik.http.routers.traefik.rule=Host(`traefik.example.com`)»
- «traefik.http.routers.traefik.tls=true»
- «traefik.http.routers.traefik.service=api@internal»
- «traefik.http.routers.traefik.tls.certresolver=leresolver»
- «traefik.http.routers.traefik.middlewares=traefik-forward-auth»
- «traefik.http.services.traefik.loadbalancer.server.port=8080»
確èªããããã«ãtraefik.example.comã«ã¢ã¯ã»ã¹ããŸããããã¹ãŠãæ£åžžã«æ©èœããããšã確èªããããã«ãã·ãŒã¯ã¬ããã¢ãŒãã§ãã©ãŠã¶ãŠã£ã³ããŠãéãå¿ èŠããããŸãããããããªããšã以åã«ã³ãŒããµãŒããŒã«ã¢ã¯ã»ã¹ããããã«ãã°ã€ã³ããŠãããããKeyCloakãèªèšŒããããããã·ã¹ãã ã¯ç§ãèªèãããã¹ã¯ãŒããèŠæ±ããŸããã§ãããç§ã¯èªåçã«ã
ãããã£ãŠãKeyCloakãšTraefikãçµã¿åãããŠäœ¿çšââããããšã§ãã·ã¹ãã ã®æ©å¯èŠçŽ ãäžæ£ã¢ã¯ã»ã¹ããä¿è·ããããšãã§ããŸããããã®ã¢ãããŒãã®å©ç¹ã¯ãç¬èªã®èªèšŒã¡ã«ããºã ããªãå Žåã§ããããå®è¡ã§ããããšã§ãããã¡ãããæ¬ ç¹ããããŸããKeyCloakã¯éåžžã«éããå€ãã®ãªãœãŒã¹ãäž»ã«ã¡ã¢ãªãæ¶è²»ããŸããæ©èœã®èгç¹ããã¯ãããã¯æããã«ããéãã§ãããããããKeyCloakã§ã§ããããšã®ã»ãšãã©ã¯å¿ èŠãããŸããããŸãã¯ãã¯ã©ãŠããµãŒãã¹ã䜿çšããããšãã§ããŸããããšãã°ãtraefik-forward-authã«ã¯GoogleOAuthãµããŒããçµã¿èŸŒãŸããŠããŸãã
çµè«
ãã®èšäºã§ã¯ãäžé£ã®ããŒã«ã«ã€ããŠèª¬æããŸããããããã®ããŒã«ã䜵çšããããšã§ãå€ãã®ITã¹ãã·ã£ãªã¹ãã®æ¥åã§ä»æ¥çºçããããŸããŸãªã¿ã¹ã¯ãå€§å¹ ã«ç°¡çŽ åããã³èªååã§ããŸããæ¬¡ã®ãããªèšå®ïŒ
- ãã¡ã€ã³åæ¥ç¶
- TLSæ§æ
- èšŒææžã®ååŸãšã€ã³ã¹ããŒã«
- èªèšŒ
ãµãŒãã¹æ§æã§æ°è¡ã§å®è¡ãããŸãã
ãã¡ãããã»ããã¢ããæã«ã¯ã³ã³ãœãŒã«ããå€ãã®ããšãããªããã°ãªããŸããã§ããããå°æ¥çã«ã¯ãæ¥åžžã®äœ¿çšã§ãæ§ç¯ãããã·ã¹ãã ã«ãã£ãŠäœ¿çšéãæžããããšãã§ããééããªãç§ã«ãšã£ãŠãã©ã¹ã«ãªããŸãã
ç§ããã®èšäºãæžããŠãããšããäž»ãªé£ããã¯ãã¹ãŠã®å¿ èŠãªæ å ±ãäžç·ã«éããããšã§ãããããã¥ã¡ã³ãã®å€ãã®ããšã¯æããã§ã¯ãªããã·ã¹ãã ãå¿ èŠã«å¿ããŠæ©èœãããããã«ãgithubã®ããŸããŸãªåé¡ã®åé¡ã®è§£æ±ºçãšstackoverflowããã®è³ªåãæ¢ãå¿ èŠããããŸããããããã£ãŠãç§ã¯ããã€ãã®ç¹ããã詳现ã«åŒ·èª¿ããããã«åªããŸãããç§ã®ç ç©¶ãã説æãããŠãã補åã誰ããããããçè§£ããã®ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã
ãŸããã³ã¡ã³ãã§ã®å»ºèšçãªæ¹å€ããããã§å®è£ ããããšããããšãããè¯ãè¡ãæ¹æ³ã«ã€ããŠã®ã¢ã€ãã¢ãå¿ããæ¥œãã¿ã«ããŠããŸããããšãã°ãKeyCloakã«ä»£ãã軜éã®ä»£æ¿åãèŠã€ããããšæã£ãŠããŸããããã¯ããã®çš®ã®ã¿ã¹ã¯ã§ã¯ããéãããã§ãã
䟿å®äžãæ§æãã¡ã€ã«ã次ã®ãªããžããªã«é 眮ããŸããïŒhttps ïŒ //github.com/debagger/vps-docker-workspace
ãæž èŽããããšãããããŸããïŒ
Macleodã®ã¯ã©ãŠããµãŒã㌠ã¯é«éã§å®å šã§ãã
äžèšã®ãªã³ã¯ã䜿çšãããããããŒãã¯ãªãã¯ããŠç»é²ãããšãä»»æã®æ§æã®ãµãŒããŒãã¬ã³ã¿ã«ããæåã®æã10ïŒ å²åŒã«ãªããŸãã