Build Core On Ubuntu » History » Version 17
  zhsj, 08/06/2016 04:46 PM 
  
| 1 | 6 | seezer | h1. Building Quassel core from source on Ubuntu | 
|---|---|---|---|
| 2 | 1 | miohtama | |
| 3 | 12 | HappyHappyMan | These instructions tell how to build the latest Quassel core from git for your Ubuntu server or desktop. | 
| 4 | 12 | HappyHappyMan | Since it scales better with many users and huge amounts of history, setting up PostgreSQL as a backend will be explained as well. | 
| 5 | 1 | miohtama | |
| 6 | 12 | HappyHappyMan | h3. Make sure repositories are up-to-date | 
| 7 | 6 | seezer | |
| 8 | 1 | miohtama | <pre> | 
| 9 | 1 | miohtama | sudo apt-get update | 
| 10 | 1 | miohtama | </pre> | 
| 11 | 1 | miohtama | |
| 12 | 7 | seezer | h3. Install required dependencies and build tools | 
| 13 | 6 | seezer | |
| 14 | 17 | zhsj | * Ubuntu Desktop: | 
| 15 | 11 | genii | <pre> | 
| 16 | 17 | zhsj | sudo apt-get install git qt4-dev-tools libqt4-dev libqt4-sql-sqlite screen cmake build-essential | 
| 17 | 1 | miohtama | </pre> | 
| 18 | 1 | miohtama | |
| 19 | 17 | zhsj | * Ubuntu Server (installed with PostgreSQL): | 
| 20 | 6 | seezer | <pre> | 
| 21 | 17 | zhsj | sudo apt-get -o APT::Install-Recommends=0 -o APT::Install-Suggests=0 install git-core qt4-dev-tools libqt4-dev libqt4-sql-psql screen cmake build-essential | 
| 22 | 6 | seezer | </pre> | 
| 23 | 12 | HappyHappyMan | |
| 24 | 17 | zhsj | If you want to change the SQL driver, just replace the package libqt4-sql-* with what you want. | 
| 25 | 17 | zhsj | * SQLite(libqt4-sql-sqlite) is suggested for single user setups. | 
| 26 | 17 | zhsj | * PostgreSQL(libqt4-sql-psql) is suggested for multi-user setups | 
| 27 | 6 | seezer | |
| 28 | 6 | seezer | h3. Get the sources | 
| 29 | 6 | seezer | |
| 30 | 7 | seezer | <pre> | 
| 31 | 12 | HappyHappyMan | mkdir quassel-build | 
| 32 | 12 | HappyHappyMan | cd quassel-build | 
| 33 | 12 | HappyHappyMan | git clone https://github.com/quassel/quassel.git | 
| 34 | 1 | miohtama | </pre> | 
| 35 | 1 | miohtama | |
| 36 | 7 | seezer | h3. Build it | 
| 37 | 6 | seezer | |
| 38 | 4 | seezer | <pre> | 
| 39 | 1 | miohtama | mkdir quassel/build | 
| 40 | 1 | miohtama | cd quassel/build | 
| 41 | 1 | miohtama | cmake -DWANT_CORE=1 -DWANT_QTCLIENT=0 -DWANT_MONO=0 ../ | 
| 42 | 1 | miohtama | make | 
| 43 | 12 | HappyHappyMan | sudo make install | 
| 44 | 1 | miohtama | </pre> | 
| 45 | 1 | miohtama | |
| 46 | 1 | miohtama | Another common option to cmake would be: | 
| 47 | 1 | miohtama | <pre> | 
| 48 | 15 | midzer | -DCMAKE_INSTALL_PREFIX=/path/where/it/should/be/installed | 
| 49 | 6 | seezer | </pre> | 
| 50 | 12 | HappyHappyMan | |
| 51 | 5 | seezer | Otherwise /usr/local/ is used as the install prefix. | 
| 52 | 6 | seezer | |
| 53 | 1 | miohtama | h2. Optional Step: Use PostgreSQL as backend | 
| 54 | 7 | seezer | |
| 55 | 6 | seezer | h3. Setup PostgreSQL database master user | 
| 56 | 1 | miohtama | |
| 57 | 2 | miohtama | * "Follow these Ubuntu specific instructions":https://help.ubuntu.com/community/PostgreSQL | 
| 58 | 7 | seezer | |
| 59 | 1 | miohtama | h3. Setup quassel PostgreSQL database. The database password will be asked later by the Quassel client configuration wizard. | 
| 60 | 1 | miohtama | |
| 61 | 1 | miohtama | <pre> | 
| 62 | 1 | miohtama | sudo -u postgres psql | 
| 63 | 1 | miohtama | postgres=# CREATE USER quassel ENCRYPTED PASSWORD 'somepassword'; | 
| 64 | 1 | miohtama | CREATE ROLE | 
| 65 | 1 | miohtama | postgres=# CREATE DATABASE quassel WITH OWNER quassel ENCODING 'UTF8'; | 
| 66 | 1 | miohtama | CREATE DATABASE | 
| 67 | 1 | miohtama | </pre> | 
| 68 | 1 | miohtama | |
| 69 | 6 | seezer | h2. Optional Step: Create SSL certificate: | 
| 70 | 1 | miohtama | |
| 71 | 1 | miohtama | <pre> | 
| 72 | 1 | miohtama | openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout ~/.config/quassel-irc.org/quasselCert.pem -out ~/.config/quassel-irc.org/quasselCert.pem | 
| 73 | 1 | miohtama | </pre> | 
| 74 | 1 | miohtama | |
| 75 | 1 | miohtama | h2. Running Core | 
| 76 | 1 | miohtama | |
| 77 | 12 | HappyHappyMan | "Screen":http://www.debuntu.org/2006/07/04/72-how-to-screen-the-ultimate-admin-tool is a terminal tool which allows you to leave terminal sessions running in the background even when you are logged out. | 
| 78 | 1 | miohtama | |
| 79 | 12 | HappyHappyMan | We run Quassel in screen so that core keeps running as long as it is killed or the server is restarted | 
| 80 | 1 | miohtama | |
| 81 | 1 | miohtama | <pre> | 
| 82 | 1 | miohtama | screen | 
| 83 | 1 | miohtama | cd quassel/build | 
| 84 | 1 | miohtama | ./quasselcore | 
| 85 | 1 | miohtama | </pre> | 
| 86 | 1 | miohtama | |
| 87 | 12 | HappyHappyMan | Now you can shut down your terminal and the Quassel core still keeps running. | 
| 88 | 1 | miohtama | |
| 89 | 12 | HappyHappyMan | Later we can reattach to this screen session to check out the Quassel core terminal output to see if there has been any problems. Log in and type: | 
| 90 | 1 | miohtama | |
| 91 | 1 | miohtama | <pre> | 
| 92 | 1 | miohtama | screen -x | 
| 93 | 1 | miohtama | </pre> | 
| 94 | 1 | miohtama | |
| 95 | 1 | miohtama | Now you should how you left your terminal last time you shut it down. | 
| 96 | 1 | miohtama | |
| 97 | 1 | miohtama | |
| 98 | 12 | HappyHappyMan | h2. First-time Setup | 
| 99 | 8 | yitsushi | |
| 100 | 12 | HappyHappyMan | The configuration wizard will guide you through the rest of the setup when you connect to your Quassel core using a Quassel client for the first time. Remember to choose PostgreSQL backend instead of SQLite when asked. | 
| 101 | 8 | yitsushi | |
| 102 | 8 | yitsushi | h2. Start as Daemon | 
| 103 | 8 | yitsushi | |
| 104 | 8 | yitsushi | *make install*, create a user *quasselcore* with *quassel* group and create the */etc/init.d/quasselcore*: | 
| 105 | 8 | yitsushi | |
| 106 | 8 | yitsushi | <pre> | 
| 107 | 8 | yitsushi | ### BEGIN INIT INFO | 
| 108 | 8 | yitsushi | # Provides: quasselcore | 
| 109 | 8 | yitsushi | # Required-Start: $network $local_fs | 
| 110 | 8 | yitsushi | # Required-Stop: | 
| 111 | 8 | yitsushi | # Should-Start: | 
| 112 | 8 | yitsushi | # Should-Stop: | 
| 113 | 8 | yitsushi | # Default-Start: 2 3 4 5 | 
| 114 | 8 | yitsushi | # Default-Stop: 0 1 6 | 
| 115 | 8 | yitsushi | # Short-Description: distributed IRC client using a central core component | 
| 116 | 8 | yitsushi | # Description: This is the core component of Quassel. A modern, | 
| 117 | 8 | yitsushi | # cross-platform, distributed IRC client, meaning that one | 
| 118 | 8 | yitsushi | # (or multiple) client(s) can attach to and detach from this | 
| 119 | 8 | yitsushi | # central core. It's much like the popular combination | 
| 120 | 8 | yitsushi | # of screen and a text-based IRC client such as WeeChat. | 
| 121 | 8 | yitsushi | ### END INIT INFO | 
| 122 | 8 | yitsushi | PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin | 
| 123 | 8 | yitsushi | |
| 124 | 8 | yitsushi | DAEMON=/usr/local/bin/quasselcore | 
| 125 | 8 | yitsushi | NAME=quasselcore | 
| 126 | 8 | yitsushi | DESC="distributed IRC core" | 
| 127 | 10 | verschdl | LOGDIR=/var/log/quassel | 
| 128 | 8 | yitsushi | PORT=4242 | 
| 129 | 8 | yitsushi | |
| 130 | 8 | yitsushi | PIDFILE=/var/run/quasselcore.pid | 
| 131 | 8 | yitsushi | |
| 132 | 8 | yitsushi | test -x $DAEMON || exit 0 | 
| 133 | 8 | yitsushi | |
| 134 | 8 | yitsushi | . /lib/lsb/init-functions | 
| 135 | 8 | yitsushi | |
| 136 | 8 | yitsushi | DAEMON_OPTS="" | 
| 137 | 8 | yitsushi | DIETIME=10 | 
| 138 | 8 | yitsushi | STARTIME=3 | 
| 139 | 8 | yitsushi | LOGFILE=$LOGDIR/core.log | 
| 140 | 8 | yitsushi | DATADIR=/var/cache/quassel | 
| 141 | 8 | yitsushi | DAEMONUSER=quasselcore | 
| 142 | 8 | yitsushi | |
| 143 | 8 | yitsushi | if [ -f /etc/default/$NAME ] ; then | 
| 144 | 8 | yitsushi | . /etc/default/$NAME | 
| 145 | 8 | yitsushi | fi | 
| 146 | 8 | yitsushi | |
| 147 | 8 | yitsushi | if [ -n "$DAEMONUSER" ] ; then | 
| 148 | 8 | yitsushi | if getent passwd | grep -q "^$DAEMONUSER:"; then | 
| 149 | 8 | yitsushi | # Obtain the uid and gid | 
| 150 | 8 | yitsushi |         DAEMONUID=`getent passwd |grep "^$DAEMONUSER:" | awk -F : '{print $3}'` | 
| 151 | 8 | yitsushi |         DAEMONGID=`getent passwd |grep "^$DAEMONUSER:" | awk -F : '{print $4}'` | 
| 152 | 8 | yitsushi | else | 
| 153 | 8 | yitsushi | log_failure_msg "The user $DAEMONUSER, required to run $NAME does not exist." | 
| 154 | 8 | yitsushi | exit 1 | 
| 155 | 8 | yitsushi | fi | 
| 156 | 8 | yitsushi | fi | 
| 157 | 8 | yitsushi | |
| 158 | 8 | yitsushi | set -e | 
| 159 | 8 | yitsushi | |
| 160 | 8 | yitsushi | running_pid() { | 
| 161 | 8 | yitsushi | pid=$1 | 
| 162 | 8 | yitsushi | name=$2 | 
| 163 | 8 | yitsushi | [ -z "$pid" ] && return 1 | 
| 164 | 8 | yitsushi | [ ! -d /proc/$pid ] && return 1 | 
| 165 | 8 | yitsushi | cmd=`cat /proc/$pid/cmdline | tr "\000" "\n"|head -n 1 |cut -d : -f 1` | 
| 166 | 8 | yitsushi | [ "$cmd" != "$name" ] && return 1 | 
| 167 | 8 | yitsushi | return 0 | 
| 168 | 8 | yitsushi | } | 
| 169 | 8 | yitsushi | |
| 170 | 8 | yitsushi | running() { | 
| 171 | 8 | yitsushi | [ ! -f "$PIDFILE" ] && return 1 | 
| 172 | 8 | yitsushi | pid=`cat $PIDFILE` | 
| 173 | 8 | yitsushi | running_pid $pid $DAEMON || return 1 | 
| 174 | 8 | yitsushi | return 0 | 
| 175 | 8 | yitsushi | } | 
| 176 | 8 | yitsushi | |
| 177 | 8 | yitsushi | start_server() { | 
| 178 | 8 | yitsushi | start-stop-daemon --start --quiet --pidfile $PIDFILE --make-pidfile \ | 
| 179 | 8 | yitsushi | --background --chuid $DAEMONUSER --exec $DAEMON \ | 
| 180 | 8 | yitsushi | -- --logfile=$LOGFILE --loglevel=$LOGLEVEL --configdir=$DATADIR \ | 
| 181 | 8 | yitsushi | --port=$PORT \ | 
| 182 | 8 | yitsushi | $DAEMON_OPTS | 
| 183 | 8 | yitsushi | errcode=$? | 
| 184 | 8 | yitsushi | return $errcode | 
| 185 | 8 | yitsushi | } | 
| 186 | 8 | yitsushi | |
| 187 | 8 | yitsushi | stop_server() { | 
| 188 | 8 | yitsushi | start-stop-daemon --stop --quiet --pidfile $PIDFILE --user $DAEMONUSER \ | 
| 189 | 8 | yitsushi | --exec $DAEMON | 
| 190 | 8 | yitsushi | errcode=$? | 
| 191 | 8 | yitsushi | return $errcode | 
| 192 | 8 | yitsushi | } | 
| 193 | 8 | yitsushi | |
| 194 | 8 | yitsushi | force_stop() { | 
| 195 | 8 | yitsushi | [ ! -e "$PIDFILE" ] && return | 
| 196 | 8 | yitsushi | if running ; then | 
| 197 | 8 | yitsushi | kill -15 $pid | 
| 198 | 8 | yitsushi | # Is it really dead? | 
| 199 | 8 | yitsushi | sleep "$DIETIME"s | 
| 200 | 8 | yitsushi | if running ; then | 
| 201 | 8 | yitsushi | kill -9 $pid | 
| 202 | 8 | yitsushi | sleep "$DIETIME"s | 
| 203 | 8 | yitsushi | if running ; then | 
| 204 | 8 | yitsushi | echo "Cannot kill $NAME (pid=$pid)!" | 
| 205 | 8 | yitsushi | exit 1 | 
| 206 | 8 | yitsushi | fi | 
| 207 | 8 | yitsushi | fi | 
| 208 | 8 | yitsushi | fi | 
| 209 | 8 | yitsushi | rm -f $PIDFILE | 
| 210 | 8 | yitsushi | } | 
| 211 | 8 | yitsushi | |
| 212 | 8 | yitsushi | case "$1" in | 
| 213 | 8 | yitsushi | start) | 
| 214 | 8 | yitsushi | log_daemon_msg "Starting $DESC" "$NAME" | 
| 215 | 8 | yitsushi | # Check if it's running first | 
| 216 | 8 | yitsushi | if running ; then | 
| 217 | 8 | yitsushi | log_progress_msg "apparently already running" | 
| 218 | 8 | yitsushi | log_end_msg 0 | 
| 219 | 8 | yitsushi | exit 0 | 
| 220 | 8 | yitsushi | fi | 
| 221 | 8 | yitsushi | if start_server ; then | 
| 222 | 8 | yitsushi | [ -n "$STARTTIME" ] && sleep $STARTTIME # Wait some time | 
| 223 | 8 | yitsushi | if running ; then | 
| 224 | 8 | yitsushi | log_end_msg 0 | 
| 225 | 8 | yitsushi | else | 
| 226 | 8 | yitsushi | log_end_msg 1 | 
| 227 | 8 | yitsushi | fi | 
| 228 | 8 | yitsushi | else | 
| 229 | 8 | yitsushi | log_end_msg 1 | 
| 230 | 8 | yitsushi | fi | 
| 231 | 8 | yitsushi | ;; | 
| 232 | 8 | yitsushi | stop) | 
| 233 | 8 | yitsushi | log_daemon_msg "Stopping $DESC" "$NAME" | 
| 234 | 8 | yitsushi | if running ; then | 
| 235 | 8 | yitsushi | stop_server | 
| 236 | 8 | yitsushi | log_end_msg $? | 
| 237 | 8 | yitsushi | else | 
| 238 | 8 | yitsushi | log_progress_msg "apparently not running" | 
| 239 | 8 | yitsushi | log_end_msg 0 | 
| 240 | 8 | yitsushi | exit 0 | 
| 241 | 8 | yitsushi | fi | 
| 242 | 8 | yitsushi | ;; | 
| 243 | 8 | yitsushi | force-stop) | 
| 244 | 8 | yitsushi | $0 stop | 
| 245 | 8 | yitsushi | if running; then | 
| 246 | 8 | yitsushi | # If it's still running try to kill it more forcefully | 
| 247 | 8 | yitsushi | log_daemon_msg "Stopping (force) $DESC" "$NAME" | 
| 248 | 8 | yitsushi | force_stop | 
| 249 | 8 | yitsushi | log_end_msg $? | 
| 250 | 8 | yitsushi | fi | 
| 251 | 8 | yitsushi | ;; | 
| 252 | 8 | yitsushi | restart|force-reload) | 
| 253 | 8 | yitsushi | log_daemon_msg "Restarting $DESC" "$NAME" | 
| 254 | 8 | yitsushi | stop_server | 
| 255 | 8 | yitsushi | # Wait some sensible amount, some server need this | 
| 256 | 8 | yitsushi | [ -n "$DIETIME" ] && sleep $DIETIME | 
| 257 | 8 | yitsushi | start_server | 
| 258 | 8 | yitsushi | [ -n "$STARTTIME" ] && sleep $STARTTIME | 
| 259 | 8 | yitsushi | running | 
| 260 | 8 | yitsushi | log_end_msg $? | 
| 261 | 8 | yitsushi | ;; | 
| 262 | 8 | yitsushi | status) | 
| 263 | 8 | yitsushi | log_daemon_msg "Checking status of $DESC" "$NAME" | 
| 264 | 8 | yitsushi | if running ; then | 
| 265 | 8 | yitsushi | log_success_msg "running" | 
| 266 | 8 | yitsushi | log_end_msg 0 | 
| 267 | 8 | yitsushi | else | 
| 268 | 8 | yitsushi | log_success_msg "apparently not running" | 
| 269 | 8 | yitsushi | log_end_msg 1 | 
| 270 | 8 | yitsushi | exit 1 | 
| 271 | 8 | yitsushi | fi | 
| 272 | 8 | yitsushi | ;; | 
| 273 | 8 | yitsushi | reload) | 
| 274 | 8 | yitsushi | log_warning_msg "Reloading $NAME daemon: not implemented, as the daemon" | 
| 275 | 8 | yitsushi | log_warning_msg "cannot re-read the config file (use restart)." | 
| 276 | 8 | yitsushi | ;; | 
| 277 | 8 | yitsushi | |
| 278 | 8 | yitsushi | *) | 
| 279 | 8 | yitsushi | N=/etc/init.d/$NAME | 
| 280 | 8 | yitsushi |       echo "Usage: $N {start|stop|force-stop|restart|force-reload|status}" >&2 | 
| 281 | 8 | yitsushi | exit 1 | 
| 282 | 8 | yitsushi | ;; | 
| 283 | 8 | yitsushi | esac | 
| 284 | 8 | yitsushi | |
| 285 | 8 | yitsushi | exit 0 | 
| 286 | 8 | yitsushi | </pre> | 
| 287 | 8 | yitsushi | |
| 288 | 14 | rikai | * *Note:* By default this script will not work after a reboot with mysql/postgresql backends. If you're interested in that, this should make quassel start with either mysql or postgresql "as per this bug report":https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=701943. Simply change the the Should-Start and Should-Stop parameters to the following: | 
| 289 | 13 | rikai | <pre> | 
| 290 | 13 | rikai | # Should-Start: mysql postgresql | 
| 291 | 13 | rikai | # Should-Stop: mysql postgresql | 
| 292 | 13 | rikai | </pre> | 
| 293 | 13 | rikai | |
| 294 | 8 | yitsushi | And now... | 
| 295 | 8 | yitsushi | Binary: /usr/local/bin/quasselcore | 
| 296 | 8 | yitsushi | The logfile is: /var/log/quassel/core.log | 
| 297 | 8 | yitsushi | PID-file: /var/run/quasselcore.pid | 
| 298 | 8 | yitsushi | Data dir (confi, cert): /var/cache/quassel | 
| 299 | 8 | yitsushi | Daemon-user: quasselcore | 
| 300 | 8 | yitsushi | |
| 301 | 8 | yitsushi | Ok... Start: | 
| 302 | 8 | yitsushi | <pre> | 
| 303 | 8 | yitsushi | /etc/init.d/quasselcore start | 
| 304 | 1 | miohtama | </pre> |