Skip to main content

How to Self-Host Flarum: Modern Forum Software 2026

·OSSAlt Team
flarumforumcommunityself-hostingdocker2026

TL;DR

Flarum (MIT, ~15K GitHub stars, PHP) is modern forum software that's fast, beautiful, and extensible. Unlike Discourse (which requires 2GB+ RAM and significant setup), Flarum is lightweight (~100MB RAM), loads instantly, and has a polished UI out of the box. It supports Markdown, mentions, tags, real-time updates, SSO, and a rich extension ecosystem. Perfect for product communities, support forums, or hobbyist groups.

Key Takeaways

  • Flarum: MIT, ~15K stars, PHP — modern, lightweight forum
  • Fast: PHP + MySQL backend loads in milliseconds — feels like a SPA
  • Extensions: 200+ community extensions — polls, OAuth, reactions, SEO, themes
  • Real-time: Live updates — new posts appear without page refresh
  • Markdown: Full Markdown editor with preview
  • SSO: OAuth2, LDAP, SAML via extensions — integrate with Authentik/Authelia

Flarum vs Discourse vs phpBB vs NodeBB

FeatureFlarumDiscoursephpBBNodeBB
RAM usage~100MB~2GB+~100MB~300MB
LanguagePHPRubyPHPNode.js
UI qualityExcellentExcellentDatedGood
Setup time10 min30+ min20 min15 min
Extensions200+150+1000+300+
Real-timeYesYesNoYes
SEOGood (+ extensions)ExcellentGoodGood
Email-inNoYesNoYes
Self-hostedYesYesYesYes
PriceFreeFreeFreeFree

Part 1: Docker Setup

# docker-compose.yml
services:
  flarum:
    image: crazymax/flarum:latest
    container_name: flarum
    restart: unless-stopped
    ports:
      - "8888:8000"
    volumes:
      - flarum_data:/data
    environment:
      TZ: America/Los_Angeles
      FLARUM_BASE_URL: https://forum.yourdomain.com
      FLARUM_FORUM_TITLE: "Your Community"
      FLARUM_API_PATH: api
      FLARUM_BASE_PATH: /

      # Database:
      DB_HOST: db
      DB_NAME: flarum
      DB_USER: flarum
      DB_PASSWORD: "${DB_PASSWORD}"
      DB_PREFIX: flarum_

      # Admin account (first run):
      FLARUM_ADMIN_USER: admin
      FLARUM_ADMIN_PASSWORD: "${ADMIN_PASSWORD}"
      FLARUM_ADMIN_MAIL: admin@yourdomain.com

      # SMTP:
      FLARUM_MAIL_FROM: forum@yourdomain.com
      FLARUM_MAIL_DRIVER: smtp
      FLARUM_MAIL_HOST: mail.yourdomain.com
      FLARUM_MAIL_PORT: 587
      FLARUM_MAIL_USERNAME: forum@yourdomain.com
      FLARUM_MAIL_PASSWORD: "${MAIL_PASSWORD}"
      FLARUM_MAIL_ENCRYPTION: tls

    depends_on:
      - db

  db:
    image: mariadb:11
    restart: unless-stopped
    volumes:
      - flarum_db:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: "${DB_ROOT_PASSWORD}"
      MYSQL_DATABASE: flarum
      MYSQL_USER: flarum
      MYSQL_PASSWORD: "${DB_PASSWORD}"

volumes:
  flarum_data:
  flarum_db:
echo "DB_PASSWORD=$(openssl rand -base64 24)" >> .env
echo "DB_ROOT_PASSWORD=$(openssl rand -base64 24)" >> .env
echo "ADMIN_PASSWORD=$(openssl rand -base64 16)" >> .env

docker compose up -d

Part 2: HTTPS with Caddy

forum.yourdomain.com {
    reverse_proxy localhost:8888
}

Part 3: Forum Configuration

Admin panel

Access: https://forum.yourdomain.com/admin

Essential settings

Basics:
  - Forum title
  - Forum description
  - Welcome banner (shown to new users)
  - Default homepage: All Discussions / Tags

Appearance:
  - Logo and favicon upload
  - Primary color
  - Dark mode (via extension)
  - Custom header HTML
  - Custom CSS

Email:
  - SMTP configuration
  - Notification settings

Create tags (categories)

Admin → Tags:
  Primary tags (categories):
    📢 Announcements
    💬 General
    ❓ Support
    💡 Feature Requests
    🐛 Bug Reports
    🎉 Show & Tell

  Secondary tags (cross-cutting):
    Solved
    Pinned
    FAQ

