mirror of
				https://github.com/kevinveenbirkenbach/computer-playbook.git
				synced 2025-11-04 12:18:17 +00:00 
			
		
		
		
	Added fediverse bridge draft
This commit is contained in:
		@@ -100,6 +100,8 @@ defaults_networks:
 | 
			
		||||
      subnet: 192.168.103.192/28
 | 
			
		||||
    web-app-magento:
 | 
			
		||||
      subnet: 192.168.103.208/28
 | 
			
		||||
    web-app-bridgy-fed:
 | 
			
		||||
      subnet: 192.168.103.224/28
 | 
			
		||||
 | 
			
		||||
    # /24 Networks / 254 Usable Clients
 | 
			
		||||
    web-app-bigbluebutton:
 | 
			
		||||
 
 | 
			
		||||
@@ -74,6 +74,7 @@ ports:
 | 
			
		||||
      web-app-chess: 8050
 | 
			
		||||
      web-app-bluesky_view: 8051
 | 
			
		||||
      web-app-magento: 8052
 | 
			
		||||
      web-app-bridgy-fed: 8053
 | 
			
		||||
      web-app-bigbluebutton: 48087    # This port is predefined by bbb. @todo Try to change this to a 8XXX port
 | 
			
		||||
  public:
 | 
			
		||||
    # The following ports should be changed to 22 on the subdomain via stream mapping
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										25
									
								
								roles/web-app-bridgy-fed/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								roles/web-app-bridgy-fed/README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
			
		||||
# Bridgy Fed
 | 
			
		||||
 | 
			
		||||
## Description
 | 
			
		||||
Bridgy Fed bridges ActivityPub (Fediverse), ATProto/Bluesky, and IndieWeb (webmentions/mf2). It mirrors identities and interactions across networks.
 | 
			
		||||
 | 
			
		||||
## Overview
 | 
			
		||||
This role builds and runs Bridgy Fed as a Docker container and (optionally) starts a Datastore-mode Firestore emulator as a sidecar. It exposes HTTP locally for a front proxy.
 | 
			
		||||
 | 
			
		||||
Upstream docs & dev notes:
 | 
			
		||||
- User & developer docs: https://fed.brid.gy and https://bridgy-fed.readthedocs.io/
 | 
			
		||||
- Source: https://github.com/snarfed/bridgy-fed
 | 
			
		||||
- Local run (reference): `flask run -p 8080` with APPVIEW_HOST/PLC_HOST/BGS_HOST/PDS_HOST set, and Datastore emulator envs
 | 
			
		||||
 | 
			
		||||
## Features
 | 
			
		||||
- Dockerized Flask app (gunicorn)
 | 
			
		||||
- Optional Firestore emulator (Datastore mode) sidecar
 | 
			
		||||
- Front proxy integration via `sys-stk-front-proxy`
 | 
			
		||||
 | 
			
		||||
## Quick start
 | 
			
		||||
1) Set domains and ports in inventory.  
 | 
			
		||||
2) Enable/disable the emulator in `config/main.yml`.  
 | 
			
		||||
3) Run the role; your front proxy will publish the app.
 | 
			
		||||
 | 
			
		||||
## Notes
 | 
			
		||||
- Emulator is **not** for production; it’s in-memory unless you mount a volume/configure import/export.
 | 
			
		||||
							
								
								
									
										34
									
								
								roles/web-app-bridgy-fed/config/main.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								roles/web-app-bridgy-fed/config/main.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
features:
 | 
			
		||||
  matomo:           true
 | 
			
		||||
  css:              true
 | 
			
		||||
  desktop:          true
 | 
			
		||||
  central_database: false
 | 
			
		||||
  logout:           false
 | 
			
		||||
  oidc:             false
 | 
			
		||||
 | 
			
		||||
server:
 | 
			
		||||
  domains:
 | 
			
		||||
    canonical:
 | 
			
		||||
      - "bridgyfed.{{ PRIMARY_DOMAIN }}"
 | 
			
		||||
  csp:
 | 
			
		||||
    whitelist: {}
 | 
			
		||||
    flags: {}
 | 
			
		||||
 | 
			
		||||
