Koffie aanbieding deze week: alle supermarkten
Welke koffie is deze week in de aanbieding of in de bonus? Nu 192 aanbiedingen bij 14 supermarkten, tot 50% korting, met prijs per kilo, cup en pad.
TD Sync Catalog는 EAN 코드로 WooCommerce 제품 페이지를 자동 생성·검토·가격 설정·게시합니다
TD Sync Catalog crea le schede prodotto WooCommerce dal codice EAN: dati dai siti dei produttori, revisione, prezzi vostri e pubblicazione.
커머스GitHub @Giuseppe-sciarra온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
저장소 정보는 아직 수집하지 않았습니다.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
Self-hosted portal that builds WooCommerce product sheets from an EAN or a manufacturer code: web search, cross-checked pages, translation, publishing.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗WooCommerce product sheets from a barcode — paste EANs or manufacturer codes, and CataSync finds the pages that publish those products, checks that they really show that code and prepares name, brand, photos, description and specifications in your shop's language. Self-hosted, multi-client, nothing to install on the shops.
🌐 Website (in Italian): tastieredigitali.tech/casi-studio/td-sync-catalog
| Why? — every miss says why: the queries, the engines that answered or blocked, the sites opened and what happened on each. | Nothing online — three searches and no page with that code: try the manufacturer code or fill the sheet in by hand. |
| Edit — name, brand, category, prices, description, photos and specifications before publishing. | Dark theme — automatic, light or dark. |
| Search settings — engine, translation, headless browser, and how the last searches went. | Portal appearance — name, logo and favicon of your portal. |
| Categories — add (also inside another one), rename, delete and reorder the shop's categories, by dragging them or with the arrows. | Delete — before deleting a category it shows what is inside and what happens to it. |
| Guide — three guides (products, warehouse, categories) with screenshots, in a tab of their own. | Warehouse — the products already on the site by category, with search, pages, edit and the site's trash. |
| Product sheet — the whole product as it is on the site: name, status, prices, stock, categories, photos, descriptions and specifications. | Customer profile — company details, logo and subscription as set by the administrator, read-only for the client. |
The data shown is a demo with made-up names and .example sites. The interface is available
in English, Italian, French and German.
Search
schema.org/Product, microdata, Open Graph), then specification tables and page text.Friendly reading
robots.txt respected (user agent token tdsynccatalog, plus the rules for *).Why not found
Languages
WooCommerce
global_unique_id) or SKU: categories, brands,
attributes (the shop's global ones when the name matches), images.Warehouse
PUBLIC_URL, because the site
downloads the file from the portal).|);
the site's global attributes and those used for variations are shown and kept as they are.EMPTY_TRASH_DAYS, 30 by default; the portal has the same number per shop to show the
right dates). Images stay in the media library.Categories
wordpress/catasync-category-menu.php) puts every category under the menu item
you choose on the site, in the same order.Portal
.env) or passkey (fingerprint, face, device PIN, security key). Any combination
can be on and you pick one when signing in; the first one also gives ten backup codes. Until
it is on, a small line at the top of the panel says so. Turning it on, changing it or turning it
off asks for the password; the password itself is changed from Account too.| Port | Protocol | What |
|---|---|---|
HOST_PORT (default 8811) | TCP | the portal, behind the reverse proxy |
The port listens on BIND_ADDRESS (default 127.0.0.1). Database, SearXNG, LibreTranslate and
the browser stay on the internal Docker network.
git clone https://github.com/Giuseppe-sciarra/CataSync.git
cd CataSync
# 1. Configuration
cp .env.example .env
nano .env # at least: SECRET_KEY, FERNET_KEY, POSTGRES_PASSWORD, SEARXNG_SECRET, ADMIN_EMAIL, ADMIN_PASSWORD
# 2. Folder for the LibreTranslate models (the container runs as user 1032)
mkdir -p libretranslate && sudo chown -R 1032:1032 libretranslate
# 3. Start
docker compose up -d --build
docker compose logs -f hub
# 4. Nightly automatic update (as root, see "Updates")
bash installa-aggiornamento.sh
The secrets:
openssl rand -hex 32 # SECRET_KEY, and another one for SEARXNG_SECRET
openssl rand -base64 32 | tr '+/' '-_' # FERNET_KEY
POSTGRES_PASSWORD takes letters and digits only (it goes into a URL). Keep a copy of
FERNET_KEY off the server: it encrypts the shops' REST keys and the search engine keys.
Then open the portal (http://localhost:8811 for a local check, with COOKIE_SECURE=0) and
sign in with ADMIN_EMAIL and ADMIN_PASSWORD. After the first sign-in, empty
ADMIN_PASSWORD in .env and run docker compose up -d again: the user exists by then and its
password is changed from the panel.
The first start of LibreTranslate downloads its language models: translation works a few minutes later.
The email code of two-step verification needs the mail server in .env (SMTP_HOST, SMTP_PORT,
SMTP_SECURITY, SMTP_USER, SMTP_PASSWORD, SMTP_FROM): without it that method cannot be
enabled (authenticator apps and passkeys work anyway).
PUBLIC_URL=https://catalog.example.com
BIND_ADDRESS=127.0.0.1 # 0.0.0.0 if the proxy runs on another machine
HOST_PORT=8811
COOKIE_SECURE=1
Point the proxy at http://<server>:8811. PUBLIC_URL must be the address users open in the
browser: requests that write are checked against it. With BIND_ADDRESS=0.0.0.0, allow the port
only from the proxy's address in the firewall.
docker-compose.portainer-git.yml, and the variables of .env.example in Environment
variables. Portainer builds the image on the Docker node. This variant runs the portal alone,
with SQLite on its volume.docker-compose.portainer.yml in the web editor, if you publish the image
to a registry (HUB_IMAGE).For Postgres, SearXNG and LibreTranslate together, use the full docker-compose.yml.
The web search is set once in Settings and applies to every client.
Only if you want the categories in the site menu; without the mu-plugin the menu is never touched.
wordpress/catasync-category-menu.php from this repository into wp-content/mu-plugins/
of the shop. It starts by itself: nothing to activate.The plugin works on the site by itself: the portal does not call it, so it needs no extra permissions on the REST key.
If the shop shows its specifications with the TD Product Specs plugin (_td_product_specs
meta, [td_specifiche] shortcode and YOOtheme fields), CataSync writes there too
(Sites → Edit → Also write specifications for TD Product Specs) and works together with what is on the site:
Without the plugin nothing changes: the meta stays on the product and does nothing.
Every search ends with a cause, the one the client sees in the table and in Why?:
| Cause | What it means | What to do |
|---|---|---|
| Search engines blocked | the code has not really been searched | nothing: it is retried by itself |
| Engine off or unreachable | SearXNG does not answer | check the container |
| No site publishes this code | the engines answer, but no page shows the code | try the manufacturer code or fill it in by hand |
| The sites that publish it cannot be read | anti-bot protection, robots.txt, site errors | fill it in by hand, or ask the wholesaler for a price list |
| No page confirms it is this product | similar pages, none with the right code | check the code |
| Found only by name similarity | a single page, without the code | fill it in by hand |
| Wholesaler's internal code | prefix 20–29 | use the manufacturer's EAN or the manufacturer code |
The interface language is chosen by each user with the 🌐 selector (or follows the browser): it changes only the portal's texts.
The language of the sheets is the one in which name, description and specifications reach WooCommerce. In order: the language fixed on the site (Sites → Edit), then the Product sheets in selector above the codes (which starts from the interface language), then the client's language. What arrives in another language is translated by LibreTranslate and marked for a review; without LibreTranslate the sheet keeps the language found, with a warning.
| What | Where |
|---|---|
| Search engine, engines to query, LibreTranslate, browser | Settings → Automatic web search |
| Engine status, causes of misses, sites refusing to be read | Settings → How the search went |
| A list of codes searched one by one, with the outcome | Settings → Batch test |
| Portal name, logo, favicon | Settings → Portal appearance |
| Maintenance notice on the sign-in page | Settings → Maintenance notice |
| Two-step verification and password, for each user | Account (your email, top right) |
| Remove two-step verification for someone who lost phone and backup codes | Users → Remove 2FA |
| Mail server for the two-step verification email code | .env: SMTP_HOST, SMTP_PORT, SMTP_SECURITY, SMTP_USER, SMTP_PASSWORD, SMTP_FROM |
| Products already on the site: search, full product sheet, category, price, trash | Warehouse |
| Add, rename, delete and order the shop's categories | Categories |
| Menu item the categories go under (optional mu-plugin) | on the site, Appearance → Menu categorie |
| Clients, plan, quota, data sources | Clients |
| REST keys, shop language, write policies, required fields, nightly update, trash days | Sites → Edit |
| Users and roles | Users |
| Codes, categories, prices, publishing | Products (client area) |
| Batches, deleting a batch | History |
| Shop categories, attributes, brands | Categories |
| Client's company details and logo (the client sees them in Customer profile) | Clients → Edit |
| Pause between searches, retries, cache | .env: SEARCH_PAUSE, SEARCH_MAX_DEFERRALS, CACHE_DAYS |
git pull --ff-only
docker compose pull searxng libretranslate browser
docker compose up -d --build
docker compose ps
The database updates itself at start-up: no manual migrations. Keep SearXNG up to date: older versions lack some engines and suspend an engine for a whole day at the first CAPTCHA.
Every night aggiorna-tutto.sh updates by itself what CataSync runs on:
requirements.txt at its latest version;After each step it checks that everything answers: the portal on /health, SearXNG, LibreTranslate
with its list of languages, browserless by actually opening a page. If something breaks it goes
back to the previous files and images by itself. At the end it emails a summary, only when it
updated something or something went wrong. The portal is down for 10-30 seconds, and only when
there is something to update. This also keeps SearXNG up to date without thinking about it.
It never touches the CataSync code and never looks at GitHub: you install a new version yourself,
with git pull (above), when you decide. It never moves to a
new major version of PostgreSQL: do that by hand, with backup and restore.
It works with the installation made with docker-compose.yml in a folder (above). Do not use it
with a Portainer stack: there, updates are done from Portainer.
What it needs: the mail server in .env (SMTP_HOST and the other SMTP_*), the same one used for
two-step verification. The summary goes to ADMIN_EMAIL; to send it somewhere else put
AGG_MAIL_A=address in .env.
On a new installation it is turned on by step 4 of the installation. On a CataSync that is already installed, from its folder and as root:
git pull --ff-only # brings the two scripts, if they are not there yet (since 2.10.1)
bash aggiorna-tutto.sh --dry-run # dry run: says what it would do, touches nothing
bash installa-aggiornamento.sh # schedules it every night
You should see ── fine ── at the end of the dry run, and after the last command
✅ Timer systemd installato: ogni notte alle 02:00 (without systemd it uses cron:
✅ Cron installato). 02:00 comes before the nightly shop re-sync (03:00 by default). A
number changes the time: bash installa-aggiornamento.sh 3 for 03:00,
bash installa-aggiornamento.sh 1:30 for 01:30. The timer is Persistent: if the server was off at
that time, the update starts as soon as it is back on. Then:
| To | Command |
|---|---|
| see whether it is active and how the last run went | bash installa-aggiornamento.sh --status |
| read the log | tail -f logs/aggiorna-tutto.log |
| update right now | bash aggiorna-tutto.sh |
| remove the schedule | bash installa-aggiornamento.sh --remove |
The log never goes over 1 MB: when it gets there, the most recent lines are kept.
Optional values in .env: AGG_MAIL_SEMPRE=1 (email even when everything was already up to date)
and AGG_TIENI_ROLLBACK=3 (how many previous portal images to keep for rollback, about 0.5 GB
each).
To hold a library back, write a limit on its line in requirements.txt, with the reason, for
example httpx<1 # reason: lines with a limit are left as they are.
The script rewrites requirements.txt, with a backup copy in backups/. If git pull stops
because the file changed on the server, put it back as it is on GitHub, pull, and let the script
bring everything up to date again:
git checkout -- requirements.txt
git pull --ff-only
bash aggiorna-tutto.sh
Every change to main that passes the checks is published as a
release. The version is in
VERSION.txt and at the bottom of every page: a new number in VERSION.txt is used as it is,
otherwise the last digit goes up by one; [minor] or [major] in the title of a commit raise
the middle or the first digit.
docker compose exec -T db pg_dump -U hub hub > catasync-$(date +%F).sql
Also keep the hub_data volume (logos, favicon, category images, image cache) and the .env
file: without FERNET_KEY the saved REST keys cannot be decrypted. docker compose down keeps
the volumes; docker compose down -v deletes them.
SEARCH_PAUSE and update SearXNG
(docker compose pull searxng). If nothing answers for hours, the only stable way is an
official API (Brave or Google) under Automatic web search.settings.yml in use lacks
search: formats: [html, json]: use the one in searxng/.searxng container does not start — SEARXNG_SECRET is missing in .env.docker compose logs libretranslate). Permission errors in its log:
sudo chown -R 1032:1032 libretranslate.PUBLIC_URL is not the address open in the
browser: correct it or leave it empty.COOKIE_SECURE=1 needs HTTPS; use
COOKIE_SECURE=0 only for local tests.Authorization header (some Apache setups),
CataSync retries with the keys in the address by itself.FERNET_KEY lost — the shops' REST keys and the engine keys have to be entered again.localhost) and are
bound to the domain in PUBLIC_URL, or to the one open in the browser when it is empty: after a
domain change they must be registered again.SECRET_KEY or FERNET_KEY — backup codes depend on
SECRET_KEY, authenticator secrets on FERNET_KEY: remove two-step verification for those users
(Users → Remove 2FA) and have them turn it on again.CHANGELOG.md — what changed in each version.SECURITY.md — how to report a vulnerability.THIRD-PARTY.md — third-party components and their licences.docs/GUIDA.md — the complete guide (in Italian): search, prices, nightly update, deleting
batches, subscriptions, WooCommerce calls.docs/SICUREZZA.md — security notes (in Italian).wordpress/catasync-category-menu.php — the optional WordPress mu-plugin that puts the categories
in the site menu.CataSync is free software released under the GNU Affero General Public License v3.0 or
later. If you run a modified version for other people over a network, you must offer
them its source code: the Source code link at the bottom of every page (SOURCE_URL) is there
for that. Third-party components keep their own licences (THIRD-PARTY.md).
Copyright © Giuseppe Sciarra — Tastiere Digitali
If CataSync is useful to you, you can support its development with a donation:
Bug reports and pull requests are welcome.
| Languages loaded in LibreTranslate | docker-compose.yml: LT_LOAD_ONLY |
| SearXNG engines and suspensions | searxng/settings.yml |
docker exec -it catasync-hub python -m app.due_fattori togli [email protected]wp-content/mu-plugins/ (not in a subfolder) and be switched on in Appearance → Menu categorie.