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