在Fly.io中部署tinyproxy

利用Fly.io的免费额度部署tinyproxy,获得免费vpn
Fly.io 是一个让你像部署本地 Docker 一样,把后端服务直接跑到全球边缘节点上的云平台。
每个账号有免费的3台 shared-cpu-1x 256mb 虚机(Firecracker microVM), 每个月30GB流量,3G存储资源。
我就是通过白嫖这些免费资源来搭建一个Proxy, 我们选择是通过 tinyproxy 来实现代理服务
国 内小伙伴需要注意:注册账号需要绑定信用卡,需要支持境外支付的卡
准备
我们需要准备3个文件
tinyproxy.conf: tinyproxy的配置文件Dockerfile: Docker构建文件fly.toml: fly中应用配置文件
推荐准备一个应用专用目录,将3个文件都放在目录中,并且保持在同一级。 如果已经有部署到fly的应用,请不要混用目录。
tinyproxy.conf
将下列内容写入 tinyproxy.conf
User nobody
Group nogroup
Listen 0.0.0.0
Port 8888
Timeout 600
MaxClients 100
DisableViaHeader Yes
Allow 0.0.0.0/0
ConnectPort 443
ConnectPort 563
LogLevel Info
BasicAuth user password
user & password 请妥善设置,尤其是password尽量复杂一些。
Dockerfile
将下列内容写入 Dockerfile
FROM alpine:3.19
RUN apk add --no-cache tinyproxy
COPY tinyproxy.conf /etc/tinyproxy/tinyproxy.conf
EXPOSE 8888
CMD ["tinyproxy", "-d", "-c", "/etc/tinyproxy/tinyproxy.conf"]
不推荐使用 latest 标签,避免后续部署拉取最新镜像后,某些配置项失效导致应用起不来。
fly.toml
将下列内容写入 fly.toml
app = 'app-name'
primary_region = 'iad'
swap_size_mb = 512
[build]
dockerfile = 'Dockerfile'
[[services]]
internal_port = 8888
protocol = "tcp"
processes = ['app']
[[services.ports]]
port = 443
handlers = ["tls"]
[[vm]]
cpu_kind = 'shared'
cpus = 1
memory_mb = 256
app 是配置应用名称,这个名称是全局唯一,通用的名字非常容易冲突。可以不填由fly随机生成,或者设置一些复杂名字
部署
文件都准备之后我们就可以开始部署了,我们通过 flyctl 进行部署操作。
安装flyctl
macOS
brew install flyctl
或者
curl -L https://fly.io/install.sh | sh
Linux
curl -L https://fly.io/install.sh | sh
如果是fish这种非bash的shell,执行安装脚本之后,脚本会询问是否自动设置fly环境变量,请选择N,因为安装脚本是bash的,fish中执行会报错。 需要手动执行命令来设置环境变量。
Windows
pwsh -Command "iwr https://fly.io/install.ps1 -useb | iex"
windows推荐在wsl中安装flyctl, ~~~我就是在wsl-arch中操作的~~~
登录fly
首先我们需要先login才可能继续后面的操作
fly auth login
如果是在wsl中执行的,会出现无法打开浏览器的提示,提示会给一个地址,手动打开浏览器,复制地址并访问,即可完成登录
创建应用
我们需要先fly中创建一个应用。
fly 命令需要在fly.toml等文件所在目录执行
fly lauch --no-depoly
因为我们已经提前创建了fly.toml文件,命令会提示我们已有文件。
如果文件中配置了app名字,如果名字冲突命令会出现冲突提示
部署应用
fly depoly
执行命令,fly会开始build镜像,然后推送镜像,最用启动应用。
部署完成之后,会提示我们是否需要配置IP地址,这里要选N
默认给配置的是专用IP地址,是计费的。我们要用免费共享IP地址
配置免费IP地址
fly ips allocate-v4 --shared
这里一定要加--shared,否则就是专用地址.
检查状态
首先查看应用状态
fly status
如果你有多个应用,为了查看指定应用需要添加-a app-name。
下面的命令也是同理
App
Name = app-name
Owner = personal
Hostname = app-name.fly.dev
Image = app-name:deployment-xxxxxxxxxxxxxx
Machines
PROCESS ID VERSION REGION STATE ROLE CHECKS LAST UPDATED
app xxxxxxxxxxxxxx 14 iad started 2026-01-23T06:53:45Z
app信息中我们需要关注 Hostname 和 Mechines
Hostname: 是fly给我们分配的域名,可以通过这个域名访问到我们的代理Mechines: 是我们的代理虚机是否运行正常,以及虚机数量,避免超额
如果超额,可以通过下列命令缩减数量, count面数量是机器总数,1表示缩减到1台机器
fly scale count 1 -a app-name
接下来查看 ip 信息
fly ips list
VERSION IP TYPE REGION CREATED AT
v4 xx.xxx.xx.xxx public ingress (shared) Jan 1 0001 00:00
Type带shared就是共享IP地址。 除了hostname访问,我们也可以通过ip直接访问。
最后查看一下 services 信息
fly services list
Services
PROTOCOL PORTS HANDLERS FORCE HTTPS PROCESS GROUP REGIONS MACHINES
TCP xxx => xxxx [TLS] False app iad 1
这里我们就关注一下 PORTS 和 HANDLERS 是否和我们配置文件中的一致
测试连接
这个时候我们的代理已经成功启动了,现在测试一下是否可用
curl -v -x http://hostname -U 'user:password' https://ifconfig.me
浏览器配置代理
大部分情况我们只是需要代理来访问一些网站,并不需要OS全部走代理。 这时我们只需要在浏览器上配置代理,这样也能节省一些流量
这里推荐使用 SwitchOmega 插件。
Happy hacking!!!
