Build Core On Ubuntu » History » Version 8
yitsushi, 04/23/2010 05:19 PM
add base of "as Daemon"... I hope it's useful
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 | 1 | miohtama | </pre> |
17 | 1 | miohtama | |
18 | 6 | seezer | Also install the sql driver for your planned backend. |
19 | 6 | seezer | |
20 | 6 | seezer | - For sqlite (Quassels default, suggested for single user setups): |
21 | 1 | miohtama | <pre> |
22 | 6 | seezer | sudo apt-get install libqt4-sql-sqlite |
23 | 6 | seezer | </pre> |
24 | 6 | seezer | |
25 | 6 | seezer | - For PostgreSQL (suggested for multiuser setups): |
26 | 6 | seezer | <pre> |
27 | 6 | seezer | sudo apt-get install libqt4-sql-psql |
28 | 6 | seezer | </pre> |
29 | 6 | seezer | |
30 | 7 | seezer | h3. Get the sources |
31 | 6 | seezer | |
32 | 6 | seezer | <pre> |
33 | 1 | miohtama | git clone git://git.quassel-irc.org/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 | 4 | seezer | make |
43 | 1 | miohtama | optional step: make install |
44 | 1 | miohtama | </pre> |
45 | 1 | miohtama | |
46 | 1 | miohtama | Another common option to cmake would be: |
47 | 6 | seezer | <pre> |
48 | 6 | seezer | -DINSTALL_PREFIX=/path/where/it/should/be/installed |
49 | 6 | seezer | </pre> |
50 | 4 | seezer | Otherwise /usr/local/ is used as the install prefix. |
51 | 5 | seezer | |
52 | 6 | seezer | h2. Optional Step: Use PostgreSQL as backend |
53 | 1 | miohtama | |
54 | 7 | seezer | h3. Setup PostgreSQL database master user |
55 | 6 | seezer | |
56 | 1 | miohtama | * "Follow these Ubuntu specific instructions":https://help.ubuntu.com/community/PostgreSQL |
57 | 2 | miohtama | |
58 | 7 | seezer | h3. Setup quassel PostgreSQL database. The database password will be asked later by the Quassel client configuration wizard. |
59 | 1 | miohtama | |
60 | 1 | miohtama | <pre> |
61 | 1 | miohtama | sudo -i |
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 | 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. |
78 | 1 | miohtama | |
79 | 1 | miohtama | 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 | 4 | seezer | cd quassel/build |
84 | 1 | miohtama | ./quasselcore |
85 | 1 | miohtama | </pre> |
86 | 1 | miohtama | |
87 | 1 | miohtama | Now you can shut down your terminal and the quassel core still keeps running. |
88 | 1 | miohtama | |
89 | 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: |
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 | 1 | miohtama | h2. Starting using it |
99 | 1 | miohtama | |
100 | 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. |
101 | 8 | yitsushi | |
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 | 8 | yitsushi | LOGDIR=/var/log/quassel |
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 | 8 | yitsushi | And now... |
289 | 8 | yitsushi | Binary: /usr/local/bin/quasselcore |
290 | 8 | yitsushi | The logfile is: /var/log/quassel/core.log |
291 | 8 | yitsushi | PID-file: /var/run/quasselcore.pid |
292 | 8 | yitsushi | Data dir (confi, cert): /var/cache/quassel |
293 | 8 | yitsushi | Daemon-user: quasselcore |
294 | 8 | yitsushi | |
295 | 8 | yitsushi | Ok... Start: |
296 | 8 | yitsushi | <pre> |
297 | 8 | yitsushi | /etc/init.d/quasselcore start |
298 | 8 | yitsushi | </pre> |