Skip to content

Instantly share code, notes, and snippets.

@nchlswhttkr
Last active Jul 6, 2020
Embed
What would you like to do?
Terraria server on a DO droplet

Running Terraria on a DO droplet

Code from Debugging my Terraria Server's Startup.

terraria.nchlswhttkr.com:7777 for my server (if up).

This runs in a detached screen, managed by systemd.

You can download the server itself off the official Terraria website, place the contents of the Linux directory on a local terraria user in your droplet, with the accompanying server.config and terraria.service.

Set up as a user unit (~/.config/systemd/user/terraria.service) to run the server, which can be taken up/down with systemctl --user start/stop terraria.

To make sure this unit is not stopped when the owning user logs out, run sudo loginctl enable-linger <username> to allow the service to linger. Otherwise, the server will be stopped when you log out of your SSH session.

Runs off port 7777 (make sure its excepted from your firewall).

Attach to the screen (screen -r terraria) if you want to run admin commands.


Useful Links

#this is an example config file for TerrariaServer.exe
#use the command 'TerrariaServer.exe -config serverconfig.txt' to use this configuration or run start-server.bat
#please report crashes by emailing crashlog.txt to support@terraria.org
#the following is a list of available command line parameters:
#-config <config file> Specifies the configuration file to use.
#-port <port number> Specifies the port to listen on.
#-players <number> / -maxplayers <number> Sets the max number of players
#-pass <password> / -password <password> Sets the server password
#-world <world file> Load a world and automatically start the server.
#-autocreate <#> Creates a world if none is found in the path specified by -world. World size is specified by: 1(small), 2(medium), and 3(large).
#-banlist <path> Specifies the location of the banlist. Defaults to "banlist.txt" in the working directory.
#-worldname <world name> Sets the name of the world when using -autocreate.
#-secure Adds addition cheat protection to the server.
#-noupnp Disables automatic port forwarding
#-steam Enables Steam Support
#-lobby <friends> or <private> Allows friends to join the server or sets it to private if Steam is enabled
#-ip <ip address> Sets the IP address for the server to listen on
#-forcepriority <priority> Sets the process priority for this task. If this is used the "priority" setting below will be ignored.
#-disableannouncementbox Disables the text announcements Announcement Box makes when pulsed from wire.
#-announcementboxrange <number> Sets the announcement box text messaging range in pixels, -1 for serverwide announcements.
#-seed <seed> Specifies the world seed when using -autocreate
#remove the # in front of commands to enable them.
#Load a world and automatically start the server.
world=/home/terraria/worlds/home.wld
#Creates a new world if none is found. World size is specified by: 1(small), 2(medium), and 3(large).
autocreate=1
#Sets the world seed when using autocreate
#seed=AwesomeSeed
#Sets the name of the world when using autocreate
worldname=home
#Sets the difficulty of the world when using autocreate 0(normal), 1(expert)
difficulty=0
#Sets the max number of players allowed on a server. Value must be between 1 and 255
maxplayers=8
#Set the port number
port=7777
#Set the server password
#password=p@55w0rd
#Set the message of the day
motd=Hello World!
#Sets the folder where world files will be stored
worldpath=/home/terraria/worlds/
#The location of the banlist. Defaults to "banlist.txt" in the working directory.
#banlist=banlist.txt
#Adds addition cheat protection.
#secure=1
#Sets the server language from its language code.
#English = en-US, German = de-DE, Italian = it-IT, French = fr-FR, Spanish = es-ES, Russian = ru-RU, Chinese = zh-Hans, Portuguese = pt-BR, Polish = pl-PL,
language=en-US
#Automatically forward ports with uPNP
#upnp=1
#Reduces enemy skipping but increases bandwidth usage. The lower the number the less skipping will happen, but more data is sent. 0 is off.
#npcstream=60
#Default system priority 0:Realtime, 1:High, 2:AboveNormal, 3:Normal, 4:BelowNormal, 5:Idle
priority=1
systemctl --user start terraria
until ss -lt | grep 0.0.0.0:7777; do
sleep 1
done
screen -S terraria -X stuff "password <YOUR-PASSWORD>\n"
systemctl --user stop terraria
screen -wipe
[Unit]
Description=Terraria Server
[Service]
Type=forking
KillMode=none
WorkingDirectory=/home/terraria
ExecStart=/usr/bin/screen -dm -S terraria /home/terraria/server/TerrariaServer.bin.x86_64 -config /home/terraria/server.config
ExecStop=/usr/bin/screen -S terraria -X stuff "exit\n"
@mixels
Copy link

mixels commented Jul 4, 2020

Thanks for this! It was a big help for me getting started with a Terraria server as a systemd service. One question, I'm having trouble deciphering the start.sh file. Nothing is listening on port 7000. What's the purpose of that? And have you considered adding the Restart property to the terraria.service?

@nchlswhttkr
Copy link
Author

nchlswhttkr commented Jul 5, 2020

Hey! Seems like port 7000 was a typo on my part, it should be 7777. Cheers for catching that, I've updated it.

I should probably clarify that this code mostly exists because I had certain constraints to meet, largely in relation to how the "Run script over SSH" command works in iOS Shortcuts.

  • The command isn't interactive. My phone would SSH into the droplet, run the script, and logout. Running it inside a GNU screen was my workaround.
  • In my case systemd wasn't really necessary, it was just for my own convenience. I only wanted the Terraria server running when I was actually playing, so being able to start/stop it in the background with systemctl --user start/stop terraria was very nice.
  • The server doesn't listen for commands (like setting the password) until it's finished startup/loading, so I made my phone wait for it to bind to port 7777 before setting the password and finishing.

If I wanted the Terraria server to always be running while my droplet was up, I'd make it a system unit rather than a user unit and enable it so it runs on boot (IIRC user units on run on login). Like you pointed out, you could make it Restart then as well.

Hope this clears things up!

@mixels
Copy link

mixels commented Jul 6, 2020

Yes thank you it does! Thank you, that helps it all click. :) Cheers and thanks for the contribution, it helped me!

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