Jump to content

Invidious

From Pulsed Media Wiki

Invidious

Invidious is a privacy-respecting alternative frontend for YouTube. It lets you watch YouTube videos without Google tracking, without ads, and without requiring JavaScript. Your requests go through your seedbox's connection, not your home IP.

PMSS has built-in proxy support for Invidious. Once you install it and tell PMSS which port it runs on, the reverse proxy configuration is generated and maintained automatically.

What You Get

  • No Google tracking -- Invidious proxies video streams through your server. Google sees your seedbox's IP, not yours.
  • No ads -- YouTube ads are stripped.
  • No JavaScript required -- the interface works without JS (though JS enables extras like comments).
  • RSS feeds -- subscribe to channels via RSS without a Google account.
  • Two access paths -- one public (shareable), one private (behind your seedbox login).

Access Paths

Once configured, Invidious is available at two URLs:

Path URL Authentication
Public https://SERVER.pulsedmedia.com/public-USERNAME/invidious/ None -- anyone with the link can access it
Private https://SERVER.pulsedmedia.com/user-USERNAME/apps/invidious/ Behind your seedbox login

The public path is useful for sharing your Invidious instance with friends or using it from devices where you don't want to enter your seedbox credentials. The private path keeps it behind authentication.

Installation

Invidious needs a PostgreSQL database. Docker Compose is the recommended way to run both together.

Step 1: Create a Docker Compose file

<syntaxhighlight lang="bash"> mkdir -p ~/invidious && cd ~/invidious </syntaxhighlight>

Create docker-compose.yml:

<syntaxhighlight lang="yaml"> version: "3" services:

 invidious:
   image: quay.io/invidious/invidious:latest
   restart: unless-stopped
   ports:
     - "127.0.0.1:3100:3000"
   environment:
     INVIDIOUS_CONFIG: |
       db:
         dbname: invidious
         user: kemal
         password:
         # ↑ Set your own database password above (e.g. a random string).
         host: invidious-db
         port: 5432
       check_tables: true
       external_port: 443
       domain: SERVER.pulsedmedia.com
       https_only: true
   depends_on:
     - invidious-db
 invidious-db:
   image: docker.io/library/postgres:14
   restart: unless-stopped
   volumes:
     - postgresdata:/var/lib/postgresql/data
     - ./config/sql:/config/sql
     - ./docker/init-invidious-db.sh:/docker-entrypoint-initdb.d/init-invidious-db.sh
   environment:
     POSTGRES_DB: invidious
     POSTGRES_USER: kemal
     POSTGRES_PASSWORD:
     # ↑ Must match the password set in the Invidious config above.

volumes:

 postgresdata:

</syntaxhighlight>

Notes:

  • Port 3100 is bound to 127.0.0.1 so Invidious is only reachable through the lighttpd proxy, not directly from the internet.
  • Pick a port that isn't in use. Check with ss -tlnp.
  • Replace SERVER with your actual server hostname.

Step 2: Start it

<syntaxhighlight lang="bash"> docker compose up -d </syntaxhighlight>

Verify it's running:

<syntaxhighlight lang="bash"> docker compose ps curl http://127.0.0.1:3100/ </syntaxhighlight>

You should see Invidious HTML output.

Step 3: Tell PMSS the port

Create a file containing just the port number:

<syntaxhighlight lang="bash"> echo "3100" > ~/.invidiousPort </syntaxhighlight>

PMSS reads this file and automatically generates the reverse proxy fragment at ~/.lighttpd/custom.d/pmss-invidious.conf. This happens during the next lighttpd configuration regeneration cycle.

If you don't want to wait for the automatic cycle, you can trigger a regeneration or contact support.

Step 4: Verify

Once the proxy is active, visit:

https://SERVER.pulsedmedia.com/user-USERNAME/apps/invidious/

You should see the Invidious search page.

Disabling Invidious

Remove the port file:

<syntaxhighlight lang="bash"> rm ~/.invidiousPort </syntaxhighlight>

PMSS will clean up the proxy fragment (pmss-invidious.conf) on the next regeneration cycle. You can then stop and remove the containers:

<syntaxhighlight lang="bash"> cd ~/invidious docker compose down </syntaxhighlight>

Add -v to also delete the PostgreSQL data volume:

<syntaxhighlight lang="bash"> docker compose down -v </syntaxhighlight>

Configuration Tips

Proxy videos through your server

By default, Invidious can serve video URLs that point directly to Google. To route all video traffic through your seedbox (better privacy), add to the INVIDIOUS_CONFIG block:

<syntaxhighlight lang="yaml"> local: true </syntaxhighlight>

This uses more bandwidth and CPU but means your browser never contacts Google directly.

Registration

To allow account creation on your instance (for saved subscriptions, playlists):

<syntaxhighlight lang="yaml"> registration_enabled: true </syntaxhighlight>

To keep it personal, leave registration disabled and use the default account, or limit registrations after creating your own.

Popular page and trending

Disable the popular/trending endpoints if you want a minimal instance:

<syntaxhighlight lang="yaml"> popular_enabled: false </syntaxhighlight>

Adding an Invidious Tab

You can add Invidious as a tab in your web panel using .customFrames:

invidious|Private YouTube|Invidious|/user-USERNAME/apps/invidious/

Troubleshooting

Invidious shows "Could not extract video data"

YouTube regularly changes its API. Update to the latest Invidious image:

<syntaxhighlight lang="bash"> cd ~/invidious docker compose pull docker compose up -d </syntaxhighlight>

This is the most common issue with Invidious. The project releases frequent updates to track YouTube API changes.

Proxy returns 502 Bad Gateway

The container isn't running or isn't listening on the expected port:

<syntaxhighlight lang="bash"> docker compose ps curl http://127.0.0.1:3100/ ss -tlnp | grep 3100 </syntaxhighlight>

Check container logs:

<syntaxhighlight lang="bash"> docker compose logs invidious </syntaxhighlight>

Database connection errors

The PostgreSQL container may not be ready yet. Check its status:

<syntaxhighlight lang="bash"> docker compose logs invidious-db </syntaxhighlight>

If it's still initializing, wait a minute and try again. Invidious will retry database connections on startup.

See Also