免责声明

请遵循当地法律使用,如有违反当地法律造成的责任,拒不承担

Heroku 为我们提供了免费的容器服务,我们不应该滥用它,所以本项目不宜做为长期翻墙使用。

可以部署两个以上的应用,实现 负载均衡,避免长时间大流量连接某一应用而被 Heroku 判定为滥用。

Heroku 的网络并不稳定,部署前请三思。

在开始之前,你需要准备:

  • 一个Heroku账号
  • 一个CloudFlare账号

准备完这两个东西,你就可以开始下面的操作了


部署应用

点击右边的这个链接,会看到如下的页面,其中APP name这里随便填,但是不能跟别人重复(重复或不可用会标红)

如果你这里加载出来了一个变量的框,写着UUID,下面有一串字母和数字组成的字符串,你可以修改它,到这里生成一个,也可以直接保留(推荐修改,这是连接凭证)

部署应用

修改UUID

(如果你在部署的时候已经修改过了UUID,或者认为没必要修改UUID,那就直接往下看CloudFlare部分)

点击Deploy APP后就会开始部署,等部署完后下面会出现两个按钮,一个是Manage APP,另一个是View,我们点Manage APP

接着我们点Settings,然后点Reveal Config Vars,来修改我们的UUID

修改uuid

Cloudflare加速

我们先到这个仓库下载它的Release来使用其程序找到最适合我们的节点

解压下载的压缩包,用管理员权限运行它的pingip.exe,输入线程,等待程序跑完

ping_host.log里面找到延迟最低的IP地址(一般在第一行),把它复制下来,等会会用到

在跑程序的期间,你可以登录你的cloudflare,找到workers,新建一个workers,并把一下代码复制进去

双Heroku APP

(该js从隔壁OneManager借用过来并作了小修改)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// odd, 单日
const SingleDay = 'https://first-app.herokuapp.com' // 在这里填你第一个APP的链接
// even, 双日
const DoubleDay = 'https://second-app.herokuapp.com' // 在这里填你第二个APP的链接

// Used in cloudflare workers, odd or even days point to 2 heroku account.

// 由于heroku不绑卡不能自定义域名,就算绑卡后https也不方便
// 另外免费套餐每月550小时,有些人不够用
// 于是在CF Workers使用此代码,分单双日拉取不同heroku帐号下的相同网页
// 只改上面,下面不用动

addEventListener('fetch', event => {
let url=new URL(event.request.url);
if (url.protocol == 'http:') {
url.protocol = 'https:'
event.respondWith( Response.redirect(url.href) )
} else {
let response = null;
let nd = new Date();
if (nd.getDate()%2) {
host = SingleDay
} else {
host = DoubleDay
}
if (host.substr(0, 7)!='http://'&&host.substr(0, 8)!='https://') host = 'http://' + host;

response = fetchAndApply(host, event.request);

event.respondWith( response );
}
})

async function fetchAndApply(host, request) {
let f_url = new URL(request.url);
let a_url = new URL(host);
let replace_path = a_url.pathname;
if (replace_path.substr(replace_path.length-1)!='/') replace_path += '/';
let replaced_path = '/';
let query = f_url.search;
let path = f_url.pathname;
if (host.substr(host.length-1)=='/') path = path.substr(1);
f_url.href = host + path + query;

let response = null;
let method = request.method;
let body = request.body;
let request_headers = request.headers;
let new_request_headers = new Headers(request_headers);
new_request_headers.set('Host', f_url.host);
new_request_headers.set('Referer', request.url);

response = await fetch(f_url.href, {
method: method,
body: body,
headers: new_request_headers
});
}

let out_headers = new Headers(response.headers);
if (out_headers.get('Content-Disposition')=='attachment') out_headers.delete('Content-Disposition');
let out_body = null;
let contentType = out_headers.get('Content-Type');
if (contentType.includes("application/text")) {
out_body = await response.text();
while (out_body.includes(replace_path)) out_body = out_body.replace(replace_path, replaced_path);
} else if (contentType.includes("text/html")) {
out_body = await response.text();
while (replace_path!='/'&&out_body.includes(replace_path)) out_body = out_body.replace(replace_path, replaced_path);
} else {
out_body = await response.body;
}

let out_response = new Response(out_body, {
status: response.status,
headers: out_headers
})

return out_response;
}

单Heroku APP

1
2
3
4
5
6
7
8
9
10
addEventListener(
"fetch",event => {
let url=new URL(event.request.url);
url.hostname="change-this-to-your-app-name.herokuapp.com";
let request=new Request(url,event.request);
event. respondWith(
fetch(request)
)
}
)

把其中的hostname的地址改成你的herokuapp的地址,然后保存

复制直接访问cloudflare提供的域名,如果提示Bad Request就可以了,把域名复制下来,等下会用到

配置V2Ray

打开你的v2ray,添加vme$$服务器,按照下面的图填写

配置v2

然后保存,愉快地使用v2ray就可以了

(不会用v2的自己找教程,这里不教)

注意事项

这只是一个临时用的方法,不适宜长期使用

heroku每个月有运行时长限制,只适合轻度使用用户

heroku的实例半小时没有访问就会自动休眠,你可以使用此项目来避免这个问题


Reference

Heroku+Cloudflare+V2搭建详细图文教程