Sign inSign up

loweel/xenomorph

By loweel

•Updated about 17 hours ago

Xenomorph is a work-in-progress ActivityPub server written in Ada.

Image
0

10K+

loweel/xenomorph repository overview

⁠Xenomorph with Docker

ActivityPub server, federates with Mastodon, GoToSocial, Pleroma and the rest.

loweel/xenomorph:latest — amd64, port 8001, runs as UID/GID 10001.

Before you start: a domain pointing at this machine (social.example.com below), and a reverse proxy for TLS.

⁠1. Create the instance

sudo install -d -o 10001 -g 10001 -m 0750 /srv/xenomorph

docker run --rm -it --user 10001:10001 \
  -v /srv/xenomorph:/var/lib/xenomorph \
  loweel/xenomorph:latest init /var/lib/xenomorph/data

It will do some questions.

Answer:

  • Network address: 0.0.0.0
  • Network port: 8001
  • Host name: social.example.com — your public domain, final
  • URL prefix: empty
  • Admin email: optional

⁠2. Run it again, this time with no question asked.

docker run -d --name xenomorph --restart unless-stopped \
  --read-only --user 10001:10001 --cap-drop ALL \
  --security-opt no-new-privileges --tmpfs /tmp:size=16m,mode=1777 \
  -p 8001:8001 \
  -v /srv/xenomorph:/var/lib/xenomorph \
  -e ADMIN_USER=admin \
  -e ADMIN_PASSWORD='choose-a-password' \
  loweel/xenomorph:latest

docker logs -f xenomorph

⁠3. HTTPS in front

Caddy:

social.example.com {
	reverse_proxy 127.0.0.1:8001
}

nginx — keep all three headers:

location / {
	proxy_pass http://127.0.0.1:8001;
	proxy_set_header Host $host;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	proxy_set_header X-Forwarded-Proto $scheme;
}

⁠4. Log in

https://social.example.com/admin/admin
         ^ domain            ^ user  ^ control panel

Then add "admin_account": "admin" to /srv/xenomorph/data/server.json and:

docker restart xenomorph

You are @[email protected].

⁠Update

docker pull loweel/xenomorph:latest
docker rm -f xenomorph
# same docker run as step 2

Back up /srv/xenomorph.

On a release that changes the on-disk layout, with the container stopped:

docker run --rm -it --user 10001:10001 \
  -v /srv/xenomorph:/var/lib/xenomorph \
  loweel/xenomorph:latest upgrade /var/lib/xenomorph/data

⁠Docker Swarm

One replica only.

sudo install -d -o 10001 -g 10001 -m 0750 /srv/xenomorph/data
sudo install -d -o root  -g root  -m 0755 /srv/xenomorph/config
docker node update --label-add xenomorph=true NODE_NAME
docker network create --driver overlay --attachable traefik_public

docker run --rm -it --user 10001:10001 \
  -v /srv/xenomorph/data:/var/lib/xenomorph \
  loweel/xenomorph:latest init /var/lib/xenomorph/data

sudo cp /srv/xenomorph/data/data/server.json /srv/xenomorph/config/server.json
sudo chmod 0644 /srv/xenomorph/config/server.json

xenomorph.yml — set your domain in the router rule, and the two paths at the bottom:

version: "3.8"

services:
  xenomorph:
    image: loweel/xenomorph:latest
    environment:
      XENOMORPH_BASEDIR: /var/lib/xenomorph/data
      XENOMORPH_CONFIG: /etc/xenomorph/server.json
      ADMIN_USER: ${ADMIN_USER:-admin}
      ADMIN_PASSWORD: ${ADMIN_PASSWORD}
    volumes:
      - type: volume
        source: xenomorph-data
        target: /var/lib/xenomorph
      - type: volume
        source: xenomorph-config
        target: /etc/xenomorph
        read_only: true
    networks:
      - xenomorph
      - traefik_public
    user: "10001:10001"
    tmpfs:
      - /tmp:size=16m,mode=1777
    cap_drop:
      - ALL
    security_opt:
      - no-new-privileges:true
    stop_grace_period: 30s
    healthcheck:
      test: ["CMD", "xenomorph", "state", "/var/lib/xenomorph/data"]
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 10s
    deploy:
      replicas: 1
      labels:
        - "traefik.enable=true"
        - "traefik.docker.network=traefik_public"
        - "traefik.http.routers.xenomorph.rule=Host(`social.example.com`)"
        - "traefik.http.routers.xenomorph.entrypoints=web"
        - "traefik.http.routers.xenomorph.service=xenomorph-svc"
        - "traefik.http.services.xenomorph-svc.loadbalancer.server.port=8001"
      placement:
        constraints:
          - node.labels.xenomorph == true
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 5
        window: 60s
      update_config:
        parallelism: 1
        order: stop-first
        failure_action: rollback

networks:
  xenomorph:
    driver: overlay
  traefik_public:
    external: true

volumes:
  xenomorph-data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /srv/xenomorph/data
  xenomorph-config:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /srv/xenomorph/config
export ADMIN_USER=admin
export ADMIN_PASSWORD='choose-a-password'

docker stack deploy --compose-file xenomorph.yml --resolve-image always xenomorph
docker service logs -f xenomorph_xenomorph
docker service update --force xenomorph_xenomorph   # after editing server.json

On NFS, mount the two exports at those paths. The data export needs working POSIX rename, link, locking and fsync.

Tag summary

Content type

Image

Digest

sha256:a2f1530ae…

Size

119.5 MB

Last updated

about 17 hours ago

docker pull loweel/xenomorph