docker:
 | 
			
		||||
  services:
 | 
			
		||||
    database:
 | 
			
		||||
      enabled: false
 | 
			
		||||
    emulator:
 | 
			
		||||
      enabled: true
 | 
			
		||||
      image:    'gcr.io/google.com/cloudsdktool/google-cloud-cli:latest'
 | 
			
		||||
    application:
 | 
			
		||||
      image:   "python"
 | 
			
		||||
      version: "3.12-bookworm"
 | 
			
		||||
      name:    "web-app-bridgy-fed"
 | 
			
		||||
 | 
			
		||||
rbac:
 | 
			
		||||
  roles: {}
 | 
			
		||||
 | 
			
		||||
source:
 | 
			
		||||
  repo: "https://github.com/snarfed/bridgy-fed.git"
 | 
			
		||||
  ref:  "main"
 | 
			
		||||
							
								
								
									
										49
									
								
								roles/web-app-bridgy-fed/files/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								roles/web-app-bridgy-fed/files/Dockerfile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,49 @@
 | 
			
		||||
# Runtime image for Bridgy Fed (Flask) with a build step that clones upstream
 | 
			
		||||
ARG PY_BASE="python:3.12-bookworm"
 | 
			
		||||
FROM ${PY_BASE} AS build
 | 
			
		||||
 | 
			
		||||
ARG BRIDGY_REPO_URL
 | 
			
		||||
ARG BRIDGY_REPO_REF
 | 
			
		||||
 | 
			
		||||
# System deps: git, build tools, curl for healthchecks, and gunicorn
 | 
			
		||||
