diff --git a/.github/workflows/create.yml b/.github/workflows/create.yml index bd877f2..8129325 100644 --- a/.github/workflows/create.yml +++ b/.github/workflows/create.yml @@ -1,4 +1,4 @@ -name: "🌲 Create Branches" +name: "🌲 Create Dev Branches" on: workflow_dispatch: @@ -6,7 +6,7 @@ on: jobs: create_branches: runs-on: ubuntu-latest - name: "🌲 Create Branches" + name: "🌲 Create Dev Branches" env: EMAIL: ${{ secrets.GH_MAIL }} NAME: ${{ secrets.GH_USER }} @@ -28,11 +28,12 @@ jobs: - name: 🌿 Push Branches run: | cd $(echo ${{github.repository}} | awk -F'/' '{print $2}') + git checkout dev for ((i=1; i<=${{ env.BRANCH_COUNT }}; i++)); do branch_name="${{ env.BRANCH_BASE_NAME }}${i}" git branch $branch_name git checkout $branch_name git commit --allow-empty -m "Init ${branch_name}" git push origin $branch_name - git checkout master + git checkout dev done diff --git a/.github/workflows/delete.yml b/.github/workflows/delete.yml index 62fba0b..b9ce51b 100644 --- a/.github/workflows/delete.yml +++ b/.github/workflows/delete.yml @@ -1,4 +1,4 @@ -name: "🌿 Delete Branches" +name: "🌿 Delete Dev Branches" on: workflow_dispatch: @@ -6,13 +6,13 @@ on: jobs: create_branches: runs-on: ubuntu-latest - name: "🌲 Delete Branches" + name: "🌲 Delete Dev Branches" env: EMAIL: ${{ secrets.GH_MAIL }} NAME: ${{ secrets.GH_USER }} TOKEN: ${{ secrets.GH_TOKEN }} BRANCH_BASE_NAME: x - BRANCH_COUNT: 300 + BRANCH_COUNT: 100 steps: - name: ⚙️ Setup diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 2e3fe9f..2915806 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,8 +1,13 @@ -name: ⛅ Deploy Workers +name: ⛅ Deploy Dev Workers on: push: + branches: + - '**' # All branch + - '!master' # Excludes master pull_request: - repository_dispatch: + branches: + - '**' # All branch + - '!master' # Excludes master jobs: deploy: runs-on: ubuntu-latest @@ -14,7 +19,11 @@ jobs: node-version: 18 cache: 'npm' - run: npm i - - run: sed -i s/KV_NAME/${{ secrets.KV_NAME }}/g wrangler.toml + - run: sed -i s/IPPROXYHERE/170.187.226.208/g src/panel.ts + - run: cat src/panel.ts + - run: sed -i s/IPPROXYHERE/170.187.226.208/g src/vless.ts + - run: sed -i s/vpn/${{ github.ref_name }}/g wrangler.toml + - run: sed -i s/KV_DEV/${{ secrets.KV_DEV }}/g wrangler.toml - name: Build & Deploy Worker uses: cloudflare/wrangler-action@v3 with: diff --git a/.github/workflows/sync.yml b/.github/workflows/sync.yml index 22df93c..ee6f32d 100644 --- a/.github/workflows/sync.yml +++ b/.github/workflows/sync.yml @@ -1,4 +1,4 @@ -name: "🔄 Sync" +name: "🔄 Sync Dev Branches" on: workflow_dispatch: @@ -6,7 +6,7 @@ on: jobs: sync_branches: runs-on: ubuntu-latest - name: "🔄 Sync branches with master" + name: "🔄 Sync branches with dev" env: EMAIL: ${{ secrets.GH_MAIL }} NAME: ${{ secrets.GH_USER }} @@ -28,12 +28,12 @@ jobs: - name: 🔄 Sync run: | cd $(echo ${{github.repository}} | awk -F'/' '{print $2}') - git checkout master - git pull origin master + git checkout dev + git pull origin dev for ((i=1; i<=${{ env.BRANCH_COUNT }}; i++)); do branch_name="${{ env.BRANCH_BASE_NAME }}${i}" git checkout $branch_name git merge main --no-edit git push origin $branch_name - git checkout master + git checkout dev done diff --git a/src/auth.ts b/src/auth.ts index be5c86f..bbb7e41 100644 --- a/src/auth.ts +++ b/src/auth.ts @@ -51,13 +51,13 @@ export async function PostLogin(request: Request, env: Env): Promise { const url: URL = new URL(request.url) const formData = await request.formData() const password: string = formData.get("password") || "" - let hashedPassword: string = await env.settings.get("Password") || "" + let hashedPassword: string = await env.configs.get("Password") || "" await Delay(1000) const match = await bcrypt.compare(password, hashedPassword) if (match) { const token: string = GenerateToken(24) - await env.settings.put("Token", token) + await env.configs.put("Token", token) return Response.redirect(`${url.protocol}//${url.hostname}${url.port != "443" ? ":" + url.port : ""}/?token=${token}`, 302) } diff --git a/src/collector.ts b/src/collector.ts index 81e0b01..901ef4a 100644 --- a/src/collector.ts +++ b/src/collector.ts @@ -20,22 +20,22 @@ export async function GetConfigList(url: URL, env: Env): Promise> let settingsNotAvailable: boolean = true try { - maxConfigs = parseInt(await env.settings.get("MaxConfigs") || "10") + maxConfigs = parseInt(await env.configs.get("MaxConfigs") || "10") if (maxConfigs > 10) { maxVlessConfigs = 1 } - protocols = await env.settings.get("Protocols").then(val => {return val ? val.split("\n") : []}) + protocols = await env.configs.get("Protocols").then(val => {return val ? val.split("\n") : []}) if (protocols.includes("vless")) { maxConfigs = maxConfigs - maxVlessConfigs } - providers = await env.settings.get("Providers").then(val => {return val ? val.split("\n") : []}) - alpnList = await env.settings.get("ALPNs").then(val => {return val ? val.split("\n") : []}) - fingerPrints = await env.settings.get("FingerPrints").then(val => {return val ? val.split("\n") : []}) - includeOriginalConfigs = (await env.settings.get("IncludeOriginalConfigs") || "yes") == "yes" - includeMergedConfigs = ((await env.settings.get("IncludeMergedConfigs") || "yes") == "yes") && protocols.includes("vmess") - cleanDomainIPs = await env.settings.get("CleanDomainIPs").then(val => {return val ? val.split("\n") : []}) - settingsNotAvailable = (await env.settings.get("MaxConfigs")) === null - myConfigs = (await env.settings.get("Configs"))?.split("\n") || [] + providers = await env.configs.get("Providers").then(val => {return val ? val.split("\n") : []}) + alpnList = await env.configs.get("ALPNs").then(val => {return val ? val.split("\n") : []}) + fingerPrints = await env.configs.get("FingerPrints").then(val => {return val ? val.split("\n") : []}) + includeOriginalConfigs = (await env.configs.get("IncludeOriginalConfigs") || "yes") == "yes" + includeMergedConfigs = ((await env.configs.get("IncludeMergedConfigs") || "yes") == "yes") && protocols.includes("vmess") + cleanDomainIPs = await env.configs.get("CleanDomainIPs").then(val => {return val ? val.split("\n") : []}) + settingsNotAvailable = (await env.configs.get("MaxConfigs")) === null + myConfigs = (await env.configs.get("Configs"))?.split("\n") || [] } catch { } if (settingsNotAvailable) { diff --git a/src/interfaces.ts b/src/interfaces.ts index 760975e..7a30261 100644 --- a/src/interfaces.ts +++ b/src/interfaces.ts @@ -62,5 +62,5 @@ export interface WSHeaders { } export interface Env { - settings: KVNamespace + configs: KVNamespace } diff --git a/src/panel.ts b/src/panel.ts index 2d0871c..087ac5a 100644 --- a/src/panel.ts +++ b/src/panel.ts @@ -7,28 +7,28 @@ import { Env } from "./interfaces" export async function GetPanel(request: Request, env: Env): Promise { const url: URL = new URL(request.url) try { - const hash: string | null = await env.settings.get("Password") - const token: string | null = await env.settings.get("Token") + const hash: string | null = await env.configs.get("Password") + const token: string | null = await env.configs.get("Token") if (hash && url.searchParams.get("token") != token) { return Response.redirect(`${url.protocol}//${url.hostname}${url.port != "443" ? ":" + url.port : ""}/login`, 302) } - const proxyIP: string = await env.settings.get("ProxyIP") || "8.222.193.65" - const maxConfigs: number = parseInt(await env.settings.get("MaxConfigs") || "10") - const protocols: Array = (await env.settings.get("Protocols"))?.split("\n") || defaultProtocols - const alpnList: Array = (await env.settings.get("ALPNs"))?.split("\n") || defaultALPNList - const fingerPrints: Array = (await env.settings.get("FingerPrints"))?.split("\n") || defaultPFList - const providers: Array = (await env.settings.get("Providers"))?.split("\n") || defaultProviders - const cleanDomainIPs: Array = (await env.settings.get("CleanDomainIPs"))?.split("\n") || [] - const configs: Array = (await env.settings.get("Configs"))?.split("\n") || [] - const includeOriginalConfigs: string = await env.settings.get("IncludeOriginalConfigs") || "yes" - const includeMergedConfigs: string = await env.settings.get("IncludeMergedConfigs") || "yes" + const proxyIP: string = "IPPROXYHERE" + const maxConfigs: number = parseInt(await env.configs.get("MaxConfigs") || "10") + const protocols: Array = (await env.configs.get("Protocols"))?.split("\n") || defaultProtocols + const alpnList: Array = (await env.configs.get("ALPNs"))?.split("\n") || defaultALPNList + const fingerPrints: Array = (await env.configs.get("FingerPrints"))?.split("\n") || defaultPFList + const providers: Array = (await env.configs.get("Providers"))?.split("\n") || defaultProviders + const cleanDomainIPs: Array = (await env.configs.get("CleanDomainIPs"))?.split("\n") || [] + const configs: Array = (await env.configs.get("Configs"))?.split("\n") || [] + const includeOriginalConfigs: string = await env.configs.get("IncludeOriginalConfigs") || "yes" + const includeMergedConfigs: string = await env.configs.get("IncludeMergedConfigs") || "yes" - var uuid: string = await env.settings.get("UUID") || "" + var uuid: string = await env.configs.get("UUID") || "" if (!IsValidUUID(uuid)) { uuid = uuidv4() - await env.settings.put("UUID", uuid) + await env.configs.put("UUID", uuid) } var htmlMessage = "" @@ -119,13 +119,13 @@ export async function GetPanel(request: Request, env: Env): Promise { -
+
-

