Skip to content
Snippets Groups Projects
README.md 14.3 KiB
Newer Older
  • Learn to ignore specific revisions
  • # Funkwhale ansible role
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    An ansible role to install and update [Funkwhale](https://funkwhale.audio).
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    
    
    ## Summary
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    
    Using this role, you can install and upgrade a Funkwhale pod, closely matching our [standard installation guide](https://docs.funkwhale.audio/installation/debian.html). The role will take care of:
    
    - Installing and configure dependencies and packages
    - Install and configure PostgreSQL, Redis and Nginx (optional)
    - Install and configure Funkwhale and it's dependencies
    - Install and configure a SSL certificate with Let's Encrypt (optional)
    
    
    ## Philosophy
    
    
    This role strives to:
    
    - Work out-of-the box by default
    - Be modular and lightweight
    - Avoid dependencies on other ansible roles
    - Allow further customization
    - Allow running multiple Funkwhale instances on the same host
    - Avoid messing with existing software and apps on the server
    
    
    ## Installation and usage
    
    Agate's avatar
    Agate committed
    pip3 install --user ansible
    
    ```
    
    Create a directory for ansible files:
    
        mkdir ~/ansible-funkwhale
        cd ansible-funkwhale
    
    Create a playbook requirements and inventory file:
    
        touch requirements.yml
        touch playbook.yml
        touch inventory.ini
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        touch ansible.cfg
    
    
    Add the following to `requirements.yml`:
    
    ```
    - src: git+https://dev.funkwhale.audio/funkwhale/ansible
      name: funkwhale
      version: master
    ```
    
    Install the role:
    
    ```
    ansible-galaxy install -r requirements.yml
    ```
    
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    Add the following to `ansible.cfg`:
    
    ```
    [defaults]
    # Needed to use become with unprevileged users,
    # see https://docs.ansible.com/ansible/latest/user_guide/become.html#becoming-an-unprivileged-user
    allow_world_readable_tmpfiles=true
    ```
    
    
    Add the following to `playbook.yml`:
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    
    ```yaml
    
    - hosts: funkwhale-servers
    
    Eliot Berriot's avatar
    Eliot Berriot committed
      roles:
        - role: funkwhale
          funkwhale_hostname: yourdomain.funkwhale
          funkwhale_letsencrypt_email: contact@youremail.com
    ```
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    See below for a full documentation on available variables.
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    
    
    Add your server to `inventory.ini`:
    
    ```ini
    [funkwhale-servers]
    your-server-ip-or-domain
    ```
    
    Launch the installation (in check mode, so nothing is applied):
    
    ```
    ansible-playbook --ask-become-pass -i inventory.ini playbook.yml --check --diff
    ```
    
    
    _On some hosts, you may need to install the `python-apt` package for check mode to work_.
    
    This command will show you the changes that would be applied to your system. If you are comfortable with them,
    
    rerun the same command without the `--check` flag.
    
    
    Once installation is complete, run `/srv/funkwhale/virtualenv/bin/python /srv/funkwhale/api/manage.py createsuperuser` to create your admin account.
    
    ## Role Variables
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    **Required variables**
    
    
    | name                          | Example                 | Description                                                                                                                          |
    | ----------------------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
    | `funkwhale_hostname`          | `yourdomain.funkwhale`  | The domain name of your Funkwhale pod                                                                                                |
    | `funkwhale_letsencrypt_email` | `contact@youremail.com` | The email to associate with your Let's Encrypt certificate (not needed if you set `funkwhale_letsencrypt_enabled: false`, see below) |
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    
    **Optional variables**
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    
    
    gi bi's avatar
    gi bi committed
    | name                                  | Default                                                                                                                                                             | Description                                                                                                                                                                             |
    | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    | `funkwhale_api_ip`                    | `127.0.0.1`                                                                                                                                                         | IP address with which to bind the Funkwhale server                                                                                                                                      |
    | `funkwhale_api_port`                  | `5000`                                                                                                                                                              | Port with which to bind the Funkwhale server                                                                                                                                            |
    | `funkwhale_config_path`               | `/srv/funkwhale/config`                                                                                                                                             | Path to Funkwhale's configuration directory                                                                                                                                             |
    | `funkwhale_nginx_csp_policy`          | `"default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:; object-src 'none'; media-src 'self' data:"` | Content-Security-Policy header to us. You will need to tweak this if you're serving media files from a separate domain.                                                                 |
    | `funkwhale_database_managed`          | `true`                                                                                                                                                              | If `true`, the role will manage the database server and Funkwhale's database                                                                                                            |
    | `funkwhale_database_name`             | `funkwhale`                                                                                                                                                         | Name of the Funkwhale database to use                                                                                                                                                   |
    | `funkwhale_database_user`             | `funkwhale`                                                                                                                                                         | Postgresql username to login as                                                                                                                                                         |
    | `funkwhale_env_vars`                  | `[]`                                                                                                                                                                | List of environment variables to append to the generated `.env` file. Example: `["AWS_ACCESS_KEY_ID=myawsid", "AWS_SECRET_ACCESS_KEY=myawskey"]`                                        |
    | `funkwhale_external_storage_enabled`  | `false`                                                                                                                                                             | If `true`, set up the proper configuration to use an external storage for media files                                                                                                   |
    | `funkwhale_disable_django_admin`      | `false`                                                                                                                                                             | If `true`, returns a 403 (Forbidden) for `/api/admin`                                                                                                                                   |
    | `funkwhale_gunicorn_extra_args`       | `""`                                                                                                                                                                | Additional args to pass to gunicorn in the `funkwhale-server.service` file. Refer to [gunicorn's documentation](https://docs.gunicorn.org/en/stable/settings.html) for possible options |
    | `funkwhale_install_path`              | `/srv/funkwhale`                                                                                                                                                    | Path where frontend, api and virtualenv files should be stored (**no trailing slash**)                                                                                                  |
    | `funkwhale_letsencrypt_certbot_flags` | `null`                                                                                                                                                              | Additional flags to pass to `certbot`                                                                                                                                                   |
    | `funkwhale_letsencrypt_enabled`       | `true`                                                                                                                                                              | If `true`, will configure SSL with certbot and Let's Encrypt                                                                                                                            |
    | `funkwhale_media_path`                | `/srv/funkwhale/data/media`                                                                                                                                         | Path where audio and uploaded files should be stored (**no trailing slash**)                                                                                                            |
    | `funkwhale_music_path`                | `/srv/funkwhale/data/music`                                                                                                                                         | Path to your existing music library, to use with [CLI import](https://docs.funkwhale.audio/admin/importing-music.html) (**no trailing slash**)                                          |
    | `funkwhale_nginx_additional_config`   | `""`                                                                                                                                                                | Additional nginx configuration to add to the Funkwhale `server{}` block                                                                                                                 |
    | `funkwhale_nginx_managed`             | `true`                                                                                                                                                              | If `true`, will install and configure nginx                                                                                                                                             |
    | `funkwhale_nginx_tls_termination`     | `true`                                                                                                                                                              | If `false`, disable SSL in nginx                                                                                                                                                        |
    
    | `funkwhale_nginx_tls_configure_ciphers` | `true` | Set TLS ciphers, curves, etc, overriding any settings in http{} |
    | `funkwhale_nginx_max_body_size` | `100M` | Value of nginx's `max_body_size` parameter to use |
    | `funkwhale_protocol` | `https` | If set to `https`, will configure Funkwhale and Nginx to work behind HTTPS. Use `http` to completely disable SSL. |
    | `funkwhale_redis_managed` | `true` | If `true`, will install and configure redis |
    | `funkwhale_ssl_cert_path` | `` | Path to an existing SSL certificate to use (use in combination with `funkwhale_letsencrypt_enabled: false`) | | `funkwhale_ssl_key_path` |`` | Path to an existing SSL key to use (use in combination with `funkwhale_letsencrypt_enabled: false`) |
    | `funkwhale_static_path` | `/srv/funkwhale/data/static` | Path where Funkwhale static files should be stored |
    | `funkwhale_systemd_managed` | `true` | If `true`, will configure Funkwhale systemd services |
    | `funkwhale_systemd_after` | `redis.service postgresql.service` | Configuration used for Systemd `After=` directive. Modify it if you have a database or redis server on a separate host |
    | `funkwhale_systemd_service_name` | `funkwhale` | Name of the generated Systemd service, e.g when calling `systemctl start <xxx>` |
    | `funkwhale_username` | `funkwhale` | Username of the system user and owner of Funkwhale data, files and configuration |
    | `funkwhale_version` | `latest` | The version to install/upgrade to. You can also use `develop` to run the development branch |
    | `funkwhale_custom_pip_packages` | `[]` | A list of additional python packages to download |
    | `funkwhale_custom_settings` | `` | Some Python code to append to`api/config/settings/production.py`. Use funkwhale_custom_settings: | ` for multiline code. |
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    
    
    **Installing from source**
    
    If you want to install Funkwhale from source (e.g to try a nonproduction branch, or use your own fork), you use the
    following variables:
    
    
    | name                            | Default                                               | Description                             |
    | ------------------------------- | ----------------------------------------------------- | --------------------------------------- |
    | `funkwhale_install_from_source` | `false`                                               | Install and build Funkwhale from source |
    | `funkwhale_source_url`          | `https://dev.funkwhale.audio/funkwhale/funkwhale.git` | URL to the git repository to use        |
    
    
    Use the `funkwhale_version` variable to control the git tag/branch to checkout.
    
    
    ## Supported platforms
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    - Debian 9
    - More to come
    
    
    ## Dependencies
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    This roles has no other dependencies.
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    
    
    ## Tests
    
    
    This role is tested using [molecule](https://molecule.readthedocs.io/en/stable/).
    We don't have CI yet, but you can run the tests with `molecule test`.
    
    
    ## Todo
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    
    - Backups
    - Superuser creation
    
    
    ## License
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    AGPL3
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    
    
    ## Author Information
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    Contact us at https://funkwhale.audio/community/