RUN apt-get update && apt-get install -y --no-install-recommends \
 | 
			
		||||
    git build-essential curl ca-certificates && \
 | 
			
		||||
    rm -rf /var/lib/apt/lists/*
 | 
			
		||||
 | 
			
		||||
WORKDIR /app
 | 
			
		||||
RUN git clone --depth=1 --branch "${BRIDGY_REPO_REF}" "${BRIDGY_REPO_URL}" ./
 | 
			
		||||
 | 
			
		||||
# Python deps
 | 
			
		||||
RUN pip install --upgrade pip && \
 | 
			
		||||
    pip install --no-cache-dir -r requirements.txt
 | 
			
		||||
 | 
			
		||||
# Create oauth_dropins static symlink (upstream expects this)
 | 
			
		||||
RUN python - <<'PY'\n\
 | 
			
		||||
import oauth_dropins, pathlib, os\n\
 | 
			
		||||
target = pathlib.Path(oauth_dropins.__file__).parent / 'static'\n\
 | 
			
		||||
link = pathlib.Path('/app/oauth_dropins_static')\n\
 | 
			
		||||
try:\n\
 | 
			
		||||
    if link.exists() or link.is_symlink():\n\
 | 
			
		||||
        link.unlink()\n\
 | 
			
		||||
    os.symlink(str(target), str(link))\n\
 | 
			
		||||
except FileExistsError:\n\
 | 
			
		||||
    pass\n\
 | 
			
		||||
print('Symlinked oauth_dropins_static ->', target)\n\
 | 
			
		||||
PY
 | 
			
		||||
 | 
			
		||||
# Final stage
 | 
			
		||||
FROM ${PY_BASE}
 | 
			
		||||
 | 
			
		||||
ARG CONTAINER_PORT
 | 
			
		||||
ENV PORT=${CONTAINER_PORT:-8080}
 | 
			
		||||
 | 
			
		||||
WORKDIR /app
 | 
			
		||||
COPY --from=build /app /app
 | 
			
		||||
 | 
			
		||||
# Non-root good practice
 | 
			
		||||
RUN useradd -r -m -d /nonroot appuser && chown -R appuser:appuser /app
 | 
			
		||||
USER appuser
 | 
			
		||||
 | 
			
		||||
EXPOSE ${PORT}
 | 
			
		||||
# Upstream flask app entry: 'flask_app:app'
 | 
			
		||||
CMD ["sh", "-lc", "exec gunicorn -w 2 -k gthread -b 0.0.0.0:${PORT} flask_app:app"]
 | 
			
		||||
							
								
								
									
										22
									
								
								roles/web-app-bridgy-fed/meta/main.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								roles/web-app-bridgy-fed/meta/main.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
---
 | 
			
		||||
galaxy_info:
 | 
			
		||||
  author: "Kevin Veen-Birkenbach"
 | 
			
		||||
  description: "Bridgy Fed: bridge between ActivityPub (Fediverse), ATProto/Bluesky and IndieWeb."
 | 
			
		||||
  license: "Infinito.Nexus NonCommercial License"
 | 
			
		||||
  license_url: "https://s.infinito.nexus/license"
 | 
			
		||||
  company: |
 | 
			
		||||
    Kevin Veen-Birkenbach
 | 
			
		||||
    Consulting & Coaching Solutions
 | 
			
		||||
    https://www.veen.world
 | 
			
		||||
  galaxy_tags:
 | 
			
		||||
    - activitypub
 | 
			
		||||
    - bluesky
 | 
			
		||||
    - atproto
 | 
			
		||||
    - fediverse
 | 
			
		||||
    - bridge
 | 
			
		||||
  repository: "https://s.infinito.nexus/code"
 | 
			
		||||
  issue_tracker_url: "https://s.infinito.nexus/issues"
 | 
			
		||||
  documentation: "https://fed.brid.gy/docs"
 | 
			
		||||
  logo:
 | 
			
		||||
    class: "fa-solid fa-bridge"
 | 
			
		||||
dependencies: []
 | 
			
		||||
							
								
								
									
										21
									
								
								roles/web-app-bridgy-fed/tasks/01_core.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								roles/web-app-bridgy-fed/tasks/01_core.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
			
		||||
- name: "Load docker and front proxy for {{ application_id }}"
 | 
			
		||||
  include_role:
 | 
			
		||||
    name: sys-stk-full-stateless
 | 
			
		||||
 | 
			
		||||
- name: "Include front proxy for {{ container_hostname }}:{{ ports.localhost.http[application_id] }}"
 | 
			
		||||
  include_role:
 | 
			
		||||
    name: sys-stk-front-proxy
 | 
			
		||||
  vars:
 | 
			
		||||
    domain:    "{{ container_hostname }}"
 | 
			
		||||
    http_port: "{{ ports.localhost.http[application_id] }}"
 | 
			
		||||
 | 
			
		||||
- name: "Provide Dockerfile"
 | 
			
		||||
  copy:
 | 
			
		||||
    src: "Dockerfile"
 | 
			
		||||
    dest: "{{ docker_compose.directories.instance }}/Dockerfile"
 | 
			
		||||
  notify:
 | 
			
		||||
    - docker compose build
 | 
			
		||||
 | 
			
		||||
- name: "Run once marker"
 | 
			
		||||
  set_fact:
 | 
			
		||||
    run_once_web_app_bridgy_fed: true
 | 
			
		||||
							
								
								
									
										3
									
								
								roles/web-app-bridgy-fed/tasks/main.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								roles/web-app-bridgy-fed/tasks/main.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
- name: "Include core routines for '{{ application_id }}'"
 | 
			
		||||
  include_tasks: "01_core.yml"
 | 
			
		||||
  when: run_once_web_app_bridgy_fed is not defined
 | 
			
		||||
							
								
								
									
										20
									
								
								roles/web-app-bridgy-fed/templates/Administration.md.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								roles/web-app-bridgy-fed/templates/Administration.md.j2
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
# Administration
 | 
			
		||||
 | 
			
		||||
## Local dev shell (inside container)
 | 
			
		||||
```bash
 | 
			
		||||
docker compose exec application bash
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Logs
 | 
			
		||||
```bash
 | 
			
		||||
docker compose logs -f application
 | 
			
		||||
docker compose logs -f emulator   # if enabled
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Notes
 | 
			
		||||
- Upstream dev run example:
 | 
			
		||||
  ```bash
 | 
			
		||||
  export APPVIEW_HOST=api.bsky.app PLC_HOST=plc.directory BGS_HOST=bsky.network PDS_HOST=atproto.brid.gy
 | 
			
		||||
  flask --debug run -p 8080
 | 
			
		||||
  ```
 | 
			
		||||
  (We run via gunicorn in this role.)
 | 
			
		||||
							
								
								
									
										43
									
								
								roles/web-app-bridgy-fed/templates/docker-compose.yml.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								roles/web-app-bridgy-fed/templates/docker-compose.yml.j2
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
			
		||||
{% include 'roles/docker-compose/templates/base.yml.j2' %}
 | 
			
		||||
 | 
			
		||||
  application:
 | 
			
		||||
    build:
 | 
			
		||||
      context: .
 | 
			
		||||
      dockerfile: Dockerfile
 | 
			
		||||
      args:
 | 
			
		||||
        BRIDGY_REPO_URL: "{{ BRIDGY_REPO_URL }}"
 | 
			
		||||
        BRIDGY_REPO_REF: "{{ BRIDGY_REPO_REF }}"
 | 
			
		||||
        CONTAINER_PORT:  "{{ container_port | string }}"
 | 
			
		||||
    image: "{{ BRIDGY_IMAGE }}"
 | 
			
		||||
    container_name: "{{ BRIDGY_CONTAINER }}"
 | 
			
		||||
    hostname: "{{ container_hostname }}"
 | 
			
		||||
    env_file:
 | 
			
		||||
      - "{{ docker_compose.files.env }}"
 | 
			
		||||
    ports:
 | 
			
		||||
      - "127.0.0.1:{{ ports.localhost.http[application_id] }}:{{ container_port }}"
 | 
			
		||||
{% include 'roles/docker-container/templates/healthcheck/tcp.yml.j2' %}
 | 
			
		||||
{% include 'roles/docker-container/templates/base.yml.j2' %}
 | 
			
		||||
    depends_on:
 | 
			
		||||
{% if EMULATOR_ENABLED | bool %}
 | 
			
		||||
      - emulator
 | 
			
		||||
{% endif %}
 | 
			
		||||
{% include 'roles/docker-container/templates/networks.yml.j2' %}
 | 
			
		||||
 | 
			
		||||
{% if EMULATOR_ENABLED | bool %}
 | 
			
		||||
  emulator:
 | 
			
		||||
    image: "{{ EMULATOR_IMAGE }}"
 | 
			
		||||
    container_name: "{{ BRIDGY_CONTAINER }}_emulator"
 | 
			
		||||
    command: >
 | 
			
		||||
      gcloud emulators firestore start
 | 
			
		||||
      --host-port=0.0.0.0:{{ EMULATOR_PORT }}
 | 
			
		||||
      --database-mode=datastore-mode
 | 
			
		||||
      --quiet
 | 
			
		||||
    ports:
 | 
			
		||||
      - "127.0.0.1:{{ EMULATOR_PORT }}:{{ EMULATOR_PORT }}"
 | 
			
		||||
    environment:
 | 
			
		||||
      - CLOUDSDK_CORE_DISABLE_PROMPTS=1
 | 
			
		||||
    restart: unless-stopped
 | 
			
		||||
{% include 'roles/docker-container/templates/networks.yml.j2' %}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{% include 'roles/docker-compose/templates/networks.yml.j2' %}
 | 
			
		||||
							
								
								
									
										18
									
								
								roles/web-app-bridgy-fed/templates/env.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								roles/web-app-bridgy-fed/templates/env.j2
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
# Flask / Gunicorn basics
 | 
			
		||||
FLASK_ENV="{{ ENVIRONMENT | default('production') }}"
 | 
			
		||||
PORT="{{ container_port }}"
 | 
			
		||||
BRIDGY_ADMIN_EMAIL="{{ BRIDGY_ADMIN_EMAIL }}"
 | 
			
		||||
 | 
			
		||||
# Bridgy Fed upstream knobs (see README @ GitHub)
 | 
			
		||||
APPVIEW_HOST="{{ APPVIEW_HOST }}"
 | 
			
		||||
PLC_HOST="{{ PLC_HOST }}"
 | 
			
		||||
BGS_HOST="{{ BGS_HOST }}"
 | 
			
		||||
PDS_HOST="{{ PDS_HOST }}"
 | 
			
		||||
 | 
			
		||||
# Datastore emulator (Datastore-mode Firestore). If sidecar enabled, point here.
 | 
			
		||||
GOOGLE_CLOUD_PROJECT="{{ EMULATOR_PROJECT_ID }}"
 | 
			
		||||
DATASTORE_EMULATOR_HOST="{{ EMULATOR_ENABLED | ternary(EMULATOR_HOST_INTERNAL, '') }}"
 | 
			
		||||
# DATASTORE_DATASET not needed when GOOGLE_CLOUD_PROJECT is set
 | 
			
		||||
 | 
			
		||||
# Optional:
 | 
			
		||||
# GUNICORN_CMD_ARGS="--log-level info"
 | 
			
		||||
							
								
								
									
										27
									
								
								roles/web-app-bridgy-fed/vars/main.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								roles/web-app-bridgy-fed/vars/main.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
			
		||||
# General
 | 
			
		||||
application_id:                       "web-app-bridgy-fed"
 | 
			
		||||
 | 
			
		||||
# App container
 | 
			
		||||
BRIDGY_CONTAINER:                     "{{ applications | get_app_conf(application_id, 'docker.services.application.name') }}"
 | 
			
		||||
BRIDGY_IMAGE:                         "{{ applications | get_app_conf(application_id, 'docker.services.application.image') }}"
 | 
			
		||||
#BRIDGY_VERSION:                       "{{ applications | get_app_conf(application_id, 'docker.services.application.version')}}"
 | 
			
		||||
container_port:                       8080
 | 
			
		||||
container_hostname:                   "{{ domains | get_domain(application_id) }}"
 | 
			
		||||
BRIDGY_ADMIN_EMAIL:                   "{{ users.administrator.email }}"
 | 
			
		||||
 | 
			
		||||
# Source
 | 
			
		||||
BRIDGY_REPO_URL:                      "{{ applications | get_app_conf(application_id, 'source.repo') }}"
 | 
			
		||||
BRIDGY_REPO_REF:                      "{{ applications | get_app_conf(application_id, 'source.ref') }}"
 | 
			
		||||
 | 
			
		||||
# Emulator sidecar (Datastore-mode Firestore)
 | 
			
		||||
EMULATOR_ENABLED:                     "{{ applications | get_app_conf(application_id, 'docker.services.emulator.enabled') }}"
 | 
			
		||||
EMULATOR_IMAGE:                       "{{ applications | get_app_conf(application_id, 'docker.services.emulator.image') }}"
 | 
			
		||||
EMULATOR_PORT:                        8089
 | 
			
		||||
EMULATOR_HOST_INTERNAL:               "emulator:8089"
 | 
			
		||||
EMULATOR_PROJECT_ID:                  "bridgy-federated-local"
 | 
			
		||||
 | 
			
		||||
# Runtime env defaults for Bridgy Fed (see upstream README)
 | 
			
		||||
APPVIEW_HOST:                         "api.bsky.app"
 | 
			
		||||
PLC_HOST:                             "plc.directory"
 | 
			
		||||
BGS_HOST:                             "bsky.network"
 | 
			
		||||
PDS_HOST:                             "atproto.brid.gy"
 | 
			
		||||
		Reference in New Issue
	
	Block a user