How to Install Piped: The Ad-Free and Privacy-Focused YouTube Frontend Alternative
Published: 2023-11-10 09:56:06

## Introduction:

I was frustrated by the annoying pop-ups from YouTube asking me to disable ad blockers, I decided it was time to take matters into my own hands. I made a simple PHP script with yt-dlp to create a custom player. While my makeshift solution worked, it lacked the full functionality of a genuine YouTube frontend. A few days later, I stumbled upon Piped, an open-source project that promised not only ad-free viewing but also a comprehensive set of features. I took a look at their documentation and learned how to install piped on my own server. This guide tells about my journey and the steps I took to reclaim control over my online video streaming experience.

If you just want to use piped with no ads i deployed a public instance for everyone to use!  
[Public piped Instance](https://piped.wireway.ch)

## Prerequisites:

Before you start with the installation, ensure you have the following prerequisites in place:

1. **Some kind of Server**
2. **Domain:**
   - A registered domain to host your Piped instance.
3. **Software:**
   - Git
   - Docker
   - Docker Compose plugin
4. **Cloudflare Account:**
   - An active Cloudflare account.

## What is Piped?

Piped is designed as a self-hosted alternative to YouTube's interface, prioritizing user control by removing advertisements and tracking scripts. For me, it emerged as the perfect solution after my attempt at creating a custom player using a PHP script fell short of the full functionality I desired.

## Benefits of Piped:

- **No ads**
- **Privacy**
- **No Tracking**
- **Most features like YouTube**

## Installation of Piped:

1. **Cloning Piped-Docker Repository:**
   - Command: `git clone https://github.com/TeamPiped/Piped-Docker.git`
2. **Navigating to Piped-Docker Directory:**
   - Command: `cd Piped-Docker`
3. **Running Configuration Script:**
   - Command: `./configure-instance.sh`
   - Set up the domain names. For example, when asked for pipedproxy.example.com, just replace the example.com with your own domain name. Choose nginx as Reverse proxy when prompted.
4. **Creating DNS Records:**
   - Create all 3 DNS records to your Server's public IP
5. **Launching Piped Instance:**
   - Command: `docker-compose up -d`
   - This starts the docker container up
6. **Configuring Nginx with Certbot for TLS:**
   - Installed Certbot via Snap: `sudo snap install --classic certbot`
   - Ran Certbot with Cloudflare DNS verification:

     `sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /path/to/cloudflare.ini -d piped.example.com -d pipedapi.example.com -d pipedproxy.example.com`
   - Once again, change the example.com to your own Domain. 
   - Replaced `/path/to/cloudflare.ini` with the path to my Cloudflare API credentials file.
   - **Example** `cloudflare.ini` file:

Create a file named `cloudflare.ini` with the following content:

```
# Cloudflare API credentials
dns_cloudflare_email = your_email@example.com
dns_cloudflare_api_key = your_cloudflare_api_key
```

Set proper permissions on this file to enhance security:

```
chmod 600 /path/to/cloudflare.ini
```

Remember to replace `your_email@example.com` with your Cloudflare account email and `your_cloudflare_api_key` with your actual Cloudflare API key.

**Finally Nginx Configuration:**
   - Configure Nginx Configuration with TLS (HTTPS) for a secure connection.

   ```nginx
   server {
      listen 443 ssl http2;
      listen [::]:443 ssl http2;
      server_name piped.example.com pipedproxy.example.com pipedapi.example.com; # For all 3 hostnames
      ssl_certificate /path/to/certificate/fullchain.pem;
      ssl_certificate_key /path/to/certificate/privkey.pem;
      ssl_session_timeout 1d;
      ssl_session_cache shared:MozSSL:10m;
      ssl_session_tickets off;
   
      ssl_protocols TLSv1.3;
      ssl_prefer_server_ciphers off;
      add_header Strict-Transport-Security "max-age=63072000" always;
      add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
   
      ssl_stapling on;
      ssl_stapling_verify on;
      proxy_read_timeout 1d;
      proxy_connect_timeout 300;
      proxy_send_timeout 300;
      location / {
          proxy_pass http://127.0.0.1:8080;
          proxy_set_header Host $host;
      }
   }
   ```

## Conclusion:

The discovery of Piped not only resolved the issue with the ad blocker but also granted me control over my video streaming experience. The benefits of an ad-free and private platform are really nice. By sharing my journey, I hope others can also explore the realm of self-hosting and tailor their digital space to align with their preferences. In a world inundated with ads and privacy concerns, taking control is empowering.