Initial commit: merged geosite build pipeline

This commit is contained in:
Payroll3042
2026-07-24 19:27:15 +03:00
commit a101ffe758
10 changed files with 294 additions and 0 deletions
+12
View File
@@ -0,0 +1,12 @@
FROM golang:1.25
# go.mod for v2fly/domain-list-community requires go >= 1.25.12.
# Using this version directly avoids relying on Go's automatic toolchain
# download at build time.
WORKDIR /work
COPY build.sh /work/build.sh
COPY data-custom /work/data-custom
RUN chmod +x /work/build.sh
ENTRYPOINT ["/work/build.sh"]
+22
View File
@@ -0,0 +1,22 @@
FROM golang:1.25
# git comes with the full (non-slim) golang image; cron does not.
RUN apt-get update -qq \
&& apt-get install -y -qq --no-install-recommends cron \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY auto-build-push.sh /app/auto-build-push.sh
COPY data-custom /app/data-custom
RUN chmod +x /app/auto-build-push.sh
# Default schedule: 03:10 UTC daily, same time hydraponique rebuilds their
# own source repo, so this picks up same-day changes. Override by mounting
# a different crontab or changing CRON_SCHEDULE and regenerating (see README).
RUN echo "10 3 * * * root /app/auto-build-push.sh >> /proc/1/fd/1 2>> /proc/1/fd/2" > /etc/cron.d/geosite-build \
&& chmod 0644 /etc/cron.d/geosite-build \
&& crontab /etc/cron.d/geosite-build
# Run once immediately on container start (so you don't wait until 03:10
# UTC to see it work the first time), then hand off to cron in foreground.
CMD /app/auto-build-push.sh; cron -f
+101
View File
@@ -0,0 +1,101 @@
# Merged geosite.dat build
Combines:
- **v2fly/domain-list-community** (base) — ~1520 stock categories, already
covers openai, anthropic, netflix, whatsapp, discord, signal, paypal,
linkedin, reddit, spotify, facebook, instagram, twitter, roblox, binance,
bbc, archive, viber, rutracker, speedtest, notion, figma, jetbrains, adobe,
intel, autodesk, cursor, vercel, github, google, youtube, telegram.
- **hydraponique/roscomvpn-geosite** (overlay) — RU-specific categories:
category-ru, whitelist, category-geoblock-ru, apple, google-play,
google-deepmind, microsoft, epicgames, riot, escapefromtarkov, faceit,
twitch, twitch-ads, pinterest, steam, category-ads, win-spy, private,
torrent, github, telegram, youtube (last three merge/union with v2fly's
stock versions of the same name — this is intended compiler behavior,
not a conflict).
- **data-custom/** — the only 4 services confirmed missing from both:
replicate, avast, cointelegraph, snapchat.
## Requirements
- Go >= 1.25.12 (v2fly's go.mod hard-requires this)
- git
## Manual one-off build
Docker (recommended, no local Go/git needed):
```
docker build -t geosite-builder .
docker run --rm -v "$(pwd)/output:/work/output" geosite-builder
```
Or locally if you already have Go 1.25+ and git:
```
./build.sh
```
Output: `output/geosite.dat`
## Deploying as a scheduled service (Gitea + Portainer)
This runs the build daily and pushes the result straight to your own
Gitea repo, so it's served the exact same way `rules.yaml` already is —
`https://git.5838.ru/<owner>/<repo>/raw/branch/main/geosite.dat`.
### 1. Create the target repo on git.5838.ru
Create an empty repo (e.g. `geosite-build`) under your account. It can
start completely empty — the container's first run will commit the
initial `geosite.dat`.
### 2. Create a Gitea access token
Gitea → Settings → Applications → Generate New Token, scope: repo
read/write. Copy it once, you won't see it again.
### 3. Push these build files to that repo yourself
I can't reach git.5838.ru from here, so this part's on you:
```
cd geosite-build
git init
git remote add origin https://git.5838.ru/<owner>/geosite-build.git
git add .
git commit -m "Initial commit: merged geosite build pipeline"
git push -u origin main
```
(If you'd rather keep the pipeline files in a separate repo from the
generated `geosite.dat` output, that's fine too — just point `GITEA_REPO`
in the compose file at wherever the *output* should land, which can be
a different repo than the one holding this Dockerfile/scripts.)
### 4. Deploy in Portainer
- Portainer → Stacks → Add stack
- Name it (e.g. `geosite-build`)
- Paste the contents of `docker-compose.yml`
- Under **Environment variables**, add `GITEA_TOKEN` with the token from
step 2 — don't put it directly in the compose file, use Portainer's env
var field so it isn't stored in plain text in the stack definition
- Deploy
The container runs the build immediately on startup, then again daily at
03:10 UTC (same time hydraponique rebuilds their own source, so you pick
up same-day upstream changes). Check Portainer's container logs to
confirm the first run pushed successfully.
### 5. Point your configs at the new file
Once you've confirmed a successful push, update:
- Happ's `Geositeurl` in `RU-routing.json`
- Clash Verge's geo-data source, if you want the same merged categories there
to `https://git.5838.ru/<owner>/<repo>/raw/branch/main/geosite.dat`.
## Adding more custom domains later
If you find another service missing after the fact, add a new file under
`data-custom/` (one domain per line, `domain:example.com` for subdomain
matching, `full:example.com` for exact matches — same format v2fly itself
uses), commit it to whichever repo holds these pipeline files, and the
next scheduled run picks it up automatically.
+83
View File
@@ -0,0 +1,83 @@
#!/bin/sh
# auto-build-push.sh — builds the merged geosite.dat and pushes it to a
# Gitea repo, so it can be served the same way rules.yaml already is
# (https://<gitea>/<owner>/<repo>/raw/branch/<branch>/geosite.dat).
#
# Required environment variables (set these in the Portainer stack, not
# baked into the image):
# GITEA_URL e.g. https://git.5838.ru
# GITEA_REPO e.g. Payroll3042/geosite-build (must already exist, empty is fine)
# GITEA_TOKEN a Gitea personal access token with repo write access
# GIT_USER_NAME e.g. geosite-bot
# GIT_USER_EMAIL e.g. geosite-bot@5838.ru
# Optional:
# GITEA_BRANCH defaults to main
set -eu
: "${GITEA_URL:?GITEA_URL is required}"
: "${GITEA_REPO:?GITEA_REPO is required, e.g. Payroll3042/geosite-build}"
: "${GITEA_TOKEN:?GITEA_TOKEN is required}"
: "${GIT_USER_NAME:?GIT_USER_NAME is required}"
: "${GIT_USER_EMAIL:?GIT_USER_EMAIL is required}"
GITEA_BRANCH="${GITEA_BRANCH:-main}"
WORKDIR=/tmp/build
OUTDIR=/tmp/output
CUSTOM_DIR=/app/data-custom
echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) ==> Starting build"
rm -rf "$WORKDIR" "$OUTDIR"
mkdir -p "$WORKDIR" "$OUTDIR"
cd "$WORKDIR"
echo "==> Cloning v2fly/domain-list-community"
git clone --depth 1 -q https://github.com/v2fly/domain-list-community.git v2fly
echo "==> Cloning hydraponique/roscomvpn-geosite"
git clone --depth 1 -q https://github.com/hydraponique/roscomvpn-geosite.git roscomvpn-src
echo "==> Merging data directories"
mkdir -p v2fly/data/roscomvpn v2fly/data/custom
cp -r roscomvpn-src/data/. v2fly/data/roscomvpn/
if [ -d "$CUSTOM_DIR" ]; then
cp -r "$CUSTOM_DIR/." v2fly/data/custom/
fi
echo "==> Compiling merged geosite.dat"
cd v2fly
go run main.go
if [ ! -f dlc.dat ]; then
echo "ERROR: build did not produce dlc.dat"
exit 1
fi
cp dlc.dat "$OUTDIR/geosite.dat"
echo "==> Build produced $(wc -c < "$OUTDIR/geosite.dat") bytes"
echo "==> Cloning target Gitea repo"
GITEA_HOST="$(echo "$GITEA_URL" | sed -e 's~https\?://~~')"
PUSH_URL="https://${GITEA_TOKEN}@${GITEA_HOST}/${GITEA_REPO}.git"
cd /tmp
rm -rf repo
git clone -q --branch "$GITEA_BRANCH" "$PUSH_URL" repo || git clone -q "$PUSH_URL" repo
cd repo
git config user.name "$GIT_USER_NAME"
git config user.email "$GIT_USER_EMAIL"
cp "$OUTDIR/geosite.dat" ./geosite.dat
if git diff --quiet -- geosite.dat 2>/dev/null && [ -f geosite.dat ]; then
echo "==> No changes since last build, skipping commit"
else
git add geosite.dat
git commit -q -m "Auto-build $(date -u +%Y-%m-%dT%H:%M:%SZ)"
git push -q origin "HEAD:${GITEA_BRANCH}"
echo "==> Pushed updated geosite.dat to ${GITEA_URL}/${GITEA_REPO}"
fi
echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) ==> Done"
+2
View File
@@ -0,0 +1,2 @@
# stopped RU sales
domain:avast.com
+56
View File
@@ -0,0 +1,56 @@
#!/bin/sh
# build.sh — merges v2fly/domain-list-community, Loyalsoldier's overlay,
# hydraponique/roscomvpn-geosite, and your own custom data into one geosite.dat
#
# Run inside the provided Docker image (recommended, no local Go/git needed):
# docker build -t geosite-builder .
# docker run --rm -v "$(pwd)/output:/work/output" geosite-builder
#
# Or locally if you already have Go + git installed:
# ./build.sh
set -eu
WORKDIR="$(pwd)/work"
OUTDIR="$(pwd)/output"
CUSTOM_DIR="$(pwd)/data-custom"
echo "==> Preparing workspace"
rm -rf "$WORKDIR"
mkdir -p "$WORKDIR" "$OUTDIR"
cd "$WORKDIR"
echo "==> Cloning v2fly/domain-list-community (base compiler + ~1500 stock categories -"
echo " already covers openai, anthropic, netflix, whatsapp, discord, signal, paypal,"
echo " linkedin, reddit, spotify, facebook, instagram, twitter, roblox, binance, bbc,"
echo " archive, viber, rutracker, speedtest, notion, figma, jetbrains, adobe, intel,"
echo " autodesk, cursor, vercel, github, google, youtube, telegram, and more)"
git clone --depth 1 https://github.com/v2fly/domain-list-community.git v2fly
echo "==> Cloning hydraponique/roscomvpn-geosite (RU-specific categories)"
git clone --depth 1 https://github.com/hydraponique/roscomvpn-geosite.git roscomvpn-src
echo "==> Merging data directories"
mkdir -p v2fly/data/roscomvpn v2fly/data/custom
cp -r roscomvpn-src/data/. v2fly/data/roscomvpn/
# Only genuinely missing from v2fly stock (verified by testing): replicate,
# avast, cointelegraph, snapchat. Everything else is already covered upstream.
if [ -d "$CUSTOM_DIR" ]; then
cp -r "$CUSTOM_DIR/." v2fly/data/custom/
fi
echo "==> Building merged geosite.dat"
cd v2fly
go run main.go
if [ ! -f dlc.dat ]; then
echo "ERROR: build did not produce dlc.dat — check output above for errors"
exit 1
fi
cp dlc.dat "$OUTDIR/geosite.dat"
echo "==> Done. Output: $OUTDIR/geosite.dat"
ls -lh "$OUTDIR/geosite.dat"
+1
View File
@@ -0,0 +1 @@
domain:cointelegraph.com
+14
View File
@@ -0,0 +1,14 @@
services:
geosite-build:
build:
context: .
dockerfile: Dockerfile.scheduled
container_name: geosite-build
restart: unless-stopped
environment:
GITEA_URL: "https://git.5838.ru"
GITEA_REPO: "Payroll3042/geosite-build" # change if your repo name differs
GITEA_TOKEN: "${GITEA_TOKEN}" # set in Portainer's stack env vars, not here
GIT_USER_NAME: "geosite-bot"
GIT_USER_EMAIL: "geosite-bot@5838.ru"
GITEA_BRANCH: "main"
+1
View File
@@ -0,0 +1 @@
domain:replicate.com
+2
View File
@@ -0,0 +1,2 @@
domain:snapchat.com
domain:sc-cdn.net