Invidious: Private Youtube frontend instance in Docker Swarm
YouTube is ubiquitious now. Almost every video I'm sent, takes me to YouTube. Worse, every YouTube video I watch feeds Google's profile about me, so shortly after enjoying the latest Marvel movie trailers, I find myself seeing related adverts on unrelated websites.
Creepy !
As the connection between the videos I watch and the adverts I see has become move obvious, I've become more discerning re which videos I choose to watch, since I don't necessarily want algorithmically-related videos popping up next time I load the YouTube app on my TV, or Marvel merchandise advertised to me on every second news site I visit.
This is a PITA since it means I have to "self-censor" which links I'll even click on, knowing that once I do click the video link, it's forever associated with my Google account
# For pg_dump running in postgres container (used for db-backup)PGHOST=dbPGUSER=invidiousPGPASSWORD=youtubesucksBACKUP_NUM_KEEP=7BACKUP_FREQUENCY=1d
Invidious Docker Swarm config
Create a docker swarm config file in docker-compose syntax (v3), something like the example below.. example1:
Fast-track with premix! 🚀
"Premix" is a git repository which includes necessary docker-compose and env files for all published recipes. This means that you can launch any recipe with just a git pull and a docker stack deploy 👍.
🚀 Update: Premix now includes an ansible playbook, enabling you to deploy an entire stack + recipes, with a single ansible command! (more here)
/var/data/config/invidious/invidious.yml
version:"3.2"services:invidious:image:quay.io/invidious/invidious:latestenvironment:INVIDIOUS_CONFIG:|db: # make sure these values align with the indivious.env file you createddbname: invidioususer: invidiouspassword: youtubesuckshost: dbport: 5432check_tables: trueexternal_port: 443domain: invidious.example.com # update this for your own domainhttps_only: true # because we use Traefik, all access is HTTPS# statistics_enabled: false default_user_preferences:quality: dash # auto-adapts or lets you choose > 720P env_file:/var/data/config/invidious/invidious.envdeploy:replicas:1labels:-"traefik.enable=true"-"traefik.docker.network=traefik_public"-"traefik.http.routers.invidious.rule=Host(`invidious.example.com`)"-"traefik.http.routers.invidious.entrypoints=https"-"traefik.http.services.invidious.loadbalancer.server.port=3000"networks:-internal-traefik_publicdb:image:postgres:14env_file:/var/data/config/invidious/invidious.envvolumes:-/var/data/runtime/invidious/database:/var/lib/postgresql/datanetworks:-internaldb-backup:image:postgres:14env_file:/var/data/config/invidious/invidious-db-backup.envvolumes:-/var/data/invidious/database-dump:/dumpentrypoint:|bash -c 'bash -s <<EOFtrap "break;exit" SIGHUP SIGINT SIGTERMsleep 2mwhile /bin/true; dopg_dump -Fc > /dump/dump_\`date +%d-%m-%Y"_"%H_%M_%S\`.psqlls -tr /dump/dump_*.psql | head -n -"$$BACKUP_NUM_KEEP" | xargs -r rmsleep $$BACKUP_FREQUENCYdoneEOF'networks:-internalnetworks:traefik_public:external:trueinternal:driver:overlayipam:config:-subnet:172.16.21.0/24
Note
Setup unique static subnets for every stack you deploy. This avoids IP/gateway conflicts which can otherwise occur when you're creating/removing stacks a lot. See my list here.
Now hit the URL you defined in your config, you'll see the basic search screen. Enter a search phrase ("marvel movie trailer") to see the YouTube video results, or paste in a YouTube URL such as https://www.youtube.com/watch?v=bxqLsrlakK8, change the domain name from www.youtube.com to your instance's FQDN, and watch the fun 2!
You can also install a range of browser add-ons to automatically redirect you from youtube.com to your Invidious instance. I'm testing "libredirect" currently, which seems to work as advertised!
Summary
What have we achieved? We have an HTTPS-protected private YouTube frontend - we can now watch whatever videos we please, without feeding Google's profile on us. We can also subscribe to channels without requiring a Google account, and we can share individual videos directly via our instance (by generating links).
Summary
Created:
We are free of the creepy tracking attached to YouTube videos!
Chef's notes 📓
Check out the official config docs for comprehensive details on how to configure / tweak your instance! ↩
Did you receive excellent service? Want to compliment the chef? (..and support development of current and future recipes!) Sponsor me on Github / Ko-Fi / Patreon, or see the contribute page for more (free or paid) ways to say thank you! 👏
Employ your chef (engage) 🤝
Is this too much of a geeky PITA? Do you just want results, stat? I do this for a living - I'm a full-time Kubernetes contractor, providing consulting and engineering expertise to businesses needing short-term, short-notice support in the cloud-native space, including AWS/Azure/GKE, Kubernetes, CI/CD and automation.
Want to know now when this recipe gets updated, or when future recipes are added? Subscribe to the RSS feed, or leave your email address below, and we'll keep you updated.