{ "code": 200, "data": { "description": "telegram-shop", "external": { "alternate": { "https://git.softuniq.eu/Telegram-Market/telegram-shop.atom": { "title": "", "type": "application/atom+xml" }, "https://git.softuniq.eu/Telegram-Market/telegram-shop.rss": { "title": "", "type": "application/rss+xml" }, "https://git.softuniq.eu/assets/img/favicon.png": { "type": "image/png" } }, "icon": { "https://git.softuniq.eu/assets/img/favicon.png": { "type": "image/png" }, "https://git.softuniq.eu/assets/img/favicon.svg": { "type": "image/svg+xml" } }, "manifest": { "data:application/json;base64,eyJuYW1lIjoiR2l0ZWE6IEdpdCB3aXRoIGEgY3VwIG9mIHRlYSIsInNob3J0X25hbWUiOiJHaXRlYTogR2l0IHdpdGggYSBjdXAgb2YgdGVhIiwic3RhcnRfdXJsIjoiaHR0cDovL2dpdC5zb2Z0dW5pcS5ldS8iLCJpY29ucyI6W3sic3JjIjoiaHR0cDovL2dpdC5zb2Z0dW5pcS5ldS9hc3NldHMvaW1nL2xvZ28ucG5nIiwidHlwZSI6ImltYWdlL3BuZyIsInNpemVzIjoiNTEyeDUxMiJ9LHsic3JjIjoiaHR0cDovL2dpdC5zb2Z0dW5pcS5ldS9hc3NldHMvaW1nL2xvZ28uc3ZnIiwidHlwZSI6ImltYWdlL3N2Zyt4bWwiLCJzaXplcyI6IjUxMng1MTIifV19": {} } }, "html": "\n\t\n\tTelegram-Market/telegram-shop - telegram-shop - Gitea: Git with a cup of tea\n\t\n\t\n\t\n\t\n\t\n\n\n\t\n\t\n\n\t\n\t\n\t\n\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\n\n\n\t\n\n\n\t\n\n\n\n\t\n\n\n\t\n\n\t
\n\t\t\n\n\t\t\n\n\t\t\n\t\t\t\n\n\t\t\n\n\n\n\n
\n\t
\n\n\t
\n\t\t
\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\n\t\n\n\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\tTelegram-Market/telegram-shop\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t
\n\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t
\n\t
\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t1\n\t\t\n\t
\n
\n\n\t\t\t\t\t\n\t\t\t\t\t
\n\t
\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t1\n\t\t\n\t
\n
\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\tYou've already forked telegram-shop\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\n\t\t
\n\t\t\n\t\t\n\t\t\n\t
\n\n\t
\n\t\t\n\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\tCode\n\t\t\t\t\t\n\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tIssues43\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\n\t\t\t\t\t\n\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tPull Requests\n\t\t\t\t\t\n\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tActions\n\t\t\t\t\t\n\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tPackages\n\t\t\t\t\t\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tProjects1\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\tReleases\n\t\t\t\t\t\n\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tWiki\n\t\t\t\t\t\n\n\t\t\t\t\t\n\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tActivity\n\t\t\t\t\t\n\n\t\t\t\t\t\n\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\n\t\t
\n\t
\n\t
\n
\n\n\t
\n\t\t\n\n\t\t\n\n\t\t\n\n\n\n\n\t\t
\n\t\t\t
\n\t\t\t\t\n\n
\n\n
\n\t
\n\t\t\n\t\t\t\n\t\t\t\t 207 Commits\n\t\t\t\n\t\t\t\n\t\t\t\t 9 Branches\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t 1 Tag\n\t\t\t\t\n\t\t\t\n\t\t\n\t
\n
\n\n\n
\n\t
\n\t\n\n\t\n\n\n\n\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t\n\n\t\n\t\n\t\tGo to file\n\t\n\n\t\n\t\t\n\t\n\n\t\n\n\t\n\t
\n\n\t
\n\t\t\n\t\t\n\t\t\t\n\n\n\t\t\n\t\t\n\t
\n
\n\n\t\n\t\t\n\n\t\n\t\n
\n\t
\n\t\t
\n\n\t\n\t\t\n\t\t\t\"\"\n\t\t\tNW\n\t\t\n\t\n\n\ta5ea99b39b\n\n\t\n\n\n\t\n\tfix(admin): issue #131 — dead callback buttons prod_district_/admin_users + no-op placeholders\n\t\t\n\t\t\t\n\t\t\t
- prod_district_: pipe-delimited format (multi-word names safe) + handleDistrictBack shows categories (admin sees disabled locations via getLocationsByCountryAndCityAdmin)\n- admin_users: handleUserListBack (viewUserPage(0) edit)\n- current_page/current_quantity/no_action: no-op exact routes (no 'No handler' warns)\n- Audit: all 78 generated callbacks cross-checked — no overlaps, none missing\n- 48 tests pass; bump v1.2.6
\n\t\t\n\t
\n\n
\n\n\t\t
2026-08-05 12:46:37 +01:00
\n\t
\n\t
\n\t\n\t\n\t\t
\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t.gitea/workflows\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tci: install docker-cli in alpine job container for build/push/save steps\n\t\t\t\t\n\t\t\t
\n\t\t\t
2026-08-04 19:21:04 +01:00
\n\t\t
\n\t\n\t\t
\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tdocker\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tfeat: add AI-powered visual regression testing infrastructure\n\t\t\t\t\n\t\t\t
\n\t\t\t
2026-06-30 21:09:30 +01:00
\n\t\t
\n\t\n\t\t
\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tdocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\n\t\t\t
2026-08-05 12:07:56 +01:00
\n\t\t
\n\t\n\t\t
\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tscripts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tchore: sync all changes\n\t\t\t\t\n\t\t\t
\n\t\t\t
2026-07-07 18:48:40 +01:00
\n\t\t
\n\t\n\t\t
\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tsrc\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\n\t\t\t
2026-08-05 12:46:37 +01:00
\n\t\t
\n\t\n\t\t
\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\ttemplates\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tchore: sync all changes\n\t\t\t\t\n\t\t\t
\n\t\t\t
2026-07-07 18:48:40 +01:00
\n\t\t
\n\t\n\t\t
\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\ttests\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tchore: sync all changes\n\t\t\t\t\n\t\t\t
\n\t\t\t
2026-07-07 18:48:40 +01:00
\n\t\t
\n\t\n\t\t
\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\ttor-proxy\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tfix: HiddenServiceDir must be chmod 700 for Tor\n\t\t\t\t\n\t\t\t
\n\t\t\t
2026-06-24 12:16:59 +01:00
\n\t\t
\n\t\n\t\t
\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\twg\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tfeat: editable settings page with .env write and container restart\n\t\t\t\t\n\t\t\t
\n\t\t\t
2026-06-23 12:32:25 +01:00
\n\t\t
\n\t\n\t\t
\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t.dockerignore\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\n\t\t\t
2026-06-24 02:06:07 +01:00
\n\t\t
\n\t\n\t\t
\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t.env.example\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\n\t\t\t
2026-07-09 16:40:15 +01:00
\n\t\t
\n\t\n\t\t
\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t.gitignore\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tchore: ignore Kilo agent config files (kept on disk, system unaffected)\n\t\t\t\t\n\t\t\t
\n\t\t\t
2026-08-04 22:57:03 +01:00
\n\t\t
\n\t\n\t\t
\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\tcorrupt-photo.jpg\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tproduct photo fix\n\t\t\t\t\n\t\t\t
\n\t\t\t
2024-11-15 07:31:46 +03:00
\n\t\t
\n\t\n\t\t
\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\tdocker-compose.yml\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tfix: bind admin port to all interfaces instead of localhost only\n\t\t\t\t\n\t\t\t
\n\t\t\t
2026-06-24 15:16:35 +01:00
\n\t\t
\n\t\n\t\t
\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\tDockerfile\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\n\t\t\t
2026-06-24 02:06:07 +01:00
\n\t\t
\n\t\n\t\t
\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\tinstall.sh\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\n\t\t\t
2026-06-24 19:32:49 +01:00
\n\t\t
\n\t\n\t\t
\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\tpackage-lock.json\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tfeat: Mercuryo gateway, crypto QR deposit, mono products, wallet auto-refresh\n\t\t\t\t\n\t\t\t
\n\t\t\t
2026-07-08 12:08:13 +01:00
\n\t\t
\n\t\n\t\t
\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\tpackage.json\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\n\t\t\t
2026-07-18 14:28:26 +01:00
\n\t\t
\n\t\n\t\t
\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\tREADME.md\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tdocs: update README with i18n section, language support, and project structure\n\t\t\t\t\n\t\t\t
\n\t\t\t
2026-06-25 23:54:59 +01:00
\n\t\t
\n\t\n\t\t
\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\tVERSION.md\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\n\t\t\t
2026-08-05 12:46:37 +01:00
\n\t\t
\n\t\n
\n\n\t\n\t\t
\n\n\t\n\n\t

\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\tREADME.md\n\t\t\t\n\t\t
\n\t\t
\n\t\t\t\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t
\n\t

\n\n\t
\n\t\t\n\t\t
\n\t\t\t\n\t\t\t\t

Telegram Shop Bot

\n

Телеграм-бот для организации онлайн-продаж через Telegram с поддержкой криптовалют, WireGuard VPN и Tor-прокси для доступа к админ-панели через onion-адрес.

\n

Возможности

\n
    \n
  • Каталог товаров с категориями и фильтрацией по локациям
  • \n
  • Покупки с оплатой криптовалютами (BTC, ETH, LTC, USDT, USDC)
  • \n
  • Управление криптокошельками (создание, пополнение, баланс)
  • \n
  • История транзакций и покупок
  • \n
  • SaaS-система с автоматическим расчётом комиссий
  • \n
  • Мультиязычность (i18n) — английский, испанский, немецкий с переключением в боте
  • \n
  • Админ-панель на порту 3001 с вкладкой локализации
  • \n
  • Tor-прокси с двумя onion-сервисами (SSH + админка)
  • \n
  • WireGuard VPN для безопасных транзакций
  • \n
\n

Быстрый старт (одна команда)

\n

Требования

\n
    \n
  • Любое устройство с Docker: x86_64 (PC, сервер) или ARM64 (Orange Pi, Raspberry Pi)
  • \n
  • 512 МБ RAM минимум (Orange Pi Zero 2 поддерживается)
  • \n
\n

Установка

\n
git clone <repo-url> && cd telegram-shop\nbash install.sh\n

Скрипт автоматически:

\n
    \n
  1. Определит архитектуру (x86_64 / ARM64 / ARMv7)
  2. \n
  3. Установит Docker если не установлен
  4. \n
  5. Создаст .env из шаблона
  6. \n
  7. Проверит обязательные переменные
  8. \n
  9. Соберёт Docker-образ под текущую архитектуру
  10. \n
  11. Запустит контейнер и проверит health-check
  12. \n
\n

Ручная установка

\n
# 1. Клонировать\ngit clone <repo-url> && cd telegram-shop\n\n# 2. Создать .env из шаблона\ncp .env.example .env\nnano .env  # заполнить BOT_TOKEN, ADMIN_IDS, ENCRYPTION_KEY\n\n# 3. Собрать и запустить\ndocker compose up -d --build\n\n# 4. Проверить статус\ndocker compose ps\ncurl http://localhost:3001/health\n

Настройка .env

\n

Скопируйте .env.example в .env и заполните:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ПеременнаяОбязательноОписание
BOT_TOKENТокен Telegram бота (@BotFather)
ADMIN_IDSID администраторов через запятую
ENCRYPTION_KEYКлюч шифрования (32 байта hex)
ADMIN_SECRETСекрет для админ-панели
ADMIN_PORTПорт админ-панели (по умолчанию 3001)
ADMIN_URLПолный URL админ-панели (для фото товаров)
SUPER_ADMIN_IDSID супер-админов
SUPPORT_LINKСсылка на поддержку
DEFAULT_LANGUAGEЯзык по умолчанию (en, es, de; по умолчанию en)
SSH_HOST_IPКуда Tor перенаправляет SSH (по умолчанию host.docker.internal)
SHOP_CONTAINERИмя контейнера магазина (по умолчанию telegram_shop_prod)
WG_ENABLEDtrue / false (по умолчанию false)
WG_PRIVATE_KEYПриватный ключ WireGuard
WG_PUBLIC_KEYПубличный ключ WireGuard
WG_PRESHARED_KEYPre-shared ключ WireGuard
WG_ENDPOINTАдрес сервера WireGuard
WG_ADDRESSАдрес интерфейса WireGuard
WG_DNSDNS для WireGuard
\n

Генерация ключа шифрования:

\n
node -e \"console.log(require('crypto').randomBytes(32).toString('hex'))\"\n

Tor Proxy

\n

Проект включает Tor-прокси для доступа к SSH и админ-панели через onion-адреса.

\n

Архитектура

\n
Internet → Tor Network → tor-proxy контейнер\n                              ├── Onion #1 :22  → хост SSH\n                              └── Onion #2 :80  → telegram_shop_prod:3001\n                                                  (через Docker сеть tor_proxy_net)\n

Файлы Tor-прокси

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ФайлНазначение
tor-proxy/DockerfileAlpine + Tor образ
tor-proxy/entrypoint.shГенерация torrc из env vars, валидация, запись onion-адресов
tor-proxy/get-onions.shСкрипт чтения onion-адресов и обновления .env
tor-proxy/hosts/Директория для onion-hosts.txt (bind mount)
\n

После запуска

\n

Onion-адреса автоматически сохраняются в tor-proxy/hosts/onion-hosts.txt. Обновить .env:

\n
./tor-proxy/get-onions.sh\n

Вывод:

\n
============================================================\n  Onion services\n============================================================\n  SSH   : xxxxx.onion  (port 22 -> host SSH)\n  Admin : yyyyy.onion  (port 80 -> telegram_shop_prod:3001)\n============================================================\n\nUsage:\n  SSH    : torify ssh user@xxxxx.onion\n  Admin  : open http://yyyyy.onion in Tor Browser\n

Переменные Tor

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ПеременнаяПо умолчаниюОписание
SSH_HOST_IPhost.docker.internalКуда Tor перенаправляет SSH
SHOP_CONTAINERtelegram_shop_prodКонтейнер магазина
ADMIN_PORT3001Порт админки
\n

Поддерживаемые устройства

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
УстройствоАрхитектураRAMСтатус
PC / Серверx86_64≥ 512 МБ
Orange Pi Zero 2ARM64 (H616)512 МБ
Raspberry Pi 4ARM64≥ 1 ГБ
Raspberry Pi 3ARM641 ГБ
Raspberry Pi 2ARMv71 ГБ
\n

Docker автоматически собирает нативные модули (better-sqlite3, tiny-secp256k1) под архитектуру хоста.

\n

Архитектура Docker

\n
┌──────────────────────────────────────────────────────────┐\n│  docker-compose                                           │\n│                                                           │\n│  ┌────────────────────────┐  ┌─────────────────────────┐ │\n│  │ telegram_shop_prod     │  │ tor-proxy               │ │\n│  │ (node:22-alpine)       │  │ (alpine:3.18 + tor)     │ │\n│  │                        │  │                         │ │\n│  │ Port 3001              │◄─┤ HiddenService :80       │ │\n│  │ Bot + Admin Panel      │  │ HiddenService :22 → SSH│ │\n│  │                        │  │                         │ │\n│  │ Net: default           │  │ Net: default + proxy_net │ │\n│  │     + tor_proxy_net    │  │                         │ │\n│  └────────────────────────┘  └─────────────────────────┘ │\n│           │                         │                     │\n│      Volumes:                  Volumes:                  │\n│      db/, uploads/, .env      tor_data, hosts/          │\n└──────────────────────────────────────────────────────────┘\n

Сети Docker

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
СетьНазначение
defaultВнутренняя связь между контейнерами
tor_proxy_netСвязь tor-proxy ↔ telegram_shop_prod
\n

Команды управления

\n
# Запуск\ndocker compose up -d\n\n# Пересборка после изменений\ndocker compose up -d --build\n\n# Логи\ndocker compose logs -f\n\n# Логи конкретного сервиса\ndocker compose logs -f tor-proxy\ndocker compose logs -f telegram_shop_prod\n\n# Стоп\ndocker compose down\n\n# Рестарт\ndocker compose restart\n\n# Статус\ndocker compose ps\n\n# Health-check\ncurl http://localhost:3001/health\n\n# Onion-адреса\ndocker exec tor-proxy cat /var/lib/tor/ssh/hostname\ndocker exec tor-proxy cat /var/lib/tor/admin/hostname\n\n# Обновить .env с onion-адресами\n./tor-proxy/get-onions.sh\n

WireGuard

\n

WireGuard по умолчанию отключен (WG_ENABLED=false). Для включения:

\n
    \n
  1. Установите WG_ENABLED=true в .env
  2. \n
  3. Заполните ключи WireGuard в .env
  4. \n
  5. Перезапустите: docker compose restart
  6. \n
\n

Контейнер требует NET_ADMIN и sysctl net.ipv4.conf.all.src_valid_mark=1 для WireGuard. Эти привилегии заданы в docker-compose.yml.

\n

Мультиязычность (i18n)

\n

Бот поддерживает 3 языка: 🇬🇧 English, 🇪🇸 Español, 🇩🇪 Deutsch.

\n

Как это работает

\n
    \n
  • /start — всегда показывает выбор языка с флагами
  • \n
  • /language — команда для смены языка в любой момент
  • \n
  • Профиль — кнопка «🌐 Change Language» рядом с «Set Location»
  • \n
  • Выбранный язык сохраняется в БД (users.language) и используется во всех сообщениях
  • \n
  • Интерполяция: t('key', { param: value }){{param}} в строках
  • \n
  • Fallback: запрошенный язык → English → ключ
  • \n
\n

Структура i18n

\n
src/i18n/\n├── index.js              # tForUser(), tForLang(), LANGUAGE_NAMES, AVAILABLE_LANGUAGES\n└── locales/\n    ├── en.json           # 201 ключ, английский\n    ├── es.json           # 201 ключ, испанский\n    └── de.json           # 201 ключ, немецкий\n

Админ-панель локализации

\n

Вкладка «Локализация» в админ-панели (/locales) позволяет просматривать и редактировать все ключи перевода в таблице с сохранением в JSON-файлы.

\n

Добавление нового языка

\n
    \n
  1. Создать src/i18n/locales/<code>.json по шаблону en.json
  2. \n
  3. Добавить код в AVAILABLE_LANGUAGES и LANGUAGE_NAMES в src/i18n/index.js
  4. \n
  5. Язык автоматически появится в выборе при /start и /language
  6. \n
\n

Безопасность

\n
    \n
  • .env монтируется только для чтения (:ro)
  • \n
  • Порт 3001 доступен из LAN и через Tor onion
  • \n
  • Onion-адреса сохраняются в volume (персистентность при перезапуске)
  • \n
  • Tor hidden services с валидацией env vars
  • \n
  • Нативные модули компилируются в builder-стейдже
  • \n
  • devDependencies не попадают в production-образ
  • \n
  • Тестовые файлы исключены из Docker-образа (.dockerignore)
  • \n
  • node_modules хоста не попадают в образ (.dockerignore)
  • \n
\n

Устойчивость к ошибкам

\n
    \n
  • Бот не крашит контейнер при невалидном BOT_TOKEN: 5 попыток с задержкой 5с, затем бот отключается, админка продолжает работать
  • \n
  • Комиссионные кошельки не обязательны для старта: при отсутствии логируется предупреждение
  • \n
  • При потере связи с Telegram API: polling ошибки логируются, процесс продолжает работать
  • \n
\n

Структура проекта

\n
├── src/\n│   ├── admin/            # Админ-панель (Express)\n│   │   ├── routes/       # Роуты админ-панели (вкл. /locales для i18n)\n│   │   ├── views/        # Шаблоны HTML\n│   │   ├── public/       # Статические файлы (CSS)\n│   │   ├── auth.js       # Авторизация\n│   │   └── server.js      # Express-сервер\n│   ├── config/           # Конфигурация (БД, крипто)\n│   ├── context/          # Контекст и состояния бота\n│   ├── handlers/         # Обработчики команд\n│   │   ├── adminHandlers/  # Обработчики админа\n│   │   └── userHandlers/    # Обработчики пользователя\n│   ├── i18n/              # Интернационализация\n│   │   ├── index.js         # tForUser(), tForLang(), LANGUAGE_NAMES\n│   │   └── locales/         # en.json, es.json, de.json (201 ключ)\n│   ├── middleware/        # Промежуточные обработчики\n│   ├── migrations/        # Миграции БД\n│   ├── models/            # Модели данных\n│   ├── router/            # Роутинг Express\n│   ├── services/          # Бизнес-логика\n│   ├── utils/             # Утилиты (логирование, валидация, ошибки)\n│   └── index.js           # Точка входа\n├── tor-proxy/             # Tor прокси для SSH и админки\n│   ├── Dockerfile         # Alpine + Tor образ\n│   ├── entrypoint.sh      # Генерация torrc, валидация env vars\n│   ├── get-onions.sh      # Скрипт обновления .env с onion-адресами\n│   └── hosts/             # Директория для onion-hosts.txt\n├── wg/                    # WireGuard конфигурация\n│   └── start.sh           # Скрипт запуска контейнера\n├── db/                    # SQLite база данных (volume)\n├── uploads/               # Загруженные фото (volume)\n├── Dockerfile              # Multi-stage сборка магазина\n├── docker-compose.yml      # Конфигурация обоих контейнеров\n├── install.sh              # Установщик (POSIX sh)\n├── .dockerignore           # Исключения из образа\n├── .env.example            # Шаблон переменных\n└── package.json\n

Разработка

\n
# Установка зависимостей\nnpm install\n\n# Запуск в режиме разработки\nnpm run dev\n\n# Тесты\nnpm test\n

Лицензия

\n

MIT

\n\n\t\t\t\n\t\t
\n\n\t\t
\n\t\t\t\n\t\t\tReference in New Issue\n\t\t\t\n\t\t\tView Git Blame\n\t\t\tCopy Permalink\n\t\t
\n\t
\n
\n\n\t\n\n\n\t\t\t
\n\n\t\t\t\n\t\t\t\t
\n\t
\n\t\t
\n\t\t\t \n\n\n\n\t\t
\n\t
\n\n\t
\n\t\t
\n\t\t\t
\n\t\t\t\t
Description
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
No description provided\n\t\t\t\t\t\t
\n\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t Readme\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t 22 MiB\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t
\n\t
\n
\n\n\t\t\t\t
\n\t
\n\t\t\n\n\t\t\n\t\t
\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\tLanguages\n\t\t\t\t
\n\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tJavaScript\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t57.6%\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tCSS\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t23.9%\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tSCSS\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t14.4%\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tEJS\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t3.5%\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tShell\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t0.4%\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t0.2%\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t
\n\t\t\n\t
\n
\n\n\t\t\t\n\t\t
\n\t
\n
\n\n\n\t\t\n\t
\n\t\n\t\n\n\t\n\n\n\n", "httpStatus": 200, "httpStatusText": "OK", "metadata": { "author": "Telegram-Market", "description": "telegram-shop", "keywords": "go,git,self-hosted,gitea", "lang": "en-US", "og:image": "https://git.softuniq.eu/avatars/58dd88222670c696bec7a81cd0964d1b", "og:site_name": "Gitea: Git with a cup of tea", "og:title": "telegram-shop", "og:type": "object", "og:url": "https://git.softuniq.eu/Telegram-Market/telegram-shop", "referrer": "no-referrer", "viewport": "width=device-width, initial-scale=1" }, "title": "telegram-shop", "url": "https://git.softuniq.eu/Telegram-Market/telegram-shop", "usage": { "tokens": 57381 } }, "meta": { "usage": { "tokens": 57381 } }, "status": 200 }