Project

General

Profile

Build Core On Ubuntu » History » Version 11

genii, 08/08/2011 05:37 PM
Added apt-get options for server to only install direct dependencies

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