Skip to content

Instantly share code, notes, and snippets.

@twang2218
Last active Oct 23, 2017
Embed
What would you like to do?
利用 docker-machine 架设代理服务器
#!/bin/bash
# set -e
DOMAIN=lab99.org
NAME=v1
PORT=8080
MODE=aes-256-gcm
TOKEN=dockerrocks
function start() {
# Create a docker host
docker-machine create -d vultr --vultr-region-id=25 $NAME
docker-machine ls | grep $NAME
# Prepare the machine
docker-machine ssh $NAME << EOF
apt update
apt-get install --install-recommends -y linux-generic-hwe-16.04
apt dist-upgrade -y
echo 'net.core.default_qdisc=fq' >> /etc/sysctl.conf
echo 'net.ipv4.tcp_congestion_control=bbr' >> /etc/sysctl.conf
reboot
EOF
sleep 20
docker-machine ssh $NAME "sysctl net.ipv4.tcp_available_congestion_control; lsmod | grep bbr"
# Get IP of the docker host
ip=$(docker-machine ip $NAME)
if [ -z "$ip" ]; then
echo "Failed to created the $NAME host"
return 1
else
echo "Created docker host: $NAME => $ip"
fi
# Create DNS record for constant usage
local id=`doctl compute domain records list $DOMAIN | grep $NAME | cut -d' ' -f1`
if [ -z "$id" ]; then
# create one
id=`doctl compute domain records create $DOMAIN --record-name=$NAME --record-data=$ip --record-type=A | grep $NAME | cut -d' ' -f1`
if [ -z "$id" ]; then
echo "Failed to create the $NAME.$DOMAIN records"
else
echo "Created DNS record: $NAME.$DOMAIN => $ip"
fi
else
# update the existing one
doctl compute domain records update $DOMAIN --record-id=$id --record-data=$ip
echo "Updated DNS record: $NAME.$DOMAIN => $ip"
fi
# Start Proxy
eval $(docker-machine env $NAME)
docker run --name ss -d -p $PORT:$PORT\
mritd/shadowsocks \
-s "-s 0.0.0.0 -p $PORT -m $MODE -k $TOKEN --fast-open"
}
function stop() {
# Simply remove the machine
docker-machine rm -y $NAME
echo "Removed docker host: $NAME"
# Remove the dns record
local id=`doctl compute domain records list $DOMAIN | grep $NAME | cut -d' ' -f1`
if [ -z "$id" ]; then
echo "DNS record '$NAME.$DOMAIN' does not exist"
else
doctl compute domain records delete lab99.org "$id" -f
echo "DNS record '$NAME.$DOMAIN' removed"
fi
}
function status() {
docker-machine ls | grep $NAME
eval $(docker-machine env $NAME)
docker ps | grep ss
docker logs $@ ss
}
function environment() {
if [ "$1" == "--unset" ]; then
# Unset all proxy env
echo unset http_proxy
echo unset https_proxy
echo unset HTTP_PROXY
echo unset HTTPS_PROXY
echo unset all_proxy
echo "# Run: eval \$($0 env --unset)"
else
# Set proxy env
http_proxy=socks5h://127.0.0.1:1086
echo export http_proxy=socks5h://127.0.0.1:1086
echo export https_proxy=$http_proxy
echo export HTTP_PROXY=$http_proxy
echo export HTTPS_PROXY=$http_proxy
echo export all_proxy=$http_proxy
echo "# Run: eval \$($0 env)"
fi
}
command=$1
shift
case $command in
start) start ;;
stop) stop ;;
status) status ;;
env) environment $@ ;;
*) echo "Usage: $0 (start|stop|status|env)" ;;
esac
Copy link

ghost commented Oct 20, 2017

不懂脚本语言咋办哦。
此脚本是不是就是在自己的机器上直接通过vultr提供的api 直接创建一个vps
几个问题:
1.这个domain 设置的是域名对吧。我要是没有个人域名呢?
2.这个token是干啥的?
3.您当时在群里说mac可以直接通过 brew install docker-machine-driver-vultr 这个装驱动的目的是什么?
4.在vultr官方文档里面有一个api的应当在什么时候用得上?
5.运行这个脚本是不是 ./run.sh start 我这么运行的结果是 缺参数:Error setting machine configuration from flags provided: Vultr driver requires the --vultr-api-key option

@twang2218
Copy link
Author

twang2218 commented Oct 23, 2017

@vannnnish

  1. domain 是配置域名,这样各种设备上,只需要配置域名即可,不必因为每次服务器的IP 不同,而导致需要修改配置。我这个是应对多个访问设备的。如果只有自己的笔记本,那么完全不需要域名这部分,或者每次根据新的IP修改一下客户端配置;或者修改 /etc/hosts 文件,建立一个名字对应 IP 的映射关系,这样客户端就不用变动,每次修改 /etc/hosts 即可。
  2. 这里的 TOKEN 是给 ss 服务器作为口令用的
  3. 这个脚本是通过 docker-machine 来建立云服务器,如果要建立 vultr 的云服务器,就必须使用 vultr 的 docker-machine 的驱动,这样才可以通过 vultr 云 API 建立服务器。
  4. vultr 的 api key 应该放置于环境变量 VULTR_API_KEY 中,这个在 vultr 的 docker-machine 驱动项目页面有说:https://github.com/janeczku/docker-machine-vultr#pxe-deployment。除了 key 外,一般还会配置 VULTR_REGION, VULTR_PLAN, VULTR_OS 以确保是自己需要的情况。
  5. 你的报错是因为环境变量中没有 VULTR_API_KEY。这类敏感信息我一般独立写在一个文件中,比如 .vultr.env,在使用该脚本前,用 source .vultr.env 来加载所需环境变量,然后再执行该脚本。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment