Skip to content

github-neo/v2ray-heroku

Repository files navigation

Heroku已经不再免费了

如果已不再使用Heroku,可以直接看自行部署运行

Starting October 26, 2022, we will begin deleting inactive accounts and associated storage for accounts that have been inactive for over a year. Starting November 28, 2022, we plan to stop offering free product plans and plan to start shutting down free dynos and data services. We will be sending out a series of email communications to affected users.

v2ray-heroku

貌似新建的app有些需要科学访问,如果需要,请使用cloudflare worker CDN 或者 cloudflare tunnel 套一层。

切换到最新的 VLESS 协议。具体客户端配置请看 config 章节。

v2ray-heroku 是我为了体验 github action 的产物,也是我的主力 backup,我会日常维护它。加入或者修改一些我认为好的配置。但这一般会导致客户端配置需要些许修改。 不过具体配置都会体现在 详细 VLESS websocket 客户端配置

有问题请开 issue 或者 discussions。

很多人反馈 heroku 封号,我自己的还好用,请大家反馈,如果大部分人都被封号,那么就没有办法了,其他的免费的我试了 Okteto Cloud, 秒封。

请大家不要跑速度测试,或者长时间大流量。

Change log

应需求,加上首页伪装,每次部署都会随机生成首页,如果你有想法,请自己把想要的html放入到 项目html 文件,然后后续 action 部署会自动拿到。

!!!!!!! 对于一些老用户是 breaking change, 对 ws 的 path 做了修改, 请注意查看客户端配置

首先查看别人的 youtube 教程,了解怎么配置 v2ray-heroku。本项目使用最新 VLESS 协议,请在客户端配置选择 VLESS
详细 VLESS websocket 客户端配置

如果你还想自动化你的 heroku,请查看下面的教程。

本项目是包含,

项目Dockerfile是基于V2fly 官方镜像制作。仅仅增加生产配置文件的脚本。重新部署就可以更新到最新的v2ray。
基于官方镜像,这也是v2fly 推荐的做法。

保持安全最简单的方式就是,保持软件更新。

一键部署

Deploy

貌似在这个 repo 下 点击 一键部署貌似 heroku 提示违反某些原则,但是action 正常工作!!建议 fork 时候,项目名字,尽量不要带有 v2ray 关键字。

如果被heroku 提示错误,请用 github action 来部署。

部署成功后,可以先用浏览器访问 ***.herokuapp.com, 查看页面是否能正常访问。会显示一个随机的维基百科页面。

Github Actions 管理

请 Fork 本项目到自己的账户下。 Actions 需要以下 Secrets 才能正常工作,这些 Secrets 会被 workflow 中的 akhileshns/heroku-deploy 使用。

具体实现细节,请查看 workflow 配置文件. 如何配置, 请查看,Github Secrets

Name Description
APP_NAME 就是你 heroku 项目的名字. 如果你是第一次创建APP,请确保名字是唯一的
EMAIL heroku 账户的 email
HEROKU_API_KEY heroku API key,在 account 设置下可以找到
HEROKU_V2RAY_UUID V2rayUUID
HEROKU_TUNNEL_TOKEN 可选 cloudflare tunnel 的 token

这样Token一定必须是大写。。请在 heroku 网站创建app,来确保项目的名字的唯一性。

HEROKU_TUNNEL_TOKEN 是可选项,可以忽略. 详细说明,请查看章节 《建立-cloudflare-tunnel-(可选)》

请务必生成新的 UUID。使用已有的 UUID 会使自己 V2ray 暴露在危险之下。

PowerShell:

PS C:\Users\> New-Guid

Shell:

xxx@xxx:/mnt/c/Users/$ uuidgen

Github Secrets

路径

项目Setting-->Secrets

Secrets

Heroku API key

路径

heroku Account settings-->API key

Secrets

Github Actions 界面

Actions

Actions

重新部署

点击 Run workflow, 输入 deploy。 然后就会重新 deploy。

这里可以选择区域,但是请确保app没有被创建过。如果要切换区域,请先使用 destroy 删除应用。

deploy

停止

点击 Run workflow, 输入 stop。 然后就会 stop,不在计入小时数。 stop

启动

点击 Run workflow, 输入 start。 然后就会启动。

start

删除

点击 Run workflow, 输入 destroy 然后就会删除。

delete

建立 cloudflare worker (可选)

如果遇到创建的app在正常网络下不能访问,请尝试这个。

可以参考 开头的视频。代码如下。

const targetHost = "xxx.herokuapp.com"; //你的heroku的hostname
addEventListener("fetch", (event) => {
  let url = new URL(event.request.url);
  url.hostname = targetHost;
  let request = new Request(url, event.request);
  event.respondWith(fetch(request));
});

// herokuapp 如果长时间不访问就会休眠。增加cron事件监听器以支持定时job访问herokuapp url。
addEventListener('scheduled', event => {
  event.waitUntil(
    handleSchedule(event)
  )
})

async function handleSchedule(event) {
  let url = new URL("https://" + targetHost);
  url.hostname = targetHost;
  let request = new Request(url);
  const resp = await fetch(request);
  //console.log(await resp.text());
}

然后添加Worker的触发器以定时访问herokuapp url: image

如果 worker 不好用,请用自己域名代理 worker https://owo.misaka.rest/cf-workers-ban-solution/

为 worker 选择速度更快的 IP。 https://github.com/badafans/better-cloudflare-ip

