Skip to content

Instantly share code, notes, and snippets.

Last active January 28, 2023 18:05
What would you like to do?
Notes on running a personal Mastodon instance

Personal Mastodon instance

Effective total cost: $3–5/mo


Decide on an EC2 instance type:

  1. At AWS Console → EC2 → Instance Types, filter for ≥1 GB RAM and sort by price.
    • t4g.micro is lowest.
  2. Look up what t4g.micro means:
    • t: general-purpose with a burstable CPU quota
    • 4: the current generation
    • g: ARM architecture
    • micro: the second lowest configuration
  3. Calculate cost:
    • $6.15/mo when paying hourly
    • $3.59mo when paying annually
    • $2.31/mo when paying every 3 years

Prepare your AWS account:

  • Set up an alarm for your estimated monthly bill so you're notified early of any unanticipated expenses.
  • Import your SSH public key. (EC2 → us-west-2 → Key pairs)

Have ready:

  • a domain name and DNS host
  • an outgoing mail server
    • I use AWS SES since it's easy (decent reputation, automatic DKIM, etc.) and inexpensive ($0.01/mo), but any SMTP provider will do, and you could also set up a traditional mail server on the EC2 instance.
  • static file storage/hosting
    • I use AWS S3 ($1/mo), but a variety of providers offer "S3-compatible" service, and you could also just use the filesystem on the EC2 instance.

Start an EC2 instance:

  1. Launch an instance (EC2 → us-west-2 → Instances) with:
    • Name: Mastodon
    • Image: Ubuntu Server 22.04 LTS (HVM), SSD Volume Type (64-bit ARM)
    • Type: t4g.micro
    • Auto-assign public IP: Disable
    • Security Group:
      • Name: Mastodon
      • SSH from anywhere
      • HTTP from anywhere
      • HTTPS from anywhere
    • Storage: 8 GiB standard (HDD, $0.40/mo)
    • Termination protection: Enable
    • Credit specification: Standard
  2. At EC2 → us-west-2 → Elastic IPs, allocate and associate a static IP address.
  3. Publish an A record at your preferred DNS host.

Prepare the host:

  1. SSH in as ubuntu.
  2. Add 1 GB of swap:
    1. Make a swap file at /swapfile.
    2. Add a swap entry in /etc/fstab.
  3. Add swap on compressed RAM:
    1. Install package systemd-zram-generator.
    2. Set zram-fraction = 1 and compression-algorithm = zstd in /etc/systemd/zram-generator.conf.
  4. Configure unattended upgrades:
    1. Enable Automatic-Reboot in /etc/apt/apt.conf.d/50unattended-upgrades.
  5. Update and upgrade packages.
  6. Reboot.

Install Mastodon:

  1. Follow Mastodon's instructions.
    • To tune PostgreSQL, set:
      • effective_cache_size = 256MB
    • Tune Node.js to use enough memory:
      • Set export NODE_OPTIONS='--max-old-space-size=1024' in ~mastodon/.bashrc.
    • When editing .env.production, pay particular attention to:
      • SMTP…
      • S3… and AWS…
    • When registering services, set:
      • mastodon-sidekiq: --concurrency 1
      • mastodon-web: MAX_THREADS=2 and WEB_CONCURRENCY=1
  2. Schedule the recommended periodic cleanup tasks.
    • Set --concurrency 1 on both tasks.
  3. Reboot.
  4. Sign in to the web interface and review/configure admin settings.

Try out the setup for a few days/weeks, then commit to a longer payment term:

  1. At EC2 → Reserved Instances → Purchase, filter for t4g.micro, sort by effective rate, and purchase a reservation.
  2. Wait a few hours for payment processing to complete.
  3. At EC2 → Reserved Instances, confirm that the reservation is active.
Copy link

ntn888 commented Nov 26, 2022

Thanks everybody; it would be great if those of you who aren't using oracle's free tier are about to come back in a few months with some details on egress and s3 use (the uncertain parts of billing).

I actually moved on to a cheap european VPS provider (due to smtp port opening issues) & used backblaze b2 (S3 compat.) free 10G trial; it filled up in a week :( . And I'm the only user. Admittedly I have subscribed to relays.

Copy link

ntn888 commented Nov 26, 2022

Very helpful, thank you! The only things I had to do differently were:

* setup certbot before symlinking the mastodon nginx configuration. [mastodon/documentation#940](

* All requests were 404ing until I ran `chmod +x /home/mastodon`

yes precisely. on both debian 10/11 & ubuntu 20.04 uand 22.04. I think even the official instructions are a bit off.

Copy link

Thanks everybody; it would be great if those of you who aren't using oracle's free tier are about to come back in a few months with some details on egress and s3 use (the uncertain parts of billing).

I will report back later, but the results seem promising. And as for email, since the emails are only sent back to ME, I'm using SES and I didn't bother leaving the sandbox mode. Works pretty well.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment