commit a101ffe75874dfb50214eaabaa97b3ebf24263fe Author: Payroll3042 <2538553@gmail.com> Date: Fri Jul 24 19:27:15 2026 +0300 Initial commit: merged geosite build pipeline diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..e6fb3ea --- /dev/null +++ b/Dockerfile @@ -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"] diff --git a/Dockerfile.scheduled b/Dockerfile.scheduled new file mode 100644 index 0000000..32f606e --- /dev/null +++ b/Dockerfile.scheduled @@ -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 diff --git a/README.md b/README.md new file mode 100644 index 0000000..eff5115 --- /dev/null +++ b/README.md @@ -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///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//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///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. diff --git a/auto-build-push.sh b/auto-build-push.sh new file mode 100644 index 0000000..bca115e --- /dev/null +++ b/auto-build-push.sh @@ -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://///raw/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" diff --git a/avast b/avast new file mode 100644 index 0000000..024ee40 --- /dev/null +++ b/avast @@ -0,0 +1,2 @@ +# stopped RU sales +domain:avast.com diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..0ce02a9 --- /dev/null +++ b/build.sh @@ -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" diff --git a/cointelegraph b/cointelegraph new file mode 100644 index 0000000..dd51821 --- /dev/null +++ b/cointelegraph @@ -0,0 +1 @@ +domain:cointelegraph.com diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..30952d3 --- /dev/null +++ b/docker-compose.yml @@ -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" diff --git a/replicate b/replicate new file mode 100644 index 0000000..40a9e2d --- /dev/null +++ b/replicate @@ -0,0 +1 @@ +domain:replicate.com diff --git a/snapchat b/snapchat new file mode 100644 index 0000000..6abef1d --- /dev/null +++ b/snapchat @@ -0,0 +1,2 @@ +domain:snapchat.com +domain:sc-cdn.net