/
maintenance.html
661 lines (559 loc) · 20.4 KB
/
maintenance.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.10: http://docutils.sourceforge.net/" />
<title></title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 7514 2012-09-14 14:27:12Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document">
<div class="section" id="maintenance">
<h1>Maintenance</h1>
<p>This documents some common maintenance tasks and the layout of the
applications on the server.</p>
</div>
<div class="section" id="layout-of-installation">
<h1>Layout Of Installation</h1>
<p>This documents what's installed, how and where.</p>
<p>Briefly, the following services are installed:</p>
<blockquote>
<ul class="simple">
<li>Solr (served by tomcat6)</li>
<li>Postgresql</li>
<li>Elasticsearch</li>
<li>nginx</li>
<li>apache2</li>
<li>supervisord</li>
<li>CKAN</li>
</ul>
</blockquote>
<p>And the application as a whole is installed in
<cite>/applications/ecodp/users/ecodp/</cite>, with each of the above services having an
entry as a <em>product</em> within the application structure. Eg -
<cite>/applications/ecodp/users/ecodp/nginx</cite>. This base directory is refered to as
<cite>$CKAN_APPLICATION</cite> in the install scripts:</p>
<pre class="literal-block">
CKAN_APPLICATION=/applications/ecodp/users/ecodp
</pre>
<div class="section" id="solr-1-4-1">
<h2>Solr (1.4.1)</h2>
<pre class="literal-block">
SOLR_PRODUCT=$CKAN_APPLICATION/solr
TOMCAT_PRODUCT=$CKAN_APPLICATION/tomcat
</pre>
<p>Tomcat is a package install, with its <cite>lib</cite> and <cite>etc</cite> soft-linked to from
within the <cite>$TOMCAT_PRODUCT</cite> directory.</p>
<p>Solr is installed manually by dropping the approparite <tt class="docutils literal">.war</tt> file into
tomcat's webapps directory. It's data directory is <cite>$SOLR_PRODUCT/data</cite> and
the location of it's schema file etc is <cite>$SOLR_PRODUCT/solr</cite>.</p>
<p>Tomcat is run under the <tt class="docutils literal">tomcat</tt> user.</p>
</div>
<div class="section" id="postgres">
<h2>Postgres</h2>
<pre class="literal-block">
POSTGRES_PRODUCT=$CKAN_APPLICATION/postgres
</pre>
<p>Postgresql is a package install with it's <cite>/var/lib/pgsql</cite> directory being
linked to from <cite>$POSTGRES_PRODUCT/pgsql</cite>. This contains the data directory as
well as configuration files.</p>
<p>Postgres is run under the <tt class="docutils literal">postgres</tt> user.</p>
</div>
<div class="section" id="elasticsearch">
<h2>ElasticSearch</h2>
<pre class="literal-block">
ES_PRODUCT=$CKAN_APPLICATION/elasticsearch
</pre>
<p>This is a manual installation of 0.19.4 distribution of elasticsearch. The
distribution itself is simply dropped into <cite>$ES_PRODUCT</cite>, and is
self-contained. The only other addition is an init.d script is placed in
<cite>/etc/init.d/elasticsearch</cite> (and linked to from
<cite>$CKAN_APPLICATION/init.d/elasticsearch</cite>) which as then added to run-levels 3,4
and 5 for starting up at boot time.</p>
<p>One other aspect of the installation is that elastic search runs under its own
user, <cite>elasticsearch</cite>, which has had the number of file descriptors made
available to it increased to 32000. As per the production-deployment
instructions for elasticsearch.</p>
<p>Elasticsearch is run under the <tt class="docutils literal">elasticsearch</tt> user.</p>
</div>
<div class="section" id="nginx">
<h2>Nginx</h2>
<pre class="literal-block">
NGINX_PRODUCT=$CKAN_APPLICATION/nginx
</pre>
<p>This is a package install. However, the package isn't available in the
standard repositories. As such the rpm is made available through nginx's own
maintained repositories. Once installed, it's configuration files are linked
to from <cite>$NGINX_PRODUCT/etc</cite>.</p>
<p>Nginx is set up to forward <cite>/</cite> urls to apache. And to proxy
<cite>/elastic/</cite> urls to elasticsearch.</p>
<p>Nginx's master process is running under <tt class="docutils literal">root</tt>. This appears to be standard
in order that nginx can open privelaged ports without having to "tinker" with
permissions. It should be possible to grant those permissions on the nginx
executable using <tt class="docutils literal">setcap</tt>.</p>
<p>Nginx's worker processes all run under the <tt class="docutils literal">nginx</tt> user.</p>
</div>
<div class="section" id="apache">
<h2>Apache</h2>
<p>This is just a standard package installation. Configuration files are found in
<cite>/etc/httpd/</cite>.</p>
<p>Like <a class="reference internal" href="#nginx">Nginx</a>, Apache's master process is run as <tt class="docutils literal">root</tt>.
Apache's worker processes are run as <tt class="docutils literal">apache</tt>.</p>
</div>
<div class="section" id="supervisord">
<h2>Supervisord</h2>
<pre class="literal-block">
SUPERVISOR_PRODUCT=$CKAN_APPLICATION/supervisor
</pre>
<p>This is installed into the python virtualenvironment associated with the CKAN
instance. It's configuration files; log files and run files (.pid and .sock
files) are all found under <cite>$SUPERVISOR_PRODUCT/{var/log, etc, var/run}</cite></p>
<p>Supervisor is run under the <tt class="docutils literal">ecodp</tt> user.
The monitored celery tasks are run under <tt class="docutils literal">ecodp</tt> as well.</p>
</div>
<div class="section" id="ckan">
<h2>CKAN</h2>
<pre class="literal-block">
CKAN_APPLICATION=/applications/ecodp/users/ecodp
CKAN_VERSION="release-v1.7.1-ecportal"
CKAN_INSTALL_DIR=$CKAN_APPLICATION/ckan/lib
CKAN_LIB=$CKAN_INSTALL_DIR
CKAN_ETC=$CKAN_APPLICATION/ckan/etc
CKAN_HOME="$CKAN_INSTALL_DIR/$CKAN_INSTANCE"
PYENV="$CKAN_HOME/pyenv"
</pre>
<p>CKAN itself is a source installation, with a python environment for <em>each</em> CKAN
instance. As per usual, each ckan extenstion is also a source install.</p>
</div>
</div>
<div class="section" id="common-maintenance-tasks">
<h1>Common Maintenance Tasks</h1>
<div class="section" id="upgrading-ckan">
<h2>Upgrading CKAN</h2>
<p>To upgrade CKAN's source installation, follow these steps:</p>
<pre class="literal-block">
# Assuming initial config settings:
CKAN_INSTANCE=ecodp
CKAN_VERSION=release-v1.7.1-ecportal
# Working in the CKAN source directory
cd /applications/ecodp/users/ecodp/ckan/lib/${CKAN_INSTANCE}/pyenv/src/ckan
# Update the source code
git fetch
git merge origin/$CKAN_VERSION
# Activate the python virtualenv
source /applications/ecodp/users/ecodp/ckan/lib/${CKAN_INSTANCE}/pyenv/bin/activate
# Run any database migrations
paster db upgrade -c /applications/ecodp/users/ecodp/ckan/etc/%{CKAN_INSTANCE}/%{CKAN_INSTANCE}.ini
# Update the solr schema (if necessary)
cp /applications/ecodp/users/ecodp/ckan/lib/${CKAN_INSTANCE}/pyenv/src/ckan/ckanext/multilingual/solr \
/applications/ecodp/users/ecodp/solr/solr/conf
/applications/ecodp/users/ecodp/init.d/tomcat6 restart
# Restart apache
/applications/ecodp/users/ecodp/init.d/httpd restart
</pre>
<p>If the solr schema has been upgrade, then you'll need to</p>
</div>
<div class="section" id="upgrading-ckan-s-extensions">
<h2>Upgrading CKAN's extensions</h2>
<p>Each of CKAN's extensions are source installations too, which means any one of
them can be upgraded following a similar procedure to that above:</p>
<pre class="literal-block">
# Assuming initial config settings:
CKAN_INSTANCE=ecodp
# The extension we wish to upgrade, change as appropriate:
CKAN_EXTENSION=ckanext-qa
# Working in the CKAN source directory
cd /applications/ecodp/users/ecodp/ckan/lib/${CKAN_INSTANCE}/pyenv/src/${CKAN_EXTENSION}
# Update the source code
git fetch
git merge origin master
# Restart apache
/applications/ecodp/users/ecodp/init.d/httpd restart
</pre>
</div>
<div class="section" id="rebuilding-search-index">
<h2>Rebuilding Search Index</h2>
<p>The search index is rebuilt using a paster command:</p>
<pre class="literal-block">
# Assuming initial config settings:
CKAN_INSTANCE=ecodp
# Activate the python virtualenv
source /applications/ecodp/users/ecodp/ckan/lib/${CKAN_INSTANCE}/pyenv/bin/activate
# Working in the CKAN source directory
cd /applications/ecodp/users/ecodp/ckan/lib/${CKAN_INSTANCE}/pyenv/src/ckan
# Run the paster command
paster search-index rebuild -c /applications/ecodp/users/ecodp/ckan/etc/%{CKAN_INSTANCE}/%{CKAN_INSTANCE}.ini
</pre>
</div>
<div class="section" id="restarting-services">
<h2>Restarting services</h2>
<p>There's a link to each service's init.d script in
<cite>/applications/ecodp/users/ecodp/init.d</cite>. Each one accepts <cite>start</cite>, <cite>stop</cite>,
<cite>status</cite> and <cite>restart</cite>. For example:</p>
<pre class="literal-block">
/applications/ecodp/users/ecodp/init.d/httpd restart
</pre>
</div>
<div class="section" id="changing-the-http-auth-user">
<h2>Changing the HTTP Auth User</h2>
<p>The HTTP Auth username/password is currently hardcoded into the file:</p>
<pre class="literal-block">
/applications/ecodp/users/ecodp/ckan/lib/ecodp/auth.py
</pre>
<p>To change the username/password, edit this file and then restart apache (below)</p>
<p>The authentication can be removed by editing apache configuration:</p>
<pre class="literal-block">
/etc/httpd/conf.d/ecodp.conf
</pre>
<p>The whole of this block can be removed or commented out:</p>
<pre class="literal-block">
#<Location />
# allow from all
# AuthType Basic
# AuthName "ODP"
# AuthBasicProvider wsgi
# WSGIAuthUserScript /applications/ecodp/users/ecodp/ckan/lib/ecodp/auth.py
# Require valid-user
#</Location>
</pre>
<p>After that, apache needs to be restarted:</p>
<pre class="literal-block">
service httpd restart
</pre>
</div>
<div class="section" id="adding-ckan-users">
<h2>Adding CKAN Users</h2>
<p>Normal CKAN users and system administators can be added via the
<tt class="docutils literal">paster user add</tt> and <tt class="docutils literal">paster sysadmin add</tt> commands respectively.</p>
<p>For example, to create a new sysadmin called <tt class="docutils literal">admin</tt>:</p>
<pre class="literal-block">
# Assuming initial config settings:
CKAN_INSTANCE=ecodp
# Activate the python virtualenv
source /applications/ecodp/users/ecodp/ckan/lib/${CKAN_INSTANCE}/pyenv/bin/activate
# Working in the CKAN or an extension directory
cd /applications/ecodp/users/ecodp/ckan/lib/${CKAN_INSTANCE}/pyenv/src/ckan
# Run the paster command, referencing the .ini file
paster sysadmin add admin -c /applications/ecodp/users/ecodp/ckan/etc/%{CKAN_INSTANCE}/%{CKAN_INSTANCE}.ini
</pre>
<p>More information on CKAN user management can be found at:
<a class="reference external" href="http://docs.ckan.org/en/latest/paster.html#user-create-and-manage-users">http://docs.ckan.org/en/latest/paster.html#user-create-and-manage-users</a></p>
</div>
<div class="section" id="running-qa-tasks">
<h2>Running QA tasks</h2>
<p>The QA tasks can be triggered by running a paster command:</p>
<pre class="literal-block">
# Assuming initial config settings:
CKAN_INSTANCE=ecodp
# Activate the python virtualenv
source /applications/ecodp/users/ecodp/ckan/lib/${CKAN_INSTANCE}/pyenv/bin/activate
# Working in the qa source directory
cd /applications/ecodp/users/ecodp/ckan/lib/${CKAN_INSTANCE}/pyenv/src/ckanext-qa
# Run the paster command
paster qa update --config /applications/ecodp/users/ecodp/ckan/etc/%{CKAN_INSTANCE}/%{CKAN_INSTANCE}.ini
</pre>
</div>
<div class="section" id="running-paster-commands-in-general">
<h2>Running paster commands in general</h2>
<p>In general, running a paster command consists of:</p>
<pre class="literal-block">
# Assuming initial config settings:
CKAN_INSTANCE=ecodp
# Activate the python virtualenv
source /applications/ecodp/users/ecodp/ckan/lib/${CKAN_INSTANCE}/pyenv/bin/activate
# Working in the CKAN or an extension directory
cd /applications/ecodp/users/ecodp/ckan/lib/${CKAN_INSTANCE}/pyenv/src/ckan
# Run the paster command, referencing the .ini file
paster {commands} -c /applications/ecodp/users/ecodp/ckan/etc/%{CKAN_INSTANCE}/%{CKAN_INSTANCE}.ini
</pre>
</div>
</div>
<div class="section" id="backup-and-restore-db">
<h1>Backup and Restore DB</h1>
<p>On the backend machine run the following command as <tt class="docutils literal">root</tt>:</p>
<pre class="literal-block">
su postgres -c 'pg_dump ecodp > /tmp/ecodp.dump'
</pre>
<p>This will dump the ecodp database /tmp directory. It is recommended to use
the /tmp directory as the postgres user has very little rights and has not
got access to most directories.</p>
<p>As you are acting as postgres user you do not need to enter a password.</p>
<p>The restore the database run.:</p>
<pre class="literal-block">
su postgres -c 'psql -d ecodp -f /tmp/ecodp.dump'
</pre>
<p>This will restore the dump file to the ecodp database. This database
needs to be empty and must exist. This will be the case if you have just
run the backend services script.</p>
<p><em>If</em> a mistake is made and you want to refresh the data on an already
populated database then this command can be run from the <em>frontend</em> server.:</p>
<pre class="literal-block">
# Run the paster command, referencing the .ini file
paster db clean -c /applications/ecodp/users/ecodp/ckan/etc/%{CKAN_INSTANCE}/%{CKAN_INSTANCE}.ini
</pre>
<p>Once run the command the restore command can be run again.</p>
<div class="section" id="ckan-url-tests">
<h2>CKAN URL TESTS</h2>
<p>The following in ckan urls should be tested to see if they are
working. These should be off /data</p>
<p>/
/dataset
/dataset/new
/organization
organization/new
organization/estat
/user/register
/user</p>
<p>A test dataset should be made in /dataset/new with name say "test1".
Once that is made the following should be checked.</p>
<p>/dataset?q=test1 (search returns the dataset)</p>
<p>/dataset/test1
/dataset/editresources/test1 (a resource should be made)
/dataset/edit/test1 (edits should be made)
/dataset/history/test1 (see if edits in history)
/dataset/test1.rdf
/dataset/edit/test1 (dataset should be deleted in bottom tab)</p>
<p>/dataset?q=test1 (search no longer returns dataset)</p>
</div>
</div>
</div>
</body>
</html>