Skip to content

feat(funkwhale): deploy a Funkwhale pod via docker-compose + host nginx#30

Open
0cwa wants to merge 2 commits into
bonfirelink:masterfrom
0cwa:feat/funkwhale-core
Open

feat(funkwhale): deploy a Funkwhale pod via docker-compose + host nginx#30
0cwa wants to merge 2 commits into
bonfirelink:masterfrom
0cwa:feat/funkwhale-core

Conversation

@0cwa

@0cwa 0cwa commented Apr 29, 2026

Copy link
Copy Markdown

Deploys a Funkwhale audio pod on music.bonfire.link via docker-compose, frontend by the existing host nginx role.

Architecture

client ─▶ host nginx (TLS, 5 GiB body limit, 900s timeouts)
          └─▶ front container (in compose stack)
                └─▶ api / celery / postgres / redis (in compose stack)
audio  ─▶ Storj S3-compatible gateway (signed URLs, direct streaming)

Highlights

  • Public + federated by default; e-mail verification on
  • 5 GiB upload ceiling with proxy_request_buffering off for 4 h FLAC/WAV sets
  • Direct streaming from Storj (PROXY_MEDIA=false + AWS_QUERYSTRING_AUTH=true) — bucket can stay private, no public-read policy
  • Storage backend toggle (s3 / local) for Vagrant / dev rigs
  • tasks/assert.yml refuses placeholder secrets and warns when registration is on without real SMTP
  • Reuses common, fail2ban, certbot, nginx roles unchanged
  • Public-repo-safe: no real secrets committed; vault layout documented in roles/funkwhale/README.md

Out of scope (separate PRs)

  • Optional Anubis bot protection → feat/funkwhale-anubis
  • Optional nightly pg_dump → S3 backup → feat/funkwhale-backup

Verified with

yamllint -c .yamllint.yaml .
ansible-lint --profile safety roles/funkwhale   # passes; production also passes
ansible-playbook --syntax-check -i hosts/prod playbooks/funkwhale.yml
# + Jinja-rendered every template; rendered docker-compose.yml re-parses as YAML

Stacking

Depends on feat/docker-role. After PR feat/docker-role merges, rebase this onto master.

0cwa added 2 commits April 29, 2026 22:31
…ugin

Adds roles/docker, a generic role that installs the upstream Docker
apt repository and the v2 'docker compose' plugin. No playbook
references it yet -- it is consumed by the upcoming funkwhale role
and is intentionally generic so any future containerised service can
reuse it.

Highlights:
- pulls Docker's official GPG key into /etc/apt/keyrings
- installs docker-ce + cli + containerd.io + buildx + compose plugin
- exposes docker_group_users so the funkwhale service user can run
  docker without sudo

Verified with: yamllint -c .yamllint.yaml .
Adds a Funkwhale role and playbook for music.bonfire.link.

Architecture:
  client → host nginx (TLS, big bodies)
            → front container (in compose stack)
              → api / celery / postgres / redis (in compose stack)
  audio  → S3-compatible object storage (Storj gateway by default),
           streamed directly to clients via signed URLs

Highlights:
  - public + federated by default; e-mail verification on
  - 5G upload ceiling (4h FLAC/WAV sets); proxy_request_buffering off
  - direct streaming from Storj (PROXY_MEDIA=false +
    AWS_QUERYSTRING_AUTH=true); the bucket can stay private
  - storage backend toggle (s3 | local) for Vagrant/dev
  - assert.yml refuses placeholder secrets; warns when registration
    is on without real SMTP
  - depends on roles/docker (added in feat/docker-role); reuses
    common, fail2ban, certbot and nginx roles untouched
  - public-repo-safe: no real secrets committed; vault layout
    documented in roles/funkwhale/README.md

Two add-ons land in follow-up PRs and are explicitly out of scope
here:
  - feat/funkwhale-anubis  — Anubis bot protection
  - feat/funkwhale-backup  — nightly pg_dump → S3

Verified with:
  yamllint -c .yamllint.yaml .
  ansible-playbook --syntax-check -i hosts/prod playbooks/funkwhale.yml
  jinja render of every template (compose YAML re-parses cleanly)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant