PPAs & Third-Party Repos

PPAs and third-party repositories extend package availability beyond official repositories.

PPAs (Ubuntu Only)

What are PPAs?

  • Personal Package Archives hosted on Launchpad

  • Ubuntu-specific (not available on Debian)

  • Community-maintained - varying quality

  • Format: ppa:user/repository

Add PPA

# Add PPA
sudo add-apt-repository ppa:user/repository

# Update and install
sudo apt update
sudo apt install package

Common Useful PPAs

# Graphics drivers
sudo add-apt-repository ppa:graphics-drivers/ppa

# Git latest
sudo add-apt-repository ppa:git-core/ppa

# LibreOffice latest
sudo add-apt-repository ppa:libreoffice/ppa

Remove PPA

# Remove PPA
sudo add-apt-repository --remove ppa:user/repository

# Or delete the file
sudo rm /etc/apt/sources.list.d/user-ubuntu-repository-*.list
sudo apt update

Downgrade After PPA Removal

# Install ppa-purge
sudo apt install ppa-purge

# Remove PPA and downgrade packages
sudo ppa-purge ppa:user/repository

Third-Party Repositories

Modern Method (Signed Repositories)

# 1. Create keyrings directory
sudo install -m 0755 -d /etc/apt/keyrings

# 2. Download and convert GPG key
curl -fsSL https://example.com/gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/example.gpg

# 3. Add repository with signed-by
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/example.gpg] https://example.com/repo stable main" | \
  sudo tee /etc/apt/sources.list.d/example.list

# 4. Update
sudo apt update

Common Third-Party Repos

Docker

# Add GPG key
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# Add repository (Debian)
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list

# Add repository (Ubuntu)
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list

# Install
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io

VS Code

# Add GPG key
curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --dearmor -o /etc/apt/keyrings/microsoft.gpg

# Add repository
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/microsoft.gpg] https://packages.microsoft.com/repos/code stable main" | \
  sudo tee /etc/apt/sources.list.d/vscode.list

# Install
sudo apt update
sudo apt install code

Node.js (NodeSource)

# Add repository (Node 20)
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -

# Install
sudo apt install nodejs

PostgreSQL

# Add GPG key
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/keyrings/postgresql.gpg

# Add repository
echo "deb [signed-by=/etc/apt/keyrings/postgresql.gpg] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" | \
  sudo tee /etc/apt/sources.list.d/postgresql.list

# Install
sudo apt update
sudo apt install postgresql-16

Debian Backports

Newer packages from testing/unstable, rebuilt for stable.

Enable Backports

# Add backports repository
echo "deb http://deb.debian.org/debian $(lsb_release -cs)-backports main contrib non-free" | \
  sudo tee /etc/apt/sources.list.d/backports.list

sudo apt update

Install from Backports

# Install specific package from backports
sudo apt install -t $(lsb_release -cs)-backports package

# Example: newer kernel
sudo apt install -t bookworm-backports linux-image-amd64

Flatpak

Universal packaging for any distribution.

Install Flatpak

# Debian/Ubuntu
sudo apt install flatpak

# Add Flathub
flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo

Use Flatpak

# Search
flatpak search application

# Install
flatpak install flathub org.app.Name

# Run
flatpak run org.app.Name

# Update all
flatpak update

# List installed
flatpak list

Snap (Ubuntu)

Basic Usage

# Search
snap find term

# Install
sudo snap install package

# Install classic (no confinement)
sudo snap install --classic package

# List installed
snap list

# Update all
sudo snap refresh

Remove Snap (Ubuntu)

# List snaps
snap list

# Remove each snap
sudo snap remove package

# Stop and disable snapd
sudo systemctl stop snapd
sudo systemctl disable snapd

# Remove snapd
sudo apt purge snapd

# Prevent reinstall
cat <<EOF | sudo tee /etc/apt/preferences.d/nosnap.pref
Package: snapd
Pin: release a=*
Pin-Priority: -10
EOF

Repository Best Practices

Security Considerations

# Always use signed-by for third-party repos
# Store keys in /etc/apt/keyrings/
# Verify GPG key fingerprints
gpg --show-keys /etc/apt/keyrings/example.gpg

Priority and Pinning

Control package sources with /etc/apt/preferences.d/:

# Prefer official repos
Package: *
Pin: origin deb.debian.org
Pin-Priority: 900

# Lower priority for third-party
Package: *
Pin: origin example.com
Pin-Priority: 400

Troubleshooting Repos

# List all sources
grep -r --include="*.list" "^deb " /etc/apt/sources.list /etc/apt/sources.list.d/

# Check for duplicate entries
sudo apt update 2>&1 | grep -i "duplicate"

# Remove problematic repo
sudo rm /etc/apt/sources.list.d/problem.list
sudo apt update