浏览代码

lychee app

Bob Mottram 8 年前
父节点
当前提交
ab0ef66923
共有 1 个文件被更改,包括 488 次插入0 次删除
  1. 488
    0
      src/freedombone-app-lychee

+ 488
- 0
src/freedombone-app-lychee 查看文件

1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Lychee photo album
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@freedombone.net>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+VARIANTS="full full-vim writer"
32
+
33
+IN_DEFAULT_INSTALL=0
34
+SHOW_ON_ABOUT=1
35
+
36
+LYCHEE_DOMAIN_NAME=
37
+LYCHEE_CODE=
38
+LYCHEE_ONION_PORT=8105
39
+LYCHEE_REPO="https://github.com/electerious/Lychee"
40
+LYCHEE_COMMIT='3eaaed72715b30bf10ce66a5f75268467bcb728d'
41
+
42
+lychee_variables=(LYCHEE_REPO
43
+                  LYCHEE_COMMIT
44
+                  LYCHEE_DOMAIN_NAME
45
+                  LYCHEE_CODE
46
+                  ONION_ONLY
47
+                  DDNS_PROVIDER
48
+                  MY_USERNAME)
49
+
50
+
51
+function remove_user_lychee {
52
+    remove_username="$1"
53
+
54
+}
55
+
56
+function add_user_lychee {
57
+    if [[ $(app_is_installed lychee) == "0" ]]; then
58
+        echo '0'
59
+        return
60
+    fi
61
+
62
+    new_username="$1"
63
+    new_user_password="$2"
64
+
65
+    echo '0'
66
+}
67
+
68
+function install_interactive_lychee {
69
+    if [ ! $ONION_ONLY ]; then
70
+        ONION_ONLY='no'
71
+    fi
72
+
73
+    if [[ $ONION_ONLY != "no" ]]; then
74
+        LYCHEE_DOMAIN_NAME='lychee.local'
75
+        write_config_param "LYCHEE_DOMAIN_NAME" "$LYCHEE_DOMAIN_NAME"
76
+    else
77
+        function_check interactive_site_details
78
+        interactive_site_details "lychee" "LYCHEE_DOMAIN_NAME" "LYCHEE_CODE"
79
+    fi
80
+    APP_INSTALLED=1
81
+}
82
+
83
+function change_password_lychee {
84
+    set_completion_param "lychee domain" "$LYCHEE_DOMAIN_NAME"
85
+    LYCHEE_DOMAIN_NAME=$(get_completion_param "lychee domain")
86
+
87
+    LYCHEE_USERNAME="$1"
88
+    LYCHEE_PASSWORD="$2"
89
+    if [ ${#LYCHEE_PASSWORD} -lt 8 ]; then
90
+        echo $'Lychee password is too short'
91
+        return
92
+    fi
93
+}
94
+
95
+function reconfigure_lychee {
96
+    echo -n ''
97
+}
98
+
99
+function upgrade_lychee {
100
+    read_config_param "LYCHEE_DOMAIN_NAME"
101
+
102
+    function_check set_repo_commit
103
+    set_repo_commit /var/www/$LYCHEE_DOMAIN_NAME/htdocs "lychee commit" "$LYCHEE_COMMIT" $LYCHEE_REPO
104
+}
105
+
106
+function backup_local_lychee {
107
+    LYCHEE_DOMAIN_NAME='lychee.local'
108
+    if grep -q "lychee domain" $COMPLETION_FILE; then
109
+        LYCHEE_DOMAIN_NAME=$(get_completion_param "lychee domain")
110
+    fi
111
+
112
+    source_directory=/var/www/${LYCHEE_DOMAIN_NAME}/htdocs
113
+    if [ -d $source_directory ]; then
114
+        dest_directory=lychee
115
+        function_check suspend_site
116
+        suspend_site ${LYCHEE_DOMAIN_NAME}
117
+
118
+        function_check backup_directory_to_usb
119
+        backup_directory_to_usb $source_directory $dest_directory
120
+
121
+        function_check restart_site
122
+        restart_site
123
+    fi
124
+}
125
+
126
+function restore_local_lychee {
127
+    LYCHEE_DOMAIN_NAME='lychee.local'
128
+    if grep -q "lychee domain" $COMPLETION_FILE; then
129
+        LYCHEE_DOMAIN_NAME=$(get_completion_param "lychee domain")
130
+    fi
131
+    if [ $LYCHEE_DOMAIN_NAME ]; then
132
+        temp_restore_dir=/root/templychee
133
+        if [ -d $USB_MOUNT/backup/lychee ]; then
134
+            restore_directory_from_usb $temp_restore_dir lychee
135
+        else
136
+            restore_directory_from_usb $temp_restore_dir blog
137
+        fi
138
+        if [ -d /var/www/${LYCHEE_DOMAIN_NAME}/htdocs ]; then
139
+            if [ -d /var/www/${LYCHEE_DOMAIN_NAME}/previous ]; then
140
+                rm -rf /var/www/${LYCHEE_DOMAIN_NAME}/previous
141
+            fi
142
+            mv /var/www/${LYCHEE_DOMAIN_NAME}/htdocs /var/www/${LYCHEE_DOMAIN_NAME}/previous
143
+        fi
144
+        temp_source_dir=$(find ${temp_restore_dir} -name htdocs)
145
+        cp -r ${temp_source_dir} /var/www/${LYCHEE_DOMAIN_NAME}/
146
+        if [ ! "$?" = "0" ]; then
147
+            if [ -d /var/www/${LYCHEE_DOMAIN_NAME}/previous ]; then
148
+                mv /var/www/${LYCHEE_DOMAIN_NAME}/previous /var/www/${LYCHEE_DOMAIN_NAME}/htdocs
149
+            fi
150
+            set_user_permissions
151
+            backup_unmount_drive
152
+            exit 54675
153
+        fi
154
+        rm -rf ${temp_restore_dir}
155
+        chown -R www-data:www-data /var/www/${LYCHEE_DOMAIN_NAME}/htdocs
156
+        # Ensure that the bundled SSL cert is being used
157
+        if [ -f /etc/ssl/certs/${LYCHEE_DOMAIN_NAME}.bundle.crt ]; then
158
+            sed -i "s|${LYCHEE_DOMAIN_NAME}.crt|${LYCHEE_DOMAIN_NAME}.bundle.crt|g" /etc/nginx/sites-available/${LYCHEE_DOMAIN_NAME}
159
+        fi
160
+        if [ -d /etc/letsencrypt/live/${LYCHEE_DOMAIN_NAME} ]; then
161
+            ln -s /etc/letsencrypt/live/${LYCHEE_DOMAIN_NAME}/privkey.pem /etc/ssl/private/${LYCHEE_DOMAIN_NAME}.key
162
+            ln -s /etc/letsencrypt/live/${LYCHEE_DOMAIN_NAME}/fullchain.pem /etc/ssl/certs/${LYCHEE_DOMAIN_NAME}.pem
163
+        fi
164
+    fi
165
+}
166
+
167
+function backup_remote_lychee {
168
+    if grep -q "lychee domain" $COMPLETION_FILE; then
169
+        LYCHEE_DOMAIN_NAME=$(get_completion_param "lychee domain")
170
+        temp_backup_dir=/var/www/${LYCHEE_DOMAIN_NAME}/htdocs
171
+        if [ -d $temp_backup_dir ]; then
172
+            echo $"Backing up lychee"
173
+            backup_directory_to_friend $temp_backup_dir lychee
174
+            echo $"Backup of lychee complete"
175
+        else
176
+            echo $"Lychee domain specified but not found in $temp_backup_dir"
177
+            exit 2578
178
+        fi
179
+    fi
180
+}
181
+
182
+function restore_remote_lychee {
183
+    if [ -d $SERVER_DIRECTORY/backup/lychee ]; then
184
+        LYCHEE_DOMAIN_NAME=$(get_completion_param "lychee domain")
185
+        echo $"Restoring lychee installation $LYCHEE_DOMAIN_NAME"
186
+        temp_restore_dir=/root/templychee
187
+        mkdir $temp_restore_dir
188
+        function_check restore_directory_from_friend
189
+        restore_directory_from_friend $temp_restore_dir lychee
190
+        if [ -d /var/www/${LYCHEE_DOMAIN_NAME}/htdocs ]; then
191
+            if [ -d /var/www/${LYCHEE_DOMAIN_NAME}/previous ]; then
192
+                rm -rf /var/www/${LYCHEE_DOMAIN_NAME}/previous
193
+            fi
194
+            mv /var/www/${LYCHEE_DOMAIN_NAME}/htdocs /var/www/${LYCHEE_DOMAIN_NAME}/previous
195
+        fi
196
+        temp_source_dir=$(find ${temp_restore_dir} -name htdocs)
197
+        cp -r ${temp_source_dir} /var/www/${LYCHEE_DOMAIN_NAME}/
198
+        if [ ! "$?" = "0" ]; then
199
+            if [ -d /var/www/${LYCHEE_DOMAIN_NAME}/previous ]; then
200
+                mv /var/www/${LYCHEE_DOMAIN_NAME}/previous /var/www/${LYCHEE_DOMAIN_NAME}/htdocs
201
+            fi
202
+            exit 593
203
+        fi
204
+        rm -rf ${temp_restore_dir}
205
+        # Ensure that the bundled SSL cert is being used
206
+        if [ -f /etc/ssl/certs/${LYCHEE_DOMAIN_NAME}.bundle.crt ]; then
207
+            sed -i "s|${LYCHEE_DOMAIN_NAME}.crt|${LYCHEE_DOMAIN_NAME}.bundle.crt|g" /etc/nginx/sites-available/${LYCHEE_DOMAIN_NAME}
208
+        fi
209
+        if [ -d /etc/letsencrypt/live/${LYCHEE_DOMAIN_NAME} ]; then
210
+            ln -s /etc/letsencrypt/live/${LYCHEE_DOMAIN_NAME}/privkey.pem /etc/ssl/private/${LYCHEE_DOMAIN_NAME}.key
211
+            ln -s /etc/letsencrypt/live/${LYCHEE_DOMAIN_NAME}/fullchain.pem /etc/ssl/certs/${LYCHEE_DOMAIN_NAME}.pem
212
+        fi
213
+        echo $"Restore of lychee complete"
214
+    fi
215
+}
216
+
217
+function remove_lychee {
218
+    if [ ${#LYCHEE_DOMAIN_NAME} -eq 0 ]; then
219
+        return
220
+    fi
221
+
222
+    read_config_param "LYCHEE_DOMAIN_NAME"
223
+    nginx_dissite $LYCHEE_DOMAIN_NAME
224
+    remove_certs ${LYCHEE_DOMAIN_NAME}
225
+    if [ -f /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME ]; then
226
+        rm -f /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
227
+    fi
228
+    if [ -d /var/www/$LYCHEE_DOMAIN_NAME ]; then
229
+        rm -rf /var/www/$LYCHEE_DOMAIN_NAME
230
+    fi
231
+    remove_config_param LYCHEE_DOMAIN_NAME
232
+    remove_config_param LYCHEE_CODE
233
+    function_check remove_onion_service
234
+    remove_onion_service lychee ${LYCHEE_ONION_PORT}
235
+    remove_completion_param "install_lychee"
236
+    sed -i '/Lychee/d' $COMPLETION_FILE
237
+    sed -i '/lychee/d' $COMPLETION_FILE
238
+    sed -i '/lychee/d' /home/$MY_USERNAME/README
239
+    sed -i '/Lychee/d' /home/$MY_USERNAME/README
240
+
241
+    function_check remove_ddns_domain
242
+    remove_ddns_domain $LYCHEE_DOMAIN_NAME
243
+}
244
+
245
+function get_lychee_admin_password {
246
+    if [ -f /home/$MY_USERNAME/README ]; then
247
+        if grep -q "Your lychee password is" /home/$MY_USERNAME/README; then
248
+            LYCHEE_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "Your lychee password is" | awk -F ':' '{print $2}' | sed 's/^ *//')
249
+        fi
250
+    fi
251
+}
252
+
253
+function install_lychee_website {
254
+    function_check nginx_http_redirect
255
+    nginx_http_redirect $LYCHEE_DOMAIN_NAME
256
+    echo 'server {' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
257
+    echo '    listen 443 ssl;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
258
+    echo "    root /var/www/$LYCHEE_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
259
+    echo "    server_name $LYCHEE_DOMAIN_NAME;" >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
260
+    echo '    access_log off;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
261
+    echo "    error_log /var/log/nginx/${LYCHEE_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
262
+    echo '    index index.php;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
263
+    echo '    charset utf-8;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
264
+    echo '    proxy_read_timeout 86400s;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
265
+    function_check nginx_ssl
266
+    nginx_ssl $LYCHEE_DOMAIN_NAME
267
+    function_check nginx_disable_sniffing
268
+    nginx_disable_sniffing $LYCHEE_DOMAIN_NAME
269
+    echo '    add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
270
+    echo '' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
271
+    echo '    # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
272
+    echo '    location / {' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
273
+    function_check nginx_limits
274
+    nginx_limits $LYCHEE_DOMAIN_NAME
275
+    echo '        rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
276
+    echo '    }' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
277
+    echo '' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
278
+    echo "    # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
279
+    echo '    # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
280
+    echo '    location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
281
+    echo '        allow all;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
282
+    echo '    }' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
283
+    echo '' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
284
+    echo '    # statically serve these file types when possible' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
285
+    echo '    # otherwise fall back to front controller' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
286
+    echo '    # allow browser to cache them' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
287
+    echo '    # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
288
+    echo '    location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
289
+    echo '        expires 30d;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
290
+    echo '        try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
291
+    echo '    }' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
292
+    echo '' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
293
+    echo '    # block these file types' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
294
+    echo '    location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
295
+    echo '        deny all;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
296
+    echo '    }' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
297
+    echo '' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
298
+    echo '    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
299
+    echo '    # or a unix socket' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
300
+    echo '    location ~* \.php$ {' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
301
+    echo '        # Zero-day exploit defense.' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
302
+    echo '        # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
303
+    echo "        # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
304
+    echo "        # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
305
+    echo "        # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
306
+    echo "        # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
307
+    echo '        try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
308
+    echo '        # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
309
+    echo '        fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
310
+    echo '        # With php5-cgi alone:' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
311
+    echo '        # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
312
+    echo '        # With php5-fpm:' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
313
+    echo '        fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
314
+    echo '        include fastcgi_params;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
315
+    echo '        fastcgi_index index.php;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
316
+    echo '        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
317
+    echo '    }' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
318
+    echo '' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
319
+    echo '    # deny access to all dot files' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
320
+    echo '    location ~ /\. {' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
321
+    echo '        deny all;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
322
+    echo '    }' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
323
+    echo '' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
324
+    echo '    #deny access to store' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
325
+    echo '    location ~ /store {' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
326
+    echo '        deny all;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
327
+    echo '    }' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
328
+    echo '    location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
329
+    echo '      deny all;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
330
+    echo '    }' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
331
+    echo '    location ~ /\.ht {' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
332
+    echo '      deny  all;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
333
+    echo '    }' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
334
+    echo '}' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
335
+    echo '' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
336
+}
337
+
338
+function install_lychee_website_onion {
339
+    echo 'server {' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
340
+    echo "    listen 127.0.0.1:${LYCHEE_ONION_PORT} default_server;" >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
341
+    echo "    root /var/www/$LYCHEE_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
342
+    echo "    server_name $LYCHEE_DOMAIN_NAME;" >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
343
+    echo '    access_log off;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
344
+    echo "    error_log /var/log/nginx/${LYCHEE_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
345
+    echo '    index index.php;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
346
+    echo '    charset utf-8;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
347
+    echo '    proxy_read_timeout 86400s;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
348
+    function_check nginx_disable_sniffing
349
+    nginx_disable_sniffing $LYCHEE_DOMAIN_NAME
350
+    echo '    add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
351
+    echo '' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
352
+    echo '    # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
353
+    echo '    location / {' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
354
+    function_check nginx_limits
355
+    nginx_limits $LYCHEE_DOMAIN_NAME
356
+    echo '        rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
357
+    echo '    }' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
358
+    echo '' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
359
+    echo "    # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
360
+    echo '    # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
361
+    echo '    location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
362
+    echo '        allow all;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
363
+    echo '    }' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
364
+    echo '' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
365
+    echo '    # statically serve these file types when possible' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
366
+    echo '    # otherwise fall back to front controller' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
367
+    echo '    # allow browser to cache them' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
368
+    echo '    # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
369
+    echo '    location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
370
+    echo '        expires 30d;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
371
+    echo '        try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
372
+    echo '    }' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
373
+    echo '' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
374
+    echo '    # block these file types' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
375
+    echo '    location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
376
+    echo '        deny all;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
377
+    echo '    }' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
378
+    echo '' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
379
+    echo '    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
380
+    echo '    # or a unix socket' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
381
+    echo '    location ~* \.php$ {' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
382
+    function_check nginx_limits
383
+    nginx_limits $LYCHEE_DOMAIN_NAME
384
+    echo '        # Zero-day exploit defense.' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
385
+    echo '        # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
386
+    echo "        # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
387
+    echo "        # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
388
+    echo "        # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
389
+    echo "        # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
390
+    echo '        try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
391
+    echo '        # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
392
+    echo '        fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
393
+    echo '        # With php5-cgi alone:' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
394
+    echo '        # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
395
+    echo '        # With php5-fpm:' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
396
+    echo '        fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
397
+    echo '        include fastcgi_params;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
398
+    echo '        fastcgi_index index.php;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
399
+    echo '        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
400
+    echo '    }' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
401
+    echo '' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
402
+    echo '    # deny access to all dot files' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
403
+    echo '    location ~ /\. {' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
404
+    echo '        deny all;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
405
+    echo '    }' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
406
+    echo '' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
407
+    echo '    #deny access to store' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
408
+    echo '    location ~ /store {' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
409
+    echo '        deny all;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
410
+    echo '    }' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
411
+    echo '    location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
412
+    echo '      deny all;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
413
+    echo '    }' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
414
+    echo '    location ~ /\.ht {' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
415
+    echo '      deny  all;' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
416
+    echo '    }' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
417
+    echo '}' >> /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
418
+}
419
+
420
+function install_lychee_from_repo {
421
+    if [ ! -d /var/www/$LYCHEE_DOMAIN_NAME ]; then
422
+        mkdir /var/www/$LYCHEE_DOMAIN_NAME
423
+    fi
424
+
425
+    cd /var/www/$LYCHEE_DOMAIN_NAME
426
+    git_clone $LYCHEE_REPO htdocs
427
+    cd htdocs
428
+    git checkout $LYCHEE_COMMIT -b $LYCHEE_COMMIT
429
+    set_completion_param "lychee commit" "$LYCHEE_COMMIT"
430
+}
431
+
432
+function install_lychee {
433
+    if [ ! $ONION_ONLY ]; then
434
+        ONION_ONLY='no'
435
+    fi
436
+
437
+    if [ ! $LYCHEE_DOMAIN_NAME ]; then
438
+        echo $'The lychee domain name was not specified'
439
+        exit 543672
440
+    fi
441
+
442
+    # for the avatar changing command
443
+    apt-get -yq install imagemagick exif zip
444
+
445
+    function_check install_lychee_from_repo
446
+    install_lychee_from_repo
447
+
448
+    if [[ $ONION_ONLY == "no" ]]; then
449
+        function_check install_lychee_website
450
+        install_lychee_website
451
+    else
452
+        echo -n '' > /etc/nginx/sites-available/$LYCHEE_DOMAIN_NAME
453
+    fi
454
+    function_check install_lychee_website_onion
455
+    install_lychee_website_onion
456
+
457
+    function_check create_site_certificate
458
+    create_site_certificate $LYCHEE_DOMAIN_NAME 'yes'
459
+
460
+    function_check configure_php
461
+    configure_php
462
+
463
+    chown -R www-data:www-data /var/www/$LYCHEE_DOMAIN_NAME/htdocs
464
+
465
+    LYCHEE_ONION_HOSTNAME=$(add_onion_service lychee 80 ${LYCHEE_ONION_PORT})
466
+
467
+    function_check nginx_ensite
468
+    nginx_ensite $LYCHEE_DOMAIN_NAME
469
+
470
+    systemctl restart php5-fpm
471
+    systemctl restart nginx
472
+
473
+    if ! grep -q "Lychee onion domain" /home/$MY_USERNAME/README; then
474
+        echo $"Lychee onion domain: ${LYCHEE_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
475
+        echo $"Log into your lychee at https://${LYCHEE_ONION_HOSTNAME}/login" >> /home/$MY_USERNAME/README
476
+        echo '' >> /home/$MY_USERNAME/README
477
+        chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
478
+        chmod 600 /home/$MY_USERNAME/README
479
+    fi
480
+
481
+    function_check add_ddns_domain
482
+    add_ddns_domain $LYCHEE_DOMAIN_NAME
483
+
484
+    set_completion_param "lychee domain" "$LYCHEE_DOMAIN_NAME"
485
+    APP_INSTALLED=1
486
+}
487
+
488
+# NOTE: deliberately no exit 0