Reason 原因
我記憶體感覺不夠用,所以只好使用群集,而且我找到一個可以提供 DNS 循環功能的免費 DNS 提供商
My server memory is not enough that I think, So I use the swarm as well. And I found a free DNS vender which it can provide the DNS round robin feature.
Basic resources 基礎資源
- Free server Oracle Cloud
Ubuntu 20.04 minmal is my choice.
Ubuntu 20.04 minmal 是我得選擇
You must prepare 3 domain names like:
你必須準備3個 domain names 像是:
traefik.{DomainName}, code.{DomainName}, blog.{DomainName}
Software resources 軟體資源
- Docker
- Docker Swarm
- Docker-compose
- Hugo
- Traefik
- code-server(vscode online version)
Architecture diagram 結構關聯圖
Installation instructions 安裝說明
All CODEUSER name need be same.
所有的 CODEUSER 名稱都要一樣。
Please type command one by one.
請一個一個輸入指令。
準備 兩個 VMs 都要裝 docker docker-compose 只要裝在 manager 就好
Docker
sudo apt-get remove docker docker-engine docker.io containerd runc;
sudo apt-get update;
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common;
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -;
sudo apt-key fingerprint 0EBFCD88;
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update;
sudo apt-get install docker-ce docker-ce-cli containerd.io;
sudo systemctl enable --now docker.service;
If you would like to use Docker as a non-root user, you should now consider adding your user to the “docker” group with something like:
如果你是 non-root 使用者想要使用 Docker, 你現在應該考慮通過以下方式將使用者加入到 Docker 的群組裡:
sudo usermod -aG docker {your-user} // echo $USER;
Please login again.
請重新登入
Docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose;
sudo chmod +x /usr/local/bin/docker-compose;
Simple commands for docker-compose operation 用於docker-compose操作的簡單命令
Check your docker-compose.yml
檢查你的 docker-compose.yml
docker-compose config;
Launch your container from docker-compose.yml
從 docker-compose.yml 啟動你的容器
docker-compose up -d;
Stop your container from docker-compose.yml
從 docker-compose.yml 停止你的容器
docker-compose stop;
Remove your container from docker-compose.yml
從 docker-compose.yml 移除你的容器
docker-compose rm;
Setting 設定
Oracle Cloud 的安全訪問列表
開起: TCP 80 TCP 443 CDIR 0.0.0.0/0 (對外)
開起: TCP 2377 TCP/UDP 7946 UDP 4789 CDIR 10.0.0.0/16 (對內)
記得可以用 nc(netcat) 測試一下
Linux firewall
In Oracle Cloud, ubuntu used iptables.
sudo iptables -I INPUT -p tcp -m tcp --dport 2377 -j ACCEPT
sudo iptables -I INPUT -p tcp -m tcp --dport 7946 -j ACCEPT
sudo iptables -I INPUT -p udp -m udp --dport 7946 -j ACCEPT
sudo iptables -I INPUT -p udp -m udp --dport 4789 -j ACCEPT
sudo service netfilter-persistent save
Create vieux/sshfs Volume
Notice the authorized_keys file must contain ssh public keys for each vps.
docker plugin install vieux/sshfs sshkey.source=/home/${USER}/.ssh/
Plugin "vieux/sshfs" is requesting the following privileges:
- network: [host]
- mount: [/var/lib/docker/plugins/]
- mount: []
- device: [/dev/fuse]
- capabilities: [CAP_SYS_ADMIN]
Do you grant the above permissions? [y/N] y
docker volume create -d vieux/sshfs -o sshcmd={user}@{ip}:{path} -o IdentityFile=/root/.ssh/id_rsa -o allow_other sshvolume
docker run -it --rm -v sshvolume:/tmp busybox ls /tmp
So we need create “workspace” and “letsencrypt” volumes. Note! “letsencrypt” will store acme.json file for “Let’s Encrypt”
docker volume create -d vieux/sshfs -o sshcmd={user}@{ip}:{path}/workspace -o IdentityFile=/root/.ssh/id_rsa -o allow_other workspace
docker volume create -d vieux/sshfs -o sshcmd={user}@{ip}:{path}/letsencrypt -o IdentityFile=/root/.ssh/id_rsa -o allow_other letsencrypt
Enable Docker Swarm
On master
docker swarm init --advertise-addr {LAN IP Address}
On worker
docker swarm join --token {TOKEN}
Create Overlay Network
We need create “proxy” and “worknet” networks.
Note. “worknet” for internal, “proxy” for public
docker network create -d overlay --internal worknet
docker network create -d overlay proxy
Clone my codes.
Note! check out “swarm” branch
Sources |
---|
Traefik |
Code-Server |
MyBlog |
Setting Code-server
In your code-server terminal.
cd /config/workspace/;
sudo chown -R abc:abc blog;
cd blog
rm -rf public
echo 'BLOGPATH=/config/workspace/blog\nfunction hugo {\n zsh <<< "cd ${BLOGPATH} && /usr/local/bin/hugo $@";\n}' >> ~/.zshrc;
source ~/.zshrc;
hugo new site .