Tuesday, May 29, 2012

Minecraft Server on Debian

Running Minecraft Server on a Linode Debian Instance

If you are having issues following the official wiki then you are not alone - I found it much too generic and could not get the 'init.d' startup script to work. Following is a step by step guide to quickly set up your on game server running on Debian/Ubuntu distribution.

Install Java

We are going to install OpenJDK which for all intents and purposes is equivalent to Sun java but without licensing issues. Execute below commands under root or using sudo.

# aptitude update
# aptitude install openjdk-6-jre-headless

Download and Install Minecraft Server

We are going to download and install into '/usr/local/minecraft' as per the Debian FilesystemHierarchyStandard.

# mkdir /usr/local/minecraft
# cd /usr/local/minecraft/
# wget http://dl.bukkit.org/latest-rb/craftbukkit.jar

We are installing the bukkit minecraft version rather then the vanilla one, it is fully comptabible with the vanilla server but lets your run plugins to effectivley manage your server

Server Settings

Create the server's server.properties file. I suggest you at least modify the 'motd', and 'level-seed' so that your world is a little personal to you.

# cd /usr/local/minecraft/
# nano server.properties

#Danols Minecraft Server properties
allow-nether=true
level-name=world
enable-query=false
allow-flight=false
server-port=25565
level-type=DEFAULT
enable-rcon=false
level-seed=Artomix #http://seedhunter.blogspot.com/2012/03/jungle-island.html
server-ip=
max-build-height=256
spawn-npcs=true
white-list=false
spawn-animals=true
online-mode=true
pvp=true
difficulty=3
gamemode=0
max-players=6
spawn-monsters=true
generate-structures=true
view-distance=10
motd=you must survive

Automatic Startup

Compared that what is posted on the Minecraft Wiki the below is a simple startup script using Debians/Ubuntus start-stop-deamon utility, it does not have the update server, or run file system in memory option; in my opinion Java+Linux do a good job system caching on demand and any speeds from running in memory

The server is run under user 'minecraft-server' and group 'daemon' to increase security - this account and group is created as follows:

# useradd --home-dir /usr/local/minecraft-server --no-create-home -g daemon --shell /bin/false minecraft-server
# groupadd daemon

Create the startup script as follows

# cd /etc/init.d/
# touch minecraft-server
# chmod +x minecraft-server

Paste the following code into the script and make sure to modify the DAEMON_ARGS setting to reflect your memory allocation.

#!/bin/bash
### BEGIN INIT INFO
# Provides:          minecraft_server
# Required-Start:    $local_fs $remote_fs $network
# Required-Stop:     $local_fs $remote_fs $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Description:       Minecraft server debian init script.
# Author: Daniel Sokolowski
#
### END INIT INFO

# You can use this as a template or symbolic link it into `/etc/init.d` on Debian system

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin
DESC="Minecraft Server"
NAME=minecraft_server.jar
SCREENNAME=minecraft-server # the session screen game given

DAEMON="/usr/bin/screen"
DAEMONUSER=minecraft-server
DAEMONGROUP=daemon
# the -Xincgc options enable incremental garbage collector which slows 
# execution but makes  more memory efficient. 
# -Xmx1024M is the recommended minimum

DAEMON_ARGS="-DmS $SCREENNAME java -Xincgc -Xms32M -Xmx304M -jar /usr/local/minecraft-server/$NAME nogui" 
 # Lowest memory limit used was about 80M on fresh start.
 # For screen we use `-DmS` instead of -dmS since -D dosen't detach the screen so our pid 
 # file created by start-stop-deamon is correct. 
PIDFILE=/usr/local/minecraft-server/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
#[ -f "$DAEMON" ] || exit 0
# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
  # Return
        #   0 if daemon has been started
        #   1 if daemon was already running
        #   2 if daemon could not be started
        start-stop-daemon -c $DAEMONUSER -g $DAEMONGROUP -u $DAEMONUSER --start --verbose --background --chdir /usr/local/minecraft-server/ --pidfile $PIDFILE --make-pidfile --exec $DAEMON -- $DAEMON_ARGS
        echo "start-stop-daemon -c $DAEMONUSER -g $DAEMONGROUP --start --verbose --background --chdir /usr/local/minecraft-server/ --pidfile $PIDFILE --make-pidfile --exec $DAEMON -- $DAEMON_ARGS"
        # Add code here, if necessary, that waits for the process to be ready
        # to handle requests from services started subsequently which depend
        # on this one.  As a last resort, sleep for some time.
}

