From ac93c38b07c946b68b7b220b76c86dc3446e48bf Mon Sep 17 00:00:00 2001 From: coperlm <76933810+coperlm@users.noreply.github.com> Date: Tue, 17 Feb 2026 23:26:56 +0800 Subject: [PATCH 1/6] feat:self_deploy --- .gitignore | 5 +++- package.json | 4 ++-- scripts/build-client.js | 49 ++++++++++++++++++++++++++++++++++++++++ src/app/layout.tsx | 2 +- src/components/usage.tsx | 2 +- src/env.ts | 2 ++ 6 files changed, 59 insertions(+), 5 deletions(-) create mode 100644 scripts/build-client.js diff --git a/.gitignore b/.gitignore index f0b8bc1..462ac7a 100644 --- a/.gitignore +++ b/.gitignore @@ -41,4 +41,7 @@ next-env.d.ts *.log -.idea/ \ No newline at end of file +.idea/ +# Build artifacts +src/lib/client.build.js +src/**/*.backup diff --git a/package.json b/package.json index 5f3d462..084cb1f 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,8 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "terser ./src/lib/client.js -o ./public/js/client.min.js --compress --timings --mangle --toplevel && next dev --turbopack", - "build": "terser ./src/lib/client.js -o ./public/js/client.min.js --compress --timings --mangle --toplevel && next build", + "dev": "node ./scripts/build-client.js && terser ./src/lib/client.js -o ./public/js/client.min.js --compress --timings --mangle --toplevel && next dev --turbopack", + "build": "node ./scripts/build-client.js && terser ./src/lib/client.js -o ./public/js/client.min.js --compress --timings --mangle --toplevel && next build", "start": "terser ./src/lib/client.js -o ./public/js/client.min.js --compress --timings --mangle --toplevel && next start", "lint": "next lint", "db:generate": "npx drizzle-kit generate", diff --git a/scripts/build-client.js b/scripts/build-client.js new file mode 100644 index 0000000..47495e1 --- /dev/null +++ b/scripts/build-client.js @@ -0,0 +1,49 @@ +#!/usr/bin/env node +const fs = require('fs'); +const path = require('path'); + +// Get base URL from env +const baseUrl = process.env.NEXT_PUBLIC_BASE_URL || process.env.BETTER_AUTH_URL || ''; + +// Only replace if baseUrl is set and NOT vercount.one +const shouldReplace = baseUrl && !baseUrl.includes('vercount.one'); + +const clientSrc = path.resolve(__dirname, '../src/lib/client.js'); +const clientTmp = path.resolve(__dirname, '../src/lib/client.build.js'); + +if (shouldReplace) { + let origin = baseUrl; + try { + origin = new URL(baseUrl).origin; + } catch (e) { + origin = baseUrl.replace(/\/$/, ''); + } + + console.log(`[build-client] Using custom domain: ${origin}`); + + // Create temporary build version of client.js + let clientContent = fs.readFileSync(clientSrc, 'utf8'); + clientContent = clientContent.replace(/https:\/\/events\.vercount\.one/g, origin); + fs.writeFileSync(clientTmp, clientContent, 'utf8'); + + // Replace in usage.tsx + const usagePath = path.resolve(__dirname, '../src/components/usage.tsx'); + const usageBackup = usagePath + '.backup'; + let usageContent = fs.readFileSync(usagePath, 'utf8'); + fs.writeFileSync(usageBackup, usageContent, 'utf8'); // backup + usageContent = usageContent.replace(/https:\/\/events\.vercount\.one/g, origin); + fs.writeFileSync(usagePath, usageContent, 'utf8'); + + // Replace in layout.tsx + const layoutPath = path.resolve(__dirname, '../src/app/layout.tsx'); + const layoutBackup = layoutPath + '.backup'; + let layoutContent = fs.readFileSync(layoutPath, 'utf8'); + fs.writeFileSync(layoutBackup, layoutContent, 'utf8'); // backup + layoutContent = layoutContent.replace(/https:\/\/vercount\.one/g, origin); + fs.writeFileSync(layoutPath, layoutContent, 'utf8'); +} else { + console.log('[build-client] Using default: vercount.one'); + // Just copy original + fs.copyFileSync(clientSrc, clientTmp); +} + diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 1a2bc40..b6ba455 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -19,7 +19,7 @@ export const viewport = { }; export const metadata: Metadata = { title: "Vercount - 网站流量计数器", - metadataBase: new URL("https://vercount.one"), + metadataBase: new URL("https://my-site.com"), description: "Vercount is a straightforward, fast, and reliable website view counter. Vercount 是一个完美的不蒜子网站计数器替代方案,轻松统计页面浏览量和访客数量。", keywords: diff --git a/src/components/usage.tsx b/src/components/usage.tsx index 8e4139a..6fdc97a 100644 --- a/src/components/usage.tsx +++ b/src/components/usage.tsx @@ -40,7 +40,7 @@ export default function Usage() {

