YYeTsBot's Docker Stack: Four Datastores and a Frontend Fetched at Build Time
A bot and website for YYeTs, including all of YYeTs' resources plus many user-shared cloud-drive links.
At a glance
- What is it?
- YYeTsBot is a Python index of film and television links with a Telegram bot attached, MIT licensed and self-hostable through Docker Compose. The compose file asks for four datastores, the Dockerfile pulls a dated frontend zip while it builds, and the packaging metadata describes a dependency set the project does not actually use.
- Who is it for?
- YYeTsBot is worth reading if you want to see how a small Python team stitched a Telegram bot, a Tornado site and four datastores into one compose file, and it is worth running only if you are prepared to own the parts the project leaves open: an env file nobody documents, a root password written into the compose file, a build that depends on a frontend release asset, and the takedown duty for links your own users post.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 111 days ago.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.
Star history
- tgbot-collection/YYeTsBot16,316 ★ · +55
| Repository | 2026-09-21 | 2026-11-14 |
|---|---|---|
| tgbot-collection/YYeTsBot | 16.3k | 16.3k |
55 Stars in the last 54 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
Four datastores, and the bot only waits on two of them
docker-compose.yml defines four stateful services and two application services drawn from the same image. Redis runs the redis:7-alpine image, MongoDB runs mongo:6 with a quiet command and a bind of 127.0.0.1:27017, search runs getmeili/meilisearch:v1.0.2 with MEILI_HTTP_PAYLOAD_SIZE_LIMIT set to 1073741824, and MySQL runs ubuntu/mysql:8.0-22.04_beta. The dependency asymmetry is the part worth noting. The bot service declares depends_on redis and mongo only, while the web service declares mongo, redis and mysql. So the Telegram side can come up without the search index or MySQL, and the web side cannot. Budget for four containers rather than one, and remember that the bot answering messages and the site you browse are two processes from one image, not one process.
env/yyets.env is referenced but never shipped
Both application services load their configuration from a file the repository does not contain:
env_file:
- env/yyets.envThere is no env directory in the tree, no example file beside it, and no enumeration of the keys it needs anywhere in the README. The consequence is immediate and unglamorous. Clone the repository, author your compose file, run it, and the containers have nothing to read. Everything a deployment needs is therefore either inferable from the code or carried over from somebody else's running instance. Treat that env file as the real configuration surface of this project, because in practice it, rather than the compose file, decides how your instance behaves.
setup.py advertises one dependency and a Python floor that no longer holds
The packaging metadata tells a different story from the real one. setup.py declares:
REQUIRES_PYTHON = ">=3.6.0"and a REQUIRED list holding only requests, with an empty EXTRAS dictionary and a hand written VERSION constant of 1.0.1. Meanwhile requirements.txt lists twenty five lines covering pytelegrambotapi, tornado, pymongo, redis, meilisearch, playwright and more, and the Dockerfile builds on python:3.14-slim. Two consequences follow. Installing this project with pip gives you a distribution that declares one dependency and cannot run either the site or the bot, so the compose route is the only sane install. And the 3.6 floor is fiction next to those pins, so read the metadata as a leftover rather than a compatibility promise, and note that the version it reports matches neither published release.
One dependency installs from a git URL and is never pinned
Almost every line in requirements.txt carries an exact version behind an equals sign. One does not:
git+https://github.com/tgbot-collection/python-akismetA VCS requirement resolves to whatever the branch tip is at install time, so the Akismet side can change underneath a deployment without any version of this project changing. That line also explains an otherwise puzzling detail in the Dockerfile, where git is installed into the pybuilder image before pip runs, because pip has to clone to satisfy it. If you care about reproducible builds, resolve that one dependency to a commit yourself, because the repository gives you no way to know which revision it was tested against.
The image downloads a dated frontend zip while it builds
The web interface is not built here. A separate nodebuilder stage pulls a release asset from the YYeTsFE repository:
RUN curl -fL https://github.com/tgbot-collection/YYeTsFE/releases/download/ads-2026-05-22/build.zip -o build.zipThe runner stage then copies the unzipped result straight over the templates directory. Note that the asset tag is a date, ads-2026-05-22, which pins the shipped interface to a build somebody compiled in a different repository. Two consequences follow for anyone building from source. Your build needs network access to a third party release asset, and if that asset is ever removed the stage fails with nothing but a curl error to explain it. So the application image is not reproducible from this repository alone; you also need that one zip, and you have no way to regenerate it from what is checked in here.
A root password in the compose file, loopback ports and a Shanghai clock
Several defaults suit a laptop and suit nothing else. MySQL starts with MYSQL_ROOT_PASSWORD set to the literal string root, and three of the four stateful services set their logging driver to none, so a failure at startup leaves you with little to read. MongoDB and the web service publish host-local bindings only, 127.0.0.1:27017 and 127.0.0.1:8888 plus 172.17.0.1:8888, which means nothing is reachable from your network until you edit the file yourself. The image also pins a timezone:
ENV TZ=Asia/Shanghaiso anything scheduled through apscheduler runs on that clock regardless of where the host sits. One inconsistency is worth checking on your first build: tzdata is installed in the runner stage, yet the zoneinfo directory is copied from the pybuilder stage, which installs only git.
No releases since 2024, and running it moves the takedown duty to you
The two published releases were both cut on 7 January 2024, one tagged as an app version and one as an offline one click package, while the default branch took its last push on 27 July 2026. Nothing in between is versioned. A self-hosted instance is therefore whatever master produced that day, and the bot and web services use the bennythink/yyetsbot image with no tag. On top of that, the project states that it stores, uploads and distributes no video files, that comment links are posted by users, that the author is not responsible for third party content, and that infringement reports should be sent for removal. Read those as a description of the hosted service. The moment you run your own instance, the last sentence stops being about the author.
Editorial conclusion
YYeTsBot is worth reading if you want to see how a small Python team stitched a Telegram bot, a Tornado site and four datastores into one compose file, and it is worth running only if you are prepared to own the parts the project leaves open: an env file nobody documents, a root password written into the compose file, a build that depends on a frontend release asset, and the takedown duty for links your own users post. Pin an image tag and change the credentials before it faces any network.
Frequently asked questions
What does YYeTsBot actually do?
It is a Python project, MIT licensed, that indexes film and television resource links and exposes them through a website and a Telegram bot. The search index, comments, favourites and dead resource flagging live in the repository, while the web interface itself is a separate project, YYeTsFE.
How do I self-host YYeTsBot with Docker?
Use docker-compose.yml, which starts Redis, MongoDB, Meilisearch and MySQL plus a bot service and a web service, both from the bennythink/yyetsbot image. The web service runs python3 server.py on port 8888. You have to create env/yyets.env yourself, because the compose file references it but the repository does not ship it.
Why does the YYeTsBot compose file fail on a first run?
Both the bot and web services declare an env_file of env/yyets.env, and no such directory or example file exists in the repository. The services have no configuration file to load until you create it. The README does not list the keys that file is supposed to contain.
Which databases does YYeTsBot need?
Four. Redis, MongoDB, Meilisearch and MySQL. The bot service depends on Redis and MongoDB only, while the web service depends on MongoDB, Redis and MySQL. Meilisearch runs with a payload size limit of 1073741824 and keeps its data in a named volume called meilisearch_data.
How current is the YYeTsBot codebase?
The default branch master last took a push on 27 July 2026, but the only published releases are two tagged on 7 January 2024. So the branch moves steadily while no new version is cut, which means a self-hosted deployment tracks whatever master builds rather than a released tag.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/tgbot-collection-yyetsbot)Star history chart for your README
[](https://hysenlabs.com/projects/tgbot-collection-yyetsbot)Was this useful?