Massively enhance the Installation documentation (#160)

* Massively enhance the Installation documentation

Co-authored-by: Samantaz Fox <coding@samantaz.fr>
This commit is contained in:
TheFrenchGhosty 2022-02-17 21:11:02 +00:00 committed by GitHub
parent 2f2b5c2898
commit 14643b9fce
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 102 additions and 187 deletions

View file

@ -10,42 +10,38 @@ dateCreated: 2021-02-25T11:24:06.655Z
# Installation # Installation
Compiling invidious requires at least 2GB of free RAM (We recommend to have at least 3GB installed). Compiling Invidious requires at least 2GB of free RAM (We recommend to have at least 3GB installed).
If you have less (e.g on a cheap VPS) you can setup a SWAP file or partition, so the combined amount is >= 3GB. If you have less (e.g on a cheap VPS) you can setup a SWAP file or partition, so the combined amount is >= 3GB.
After installation take a look at the [Post-install steps](#post-install-configuration). After installation take a look at the [Post-install steps](#post-install-configuration).
### Note on blocking bots Note: Any [PaaS](https://en.wikipedia.org/wiki/Platform_as_a_service) or [SaaS](https://en.wikipedia.org/wiki/Software_as_a_service) provider/software (Heroku, YunoHost, Repli...) are unsupported. Use them at your own risk. They **WILL** cause problems with Invidious and might even suspend your account for "abuse" since Invidious is heavy, bandwidth intensive and technically a proxy (and most providers don't like them). If you use one and want to report an issue, please mention which one you use.
Allowing bots that excessively crawl (Semrush, webmeup, etc.) will lead your instance to get blocked very fast. While not required, it is a good idea to consider using bot blocking software such as [Nginx Bad Bot Blocker](https://github.com/mitchellkrogza/nginx-ultimate-bad-bot-blocker).
## Automated installation ## Automated Installation
[Invidious-Updater](https://github.com/tmiland/Invidious-Updater) is a self-contained script that can automatically install and update Invidious. [Invidious-Updater](https://github.com/tmiland/Invidious-Updater) is a self-contained script that can automatically install and update Invidious.
## Docker ## Docker
> The Invidious docker image is only [available on Quay](https://quay.io/repository/invidious/invidious) because, unlike Docker Hub, [Quay is open source](https://github.com/quay/quay/blob/master/LICENSE). This is reflected in the `docker-compose.yml` file used in this walkthrough.{.is-warning} > The Invidious docker image is only [available on Quay](https://quay.io/repository/invidious/invidious) because, unlike Docker Hub, [Quay is Free and Open Source Software](https://github.com/quay/quay/blob/master/LICENSE). This is reflected in the `docker-compose.yml` file used in this walk-through.{.is-warning}
Ensure [Docker Engine](https://docs.docker.com/engine/install/) and [Docker Compose](https://docs.docker.com/compose/install/) are installed before beginning. Ensure [Docker Engine](https://docs.docker.com/engine/install) and [Docker Compose](https://docs.docker.com/compose/install) are installed before beginning.
### Make directory ### Docker-compose method (production)
**This method uses the pre-built Docker image from quay**
Note: Currently the repository has to be cloned, this is because the `init-invidious-db.sh` file and the `config/sql` directory have to be mounted to the postgres container (See the volumes section in the docker-compose file below). This "problem" will be solved in the future.
```bash ```bash
$ mkdir invidious git clone https://github.com/iv-org/invidious.git
cd invidious
``` ```
### Create Docker Compose file Edit the docker-compose.yml with this content:
```bash
$ cd invidious
```
```bash
$ nano docker-compose.yml
```
Here is a working Compose setup:
```docker ```docker
version: "2.4" version: "2.4"
services: services:
@ -75,6 +71,9 @@ services:
- "127.0.0.1:3000:3000" - "127.0.0.1:3000:3000"
environment: environment:
INVIDIOUS_CONFIG: | INVIDIOUS_CONFIG: |
# Please read the following file for a comprehensive list of all available
# configuration options and their associated syntax:
# https://github.com/iv-org/invidious/blob/master/config/config.example.yml
channel_threads: 1 channel_threads: 1
check_tables: true check_tables: true
feed_threads: 1 feed_threads: 1
@ -110,58 +109,31 @@ networks:
invidious: invidious:
``` ```
Note: This compose is made for a true "production" setup, where Invidious is behind a reverse proxy. If you prefer to directly access Invidious, replace `127.0.0.1:3000:3000` with `3000:3000` under the `ports:` section.
> The environment variable `POSTGRES_USER` cannot be changed. The SQL config files that run the initial database migrations are hard-coded with the username `kemal`. > The environment variable `POSTGRES_USER` cannot be changed. The SQL config files that run the initial database migrations are hard-coded with the username `kemal`.
{.is-warning} {.is-warning}
### Start Invidious
### Docker-compose method (development)
**This method builds a Docker image from source**
```bash ```bash
$ docker-compose up git clone https://github.com/iv-org/invidious.git
``` cd invidious
or docker-compose up
```bash
$ docker-compose up -d
```
to run it in the background.
Then, visit `localhost:3000` in your browser.
### Stop Invidious
```bash
$ docker-compose down
``` ```
### Delete data
```bash ## Manual Installation
$ docker volume rm invidious_postgresdata
```
## Manual installation
### Linux ### Linux
#### Install crystal #### Install Crystal
Follow the instructions for your distribution here: https://crystal-lang.org/install/ Follow the instructions for your distribution here: https://crystal-lang.org/install/
If you're in a hurry, here are one-liner commands for some common distributions:
* Arch linux `sudo pacman -S crystal shards`
* Debian/Ubuntu: `curl -fsSL https://crystal-lang.org/install.sh | sudo bash`
* Fedora: `sudo brew update && sudo brew install crystal-lang`
Or you can do a tarball install:
```bash
cd ~/Downloads
wget https://github.com/crystal-lang/crystal/releases/download/1.1.1/crystal-1.1.1-1-linux-x86_64.tar.gz
cd /opt
sudo tar -xzf ~/Downloads/crystal-1.1.1-1-linux-x86_64.tar.gz
sudo cp /opt/crystal-1.1.1-1/bin/{crystal,shards} /usr/local/bin/
sudo cp -r /opt/crystal-1.1.1-1/lib/crystal /usr/local/lib/crystal
sudo cp -r /opt/crystal-1.1.1-1/share/crystal /usr/local/share/crystal
```
#### Install the dependencies #### Install the dependencies
Arch Linux Arch Linux
@ -169,13 +141,12 @@ Arch Linux
sudo pacman -S base-devel librsvg postgresql sudo pacman -S base-devel librsvg postgresql
``` ```
Ubuntu or Debian Debian/Ubuntu
```bash ```bash
sudo apt-get update
sudo apt install libssl-dev libxml2-dev libyaml-dev libgmp-dev libreadline-dev postgresql librsvg2-bin libsqlite3-dev zlib1g-dev libpcre3-dev libevent-dev sudo apt install libssl-dev libxml2-dev libyaml-dev libgmp-dev libreadline-dev postgresql librsvg2-bin libsqlite3-dev zlib1g-dev libpcre3-dev libevent-dev
``` ```
Fedora RHEL based and RHEL-like systems (RHEL, Fedora, AlmaLinux, RockyLinux...)
```bash ```bash
sudo dnf install -y openssl-devel libevent-devel libxml2-devel libyaml-devel gmp-devel readline-devel postgresql librsvg2-devel sqlite-devel zlib-devel gcc sudo dnf install -y openssl-devel libevent-devel libxml2-devel libyaml-devel gmp-devel readline-devel postgresql librsvg2-devel sqlite-devel zlib-devel gcc
``` ```
@ -183,134 +154,122 @@ sudo dnf install -y openssl-devel libevent-devel libxml2-devel libyaml-devel gmp
#### Add an Invidious user and clone the repository #### Add an Invidious user and clone the repository
```bash ```bash
$ useradd -m invidious useradd -m invidious
$ sudo -i -u invidious su - invidious
$ git clone https://github.com/iv-org/invidious git clone https://github.com/iv-org/invidious
$ exit exit
``` ```
#### Set up PostgresSQL #### Set up PostgresSQL
```bash ```bash
$ sudo systemctl enable --now postgresql systemctl enable --now postgresql
$ sudo -i -u postgres sudo -i -u postgres
$ psql -c "CREATE USER kemal WITH PASSWORD 'kemal';" # Change 'kemal' here to a stronger password, and update `password` in config/config.yml psql -c "CREATE USER kemal WITH PASSWORD 'kemal';" # Change 'kemal' here to a stronger password, and update `password` in config/config.yml
$ createdb -O kemal invidious createdb -O kemal invidious
$ psql invidious kemal < /home/invidious/invidious/config/sql/channels.sql psql invidious kemal < /home/invidious/invidious/config/sql/channels.sql
$ psql invidious kemal < /home/invidious/invidious/config/sql/videos.sql psql invidious kemal < /home/invidious/invidious/config/sql/videos.sql
$ psql invidious kemal < /home/invidious/invidious/config/sql/channel_videos.sql psql invidious kemal < /home/invidious/invidious/config/sql/channel_videos.sql
$ psql invidious kemal < /home/invidious/invidious/config/sql/users.sql psql invidious kemal < /home/invidious/invidious/config/sql/users.sql
$ psql invidious kemal < /home/invidious/invidious/config/sql/session_ids.sql psql invidious kemal < /home/invidious/invidious/config/sql/session_ids.sql
$ psql invidious kemal < /home/invidious/invidious/config/sql/nonces.sql psql invidious kemal < /home/invidious/invidious/config/sql/nonces.sql
$ psql invidious kemal < /home/invidious/invidious/config/sql/annotations.sql psql invidious kemal < /home/invidious/invidious/config/sql/annotations.sql
$ psql invidious kemal < /home/invidious/invidious/config/sql/playlists.sql psql invidious kemal < /home/invidious/invidious/config/sql/playlists.sql
$ psql invidious kemal < /home/invidious/invidious/config/sql/playlist_videos.sql psql invidious kemal < /home/invidious/invidious/config/sql/playlist_videos.sql
$ exit exit
``` ```
#### Set up Invidious #### Set up Invidious
```bash ```bash
$ sudo -i -u invidious su - invidious
$ cd invidious cd invidious
$ shards update && shards install shards update && shards install && crystal build src/invidious.cr --release
$ crystal build src/invidious.cr --release exit
# test compiled binary
$ ./invidious # stop with ctrl c
$ exit
``` ```
#### Systemd service #### Systemd service
```bash ```bash
$ sudo cp /home/invidious/invidious/invidious.service /etc/systemd/system/invidious.service cp /home/invidious/invidious/invidious.service /etc/systemd/system/invidious.service
$ sudo systemctl enable --now invidious.service systemctl enable --now invidious.service
```
#### Logrotate
```bash
$ echo "/home/invidious/invidious/invidious.log {
rotate 4
weekly
notifempty
missingok
compress
minsize 1048576
}" | sudo tee /etc/logrotate.d/invidious.logrotate
$ sudo chmod 0644 /etc/logrotate.d/invidious.logrotate
``` ```
### MacOS ### MacOS
```bash ```bash
# Install dependencies # Install dependencies
$ brew update brew update
$ brew install shards crystal postgres imagemagick librsvg brew install shards crystal postgres imagemagick librsvg
# Clone the repository and set up a PostgreSQL database # Clone the repository and set up a PostgreSQL database
$ git clone https://github.com/iv-org/invidious git clone https://github.com/iv-org/invidious
$ cd invidious cd invidious
$ brew services start postgresql brew services start postgresql
$ psql -c "CREATE ROLE kemal WITH PASSWORD 'kemal';" # Change 'kemal' here to a stronger password, and update `password` in config/config.yml psql -c "CREATE ROLE kemal WITH PASSWORD 'kemal';" # Change 'kemal' here to a stronger password, and update `password` in config/config.yml
$ createdb -O kemal invidious createdb -O kemal invidious
$ psql invidious kemal < config/sql/channels.sql psql invidious kemal < config/sql/channels.sql
$ psql invidious kemal < config/sql/videos.sql psql invidious kemal < config/sql/videos.sql
$ psql invidious kemal < config/sql/channel_videos.sql psql invidious kemal < config/sql/channel_videos.sql
$ psql invidious kemal < config/sql/users.sql psql invidious kemal < config/sql/users.sql
$ psql invidious kemal < config/sql/session_ids.sql psql invidious kemal < config/sql/session_ids.sql
$ psql invidious kemal < config/sql/nonces.sql psql invidious kemal < config/sql/nonces.sql
$ psql invidious kemal < config/sql/annotations.sql psql invidious kemal < config/sql/annotations.sql
$ psql invidious kemal < config/sql/privacy.sql psql invidious kemal < config/sql/privacy.sql
$ psql invidious kemal < config/sql/playlists.sql psql invidious kemal < config/sql/playlists.sql
$ psql invidious kemal < config/sql/playlist_videos.sql psql invidious kemal < config/sql/playlist_videos.sql
# Set up Invidious # Set up Invidious
$ shards update && shards install shards update && shards install && crystal build src/invidious.cr --release
$ crystal build src/invidious.cr --release
``` ```
## Post-install configuration: ## Post-install configuration:
Detailed configuration available in the [configuration guide](./Configuration.md). Detailed configuration available in the [configuration guide](./Configuration.md).
Because of various issues Invidious **must** be restarted often, at least once a day, ideally every hours. Because of various issues Invidious **must** be restarted often, at least once a day, ideally every hour.
If you use a reverse proxy, you **must** configure invidious to properly serve request through it: If you use a reverse proxy, you **must** configure invidious to properly serve request through it:
`https_only: true` : if your are serving your instance via https, set it to true `https_only: true` : if you are serving your instance via https, set it to true
`domain: domain.ext`: if you are serving your instance via a domain name, set it here `domain: domain.ext`: if you are serving your instance via a domain name, set it here
`external_port: 443`: if your are serving your instance via https, set it to 443 `external_port: 443`: if you are serving your instance via https, set it to 443
## Update Invidious ## Update Invidious
Instructions are available in the [updating guide](./Updating.md). #### Updating a Docker install
```bash
docker-compose pull && docker-compose up && docker image prune -f
```
#### Update a manual install
```bash
sudo - invidious
cd invidious
shards update && shards install && crystal build src/invidious.cr --release
exit
systemctl restart invidious.service
```
## Usage: ## Usage:
```bash ```bash
$ ./invidious -h ./invidious
Usage: invidious [arguments]
-b HOST, --bind HOST Host to bind (defaults to 0.0.0.0)
-p PORT, --port PORT Port to listen for connections (defaults to 3000)
-s, --ssl Enables SSL
--ssl-key-file FILE SSL key file
--ssl-cert-file FILE SSL certificate file
-h, --help Shows this help
-c THREADS, --channel-threads=THREADS
Number of threads for refreshing channels (default: 1)
-f THREADS, --feed-threads=THREADS
Number of threads for refreshing feeds (default: 1)
-o OUTPUT, --output=OUTPUT Redirect output (default: STDOUT)
-v, --version Print version
``` ```
Or for development:
#### Logrotate configuration
```bash ```bash
$ curl -fsSLo- https://raw.githubusercontent.com/samueleaton/sentry/master/install.cr | crystal eval echo "/home/invidious/invidious/invidious.log {
$ ./sentry rotate 4
🤖 Your SentryBot is vigilant. beep-boop... weekly
notifempty
missingok
compress
minsize 1048576
}" | tee /etc/logrotate.d/invidious.logrotate
chmod 0644 /etc/logrotate.d/invidious.logrotate
``` ```

View file

@ -1,44 +0,0 @@
---
title: Updating
description:
published: true
date: 2021-05-23T16:59:22.409Z
tags:
editor: markdown
dateCreated: 2021-01-28T20:40:27.192Z
---
## Invidious releases are based on tags. You can use them if you want to be sure your instance is stable.
#### With release tags
```bash
$ sudo -i -u invidious
$ cd invidious
$ currentVersion=$(git rev-list --max-count=1 --abbrev-commit HEAD)
$ git pull
$ latestVersion=$(git describe --tags --abbrev=0)
$ git checkout $latestVersion
$ for i in `git rev-list --reverse --abbrev-commit $currentVersion..HEAD` ; do file=./config/migrate-scripts/migrate-db-$i.sh ; [ -f $file ] && $file ; done
$ shards update && shards install
$ crystal build src/invidious.cr --release
$ exit
$ sudo systemctl restart invidious.service
```
#### With master branch
```bash
$ sudo -i -u invidious
$ cd invidious
$ currentVersion=$(git rev-list --max-count=1 --abbrev-commit HEAD)
$ git pull
$ for i in `git rev-list --reverse --abbrev-commit $currentVersion..HEAD` ; do file=./config/migrate-scripts/migrate-db-$i.sh ; [ -f $file ] && $file ; done
$ shards update && shards install
$ crystal build src/invidious.cr --release
$ exit
$ sudo systemctl restart invidious.service
```
#### With Docker:
```bash
$ docker-compose pull && docker-compose up --force-recreate --build && docker image prune -f
```