Merge remote-tracking branch 'skl85/hotfix-extautodetect'
[phorkie.git] / README.rst
1 ************************************
2 phorkie - PHP and Git based pastebin
3 ************************************
4 Self-hosted pastebin software written in PHP.
5 Pastes are editable, may have multiple files and are stored in git repositories.
6
7 Project page: http://sourceforge.net/p/phorkie/
8
9 .. contents:: Table of Contents
10
11 ========
12 Features
13 ========
14 - every paste is a git repository
15
16   - repositories can be cloned
17   - clone url can be displayed
18 - paste editing
19
20   - add new files
21   - delete existing files
22   - replace file with upload
23 - multiple files in one paste
24 - syntax highlighting with GeSHi
25 - rST rendering
26 - image upload + display
27 - external tool support
28
29   - xmllint
30   - php syntax check
31 - history in the sidebar
32
33   - old files can be downloaded easily
34 - search across pastes: description, file names and file content
35
36   - options: quoting, logical and, or, not, partial words
37
38
39 ============
40 Installation
41 ============
42 1. Unzip the phorkie release file::
43
44    $ tar xjvf phorkie-0.2.0.tar.bz2
45
46 2. Create the git directories::
47
48    $ mkdir -p repos/git repos/work
49    $ chmod og+w repos/git repos/work
50
51 3. Install dependencies_
52
53 4. Copy ``data/config.php.dist`` to ``data/config.php`` and adjust it
54    to your needs::
55
56    $ cp data/config.php.dist data/config.php
57    $ $EDITOR data/config.php
58
59    Look at ``config.default.php`` for values that you may adjust.
60
61 5. Set your web server's document root to ``/path/to/phorkie-0.2.0/www/``
62
63 6. Open phorkie in your web browser
64
65
66 Dependencies
67 ============
68 phorkie stands on the shoulders of giants.
69
70 ::
71
72   $ pear install versioncontrol_git-alpha
73   $ pear install services_libravatar-alpha
74   $ pear install http_request2
75   $ pear install pager
76   $ pear install date_humandiff-alpha
77
78   $ pear channel-discover pear.twig-project.org
79   $ pear install twig/Twig
80
81   $ pear channel-discover mediawiki.googlecode.com/svn
82   $ pear install mediawiki/geshi
83
84   $ pear channel-discover zustellzentrum.cweiske.de
85   $ pear install zz/mime_type_plaindetect-alpha
86
87 Note that this version of GeSHi is a bit outdated, but it's the fastest
88 way to install it.
89
90
91 ======
92 Search
93 ======
94
95 phorkie makes use of an Elasticsearch__ installation if you have one.
96
97 It is used to provide search capabilities and the list of recent pastes.
98
99 __ http://www.elasticsearch.org/
100
101 Setup
102 =====
103 Edit ``config.php``, setting the ``elasticsearch`` property to the HTTP URL
104 of the index, e.g. ::
105
106   http://localhost:9200/phorkie/
107
108 Run the index script to import all existing pastes into the index::
109
110   php scripts/index.php
111
112 That's all. Open phorkie in your browser, and you'll notice the search box
113 in the top menu.
114
115
116 Reset
117 =====
118 In case something really went wrong and you need to reset the search
119 index, run the following command::
120
121   $ curl -XDELETE http://localhost:9200/phorkie/
122   {"ok":true,"acknowledged"}
123
124 Phorkie will automatically re-index everything when ``setupcheck`` is enabled
125 in the configuration file.
126
127
128 =====
129 HowTo
130 =====
131
132 Make git repositories clonable
133 ==============================
134 To make git repositories clonable, you need to install ``git-daemon``
135 (``git-daemon-run`` package on Debian/Ubuntu).
136
137 Now make the repositories available by symlinking the paste repository
138 directory (``$GLOBALS['phorkie']['cfg']['repos']`` setting) into
139 ``/var/cache/git``, e.g.::
140
141   $ ln -s /home/user/www/paste/repos/git /var/cache/git/paste
142
143 Edit your ``config.php`` and set the ``$GLOBALS['phorkie']['cfg']['git']['public']``
144 setting to ``git://$yourhostname/git/paste/``.
145 The rest will be appended automatically.
146
147
148 You're on your own to setup writable repositories.
149
150
151 =================
152 Technical details
153 =================
154
155 TODO
156 ====
157 - OpenID-Login to get username+email as authorship information
158 - filters (``xmllint --format``, ``rapper``)
159 - document how to keep disk usage low (block size)
160 - comments
161 - when 2 people edit, merge changes
162 - diff changes
163 - configurable highlights
164 - Atom feed for new pastes
165 - Atom feed for paste changes
166
167
168 URLs
169 ====
170
171 ``/``
172   Index page. Shows form for new paste
173 ``/[0-9]+``
174   Display page for paste
175 ``/[0-9]/edit``
176   Edit the paste
177 ``/[0-9]+/raw/(.+)``
178   Display raw file contents
179 ``/[0-9]/tool/[a-zA-Z]+/(.+)``
180   Run a tool on the given file
181 ``/[0-9]/rev/[a-z0-9]+``
182   Show specific revision of the paste
183 ``/[0-9]/delete``
184   Delete the paste
185 ``/[0-9]/fork``
186   Create a fork of the paste
187 ``/search?q=..(&page=[0-9]+)?``
188   Search for term, with optional page
189 ``/list(/[0-9])?``
190   List all pastes, with optional page
191
192
193 Internal directory layout
194 =========================
195 ::
196
197   repos/
198     work/
199       1/ - work directory for paste #1
200       2/ - work directory for paste #2
201     git/
202       1.git/ - git repository for paste #1
203         description - Description for the repository
204       2.git/ - git repository for paste #2
205
206 nginx rewrites
207 ==============
208 If you use nginx, place the following lines into your ``server`` block:
209
210 ::
211
212   if (!-e $request_uri) {
213     rewrite ^/([0-9]+)$ /display.php?id=$1;
214     rewrite ^/([0-9]+)/delete$ /delete.php?id=$1;
215     rewrite ^/([0-9]+)/delete/confirm$ /delete.php?id=$1&confirm=1;
216     rewrite ^/([0-9]+)/edit$ /edit.php?id=$1;
217     rewrite ^/([0-9]+)/fork$ /fork.php?id=$1;
218     rewrite ^/([0-9]+)/raw/(.+)$ /raw.php?id=$1&file=$2;
219     rewrite ^/([0-9]+)/rev/(.+)$ /revision.php?id=$1&rev=$2;
220     rewrite ^/([0-9]+)/rev-raw/(.+)$ /raw.php?id=$1&rev=$2&file=$3;
221     rewrite ^/([0-9]+)/tool/([^/]+)/(.+)$ /tool.php?id=$1&tool=$2&file=$3;
222
223     rewrite ^/list$ /list.php;
224     rewrite ^/list/([0-9]+)$ /list.php?page=$1;
225
226     rewrite ^/search$ /search.php;
227     rewrite ^/search/([0-9]+)$ /search.php?page=$1;
228   }