PeerTube

A decentralised streaming video platform

Try the service in a VM

  1. Install Nix
    Arch Linux
    Bash
    $ pacman --sync --refresh --noconfirm curl git jq nix
    Debian
    Bash
    $ apt install --yes curl git jq nix
    Ubuntu
    Bash
    $ apt install --yes curl git jq nix
  2. Download a configuration file
    # default.nix
    {
      ngipkgs ? import (fetchTarball "https://github.com/ngi-nix/ngipkgs/tarball/main") { },
    }:
    ngipkgs.demo-vm (
      {
        config,
        pkgs,
        ...
      }:
      {
        services.peertube = {
          enable = true;
    
          # Configure locally-running instances of redis server & database.
          database.createLocally = true;
          redis.createLocally = true;
    
          # Where we're running
          localDomain = "localhost";
          listenWeb = 9000;
    
          # Example settings, adjust as desired
          settings = {
            listen.hostname = "0.0.0.0";
            instance.name = "My Lovely PeerTube Instance";
            # Enable livestreaming
            live.enabled = true;
          };
    
          plugins = {
            enable = true;
            plugins = with pkgs; [
              peertube-theme-dark
              peertube-plugin-video-annotation
              peertube-plugin-livechat
            ];
          };
    
          # Do *NOT* use this in production, follow the docs and properly generate a secret here! i.e. using the output of:
          # openssl rand -hex 32
          # https://docs.joinpeertube.org/install/any-os#peertube-configuration
          secrets.secretsFile = pkgs.writeText "secrets.txt" "secrets";
    
          # Set the initial password of the root user to a fixed value. Make sure to change the password afterwards!
          serviceEnvironmentFile = "/etc/peertube-envvars";
        };
        environment.etc."peertube-envvars".text = ''
          PT_INITIAL_ROOT_PASSWORD=changeme
        '';
    
        networking.firewall.allowedTCPPorts = [
          config.services.peertube.listenWeb
          # Livestreaming port
          1935
        ];
      }
    
    )
    
  3. Enable binary substituters
    Bash
    $ export NIX_CONFIG='substituters = https://cache.nixos.org/ https://ngi.cachix.org/
    trusted-public-keys = cache.nixos.org-1:6nchdd59x431o0gwypbmraurkbj16zpmqfgspcdshjy= ngi.cachix.org-1:n+cal72roc3qqulxihpv+tw5t42whxmmhpragkrsrow='
  4. Build and run a virtual machine
    Arch Linux, Debian Sid and Ubuntu 25.04
    Bash
    $ nix-build ./default.nix && ./result
    Debian 12 and Ubuntu 24.04/24.10
    Bash
    $ rev=$(nix-instantiate --eval --attr sources.nixpkgs.rev https://github.com/ngi-nix/ngipkgs/archive/master.tar.gz | jq --raw-output)
    $ nix-shell -I nixpkgs=https://github.com/NixOS/nixpkgs/archive/$rev.tar.gz --packages nix --run "nix-build ./default.nix && ./result"
  5. Usage Instructions

    PeerTube service demo.

    The web UI is available at http://localhost:9000/.

    You can log in with:

    • username: root
    • password: changeme

Options

programs.peertube-cli
programs.peertube-cli.enable

Whether to enable peertube-cli.

Type:
boolean
Default:
false
services.peertube
services.peertube.configureNginx

Configure nginx as a reverse proxy for peertube.

Type:
boolean
Default:
false
services.peertube.dataDirs

Allow access to custom data locations.

Type:
list of absolute path
Default:
[ ]
services.peertube.database.createLocally

Configure local PostgreSQL database server for PeerTube.

Type:
boolean
Default:
false
services.peertube.database.host

Database host address or unix socket.

Type:
string
Default:
if config.services.peertube.database.createLocally then "/run/postgresql" else null
services.peertube.database.name

Database name.

Type:
string
Default:
"peertube"
services.peertube.database.passwordFile

Password for PostgreSQL database.

Type:
null or absolute path
Default:
null
services.peertube.database.port

Database host port.

Type:
16 bit unsigned integer; between 0 and 65535 (both inclusive)
Default:
5432
services.peertube.database.user

Database user.

Type:
string
Default:
"peertube"
services.peertube.enable

Whether to enable Peertube.

Type:
boolean
Default:
false
services.peertube.enableWebHttps

Whether clients will access your PeerTube instance with HTTPS. Does NOT configure the PeerTube webserver itself to listen for incoming HTTPS connections.

Type:
boolean
Default:
false
services.peertube.group

Group under which Peertube runs.

Type:
string
Default:
"peertube"
services.peertube.listenHttp

The port that the local PeerTube web server will listen on.

Type:
16 bit unsigned integer; between 0 and 65535 (both inclusive)
Default:
9000
services.peertube.listenWeb

The public-facing port that PeerTube will be accessible at (likely 80 or 443 if running behind a reverse proxy). Clients will try to access PeerTube at this port.

Type:
16 bit unsigned integer; between 0 and 65535 (both inclusive)
Default:
9000
services.peertube.localDomain

The domain serving your PeerTube instance.

Type:
string
services.peertube.package

PeerTube package to use.

Type:
package
Default:
pkgs.peertube
Notes:
Missing update script An update script is required for automatically tracking the latest release.
services.peertube.plugins.enable

Whether to enable declarative plugin management for PeerTube .

Type:
boolean
Default:
false
services.peertube.plugins.package

Base PeerTube package to use when using declarative plugin management. This overrides services.peertube.package.

Type:
package
Default:
pkgs.peertube
Notes:
Missing update script An update script is required for automatically tracking the latest release.
services.peertube.plugins.plugins

List of packages with peertube plugins that should be added.

Type:
list of package
Default:
[ ]
services.peertube.redis.createLocally

Configure local Redis server for PeerTube.

Type:
boolean
Default:
false
services.peertube.redis.enableUnixSocket

Use Unix socket.

Type:
boolean
Default:
config.services.peertube.redis.createLocally
services.peertube.redis.host

Redis host.

Type:
null or string
Default:
if config.services.peertube.redis.createLocally && !config.services.peertube.redis.enableUnixSocket then "127.0.0.1" else null
services.peertube.redis.passwordFile

Password for redis database.

Type:
null or absolute path
Default:
null
services.peertube.redis.port

Redis port.

Type:
null or 16 bit unsigned integer; between 0 and 65535 (both inclusive)
Default:
if config.services.peertube.redis.createLocally && config.services.peertube.redis.enableUnixSocket then null else 6379
services.peertube.secrets.secretsFile

Secrets to run PeerTube. Generate one using openssl rand -hex 32

Type:
null or absolute path
Default:
null
services.peertube.serviceEnvironmentFile

Set environment variables for the service. Mainly useful for setting the initial root password. For example write to file: PT_INITIAL_ROOT_PASSWORD=changeme

Type:
null or absolute path
Default:
null
services.peertube.settings

Configuration for peertube.

Type:
JSON value
services.peertube.settings.video_transcription.enabled

Enable automatic transcription of videos.

Type:
boolean
Default:
false
services.peertube.settings.video_transcription.engine_path

Custom engine path for local transcription.

Type:
absolute path or string
Default:
if config.services.peertube.settings.video_transcription.enabled then lib.getExe pkgs.whisper-ctranslate2 else "Set `services.peertube.settings.video_transcription.enabled = true`."
services.peertube.smtp.createLocally

Configure local Postfix SMTP server for PeerTube.

Type:
boolean
Default:
false
services.peertube.smtp.passwordFile

Password for smtp server.

Type:
null or absolute path
Default:
null
services.peertube.user

User account under which Peertube runs.

Type:
string
Default:
"peertube"

Examples

basic
{
  config,
  pkgs,
  ...
}:
{
  services.peertube = {
    enable = true;

    # Configure locally-running instances of redis server & database.
    database.createLocally = true;
    redis.createLocally = true;

    # Where we're running
    localDomain = "localhost";
    listenWeb = 9000;

    # Example settings, adjust as desired
    settings = {
      listen.hostname = "0.0.0.0";
      instance.name = "My Lovely PeerTube Instance";
      # Enable livestreaming
      live.enabled = true;
    };

    plugins = {
      enable = true;
      plugins = with pkgs; [
        peertube-theme-dark
        peertube-plugin-video-annotation
        peertube-plugin-livechat
      ];
    };

    # Do *NOT* use this in production, follow the docs and properly generate a secret here! i.e. using the output of:
    # openssl rand -hex 32
    # https://docs.joinpeertube.org/install/any-os#peertube-configuration
    secrets.secretsFile = pkgs.writeText "secrets.txt" "secrets";

    # Set the initial password of the root user to a fixed value. Make sure to change the password afterwards!
    serviceEnvironmentFile = "/etc/peertube-envvars";
  };
  environment.etc."peertube-envvars".text = ''
    PT_INITIAL_ROOT_PASSWORD=changeme
  '';

  networking.firewall.allowedTCPPorts = [
    config.services.peertube.listenWeb
    # Livestreaming port
    1935
  ];
}
basic-cli
{
  programs.peertube-cli.enable = true;
}

This project is funded by NLnet through these subgrants:

Related links: