Takahe on a VPS: Lightweight ActivityPub Server for Mastodon-Compatible Federated Social Media

Takahe on a VPS: Lightweight ActivityPub Server for Mastodon-Compatible Federated Social Media

Takahe is a lightweight ActivityPub server — think Mastodon but engineered from the ground up for minimal resource usage. While Mastodon requires 2+ GB RAM, Takahe runs in 200–400 MB and handles multiple domains on one instance. It’s compatible with Mastodon’s API, so Mastodon clients (Ivory, Tusky, Mona) work seamlessly. For individuals or small organizations wanting a presence on the Fediverse without Mastodon’s infrastructure overhead, Takahe is the right choice.

Takahe vs Mastodon

Factor Takahe Mastodon
RAM requirement 200–400 MB 2–4 GB minimum
Multi-domain Built-in (multi-tenancy) Complex workarounds
Mastodon API Compatible subset Full implementation
Technology Python/Django Ruby on Rails
Best for Personal/small org presence Larger communities

Step 1: Docker Compose Setup

<code">mkdir -p /opt/takahe && cd /opt/takahe
nano docker-compose.yml
<code">version: '3.8'

services:
  takahe-web:
    image: jointakahe/takahe:latest
    container_name: takahe-web
    restart: always
    command: gunicorn takahe.wsgi:application --workers 4 --bind 0.0.0.0:8000
    ports:
      - "127.0.0.1:8000:8000"
    environment: &takahe-env
      TAKAHE_SECRET_KEY: ${SECRET_KEY}
      TAKAHE_DATABASE_SERVER: postgresql://takahe:${POSTGRES_PASSWORD}@takahe-db/takahe
      TAKAHE_MEDIA_BACKEND: local
      TAKAHE_MEDIA_ROOT: /app/media
      TAKAHE_EMAIL_SERVER: smtp+tls://postmaster%40mg.yourdomain.com:${SMTP_PASSWORD}@smtp.mailgun.org:587
      TAKAHE_EMAIL_FROM: [email protected]
      TAKAHE_MAIN_DOMAIN: social.yourdomain.com
      TAKAHE_DEBUG: "false"
    volumes:
      - takahe_media:/app/media
    depends_on:
      takahe-db:
        condition: service_healthy

  takahe-stator:
    image: jointakahe/takahe:latest
    container_name: takahe-stator
    restart: always
    command: python manage.py runstator
    environment: *takahe-env
    volumes:
      - takahe_media:/app/media
    depends_on:
      takahe-db:
        condition: service_healthy

  takahe-db:
    image: postgres:16-alpine
    restart: always
    environment:
      POSTGRES_DB: takahe
      POSTGRES_USER: takahe
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    volumes:
      - takahe_db:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U takahe"]
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  takahe_media:
  takahe_db:
<code">cat > .env << 'EOF'
SECRET_KEY=$(python3 -c "import secrets; print(secrets.token_hex(50))")
POSTGRES_PASSWORD=StrongTakaheDbPassword!
SMTP_PASSWORD=your_mailgun_password
EOF
chmod 600 .env

docker compose up -d
# Run migrations:
docker compose exec takahe-web python manage.py migrate

Step 2: Nginx Reverse Proxy

<code">sudo nano /etc/nginx/sites-available/takahe
<code">server {
    listen 443 ssl http2;
    server_name social.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/social.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/social.yourdomain.com/privkey.pem;

    client_max_body_size 40M;

    location /media/ {
        alias /var/lib/docker/volumes/takahe_takahe_media/_data/;
        expires 30d;
    }

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
<code">sudo certbot --nginx -d social.yourdomain.com
sudo systemctl reload nginx

Step 3: Create Admin and First Account

<code"># Create admin user:
docker compose exec takahe-web python manage.py createsuperuser

# Visit: https://social.yourdomain.com/djadmin/ → log in

# Create a domain:
# Admin → Domains → Add → social.yourdomain.com → Service domain

# Create first user account:
# Admin → Users → Add user → email, password
# Then create their identity:
# Admin → Identities → Add → [email protected]

Step 4: Connect Mastodon Clients

<code"># Takahe supports Mastodon's API — use any Mastodon client:

# Ivory (iOS): Server → social.yourdomain.com
# Tusky (Android): Instance → social.yourdomain.com
# Mona (macOS/iOS): social.yourdomain.com

# Or use the built-in Takahe web interface:
# https://social.yourdomain.com

# Post from CLI:
curl -X POST https://social.yourdomain.com/api/v1/statuses \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -F "status=Hello, Fediverse! #firstpost"

Step 5: Federation (Connecting to Fediverse)

<code"># Takahe automatically federates with other ActivityPub servers:
# - Follow @[email protected] → their posts appear in your feed
# - People on mastodon.social, pleroma.social etc. can follow you
# - Your posts are shared to your followers' home instances

# Verify federation works:
# 1. Find your account: @[email protected]
# 2. Search for it from mastodon.social → should appear
# 3. Follow someone on another instance from your Takahe account

# Admin → Domains → Add external domain to federate with
# (or federation happens automatically when following someone)

Getting Started

Takahe’s 200–400 MB RAM fits on a 1 GB Ubuntu VPS at VPS.DO. The stator worker process handles federation tasks asynchronously — following, liking, and boosting from remote accounts. For organizations wanting a verified presence on the Fediverse (link to your professional profile at @[email protected]), Takahe’s multi-domain support means you can host team members’ accounts on a single instance at different subdomains.

Conclusion

Takahe provides a Mastodon-compatible ActivityPub server on a fraction of Mastodon’s resource footprint — 200 MB RAM versus 2 GB. Its multi-domain architecture makes it uniquely suited for organizations hosting branded Fediverse presences for team members or departments. All standard Mastodon clients (Ivory, Tusky, Mona) work identically, and federation with the broader Fediverse (Mastodon, Pleroma, Misskey instances) happens automatically when accounts follow users on other platforms.

7 Comments

  • Rohrreinigung
    October 22, 2026

    Hi there, everything is going well here and ofcourse every one
    is sharing information, that’s truly good, keep up writing.

  • isochronic tones with autosuggestion for sobriety
    October 22, 2026

    Hello to all, how is the whole thing, I think every
    one is getting more from this web site, and your views are good for new visitors.

  • how to compare dietary supplements
    October 22, 2026

    I found the explanation of the points raised about what to check before ordering a supplement while keeping expectations realistic.

  • Memoicept memory support supplement
    October 22, 2026

    Thanks for explaining how this article covers understanding supplement labels while keeping expectations realistic.

  • www.spartamaxultra.com
    October 22, 2026

    Good information about how individual experiences can vary that is practical and straightforward.

  • Gelatine Sculpt liquid drops
    October 22, 2026

    I appreciate the information about healthy approaches to weight goals and encourages careful consideration.

  • Fast Brain Booster dosage
    October 22, 2026

    A clear overview of the information about checking ingredient lists without overcomplicating the subject.

Post Your Comment

Fast • Reliable • Affordable VPS - DO It Now!

Get top VPS hosting with VPS.DO’s fast, low-cost plans. Try risk-free with our 7-day no-questions-asked refund and start today!