Project

General

Profile

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>