添加以下 HTML 代码

`} + code={``} language="html" /> diff --git a/src/env.ts b/src/env.ts index 063f7c5..e23da43 100644 --- a/src/env.ts +++ b/src/env.ts @@ -15,9 +15,11 @@ export const env = createEnv({ KV_REST_API_TOKEN: z.string(), }, client: { + NEXT_PUBLIC_BASE_URL: z.string().url().optional(), }, // only for client env variables experimental__runtimeEnv: { + NEXT_PUBLIC_BASE_URL: process.env.NEXT_PUBLIC_BASE_URL, } }); \ No newline at end of file From c93f73a15a17a32f05d3562012db09e95b99c45d Mon Sep 17 00:00:00 2001 From: coperlm <76933810+coperlm@users.noreply.github.com> Date: Tue, 17 Feb 2026 23:50:29 +0800 Subject: [PATCH 2/6] fix:self_deploy_disapear --- package.json | 4 ++-- public/js/client.min.js | 2 +- public/js/client.min.js.map | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 public/js/client.min.js.map diff --git a/package.json b/package.json index 084cb1f..2b6f5c3 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,8 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "node ./scripts/build-client.js && terser ./src/lib/client.js -o ./public/js/client.min.js --compress --timings --mangle --toplevel && next dev --turbopack", - "build": "node ./scripts/build-client.js && terser ./src/lib/client.js -o ./public/js/client.min.js --compress --timings --mangle --toplevel && next build", + "dev": "node ./scripts/build-client.js && terser ./src/lib/client.build.js -o ./public/js/client.min.js --compress --timings --mangle --toplevel && next dev --turbopack", + "build": "node ./scripts/build-client.js && terser ./src/lib/client.build.js -o ./public/js/client.min.js --compress --timings --mangle --toplevel && next build", "start": "terser ./src/lib/client.js -o ./public/js/client.min.js --compress --timings --mangle --toplevel && next start", "lint": "next lint", "db:generate": "npx drizzle-kit generate", diff --git a/public/js/client.min.js b/public/js/client.min.js index 277d13d..162c9b1 100644 --- a/public/js/client.min.js +++ b/public/js/client.min.js @@ -1 +1 @@ -!function(){"use strict";const t=[];let e=!1,n=null;const o="visitorCountData",a=async()=>{const t=window.location.href;if(!t.startsWith("http"))return null;const e=new AbortController,n=setTimeout((()=>e.abort()),5e3);try{const o=await fetch("https://events.vercount.one/api/v2/log",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:t}),signal:e.signal});if(clearTimeout(n),!o.ok)throw new Error(`HTTP ${o.status}`);return(t=>"success"===t?.status&&t.data?t.data:"error"===t?.status?(console.warn("API error:",t.message),t.data||{site_uv:0,site_pv:0,page_pv:0}):t||{site_uv:0,site_pv:0,page_pv:0})(await o.json())}catch(t){return clearTimeout(n),"AbortError"===t.name?console.warn("Request timeout"):console.warn("API error:",t.message),null}},s=()=>{if(n)return n;return n={},["site_pv","page_pv","site_uv"].forEach((t=>{n[`busuanzi_value_${t}`]=document.getElementById(`busuanzi_value_${t}`),n[`busuanzi_container_${t}`]=document.getElementById(`busuanzi_container_${t}`),n[`vercount_value_${t}`]=document.getElementById(`vercount_value_${t}`),n[`vercount_container_${t}`]=document.getElementById(`vercount_container_${t}`)})),n},r=t=>{const e=s();["site_pv","page_pv","site_uv"].forEach((n=>{const o=String(t[n]||"0"),a=e[`busuanzi_value_${n}`],s=e[`vercount_value_${n}`];a&&(a.textContent=o),s&&(s.textContent=o)}))},u=()=>{const t=s();["site_pv","page_pv","site_uv"].forEach((e=>{const n=t[`busuanzi_container_${e}`],o=t[`vercount_container_${e}`];n&&(n.style.display="inline"),o&&(o.style.display="inline")}))};var i;i=async()=>{(()=>{const t=s();["site_pv","page_pv","site_uv"].forEach((e=>{const n=t[`busuanzi_container_${e}`],o=t[`vercount_container_${e}`];n&&(n.style.display="none"),o&&(o.style.display="none")}))})();const t=await a();if(t)r(t),(t=>{try{localStorage.setItem(o,JSON.stringify(t))}catch(t){}})(t),u();else{const t=(()=>{try{const t=localStorage.getItem(o);return t?JSON.parse(t):null}catch(t){return null}})();t&&(r(t),u())}},e||"loading"!==document.readyState?i():(t.push(i),document.addEventListener("DOMContentLoaded",(()=>{e=!0,t.forEach((t=>t()))}),{once:!0}))}(); \ No newline at end of file +!function(){"use strict";const t=[];let e=!1,n=null;const o="visitorCountData",a=async()=>{const t=window.location.href;if(!t.startsWith("http"))return null;const e=new AbortController,n=setTimeout(()=>e.abort(),5e3);try{const o=await fetch("https://vercount-l2e8.vercel.app/api/v2/log",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:t}),signal:e.signal});if(clearTimeout(n),!o.ok)throw new Error(`HTTP ${o.status}`);return(t=>"success"===t?.status&&t.data?t.data:"error"===t?.status?(console.warn("API error:",t.message),t.data||{site_uv:0,site_pv:0,page_pv:0}):t||{site_uv:0,site_pv:0,page_pv:0})(await o.json())}catch(t){return clearTimeout(n),"AbortError"===t.name?console.warn("Request timeout"):console.warn("API error:",t.message),null}},r=()=>{if(n)return n;return n={},["site_pv","page_pv","site_uv"].forEach(t=>{n[`busuanzi_value_${t}`]=document.getElementById(`busuanzi_value_${t}`),n[`busuanzi_container_${t}`]=document.getElementById(`busuanzi_container_${t}`),n[`vercount_value_${t}`]=document.getElementById(`vercount_value_${t}`),n[`vercount_container_${t}`]=document.getElementById(`vercount_container_${t}`)}),n},s=t=>{const e=r();["site_pv","page_pv","site_uv"].forEach(n=>{const o=String(t[n]||"0"),a=e[`busuanzi_value_${n}`],r=e[`vercount_value_${n}`];a&&(a.textContent=o),r&&(r.textContent=o)})},u=()=>{const t=r();["site_pv","page_pv","site_uv"].forEach(e=>{const n=t[`busuanzi_container_${e}`],o=t[`vercount_container_${e}`];n&&(n.style.display="inline"),o&&(o.style.display="inline")})};var c;c=async()=>{(()=>{const t=r();["site_pv","page_pv","site_uv"].forEach(e=>{const n=t[`busuanzi_container_${e}`],o=t[`vercount_container_${e}`];n&&(n.style.display="none"),o&&(o.style.display="none")})})();const t=await a();if(t)s(t),(t=>{try{localStorage.setItem(o,JSON.stringify(t))}catch(t){}})(t),u();else{const t=(()=>{try{const t=localStorage.getItem(o);return t?JSON.parse(t):null}catch(t){return null}})();t&&(s(t),u())}},e||"loading"!==document.readyState?c():(t.push(c),document.addEventListener("DOMContentLoaded",()=>{e=!0,t.forEach(t=>t())},{once:!0}))}(); \ No newline at end of file diff --git a/public/js/client.min.js.map b/public/js/client.min.js.map new file mode 100644 index 0000000..ccaf608 --- /dev/null +++ b/public/js/client.min.js.map @@ -0,0 +1 @@ +{"version":3,"names":["readyCallbacks","isDocumentReady","cachedElements","CACHE_KEY","fetchCounterData","async","currentUrl","window","location","href","startsWith","controller","AbortController","timeoutId","setTimeout","abort","response","fetch","method","headers","body","JSON","stringify","url","signal","clearTimeout","ok","Error","status","data","console","warn","message","site_uv","site_pv","page_pv","extractCounterData","json","error","name","getCachedElements","forEach","id","document","getElementById","updateCounters","elements","value","String","busuanziEl","vercountEl","textContent","showCounters","busuanziContainer","vercountContainer","style","display","callback","hideCounters","localStorage","setItem","e","setCachedData","cachedData","cached","getItem","parse","getCachedData","readyState","push","addEventListener","cb","once"],"sources":["./src/lib/client.build.js"],"mappings":"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","ignoreList":[]} \ No newline at end of file From eeb5ace47fe46f027525a32dcbd5d96d5b4e1141 Mon Sep 17 00:00:00 2001 From: coperlm <76933810+coperlm@users.noreply.github.com> Date: Wed, 18 Feb 2026 00:04:33 +0800 Subject: [PATCH 3/6] del:no use for self_deploy --- .gitignore | 5 ----- public/js/client.min.js | 1 - public/js/client.min.js.map | 1 - scripts/build-client.js | 16 ---------------- src/app/layout.tsx | 2 +- src/components/usage.tsx | 2 +- 6 files changed, 2 insertions(+), 25 deletions(-) delete mode 100644 public/js/client.min.js delete mode 100644 public/js/client.min.js.map diff --git a/.gitignore b/.gitignore index 462ac7a..bf18ca4 100644 --- a/.gitignore +++ b/.gitignore @@ -40,8 +40,3 @@ app.log next-env.d.ts *.log - -.idea/ -# Build artifacts -src/lib/client.build.js -src/**/*.backup diff --git a/public/js/client.min.js b/public/js/client.min.js deleted file mode 100644 index 162c9b1..0000000 --- a/public/js/client.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(){"use strict";const t=[];let e=!1,n=null;const o="visitorCountData",a=async()=>{const t=window.location.href;if(!t.startsWith("http"))return null;const e=new AbortController,n=setTimeout(()=>e.abort(),5e3);try{const o=await fetch("https://vercount-l2e8.vercel.app/api/v2/log",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:t}),signal:e.signal});if(clearTimeout(n),!o.ok)throw new Error(`HTTP ${o.status}`);return(t=>"success"===t?.status&&t.data?t.data:"error"===t?.status?(console.warn("API error:",t.message),t.data||{site_uv:0,site_pv:0,page_pv:0}):t||{site_uv:0,site_pv:0,page_pv:0})(await o.json())}catch(t){return clearTimeout(n),"AbortError"===t.name?console.warn("Request timeout"):console.warn("API error:",t.message),null}},r=()=>{if(n)return n;return n={},["site_pv","page_pv","site_uv"].forEach(t=>{n[`busuanzi_value_${t}`]=document.getElementById(`busuanzi_value_${t}`),n[`busuanzi_container_${t}`]=document.getElementById(`busuanzi_container_${t}`),n[`vercount_value_${t}`]=document.getElementById(`vercount_value_${t}`),n[`vercount_container_${t}`]=document.getElementById(`vercount_container_${t}`)}),n},s=t=>{const e=r();["site_pv","page_pv","site_uv"].forEach(n=>{const o=String(t[n]||"0"),a=e[`busuanzi_value_${n}`],r=e[`vercount_value_${n}`];a&&(a.textContent=o),r&&(r.textContent=o)})},u=()=>{const t=r();["site_pv","page_pv","site_uv"].forEach(e=>{const n=t[`busuanzi_container_${e}`],o=t[`vercount_container_${e}`];n&&(n.style.display="inline"),o&&(o.style.display="inline")})};var c;c=async()=>{(()=>{const t=r();["site_pv","page_pv","site_uv"].forEach(e=>{const n=t[`busuanzi_container_${e}`],o=t[`vercount_container_${e}`];n&&(n.style.display="none"),o&&(o.style.display="none")})})();const t=await a();if(t)s(t),(t=>{try{localStorage.setItem(o,JSON.stringify(t))}catch(t){}})(t),u();else{const t=(()=>{try{const t=localStorage.getItem(o);return t?JSON.parse(t):null}catch(t){return null}})();t&&(s(t),u())}},e||"loading"!==document.readyState?c():(t.push(c),document.addEventListener("DOMContentLoaded",()=>{e=!0,t.forEach(t=>t())},{once:!0}))}(); \ No newline at end of file diff --git a/public/js/client.min.js.map b/public/js/client.min.js.map deleted file mode 100644 index ccaf608..0000000 --- a/public/js/client.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"names":["readyCallbacks","isDocumentReady","cachedElements","CACHE_KEY","fetchCounterData","async","currentUrl","window","location","href","startsWith","controller","AbortController","timeoutId","setTimeout","abort","response","fetch","method","headers","body","JSON","stringify","url","signal","clearTimeout","ok","Error","status","data","console","warn","message","site_uv","site_pv","page_pv","extractCounterData","json","error","name","getCachedElements","forEach","id","document","getElementById","updateCounters","elements","value","String","busuanziEl","vercountEl","textContent","showCounters","busuanziContainer","vercountContainer","style","display","callback","hideCounters","localStorage","setItem","e","setCachedData","cachedData","cached","getItem","parse","getCachedData","readyState","push","addEventListener","cb","once"],"sources":["./src/lib/client.build.js"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/scripts/build-client.js b/scripts/build-client.js index 47495e1..3428eeb 100644 --- a/scripts/build-client.js +++ b/scripts/build-client.js @@ -25,22 +25,6 @@ if (shouldReplace) { let clientContent = fs.readFileSync(clientSrc, 'utf8'); clientContent = clientContent.replace(/https:\/\/events\.vercount\.one/g, origin); fs.writeFileSync(clientTmp, clientContent, 'utf8'); - - // Replace in usage.tsx - const usagePath = path.resolve(__dirname, '../src/components/usage.tsx'); - const usageBackup = usagePath + '.backup'; - let usageContent = fs.readFileSync(usagePath, 'utf8'); - fs.writeFileSync(usageBackup, usageContent, 'utf8'); // backup - usageContent = usageContent.replace(/https:\/\/events\.vercount\.one/g, origin); - fs.writeFileSync(usagePath, usageContent, 'utf8'); - - // Replace in layout.tsx - const layoutPath = path.resolve(__dirname, '../src/app/layout.tsx'); - const layoutBackup = layoutPath + '.backup'; - let layoutContent = fs.readFileSync(layoutPath, 'utf8'); - fs.writeFileSync(layoutBackup, layoutContent, 'utf8'); // backup - layoutContent = layoutContent.replace(/https:\/\/vercount\.one/g, origin); - fs.writeFileSync(layoutPath, layoutContent, 'utf8'); } else { console.log('[build-client] Using default: vercount.one'); // Just copy original diff --git a/src/app/layout.tsx b/src/app/layout.tsx index b6ba455..1a2bc40 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -19,7 +19,7 @@ export const viewport = { }; export const metadata: Metadata = { title: "Vercount - 网站流量计数器", - metadataBase: new URL("https://my-site.com"), + metadataBase: new URL("https://vercount.one"), description: "Vercount is a straightforward, fast, and reliable website view counter. Vercount 是一个完美的不蒜子网站计数器替代方案,轻松统计页面浏览量和访客数量。", keywords: diff --git a/src/components/usage.tsx b/src/components/usage.tsx index 6fdc97a..8e4139a 100644 --- a/src/components/usage.tsx +++ b/src/components/usage.tsx @@ -40,7 +40,7 @@ export default function Usage() {

添加以下 HTML 代码

`} + code={``} language="html" /> From 5b4f3a8ba97df13eff01281aa06ef59de583b18b Mon Sep 17 00:00:00 2001 From: coperlm <76933810+coperlm@users.noreply.github.com> Date: Wed, 18 Feb 2026 00:29:55 +0800 Subject: [PATCH 4/6] add:readme of Self-Hosting Guide --- README.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 515e81d..3b40246 100644 --- a/README.md +++ b/README.md @@ -117,6 +117,14 @@ Vercount 旨在解决这些问题,让网站计数器更快、更稳定、更 最终解释权归 EvanNotFound 所有。 -## 自托管 +## 自托管(部署到vercel) -Coming soon... \ No newline at end of file +1. fork本仓库 +2. 补全环境变量 + +- `GITHUB_CLIENT_ID` 和 `GITHUB_CLIENT_SECRET`:https://github.com/settings/developers +- `DATABASE_URL`:https://console.neon.tech/app/projects/create +- `KV_REST_API_URL` 和 `KV_REST_API_TOKEN`:https://console.upstash.com/redis/create +- `BETTER_AUTH_URL`: https://项目名.vercel.app + +3. 部署项目 From 54c54b418c15158727803677abe29487b96541dc Mon Sep 17 00:00:00 2001 From: coperlm <76933810+coperlm@users.noreply.github.com> Date: Wed, 18 Feb 2026 00:34:05 +0800 Subject: [PATCH 5/6] recover gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index bf18ca4..f0b8bc1 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,5 @@ app.log next-env.d.ts *.log + +.idea/ \ No newline at end of file From 5122ceb885f6aa19fa05f2e3583f796a496575a4 Mon Sep 17 00:00:00 2001 From: coperlm <76933810+coperlm@users.noreply.github.com> Date: Wed, 18 Feb 2026 00:36:10 +0800 Subject: [PATCH 6/6] fix env --- .env.example | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env.example b/.env.example index adaa2c7..2f63600 100644 --- a/.env.example +++ b/.env.example @@ -6,7 +6,7 @@ KV_REST_API_TOKEN= DATABASE_URL= BETTER_AUTH_SECRET= -BETTER_AUTH_URL= +BETTER_AUTH_URL="https://vercount.one" # 默认情况下,直接使用官方服务器的服务 GITHUB_CLIENT_ID= GITHUB_CLIENT_SECRET= \ No newline at end of file