Part 4: Extensions

Install extensions

# Enter the container:
docker exec -it flarum sh

# Install an extension via Composer:
composer require fof/oauth
composer require fof/polls
composer require fof/reactions
composer require flarum/markdown
composer require flarum/mentions
composer require flarum/tags
composer require flarum/sticky
composer require flarum/lock
composer require flarum/flags

Essential extensions

ExtensionWhat it does
flarum/markdownMarkdown formatting in posts
flarum/mentions@mention users and quote posts
flarum/tagsCategory system with primary/secondary tags
flarum/stickyPin discussions to the top
flarum/lockLock discussions from new replies
flarum/flagsUser-reported content moderation
flarum/approvalRequire approval for new posts
flarum/subscriptionsFollow/unfollow discussions
ExtensionWhat it does
fof/oauthLogin with GitHub, Google, Discord, etc.
fof/pollsCreate polls in discussions
fof/reactionsLike/reaction buttons on posts
fof/best-answerMark answers as "Best Answer" (Q&A)
fof/draftsSave draft posts
fof/uploadFile and image uploads
fof/sitemapGenerate XML sitemap for SEO
fof/nightmodeDark mode toggle
fof/user-bioUser bio/about section
v17development/flarum-seoAdvanced SEO meta tags
askvortsov/flarum-categoriesTraditional category layout
clarkwinkelmann/flarum-ext-emojioneareaEmoji picker

Part 5: Moderation

Moderation tools

  • Flag posts: Users can report content → moderators review
  • Suspend users: Temporary ban with reason and duration
  • Delete/hide posts: Remove or soft-delete content
  • Lock discussions: Prevent new replies
  • Merge discussions: Combine duplicate threads
  • Move discussions: Change tags/categories

Set up moderation team

Admin → Users → [user] → Groups → Add to "Mods" group

Group permissions (Admin → Permissions):
  Mods can:
    - Edit & delete posts
    - Lock & sticky discussions
    - Approve posts
    - View user IP addresses
    - Suspend users

Part 6: SSO with Authentik

OAuth2 login

  1. Install OAuth extension:
docker exec -it flarum composer require fof/oauth
  1. Admin → OAuth → Add provider → Custom OAuth
  2. Configure:
    • Client ID: from Authentik
    • Client Secret: from Authentik
    • Authorize URL: https://auth.yourdomain.com/application/o/authorize/
    • Token URL: https://auth.yourdomain.com/application/o/token/
    • Userinfo URL: https://auth.yourdomain.com/application/o/userinfo/

Users can now log in with their Authentik account.


Part 7: SEO Optimization

Install SEO extensions

docker exec -it flarum composer require v17development/flarum-seo
docker exec -it flarum composer require fof/sitemap

SEO configuration

Admin → SEO:
  - Meta description: auto-generated from discussion content
  - Open Graph tags: share previews on social media
  - Twitter Cards: rich previews when sharing links
  - Structured data: JSON-LD for search engines
  - Canonical URLs: prevent duplicate content

Sitemap

https://forum.yourdomain.com/sitemap.xml

Submit to Google Search Console for indexing.


Part 8: REST API

# Flarum has a JSON:API compliant REST API

BASE="https://forum.yourdomain.com/api"

# List discussions:
curl "$BASE/discussions" | jq '.data[].attributes.title'

# Get a discussion:
curl "$BASE/discussions/1" | jq '.data.attributes'

# Create a discussion (authenticated):
curl -X POST "$BASE/discussions" \
  -H "Authorization: Token YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "data": {
      "type": "discussions",
      "attributes": {
        "title": "Welcome to our community!",
        "content": "This is our new forum. Introduce yourself!"
      },
      "relationships": {
        "tags": {
          "data": [{"type": "tags", "id": "1"}]
        }
      }
    }
  }'

Maintenance

# Update Flarum:
docker exec -it flarum composer update --prefer-dist --no-dev -a
docker exec -it flarum php flarum migrate
docker exec -it flarum php flarum cache:clear

# Update container:
docker compose pull
docker compose up -d

# Backup:
docker exec flarum-db-1 mysqldump -u flarum -p"$DB_PASSWORD" flarum \
  | gzip > flarum-db-$(date +%Y%m%d).sql.gz

tar -czf flarum-data-$(date +%Y%m%d).tar.gz \
  $(docker volume inspect flarum_flarum_data --format '{{.Mountpoint}}')

# Logs:
docker compose logs -f flarum

See all open source community tools at OSSAlt.com/categories/community.

Comments