#
# Function that stops the daemon/service
#
do_stop()
{
        # Return
        #   0 if daemon has been stopped
        #   1 if daemon was already stopped
        #   2 if daemon could not be stopped
        #   other if a failure occurred
        start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE
        RETVAL="$?"
        [ "$RETVAL" = 2 ] && return 2
        # Wait for children to finish too if this is a daemon that forks
        # and if the daemon is only ever run from this initscript.
        # If the above conditions are not satisfied then add some other code
        # that waits for the process to drop all resources that could be
        # needed by services started subsequently.  A last resort is to
        # sleep for some time.
        start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
        [ "$?" = 2 ] && return 2
        # Many daemons don't delete their pidfiles when they exit.
        rm -f $PIDFILE
        sleep 5s
        return "$RETVAL"
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
        #
        # If the daemon can reload its configuration without
        # restarting (for example, when it is sent a SIGHUP),
        # then implement that here.
        #
        start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
        return 0
}

case "$1" in
  start)
        [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
        do_start
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  #reload|force-reload)
        #
        # If do_reload() is not implemented then leave this commented out
        # and leave 'force-reload' as an alias for 'restart'.
        #
        #log_daemon_msg "Reloading $DESC" "$NAME"
        #do_reload
        #log_end_msg $?
        #;;
  restart|force-reload)
        #
        # If the "reload" option is implemented then remove the
        # 'force-reload' alias
        #
        log_daemon_msg "Restarting $DESC" "$NAME"
        do_stop
        case "$?" in
          0|1)
                do_start
                case "$?" in
                        0) log_end_msg 0 ;;
                        1) log_end_msg 1 ;; # Old process is still running
                        *) log_end_msg 1 ;; # Failed to start
                esac
                ;;
          *)
                # Failed to stop
                log_end_msg 1
                ;;
        esac
        ;;
  *)
        #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
        echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
        exit 3
        ;;
esac

Activate the startup script and start the server by executing the following commands:

# update-rc.d minecraft-server defaults
# /etc/init.d/minecraft-server start

More Resources

Visit Bukkit for a wealth of information and plugins and feel free to contact me at webdesign.danols.com

Saturday, May 26, 2012

SIP Voip Multiline Client

Receive call from multiple SIP accounts using one client.

Finally found a decent free, no hidden costs, and open source VOIP multi line line client Linphone.

It works rather well, doesn't look like dogs breakfast, hasn't crashed yet, and best of all it's also a multi platform client - it will run on your Blackberry, Android, iPhone, Windows and Linux. So in a nut shell if you have multiple sip accounts or run your own PBX system like FreeSWITCH it does the job, and it does it well.

Yes you can thank me, but real thanks should go to Yasuro's Blog, I just got legendary googlefu.

Wednesday, May 23, 2012

Directory Size Overview in Linux

Visual console based directory size overview

If you google how to get directory size list in linux you most likley find a page that tells you to use the following command:

du -sh * | sort -nr

Or to limit only to the top 10:

du -sh * | sort -nr | head -10

However this is cumbersome and not very visual. There are two awesome solutions to this dillema: NCurses Disk Usage and Midnight Commander; the former just let's you explore the sizes of yoru folder whereas the latter is a complete and very popular system explorer which comes with an options to calculate directory sizes.

To calculate sizes in Midnight Commander press 'Shift +' to select all and choose 'Command' > 'Show directory sizes'

These programs are available as Debian packages and I suggest you install both.

Tuesday, May 22, 2012

Opera SOCKS Proxy Setup Issues

SOCKS error: Connection closed by remote server

When setting up SOCKS only proxy in Opera web browser make sure to specify the IP address instead of your fully qualified domain name (FQDN). Using a host name will not work and Opera simply fails to connect to the proxy server.

Sample working setup screen shot with a Dante proxy server , note that HTTP, HTTPS, FTP, SSH options are left blank.

Bug DSK-364301 has been filled with Opera, if it has been a while since this post and the issue still not fixed feel free to add your word of encouragement by emailing DSK-364301@bugs.opera.com :)