
Deploying Mastodon on Digital Ocean
Mastodon is the new social media platform, a decentralized alternative to Twitter that is currently blowing up. This is a step by step guide on how to run your own Mastodon instance on Digital Ocean.
Set up a Droplet
Create a new docker droplet:

This droplet has almost everything we will need preinstalled.
You will receive an email from DO with the credentials you can use to log in to start setting up the server.
Connect to the server as a root user, using ip and password from the email:
ssh root@[ip-from-email]You will be prompted to change the default password, so do that.
Then create a new user with the username you like, and grant him the sudo powers:
adduser ray
gpasswd -a ray sudoConnect domain name
Let’s also immediately point your domain name to the droplet. After buying the domain(I recommend using namecheap), change the Custom DNS settings to look like this:

Then, in DO’s networking tab, create a domain, and add an A record pointing to the droplet:

Now you will be able to ssh into your server using your new username and a domain name:
ssh ray@hackertribe.ioInstall and configure basic stuff
Update and upgrade all the software:
sudo apt-get update && sudo apt-get upgradeInstall nginx(we’ll use it to serve our droplet on the right port), and your favorite text editor:
sudo apt-get install nginx emacsNow let’s add docker to the sudo group, that will allow us to run all the docker commands without sudo:
sudo usermod -aG docker $USER
sudo service docker restartClone and configure Mastodon
Clone the repo and cd into it:
git clone https://github.com/tootsuite/mastodon.git
cd mastodonNow let’s configure some settings. First, rename the file .env.production.sample into .env.production and open it.
Set the database username/password settings:
DB_USER=your_username
DB_NAME=your_databasename
DB_PASS=your_passwordSet your domain name:
LOCAL_DOMAIN=hackertribe.ioAnd enable https:
LOCAL_HTTPS=trueRun docker-compose run --rm web rake secret to generate PAPERCLIP_SECRET, SECRET_KEY_BASE, and OTP_SECRET.
Configure the email server
Create a SendGrid account, go to Settings > API Keys, and generate an API key.
Then set up the config like this:
SMTP_SERVER=smtp.sendgrid.net
SMTP_PORT=587
SMTP_LOGIN=apikey
SMTP_PASSWORD=<your-api-key>
SMTP_FROM_ADDRESS=youremail@gmail.com(for SMTP_LOGIN literally just use “apikey”)
Configure the site info
Open the file /mastodon/config/settings.yml, and enter the information about your instance(title, description, etc).
Build the containers
Before we can build the containers, we need to add a swap file, without it my $10/month droplet was running out of memory during the build process. To add swap, execute these commands:
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile(you can read more in depth about it here)
Now let’s finally build our containers! (It will take a few minutes)
docker-compose build
docker-compose up -d(the -d flag means that we want to run it in the background mode. You can try running it without this flag, and you will see the log of everything that’s going on on the screen)
Create the DB and migrate
Now we need to run several commands in the db container to create the database.
SSH into the container:
docker exec -i -t mastodon_db_1 /bin/bashSwitch to the postgres user:
su - postgresCreate a user for your db(use the username and password you’ve just set in the .env.production)
createuser -P your_usernameCreate a database, giving the ownership rights to the user:
createdb your_databasename -O your_usernameNow you can get back to your own user, and run the migrations:
docker-compose run --rm web rails db:migratePrecompile assets
Now you can precompile the assets:
docker-compose run --rm web rails assets:precompileAfter this has finished, restart the containers:
docker stop $(docker ps -a -q) && docker-compose up -dAnd now your mastodon instance will run on yourdomain.com:3000!!
Setting up nginx and SSL
First, follow this guide to generate SSL keys and set up the basic nginx configuration.
Then, because the docker containers are serving the application on the port 3000, we will need to use nginx to proxy all the requests to them.
Create the file /etc/nginx/sites-enabled/mastodon_nginx.conf, and copy the settings from here.
Now, after you restart nginx:
sudo /etc/init.d/nginx restartIt will serve your Mastodon instance!
Conclusion
Congratulations =) Create an account, test thinigs, and invite some people to use your instance!
I also recommend submitting a link to your instance to this list to make it easier for people to discover it.
If something doesn’t work or you have any questions — feel free to email me at raymestalez@gmail.com, or toot at me at @rayalez@hackertribe.io. I will be happy to help!
Also, everyone is always welcome to join the instance I’m hosting and maintaining — hackertribe.io.
Originally published on my blog. Come subscribe to it for more cool articles and tutorials on web development, programming, startups, and general tech!
Hacker Noon is how hackers start their afternoons. We’re a part of the @AMI family. We are now accepting submissions and happy to discuss advertising & sponsorship opportunities.
If you enjoyed this story, we recommend reading our latest tech stories and trending tech stories. Until next time, don’t take the realities of the world for granted!