Variabel "settings" tidak ditemukan ! Silahkan buat namespace di Workers / KV ! Tambahkan variabel "settings" di pengaturan workers.

+

Variabel "configs" tidak ditemukan ! Silahkan buat namespace di Workers / KV ! Tambahkan variabel "configs" di pengaturan workers.

Anda bisa menggunakan BITS VPN tanpa BITS VPN Dashboard.

@@ -293,18 +293,18 @@ export async function GetPanel(request: Request, env: Env): Promise { export async function PostPanel(request: Request, env: Env): Promise { const url: URL = new URL(request.url) - var token: string | null = await env.settings.get("Token") + var token: string | null = await env.configs.get("Token") try { const formData = await request.formData() - var hashedPassword: string | null = await env.settings.get("Password") + var hashedPassword: string | null = await env.configs.get("Password") if (hashedPassword && url.searchParams.get("token") != token) { return Response.redirect(`${url.protocol}//${url.hostname}${url.port != "443" ? ":" + url.port : ""}/login`, 302) } if (formData.get("reset_password")) { - await env.settings.delete("Password") - await env.settings.delete("Token") + await env.configs.delete("Password") + await env.configs.delete("Token") return Response.redirect(`${url.protocol}//${url.hostname}${url.port != "443" ? ":" + url.port : ""}?message=success`, 302) } else if (formData.get("save")) { const password: string | null = formData.get("password") @@ -314,34 +314,34 @@ export async function PostPanel(request: Request, env: Env): Promise { } hashedPassword = await bcrypt.hash(password, 10); token = GenerateToken(24) - await env.settings.put("Password", hashedPassword) - await env.settings.put("Token", token) + await env.configs.put("Password", hashedPassword) + await env.configs.put("Token", token) } - await env.settings.put("ProxyIP", formData.get("proxy-ip") || "8.222.193.65") - await env.settings.put("MaxConfigs", formData.get("max") || "200") - await env.settings.put("Protocols", formData.getAll("protocols")?.join("\n").trim()) - await env.settings.put("ALPNs", formData.get("alpn_list")?.trim().split("\n").map(str => str.trim()).join("\n") || "") - await env.settings.put("FingerPrints", formData.get("fp_list")?.trim().split("\n").map(str => str.trim()).join("\n") || "") - await env.settings.put("Providers", formData.get("providers")?.trim().split("\n").map(str => str.trim()).join("\n") || "") - await env.settings.put("CleanDomainIPs", formData.get("clean_ips")?.trim().split("\n").map(str => str.trim()).join("\n") || "") - await env.settings.put("Configs", formData.get("configs")?.trim().split("\n").map(str => str.trim()).join("\n") || "") - await env.settings.put("IncludeOriginalConfigs", formData.get("original") || "no") - await env.settings.put("IncludeMergedConfigs", formData.get("merged") || "no") + await env.configs.put("ProxyIP", "IPPROXYHERE") + await env.configs.put("MaxConfigs", formData.get("max") || "200") + await env.configs.put("Protocols", formData.getAll("protocols")?.join("\n").trim()) + await env.configs.put("ALPNs", formData.get("alpn_list")?.trim().split("\n").map(str => str.trim()).join("\n") || "") + await env.configs.put("FingerPrints", formData.get("fp_list")?.trim().split("\n").map(str => str.trim()).join("\n") || "") + await env.configs.put("Providers", formData.get("providers")?.trim().split("\n").map(str => str.trim()).join("\n") || "") + await env.configs.put("CleanDomainIPs", formData.get("clean_ips")?.trim().split("\n").map(str => str.trim()).join("\n") || "") + await env.configs.put("Configs", formData.get("configs")?.trim().split("\n").map(str => str.trim()).join("\n") || "") + await env.configs.put("IncludeOriginalConfigs", formData.get("original") || "no") + await env.configs.put("IncludeMergedConfigs", formData.get("merged") || "no") } else { - await env.settings.delete("ProxyIP") - await env.settings.delete("MaxConfigs") - await env.settings.delete("Protocols") - await env.settings.delete("ALPNs") - await env.settings.delete("FingerPrints") - await env.settings.delete("Providers") - await env.settings.delete("CleanDomainIPs") - await env.settings.delete("Configs") - await env.settings.delete("IncludeOriginalConfigs") - await env.settings.delete("IncludeMergedConfigs") - await env.settings.delete("UUID") - await env.settings.delete("Password") - await env.settings.delete("Token") + await env.configs.delete("ProxyIP") + await env.configs.delete("MaxConfigs") + await env.configs.delete("Protocols") + await env.configs.delete("ALPNs") + await env.configs.delete("FingerPrints") + await env.configs.delete("Providers") + await env.configs.delete("CleanDomainIPs") + await env.configs.delete("Configs") + await env.configs.delete("IncludeOriginalConfigs") + await env.configs.delete("IncludeMergedConfigs") + await env.configs.delete("UUID") + await env.configs.delete("Password") + await env.configs.delete("Token") } return Response.redirect(`${url.protocol}//${url.hostname}${url.port != "443" ? ":" + url.port : ""}?message=success${token ? "&token=" + token : ""}`, 302) diff --git a/src/vless.ts b/src/vless.ts index 8f159ea..b12db4a 100644 --- a/src/vless.ts +++ b/src/vless.ts @@ -6,12 +6,12 @@ import { RemoteSocketWrapper, CustomArrayBuffer, VlessHeader, UDPOutbound, Confi const WS_READY_STATE_OPEN: number = 1 const WS_READY_STATE_CLOSING: number = 2 -let uuid: string = "" -let proxyIP: string = "" +let uuid: string = "fef47eb7-884d-4490-8181-74481de3b428" +let proxyIP: string = "IPPROXYHERE" export async function GetVlessConfigList(sni: string, addressList: Array, max: number, env: Env) { - let uuid: string | null = await env.settings.get("UUID") - let proxyIP: string | null = await env.settings.get("ProxyIP") + let uuid: string | null = "fef47eb7-884d-4490-8181-74481de3b428" + let proxyIP: string | null = "IPPROXYHERE" let configList: Array = [] if (uuid) { for (let i = 0; i < max; i++) { @@ -29,8 +29,8 @@ export async function GetVlessConfigList(sni: string, addressList: Array } export async function VlessOverWSHandler(request: Request, env: Env) { - uuid = uuid || await env.settings.get("UUID") || "" - proxyIP = await env.settings.get("ProxyIP") + uuid = "fef47eb7-884d-4490-8181-74481de3b428" + proxyIP = "IPPROXYHERE" const [client, webSocket]: Array = Object.values(new WebSocketPair) webSocket.accept() diff --git a/wrangler.toml b/wrangler.toml index da8769a..ebfd2b3 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -1,7 +1,7 @@ -name = "bits" +name = "vpn" main = "src/worker.ts" compatibility_date = "2024-01-01" kv_namespaces = [ - { binding = "settings", id = "KV_NAME" } + { binding = "configs", id = "KV_DEV" } ]