Project

General

Profile

Build Core On Ubuntu » History » Version 18

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