建立 cloudflare tunnel (可选)

项目集成 cloudflare tunnel, 在配置 Secrets HEROKU_TUNNEL_TOKEN 之后生效。具体怎么配置,请查看 cloudflare tunnel

使用 Environments 实现 多账户/多app Secrets 管理

文档介绍: https://docs.github.com/en/actions/deployment/using-environments-for-deployment

建立 Environments, 并添加 Secrets

  1. 创建 Environments Environments
  2. 添加 Secrets EnvironmentsSercet

输入环境名字

一定要确保环境名字是对的,要不然就会用主的Secrets。 EnvironmentsDeploy

VLESS websocket 客户端配置

JSON

"outbounds": [
        {
            "protocol": "vless",
            "settings": {
                "vnext": [
                    {
                        "address": "***.herokuapp.com", // heroku app URL 或者 cloudflare worker url/ip
                        "port": 443,
                        "users": [
                            {
                                "id": "", // 填写你的 UUID
                                "encryption": "none"
                            }
                        ]
                    }
                ]
            },
            "streamSettings": {
                "network": "ws",
                "security": "tls",
                "tlsSettings": {
                    "serverName": "***.herokuapp.com" // heroku app host 或者 cloudflare worker host
                }
              }
          }
    ]

VLESS tcp 客户端配置

JSON

"outbounds": [
  {
    "tag": "proxy",
    "protocol": "vless",
    "settings": {
      "vnext": [{
          "address": "******", // 服务器端地址
          "port": 8443,
          "users": [{
              "id": "", // 填写你的 UUID
              "security": "auto",
              "encryption": "none",
              "flow": "xtls-rprx-vision"
            }
          ]
        }
      ]
    },
    "streamSettings": {
      "network": "tcp",
      "security": "tls",
      "tlsSettings": {
        "allowInsecure": true,
        "alpn": [
          "h2"
        ],
        "fingerprint": "chrome",
        "show": false
      }
    },
  }
]

v2rayN

换成 V2rayN

别人的配置教程参考,https://v2raytech.com/v2rayn-config-tutorial/.

v2rayN

cloudflare worker ip 配置

v2rayN1

自行部署运行

本项目是一个基于 Docker 的 Caddy + V2Ray + acme.sh 自动证书申请工具的部署方案。使用 Docker Compose 编排 Caddy+V2Ray 和 acme.sh 两个容器,并自动配置 HTTPS 访问。

环境要求

  • Linux系统
  • 已安装 Docker 和 Docker Compose
  • 已在 Cloudflare 中添加域名,并取得相应的 API Token 和 Account ID

使用步骤

  1. 在当前用户home目录下创建acme目录。

    mkdir ~/acme
  2. 复制 acme_env.sh.sample 文件到~/acme目录并重命名为 acme_env.sh

    cp acme_env.sh.sample ~/acme/acme_env.sh
  3. 修改 ~/acme/acme_env.sh 文件,填入您的邮箱、域名(多个域名以逗号分隔)、Cloudflare API Token 和 Account ID。如果您已经有一个 UUID,请将其填入 UUID 变量中;否则,可以留空,脚本将自动生成一个 UUID,并显示在log中。TCP_PORT用于设置v2ray TCP连接的端口号,不设置的话默认使用8443端口。

  4. 构建镜像:

    ./docker_build.sh
  5. 运行容器:

    ./docker_compose.sh
  6. 完成以上步骤后,Caddy 和 V2Ray 会自动启动,并监听 80、443 (websocket) 和 8443 (tcp) 端口,同时 acme.sh 会自动申请证书并配置 HTTPS 访问。

注意事项

  • 若要禁用自动申请证书,删除或注释掉 ~/acme/acme_env.sh 中的 DOMAIN 变量即可。
    • 如果您已经有可用的证书文件,请提前将其放置到 ~/acme/caddy_v2ray-cert 目录下,命名为 Caddyfile_https 文件中期待的文件名:

      • privkey.pem : 证书的私钥。
      • fullchain.pem: 浏览器需要的完整证书链,包括公钥、元数据、根证书和中间证书等 ( Root CA -> Sub CA -> your cert )。

      这样将会使用您所提供的证书。

    • 如果没有证书,将禁用https,以http的方式运行在80端口。

  • 如果您使用的不是 Cloudflare,可以修改 docker_compose.sh 文件中的 --dns 参数以适配您的 DNS 服务商,并在 acme_env.sh 中设置好相应的环境变量。
  • Cloudflare 现已不支持 .tk .cf .ml 等免费域名后缀使用此 DNS API 验证方式,付费域名才受支持。如果您的域名属于这种情况,请修改 docker_compose.sh 文件中的 --issue 命令改用 standalone 等其他方式获取证书。或自行获取证书,然后按上述说明引入证书文件。
    • acme.sh 使用 standalone 方式获取证书命令示例:
      • http 模式(使用80端口):
        docker exec acme.sh --issue --standalone -d example.com
      • tls 模式(使用443端口):
        docker exec acme.sh --issue --standalone --alpn -d example.com
  • 如果您需要更改 Caddy 的配置,请修改 Caddyfile_httpsCaddyfile_http 文件,以及 startup.sh 启动脚本,然后重新构建镜像。
  • 如果您需要更改 V2Ray 的配置,请修改 config.json.tp 文件,然后重新构建镜像。