浏览代码

Merge branch 'stretch' of https://github.com/bashrc/freedombone

Bob Mottram 7 年前
父节点
当前提交
4a852d5bab

+ 31
- 0
doc/EN/app_edith.org 查看文件

1
+#+TITLE:
2
+#+AUTHOR: Bob Mottram
3
+#+EMAIL: bob@freedombone.net
4
+#+KEYWORDS: freedombone, edith, notes
5
+#+DESCRIPTION: How to use Edith notes
6
+#+OPTIONS: ^:nil toc:nil
7
+#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="freedombone.css" />
8
+
9
+#+BEGIN_CENTER
10
+[[file:images/logo.png]]
11
+#+END_CENTER
12
+
13
+#+BEGIN_EXPORT html
14
+<center>
15
+<h1>Edith Notes</h1>
16
+</center>
17
+#+END_EXPORT
18
+
19
+Edith notes is the simplest and quickest kind of notes system. It has no complicated user interface. Just enter your domain and a title and a note will be created. Everything typed is saved automatically.
20
+
21
+The speed and minimalism of this type of notes system may make it suitable for things like shopping lists or distraction free writing.
22
+
23
+ssh into the system with:
24
+
25
+#+BEGIN_SRC bash
26
+ssh myusername@mydomain.com -p 2222
27
+#+END_SRC
28
+
29
+Select *Administrator controls* then *App Settings* then *edith*. Enter a subdomain name, such as /notes.mydomain.com/, and optionally a freedns code. When the installation is complete you can then look up the password for the site within the *Passwords* section of the *Administrator control panel*, then  navigate to the subdomain. Log in, then enter something like /notes.mydomain.com/testnote/ and start typing.
30
+
31
+It is possible to turn off the login via *App Settings/edith* if you wish, but this will enable anyone on the internet to view or edit notes on your system, which could have obvious privacy or stability implications. From *App settings/edith* it's also possible to browse through your notes files.

+ 4
- 0
doc/EN/apps.org 查看文件

41
 A databaseless wiki system.
41
 A databaseless wiki system.
42
 
42
 
43
 [[./app_dokuwiki.html][How to use it]]
43
 [[./app_dokuwiki.html][How to use it]]
44
+* Edith
45
+Extremely simple and distraction-free notes system.
46
+
47
+[[./app_edith.html][How to use it]]
44
 * Emacs
48
 * Emacs
45
 If you use the Mutt client to read your email then this will set it up to use emacs for composing new mail.
49
 If you use the Mutt client to read your email then this will set it up to use emacs for composing new mail.
46
 
50
 

+ 441
- 0
src/freedombone-app-edith 查看文件

1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Edith: an ultra simple notes application
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2018 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
+EDITH_REPO="https://github.com/sunny/edith"
37
+EDITH_COMMIT='59f571e24be9e75d127a0f130591acf8d7a86ce3'
38
+EDITH_DOMAIN_NAME=
39
+EDITH_CODE=
40
+EDITH_ONION_PORT=8278
41
+EDITH_LOGIN_TEXT=$"Edith login"
42
+
43
+edith_variables=(MY_USERNAME
44
+                 MY_EMAIL_ADDRESS
45
+                 ONION_ONLY
46
+                 EDITH_DOMAIN_NAME
47
+                 EDITH_CODE
48
+                 DEFAULT_LANGUAGE)
49
+
50
+function change_password_edith {
51
+    curr_username="$1"
52
+    new_user_password="$2"
53
+
54
+    sed -i "/${curr_username}:/d" /etc/nginx/.edithpasswd
55
+    echo -n "$new_user_password" | htpasswd -i -s -c /etc/nginx/.edithpasswd ${curr_username}
56
+
57
+    ${PROJECT_NAME}-pass -u $MY_USERNAME -a ${curr_username} -p "$new_user_password"
58
+}
59
+
60
+function logging_on_edith {
61
+    echo -n ''
62
+}
63
+
64
+function logging_off_edith {
65
+    echo -n ''
66
+}
67
+
68
+function reconfigure_edith {
69
+    echo -n ''
70
+}
71
+
72
+function edith_enable_login {
73
+    read_config_param EDITH_DOMAIN_NAME
74
+
75
+    dialog --title $"Enable Edith login" \
76
+           --backtitle $"Freedombone Control Panel" \
77
+           --defaultno \
78
+           --yesno $"\nDo you want to add a login so that random web users can't access your notes?" 10 60
79
+    sel=$?
80
+    case $sel in
81
+        0) if grep -q '#auth_basic' /etc/nginx/sites-available/$EDITH_DOMAIN_NAME; then
82
+               sed -i 's|#auth_basic|auth_basic|g' /etc/nginx/sites-available/$EDITH_DOMAIN_NAME
83
+               systemctl restart nginx
84
+           fi
85
+           read_config_param $MY_USERNAME
86
+           EDITH_PASSWORD=$(${PROJECT_NAME}-pass -u $MY_USERNAME -a edith)
87
+           dialog --title $"Enable Edith login" \
88
+                  --msgbox $"Edith logins are now enabled with the password $EDITH_PASSWORD" 6 65
89
+           EDITH__PASSWORD=
90
+           ;;
91
+        1) if ! grep -q '#auth_basic' /etc/nginx/sites-available/$EDITH_DOMAIN_NAME; then
92
+               sed -i 's|auth_basic|#auth_basic|g' /etc/nginx/sites-available/$EDITH_DOMAIN_NAME
93
+               systemctl restart nginx
94
+           fi
95
+           dialog --title $"Disable Edith login" \
96
+                  --msgbox $"Edith logins are now disabled. Anyone can access your stream." 6 65
97
+           ;;
98
+    esac
99
+}
100
+
101
+function edith_browse {
102
+    read_config_param EDITH_DOMAIN_NAME
103
+    cd /var/www/$EDITH_DOMAIN_NAME/htdocs/data
104
+    editor /var/www/$EDITH_DOMAIN_NAME/htdocs/data
105
+}
106
+
107
+function configure_interactive_edith {
108
+    while true
109
+    do
110
+        data=$(tempfile 2>/dev/null)
111
+        trap "rm -f $data" 0 1 2 5 15
112
+        dialog --backtitle $"Freedombone Control Panel" \
113
+               --title $"Edith" \
114
+               --radiolist $"Choose an operation:" 10 50 3 \
115
+               1 $"Enable login" off \
116
+               2 $"Browse notes" off \
117
+               3 $"Exit" on 2> $data
118
+        sel=$?
119
+        case $sel in
120
+            1) break;;
121
+            255) break;;
122
+        esac
123
+        case $(cat $data) in
124
+            1) edith_enable_login;;
125
+            2) edith_browse;;
126
+            3) break;;
127
+        esac
128
+    done
129
+}
130
+
131
+function upgrade_edith {
132
+    CURR_EDITH_COMMIT=$(get_completion_param "edith commit")
133
+    if [[ "$CURR_EDITH_COMMIT" == "$EDITH_COMMIT" ]]; then
134
+        return
135
+    fi
136
+
137
+    read_config_param EDITH_DOMAIN_NAME
138
+
139
+    # update to the next commit
140
+    function_check set_repo_commit
141
+    set_repo_commit /var/www/$EDITH_DOMAIN_NAME/htdocs "edith commit" "$EDITH_COMMIT" $EDITH_REPO
142
+
143
+    chown -R www-data:www-data /var/www/$EDITH_DOMAIN_NAME/htdocs
144
+    chmod a+w /var/www/$EDITH_DOMAIN_NAME/htdocs/data
145
+}
146
+
147
+function backup_local_edith {
148
+    read_config_param EDITH_DOMAIN_NAME
149
+
150
+    function_check suspend_site
151
+    suspend_site ${EDITH_DOMAIN_NAME}
152
+
153
+    source_directory=/var/www/${EDITH_DOMAIN_NAME}/htdocs/data
154
+
155
+    function_check backup_directory_to_usb
156
+    dest_directory=edith
157
+    backup_directory_to_usb $source_directory $dest_directory
158
+
159
+    function_check restart_site
160
+    restart_site
161
+}
162
+
163
+function restore_local_edith {
164
+    read_config_param EDITH_DOMAIN_NAME
165
+
166
+    temp_restore_dir=/root/tempedith
167
+    edith_dir=/var/www/${EDITH_DOMAIN_NAME}/htdocs/data
168
+
169
+    function_check restore_directory_from_usb
170
+    restore_directory_from_usb $temp_restore_dir edith
171
+    if [ -d $temp_restore_dir ]; then
172
+        if [ -d cp $temp_restore_dir$edith_dir ]; then
173
+            cp -rp $temp_restore_dir$edith_dir $edith_dir/
174
+        else
175
+            if [ ! -d $edith_dir ]; then
176
+                mkdir $edith_dir
177
+                chmod a+w $edith_dir
178
+            fi
179
+            cp -rp $temp_restore_dir/* $edith_dir
180
+        fi
181
+        chown -R www-data:www-data $edith_dir
182
+        rm -rf $temp_restore_dir
183
+    fi
184
+}
185
+
186
+function backup_remote_edith {
187
+    read_config_param EDITH_DOMAIN_NAME
188
+
189
+    function_check suspend_site
190
+    suspend_site ${EDITH_DOMAIN_NAME}
191
+
192
+    source_directory=/var/www/${EDITH_DOMAIN_NAME}/htdocs/data
193
+
194
+    function_check backup_directory_to_friend
195
+    dest_directory=edith
196
+    backup_directory_to_friend $source_directory $dest_directory
197
+
198
+    function_check restart_site
199
+    restart_site
200
+}
201
+
202
+function restore_remote_edith {
203
+    read_config_param EDITH_DOMAIN_NAME
204
+
205
+    temp_restore_dir=/root/tempedith
206
+    edith_dir=/var/www/${EDITH_DOMAIN_NAME}/htdocs/data
207
+
208
+    function_check restore_directory_from_friend
209
+    restore_directory_from_friend $temp_restore_dir edith
210
+    if [ -d $temp_restore_dir ]; then
211
+        if [ -d cp $temp_restore_dir$edith_dir ]; then
212
+            cp -rp $temp_restore_dir$edith_dir $edith_dir/
213
+        else
214
+            if [ ! -d $edith_dir ]; then
215
+                mkdir $edith_dir
216
+                chmod a+w $edith_dir
217
+            fi
218
+            cp -rp $temp_restore_dir/* $edith_dir
219
+        fi
220
+        chown -R www-data:www-data $edith_dir
221
+        rm -rf $temp_restore_dir
222
+    fi
223
+}
224
+
225
+function remove_edith {
226
+    nginx_dissite $EDITH_DOMAIN_NAME
227
+
228
+    if [ -f /etc/nginx/sites-available/$EDITH_DOMAIN_NAME ]; then
229
+        rm /etc/nginx/sites-available/$EDITH_DOMAIN_NAME
230
+    fi
231
+
232
+    if [ -d /var/www/$EDITH_DOMAIN_NAME ]; then
233
+        rm -rf /var/www/$EDITH_DOMAIN_NAME
234
+    fi
235
+
236
+    function_check remove_onion_service
237
+    remove_onion_service edith ${EDITH_ONION_PORT}
238
+    sed -i '/edith/d' $COMPLETION_FILE
239
+
240
+    if [ -f /etc/nginx/.edithpasswd ]; then
241
+        rm /etc/nginx/.edithpasswd
242
+    fi
243
+
244
+    function_check remove_nodejs
245
+    remove_nodejs edith
246
+
247
+    remove_certs $EDITH_DOMAIN_NAME
248
+    remove_app edith
249
+
250
+    function_check remove_ddns_domain
251
+    remove_ddns_domain $EDITH_DOMAIN_NAME
252
+}
253
+
254
+function install_edith {
255
+    apt-get -yq install php-gettext php-curl php-gd php-mysql git curl
256
+    apt-get -yq install memcached php-memcached php-intl exiftool libfcgi0ldbl
257
+
258
+    function_check install_nodejs
259
+    install_nodejs edith
260
+
261
+    if [ ! ${EDITH_PASSWORD} ]; then
262
+        if [ -f ${IMAGE_PASSWORD_FILE} ]; then
263
+            EDITH_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
264
+        else
265
+            EDITH_PASSWORD="$(create_password ${MINIMUM_PASSWORD_LENGTH})"
266
+        fi
267
+    fi
268
+
269
+
270
+    if [ -d /var/www/$EDITH_DOMAIN_NAME/htdocs ]; then
271
+        rm -rf /var/www/$EDITH_DOMAIN_NAME/htdocs
272
+    fi
273
+
274
+    if [ -d /repos/edith ]; then
275
+        mkdir /var/www/$EDITH_DOMAIN_NAME/htdocs
276
+        cp -r -p /repos/edith/. /var/www/$EDITH_DOMAIN_NAME/htdocs
277
+        cd /var/www/$EDITH_DOMAIN_NAME/htdocs
278
+        git pull
279
+    else
280
+        function_check git_clone
281
+        git_clone $EDITH_REPO /var/www/$EDITH_DOMAIN_NAME/htdocs
282
+    fi
283
+
284
+    if [ ! -d /var/www/$EDITH_DOMAIN_NAME/htdocs ]; then
285
+        echo $'Unable to clone edith repo'
286
+        exit 537593569
287
+    fi
288
+
289
+    cd /var/www/$EDITH_DOMAIN_NAME/htdocs
290
+    git checkout $EDITH_COMMIT -b $EDITH_COMMIT
291
+    set_completion_param "edith commit" "$EDITH_COMMIT"
292
+
293
+    if [ ! -d /var/www/$EDITH_DOMAIN_NAME/htdocs/data ]; then
294
+        mkdir -p /var/www/$EDITH_DOMAIN_NAME/htdocs/data
295
+    fi
296
+
297
+    EDITH_ONION_HOSTNAME=$(add_onion_service edith 80 ${EDITH_ONION_PORT})
298
+
299
+    edith_nginx_site=/etc/nginx/sites-available/$EDITH_DOMAIN_NAME
300
+    if [[ $ONION_ONLY == "no" ]]; then
301
+        function_check nginx_http_redirect
302
+        nginx_http_redirect $EDITH_DOMAIN_NAME "index index.php"
303
+        echo 'server {' >> $edith_nginx_site
304
+        echo '  listen 443 ssl;' >> $edith_nginx_site
305
+        echo '  listen [::]:443 ssl;' >> $edith_nginx_site
306
+        echo "  server_name $EDITH_DOMAIN_NAME;" >> $edith_nginx_site
307
+        echo '' >> $edith_nginx_site
308
+        function_check nginx_compress
309
+        nginx_compress $EDITH_DOMAIN_NAME
310
+        echo '' >> $edith_nginx_site
311
+        echo '  # Security' >> $edith_nginx_site
312
+        function_check nginx_ssl
313
+        nginx_ssl $EDITH_DOMAIN_NAME
314
+
315
+        function_check nginx_disable_sniffing
316
+        nginx_disable_sniffing $EDITH_DOMAIN_NAME
317
+
318
+        echo '  add_header Strict-Transport-Security max-age=15768000;' >> $edith_nginx_site
319
+        echo '' >> $edith_nginx_site
320
+        echo '  access_log /dev/null;' >> $edith_nginx_site
321
+        echo '  error_log /dev/null;' >> $edith_nginx_site
322
+        echo '' >> $edith_nginx_site
323
+        echo "  root /var/www/$EDITH_DOMAIN_NAME/htdocs;" >> $edith_nginx_site
324
+        echo '' >> $edith_nginx_site
325
+        echo '  index index.php;' >> $edith_nginx_site
326
+        echo '' >> $edith_nginx_site
327
+        echo '  # PHP' >> $edith_nginx_site
328
+        echo '  location ~ \.php {' >> $edith_nginx_site
329
+        echo '    include snippets/fastcgi-php.conf;' >> $edith_nginx_site
330
+        echo '    fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;' >> $edith_nginx_site
331
+        echo '    fastcgi_read_timeout 30;' >> $edith_nginx_site
332
+        echo '  }' >> $edith_nginx_site
333
+        echo '' >> $edith_nginx_site
334
+        echo '  # Location' >> $edith_nginx_site
335
+        echo '  location / {' >> $edith_nginx_site
336
+        function_check nginx_limits
337
+        nginx_limits $EDITH_DOMAIN_NAME '15m'
338
+        echo '    try_files $uri $uri/ /index.php?$args;' >> $edith_nginx_site
339
+        echo "    auth_basic \"${EDITH_LOGIN_TEXT}\";" >> $edith_nginx_site
340
+        echo '    auth_basic_user_file /etc/nginx/.edithpasswd;' >> $edith_nginx_site
341
+        echo '  }' >> $edith_nginx_site
342
+        echo '}' >> $edith_nginx_site
343
+    else
344
+        echo -n '' > $edith_nginx_site
345
+    fi
346
+    echo 'server {' >> $edith_nginx_site
347
+    echo "    listen 127.0.0.1:$EDITH_ONION_PORT default_server;" >> $edith_nginx_site
348
+    echo "    server_name $EDITH_ONION_HOSTNAME;" >> $edith_nginx_site
349
+    echo '' >> $edith_nginx_site
350
+    function_check nginx_compress
351
+    nginx_compress $EDITH_DOMAIN_NAME
352
+    echo '' >> $edith_nginx_site
353
+    function_check nginx_disable_sniffing
354
+    nginx_disable_sniffing $EDITH_DOMAIN_NAME
355
+    echo '' >> $edith_nginx_site
356
+    echo '  access_log /dev/null;' >> $edith_nginx_site
357
+    echo '  error_log /dev/null;' >> $edith_nginx_site
358
+    echo '' >> $edith_nginx_site
359
+    echo "  root /var/www/$EDITH_DOMAIN_NAME/htdocs;" >> $edith_nginx_site
360
+    echo '' >> $edith_nginx_site
361
+    echo '  index index.php;' >> $edith_nginx_site
362
+    echo '' >> $edith_nginx_site
363
+    echo '  # PHP' >> $edith_nginx_site
364
+    echo '  location ~ \.php {' >> $edith_nginx_site
365
+    echo '    include snippets/fastcgi-php.conf;' >> $edith_nginx_site
366
+    echo '    fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;' >> $edith_nginx_site
367
+    echo '    fastcgi_read_timeout 30;' >> $edith_nginx_site
368
+    echo '  }' >> $edith_nginx_site
369
+    echo '' >> $edith_nginx_site
370
+    echo '  # Location' >> $edith_nginx_site
371
+    echo '  location / {' >> $edith_nginx_site
372
+    function_check nginx_limits
373
+    nginx_limits $EDITH_DOMAIN_NAME '15m'
374
+    echo '    try_files $uri $uri/ /index.php?$args;' >> $edith_nginx_site
375
+    echo "    auth_basic \"${EDITH_LOGIN_TEXT}\";" >> $edith_nginx_site
376
+    echo '    auth_basic_user_file /etc/nginx/.edithpasswd;' >> $edith_nginx_site
377
+    echo '  }' >> $edith_nginx_site
378
+    echo '}' >> $edith_nginx_site
379
+
380
+    function_check configure_php
381
+    configure_php
382
+
383
+    function_check create_site_certificate
384
+    create_site_certificate $EDITH_DOMAIN_NAME 'yes'
385
+
386
+    # create a password for users
387
+    if [ ! -f /etc/nginx/.edithpasswd ]; then
388
+        touch /etc/nginx/.edithpasswd
389
+    fi
390
+    if grep -q "$MY_USERNAME:" /etc/nginx/.edithpasswd; then
391
+        sed -i "/$MY_USERNAME:/d" /etc/nginx/.edithpasswd
392
+    fi
393
+    echo -n "$EDITH_PASSWORD" | htpasswd -i -s -c /etc/nginx/.edithpasswd $MY_USERNAME
394
+    if [ ! -f /etc/nginx/.edithpasswd ]; then
395
+        echo $'/etc/nginx/.edithpasswd not found'
396
+        exit 6537683563
397
+    fi
398
+
399
+    ${PROJECT_NAME}-pass -u $MY_USERNAME -a edith -p "$EDITH_PASSWORD"
400
+
401
+    cp /var/www/$EDITH_DOMAIN_NAME/htdocs/htaccess.example /var/www/$EDITH_DOMAIN_NAME/htdocs/.htaccess
402
+    cd /var/www/$EDITH_DOMAIN_NAME/htdocs
403
+    npm install -g coffeescript uglify-js
404
+    cake build
405
+    if [ ! "$?" = "0" ]; then
406
+        echo $'Unable to build Edith'
407
+        exit 7396483635
408
+    fi
409
+    cp config.example.php config.php
410
+    if [[ $ONION_ONLY == "no" ]]; then
411
+        sed -i "s|define('EDITH_URI'.*|define('EDITH_URI', 'https://$EDITH_DOMAIN_NAME');|g" config.php
412
+    else
413
+        sed -i "s|define('EDITH_URI'.*|define('EDITH_URI', 'http://$EDITH_ONION_HOSTNAME');|g" config.php
414
+    fi
415
+
416
+    set_completion_param "edith domain" "$EDITH_DOMAIN_NAME"
417
+    set_completion_param "edith onion domain" "$EDITH_ONION_HOSTNAME"
418
+    chown -R www-data:www-data /var/www/$EDITH_DOMAIN_NAME/htdocs
419
+    chmod a+w /var/www/$EDITH_DOMAIN_NAME/htdocs/data
420
+    nginx_ensite $EDITH_DAEMON_NAME
421
+    systemctl restart nginx
422
+
423
+    APP_INSTALLED=1
424
+}
425
+
426
+function install_interactive_edith {
427
+    if [ ! $ONION_ONLY ]; then
428
+        ONION_ONLY='no'
429
+    fi
430
+
431
+    if [[ $ONION_ONLY != "no" ]]; then
432
+        GHOST_DOMAIN_NAME='edith.local'
433
+        write_config_param "EDITH_DOMAIN_NAME" "$EDITH_DOMAIN_NAME"
434
+    else
435
+        function_check interactive_site_details
436
+        interactive_site_details "edith" "EDITH_DOMAIN_NAME" "EDITH_CODE"
437
+    fi
438
+    APP_INSTALLED=1
439
+}
440
+
441
+# NOTE: deliberately no exit 0

+ 1
- 1
src/freedombone-app-emacs 查看文件

188
 
188
 
189
 function install_emacs {
189
 function install_emacs {
190
     apt-get -yq install emacs ispell ibritish ifrench ispanish iitalian irussian iswedish inorwegian iirish ingerman iswiss iogerman idutch idanish ibrazilian ibulgarian ipolish iczech iestonian ilithuanian iukrainian icatalan
190
     apt-get -yq install emacs ispell ibritish ifrench ispanish iitalian irussian iswedish inorwegian iirish ingerman iswiss iogerman idutch idanish ibrazilian ibulgarian ipolish iczech iestonian ilithuanian iukrainian icatalan
191
-    update-alternatives --set editor /usr/bin/emacs
191
+    update-alternatives --set editor /usr/bin/emacs24
192
 
192
 
193
     # A minimal emacs configuration
193
     # A minimal emacs configuration
194
     #echo -n "(add-to-list 'load-path " > /home/$MY_USERNAME/.emacs
194
     #echo -n "(add-to-list 'load-path " > /home/$MY_USERNAME/.emacs

+ 1
- 1
src/freedombone-app-vim 查看文件

232
 
232
 
233
 function install_vim {
233
 function install_vim {
234
     apt-get -yq install vim
234
     apt-get -yq install vim
235
-    update-alternatives --set editor /usr/bin/vim
235
+    update-alternatives --set editor /usr/bin/vim.tiny
236
 
236
 
237
     # add a mutt entry to use Vim to compose emails
237
     # add a mutt entry to use Vim to compose emails
238
     if [ -f /etc/Muttrc ]; then
238
     if [ -f /etc/Muttrc ]; then

+ 1
- 1
src/freedombone-controlpanel 查看文件

289
     trap "rm -f $data" 0 1 2 5 15
289
     trap "rm -f $data" 0 1 2 5 15
290
     dialog --title "$titlestr" \
290
     dialog --title "$titlestr" \
291
            --backtitle $"Freedombone Control Panel" \
291
            --backtitle $"Freedombone Control Panel" \
292
-           --inputbox "$viewstr" 12 60 "$CURR_PASSWORD" 2>$data
292
+           --inputbox "$viewstr" 12 75 "$CURR_PASSWORD" 2>$data
293
     sel=$?
293
     sel=$?
294
     case $sel in
294
     case $sel in
295
         0)
295
         0)

+ 1
- 0
src/freedombone-image-customise 查看文件

1945
     git clone $KEYSERVER_WEB_REPO $rootdir/repos/keyserverweb
1945
     git clone $KEYSERVER_WEB_REPO $rootdir/repos/keyserverweb
1946
     git clone $PEERTUBE_REPO $rootdir/repos/peertube
1946
     git clone $PEERTUBE_REPO $rootdir/repos/peertube
1947
     git clone $PRIVATEBIN_REPO $rootdir/repos/privatebin
1947
     git clone $PRIVATEBIN_REPO $rootdir/repos/privatebin
1948
+    git clone $EDITH_REPO $rootdir/repos/edith
1948
     #git clone $WEKAN_REPO $rootdir/repos/wekan
1949
     #git clone $WEKAN_REPO $rootdir/repos/wekan
1949
     #git clone $FLOW_ROUTER_REPO $rootdir/repos/flowrouter
1950
     #git clone $FLOW_ROUTER_REPO $rootdir/repos/flowrouter
1950
     #git clone $METEOR_USERACCOUNTS_REPO $rootdir/repos/meteoruseraccounts
1951
     #git clone $METEOR_USERACCOUNTS_REPO $rootdir/repos/meteoruseraccounts

+ 2
- 2
src/freedombone-utils-onion 查看文件

83
     if [ ${#nick} -gt 0 ]; then
83
     if [ ${#nick} -gt 0 ]; then
84
         sed -i "/stealth ${nick}/d" /etc/tor/torrc
84
         sed -i "/stealth ${nick}/d" /etc/tor/torrc
85
     fi
85
     fi
86
-    sed -i "/hidden_service_${onion_service_name}/d" /etc/tor/torrc
87
-    sed -i "/hidden_service_${onion_service_name}_mobile/d" /etc/tor/torrc
86
+    sed -i "/hidden_service_${onion_service_name}/,+1 d" /etc/tor/torrc
87
+    sed -i "/hidden_service_${onion_service_name}_mobile/,+1 d" /etc/tor/torrc
88
     sed -i "/127.0.0.1:${onion_service_port_to}/d" /etc/tor/torrc
88
     sed -i "/127.0.0.1:${onion_service_port_to}/d" /etc/tor/torrc
89
     if [ $3 ]; then
89
     if [ $3 ]; then
90
         sed -i "/127.0.0.1:${3}/d" /etc/tor/torrc
90
         sed -i "/127.0.0.1:${3}/d" /etc/tor/torrc

+ 301
- 0
website/EN/app_edith.html 查看文件

1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
3
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
4
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
5
+<head>
6
+<!-- 2018-02-02 Fri 14:45 -->
7
+<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
8
+<meta name="viewport" content="width=device-width, initial-scale=1" />
9
+<title>&lrm;</title>
10
+<meta name="generator" content="Org mode" />
11
+<meta name="author" content="Bob Mottram" />
12
+<meta name="description" content="How to use Edith notes"
13
+ />
14
+<meta name="keywords" content="freedombone, edith, notes" />
15
+<style type="text/css">
16
+ <!--/*--><![CDATA[/*><!--*/
17
+  .title  { text-align: center;
18
+             margin-bottom: .2em; }
19
+  .subtitle { text-align: center;
20
+              font-size: medium;
21
+              font-weight: bold;
22
+              margin-top:0; }
23
+  .todo   { font-family: monospace; color: red; }
24
+  .done   { font-family: monospace; color: green; }
25
+  .priority { font-family: monospace; color: orange; }
26
+  .tag    { background-color: #eee; font-family: monospace;
27
+            padding: 2px; font-size: 80%; font-weight: normal; }
28
+  .timestamp { color: #bebebe; }
29
+  .timestamp-kwd { color: #5f9ea0; }
30
+  .org-right  { margin-left: auto; margin-right: 0px;  text-align: right; }
31
+  .org-left   { margin-left: 0px;  margin-right: auto; text-align: left; }
32
+  .org-center { margin-left: auto; margin-right: auto; text-align: center; }
33
+  .underline { text-decoration: underline; }
34
+  #postamble p, #preamble p { font-size: 90%; margin: .2em; }
35
+  p.verse { margin-left: 3%; }
36
+  pre {
37
+    border: 1px solid #ccc;
38
+    box-shadow: 3px 3px 3px #eee;
39
+    padding: 8pt;
40
+    font-family: monospace;
41
+    overflow: auto;
42
+    margin: 1.2em;
43
+  }
44
+  pre.src {
45
+    position: relative;
46
+    overflow: visible;
47
+    padding-top: 1.2em;
48
+  }
49
+  pre.src:before {
50
+    display: none;
51
+    position: absolute;
52
+    background-color: white;
53
+    top: -10px;
54
+    right: 10px;
55
+    padding: 3px;
56
+    border: 1px solid black;
57
+  }
58
+  pre.src:hover:before { display: inline;}
59
+  /* Languages per Org manual */
60
+  pre.src-asymptote:before { content: 'Asymptote'; }
61
+  pre.src-awk:before { content: 'Awk'; }
62
+  pre.src-C:before { content: 'C'; }
63
+  /* pre.src-C++ doesn't work in CSS */
64
+  pre.src-clojure:before { content: 'Clojure'; }
65
+  pre.src-css:before { content: 'CSS'; }
66
+  pre.src-D:before { content: 'D'; }
67
+  pre.src-ditaa:before { content: 'ditaa'; }
68
+  pre.src-dot:before { content: 'Graphviz'; }
69
+  pre.src-calc:before { content: 'Emacs Calc'; }
70
+  pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
71
+  pre.src-fortran:before { content: 'Fortran'; }
72
+  pre.src-gnuplot:before { content: 'gnuplot'; }
73
+  pre.src-haskell:before { content: 'Haskell'; }
74
+  pre.src-hledger:before { content: 'hledger'; }
75
+  pre.src-java:before { content: 'Java'; }
76
+  pre.src-js:before { content: 'Javascript'; }
77
+  pre.src-latex:before { content: 'LaTeX'; }
78
+  pre.src-ledger:before { content: 'Ledger'; }
79
+  pre.src-lisp:before { content: 'Lisp'; }
80
+  pre.src-lilypond:before { content: 'Lilypond'; }
81
+  pre.src-lua:before { content: 'Lua'; }
82
+  pre.src-matlab:before { content: 'MATLAB'; }
83
+  pre.src-mscgen:before { content: 'Mscgen'; }
84
+  pre.src-ocaml:before { content: 'Objective Caml'; }
85
+  pre.src-octave:before { content: 'Octave'; }
86
+  pre.src-org:before { content: 'Org mode'; }
87
+  pre.src-oz:before { content: 'OZ'; }
88
+  pre.src-plantuml:before { content: 'Plantuml'; }
89
+  pre.src-processing:before { content: 'Processing.js'; }
90
+  pre.src-python:before { content: 'Python'; }
91
+  pre.src-R:before { content: 'R'; }
92
+  pre.src-ruby:before { content: 'Ruby'; }
93
+  pre.src-sass:before { content: 'Sass'; }
94
+  pre.src-scheme:before { content: 'Scheme'; }
95
+  pre.src-screen:before { content: 'Gnu Screen'; }
96
+  pre.src-sed:before { content: 'Sed'; }
97
+  pre.src-sh:before { content: 'shell'; }
98
+  pre.src-sql:before { content: 'SQL'; }
99
+  pre.src-sqlite:before { content: 'SQLite'; }
100
+  /* additional languages in org.el's org-babel-load-languages alist */
101
+  pre.src-forth:before { content: 'Forth'; }
102
+  pre.src-io:before { content: 'IO'; }
103
+  pre.src-J:before { content: 'J'; }
104
+  pre.src-makefile:before { content: 'Makefile'; }
105
+  pre.src-maxima:before { content: 'Maxima'; }
106
+  pre.src-perl:before { content: 'Perl'; }
107
+  pre.src-picolisp:before { content: 'Pico Lisp'; }
108
+  pre.src-scala:before { content: 'Scala'; }
109
+  pre.src-shell:before { content: 'Shell Script'; }
110
+  pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
111
+  /* additional language identifiers per "defun org-babel-execute"
112
+       in ob-*.el */
113
+  pre.src-cpp:before  { content: 'C++'; }
114
+  pre.src-abc:before  { content: 'ABC'; }
115
+  pre.src-coq:before  { content: 'Coq'; }
116
+  pre.src-groovy:before  { content: 'Groovy'; }
117
+  /* additional language identifiers from org-babel-shell-names in
118
+     ob-shell.el: ob-shell is the only babel language using a lambda to put
119
+     the execution function name together. */
120
+  pre.src-bash:before  { content: 'bash'; }
121
+  pre.src-csh:before  { content: 'csh'; }
122
+  pre.src-ash:before  { content: 'ash'; }
123
+  pre.src-dash:before  { content: 'dash'; }
124
+  pre.src-ksh:before  { content: 'ksh'; }
125
+  pre.src-mksh:before  { content: 'mksh'; }
126
+  pre.src-posh:before  { content: 'posh'; }
127
+  /* Additional Emacs modes also supported by the LaTeX listings package */
128
+  pre.src-ada:before { content: 'Ada'; }
129
+  pre.src-asm:before { content: 'Assembler'; }
130
+  pre.src-caml:before { content: 'Caml'; }
131
+  pre.src-delphi:before { content: 'Delphi'; }
132
+  pre.src-html:before { content: 'HTML'; }
133
+  pre.src-idl:before { content: 'IDL'; }
134
+  pre.src-mercury:before { content: 'Mercury'; }
135
+  pre.src-metapost:before { content: 'MetaPost'; }
136
+  pre.src-modula-2:before { content: 'Modula-2'; }
137
+  pre.src-pascal:before { content: 'Pascal'; }
138
+  pre.src-ps:before { content: 'PostScript'; }
139
+  pre.src-prolog:before { content: 'Prolog'; }
140
+  pre.src-simula:before { content: 'Simula'; }
141
+  pre.src-tcl:before { content: 'tcl'; }
142
+  pre.src-tex:before { content: 'TeX'; }
143
+  pre.src-plain-tex:before { content: 'Plain TeX'; }
144
+  pre.src-verilog:before { content: 'Verilog'; }
145
+  pre.src-vhdl:before { content: 'VHDL'; }
146
+  pre.src-xml:before { content: 'XML'; }
147
+  pre.src-nxml:before { content: 'XML'; }
148
+  /* add a generic configuration mode; LaTeX export needs an additional
149
+     (add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
150
+  pre.src-conf:before { content: 'Configuration File'; }
151
+
152
+  table { border-collapse:collapse; }
153
+  caption.t-above { caption-side: top; }
154
+  caption.t-bottom { caption-side: bottom; }
155
+  td, th { vertical-align:top;  }
156
+  th.org-right  { text-align: center;  }
157
+  th.org-left   { text-align: center;   }
158
+  th.org-center { text-align: center; }
159
+  td.org-right  { text-align: right;  }
160
+  td.org-left   { text-align: left;   }
161
+  td.org-center { text-align: center; }
162
+  dt { font-weight: bold; }
163
+  .footpara { display: inline; }
164
+  .footdef  { margin-bottom: 1em; }
165
+  .figure { padding: 1em; }
166
+  .figure p { text-align: center; }
167
+  .inlinetask {
168
+    padding: 10px;
169
+    border: 2px solid gray;
170
+    margin: 10px;
171
+    background: #ffffcc;
172
+  }
173
+  #org-div-home-and-up
174
+   { text-align: right; font-size: 70%; white-space: nowrap; }
175
+  textarea { overflow-x: auto; }
176
+  .linenr { font-size: smaller }
177
+  .code-highlighted { background-color: #ffff00; }
178
+  .org-info-js_info-navigation { border-style: none; }
179
+  #org-info-js_console-label
180
+    { font-size: 10px; font-weight: bold; white-space: nowrap; }
181
+  .org-info-js_search-highlight
182
+    { background-color: #ffff00; color: #000000; font-weight: bold; }
183
+  .org-svg { width: 90%; }
184
+  /*]]>*/-->
185
+</style>
186
+<link rel="stylesheet" type="text/css" href="freedombone.css" />
187
+<script type="text/javascript">
188
+/*
189
+@licstart  The following is the entire license notice for the
190
+JavaScript code in this tag.
191
+
192
+Copyright (C) 2012-2017 Free Software Foundation, Inc.
193
+
194
+The JavaScript code in this tag is free software: you can
195
+redistribute it and/or modify it under the terms of the GNU
196
+General Public License (GNU GPL) as published by the Free Software
197
+Foundation, either version 3 of the License, or (at your option)
198
+any later version.  The code is distributed WITHOUT ANY WARRANTY;
199
+without even the implied warranty of MERCHANTABILITY or FITNESS
200
+FOR A PARTICULAR PURPOSE.  See the GNU GPL for more details.
201
+
202
+As additional permission under GNU GPL version 3 section 7, you
203
+may distribute non-source (e.g., minimized or compacted) forms of
204
+that code without the copy of the GNU GPL normally required by
205
+section 4, provided you include this license notice and a URL
206
+through which recipients can access the Corresponding Source.
207
+
208
+
209
+@licend  The above is the entire license notice
210
+for the JavaScript code in this tag.
211
+*/
212
+<!--/*--><![CDATA[/*><!--*/
213
+ function CodeHighlightOn(elem, id)
214
+ {
215
+   var target = document.getElementById(id);
216
+   if(null != target) {
217
+     elem.cacheClassElem = elem.className;
218
+     elem.cacheClassTarget = target.className;
219
+     target.className = "code-highlighted";
220
+     elem.className   = "code-highlighted";
221
+   }
222
+ }
223
+ function CodeHighlightOff(elem, id)
224
+ {
225
+   var target = document.getElementById(id);
226
+   if(elem.cacheClassElem)
227
+     elem.className = elem.cacheClassElem;
228
+   if(elem.cacheClassTarget)
229
+     target.className = elem.cacheClassTarget;
230
+ }
231
+/*]]>*///-->
232
+</script>
233
+</head>
234
+<body>
235
+<div id="preamble" class="status">
236
+<a name="top" id="top"></a>
237
+</div>
238
+<div id="content">
239
+<div class="org-center">
240
+
241
+<div class="figure">
242
+<p><img src="images/logo.png" alt="logo.png" />
243
+</p>
244
+</div>
245
+</div>
246
+
247
+<center>
248
+<h1>Edith Notes</h1>
249
+</center>
250
+
251
+<p>
252
+Edith notes is the simplest and quickest kind of notes system. It has no complicated user interface. Just enter your domain and a title and a note will be created. Everything typed is saved automatically.
253
+</p>
254
+
255
+<p>
256
+The speed and minimalism of this type of notes system may make it suitable for things like shopping lists or distraction free writing.
257
+</p>
258
+
259
+<p>
260
+ssh into the system with:
261
+</p>
262
+
263
+<div class="org-src-container">
264
+<pre class="src src-bash">ssh myusername@mydomain.com -p 2222
265
+</pre>
266
+</div>
267
+
268
+<p>
269
+Select <b>Administrator controls</b> then <b>App Settings</b> then <b>edith</b>. Enter a subdomain name, such as <i>notes.mydomain.com</i>, and optionally a freedns code. When the installation is complete you can then look up the password for the site within the <b>Passwords</b> section of the <b>Administrator control panel</b>, then  navigate to the subdomain. Log in, then enter something like <i>notes.mydomain.com/testnote</i> and start typing.
270
+</p>
271
+
272
+<p>
273
+It is possible to turn off the login via <b>App Settings/edith</b> if you wish, but this will enable anyone on the internet to view or edit notes on your system, which could have obvious privacy or stability implications. From <b>App settings/edith</b> it's also possible to browse through your notes files.
274
+</p>
275
+</div>
276
+<div id="postamble" class="status">
277
+
278
+<style type="text/css">
279
+.back-to-top {
280
+    position: fixed;
281
+    bottom: 2em;
282
+    right: 0px;
283
+    text-decoration: none;
284
+    color: #000000;
285
+    background-color: rgba(235, 235, 235, 0.80);
286
+    font-size: 12px;
287
+    padding: 1em;
288
+    display: none;
289
+}
290
+
291
+.back-to-top:hover {
292
+    background-color: rgba(135, 135, 135, 0.50);
293
+}
294
+</style>
295
+
296
+<div class="back-to-top">
297
+<a href="#top">Back to top</a> | <a href="mailto:bob@freedombone.net">E-mail me</a>
298
+</div>
299
+</div>
300
+</body>
301
+</html>

+ 133
- 121
website/EN/apps.html 查看文件

3
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
4
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
4
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
5
 <head>
5
 <head>
6
-<!-- 2018-01-10 Wed 22:25 -->
6
+<!-- 2018-02-02 Fri 14:51 -->
7
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
7
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
8
 <meta name="viewport" content="width=device-width, initial-scale=1" />
8
 <meta name="viewport" content="width=device-width, initial-scale=1" />
9
 <title>&lrm;</title>
9
 <title>&lrm;</title>
265
 </div>
265
 </div>
266
 
266
 
267
 
267
 
268
-<div id="outline-container-org882df4a" class="outline-2">
269
-<h2 id="org882df4a">Akaunting</h2>
270
-<div class="outline-text-2" id="text-org882df4a">
268
+<div id="outline-container-org6873154" class="outline-2">
269
+<h2 id="org6873154">Akaunting</h2>
270
+<div class="outline-text-2" id="text-org6873154">
271
 <p>
271
 <p>
272
 A web based accounts system for small businesses or freelancers.
272
 A web based accounts system for small businesses or freelancers.
273
 </p>
273
 </p>
277
 </p>
277
 </p>
278
 </div>
278
 </div>
279
 </div>
279
 </div>
280
-<div id="outline-container-orge821a92" class="outline-2">
281
-<h2 id="orge821a92">CryptPad</h2>
282
-<div class="outline-text-2" id="text-orge821a92">
280
+<div id="outline-container-org7e6ef98" class="outline-2">
281
+<h2 id="org7e6ef98">CryptPad</h2>
282
+<div class="outline-text-2" id="text-org7e6ef98">
283
 <p>
283
 <p>
284
 Collaborate on editing documents, presentations and source code, or vote on things. All with a good level of security.
284
 Collaborate on editing documents, presentations and source code, or vote on things. All with a good level of security.
285
 </p>
285
 </p>
289
 </p>
289
 </p>
290
 </div>
290
 </div>
291
 </div>
291
 </div>
292
-<div id="outline-container-org6d56481" class="outline-2">
293
-<h2 id="org6d56481">DLNA</h2>
294
-<div class="outline-text-2" id="text-org6d56481">
292
+<div id="outline-container-orgb6914dd" class="outline-2">
293
+<h2 id="orgb6914dd">DLNA</h2>
294
+<div class="outline-text-2" id="text-orgb6914dd">
295
 <p>
295
 <p>
296
 Enables you to use the system as a music server which any DLNA compatible devices can connect to within your home network.
296
 Enables you to use the system as a music server which any DLNA compatible devices can connect to within your home network.
297
 </p>
297
 </p>
301
 </p>
301
 </p>
302
 </div>
302
 </div>
303
 </div>
303
 </div>
304
-<div id="outline-container-org0aaf2bf" class="outline-2">
305
-<h2 id="org0aaf2bf">Dokuwiki</h2>
306
-<div class="outline-text-2" id="text-org0aaf2bf">
304
+<div id="outline-container-orgc23c65e" class="outline-2">
305
+<h2 id="orgc23c65e">Dokuwiki</h2>
306
+<div class="outline-text-2" id="text-orgc23c65e">
307
 <p>
307
 <p>
308
 A databaseless wiki system.
308
 A databaseless wiki system.
309
 </p>
309
 </p>
313
 </p>
313
 </p>
314
 </div>
314
 </div>
315
 </div>
315
 </div>
316
-<div id="outline-container-orga523977" class="outline-2">
317
-<h2 id="orga523977">Emacs</h2>
318
-<div class="outline-text-2" id="text-orga523977">
316
+<div id="outline-container-orgf803ba9" class="outline-2">
317
+<h2 id="orgf803ba9">Edith</h2>
318
+<div class="outline-text-2" id="text-orgf803ba9">
319
+<p>
320
+Extremely simple and distraction-free notes system.
321
+</p>
322
+
323
+<p>
324
+<a href="./app_edith.html">How to use it</a>
325
+</p>
326
+</div>
327
+</div>
328
+<div id="outline-container-orgfd2155a" class="outline-2">
329
+<h2 id="orgfd2155a">Emacs</h2>
330
+<div class="outline-text-2" id="text-orgfd2155a">
319
 <p>
331
 <p>
320
 If you use the Mutt client to read your email then this will set it up to use emacs for composing new mail.
332
 If you use the Mutt client to read your email then this will set it up to use emacs for composing new mail.
321
 </p>
333
 </p>
325
 </p>
337
 </p>
326
 </div>
338
 </div>
327
 </div>
339
 </div>
328
-<div id="outline-container-org11ae2d9" class="outline-2">
329
-<h2 id="org11ae2d9">Etherpad</h2>
330
-<div class="outline-text-2" id="text-org11ae2d9">
340
+<div id="outline-container-org5fcc9ff" class="outline-2">
341
+<h2 id="org5fcc9ff">Etherpad</h2>
342
+<div class="outline-text-2" id="text-org5fcc9ff">
331
 <p>
343
 <p>
332
 Collaborate on creating documents in real time. Maybe you're planning a holiday with other family members or creating documentation for a Free Software project along with other volunteers. Etherpad is hard to beat for simplicity and speed. Only users of the system will be able to access it.
344
 Collaborate on creating documents in real time. Maybe you're planning a holiday with other family members or creating documentation for a Free Software project along with other volunteers. Etherpad is hard to beat for simplicity and speed. Only users of the system will be able to access it.
333
 </p>
345
 </p>
337
 </p>
349
 </p>
338
 </div>
350
 </div>
339
 </div>
351
 </div>
340
-<div id="outline-container-org7f75cbc" class="outline-2">
341
-<h2 id="org7f75cbc">Federated wiki</h2>
342
-<div class="outline-text-2" id="text-org7f75cbc">
352
+<div id="outline-container-orgdc50344" class="outline-2">
353
+<h2 id="orgdc50344">Federated wiki</h2>
354
+<div class="outline-text-2" id="text-orgdc50344">
343
 <p>
355
 <p>
344
 A new approach to creating wiki content.
356
 A new approach to creating wiki content.
345
 </p>
357
 </p>
349
 </p>
361
 </p>
350
 </div>
362
 </div>
351
 </div>
363
 </div>
352
-<div id="outline-container-org538cc52" class="outline-2">
353
-<h2 id="org538cc52">Friendica</h2>
354
-<div class="outline-text-2" id="text-org538cc52">
364
+<div id="outline-container-org30bda20" class="outline-2">
365
+<h2 id="org30bda20">Friendica</h2>
366
+<div class="outline-text-2" id="text-org30bda20">
355
 <p>
367
 <p>
356
 Federated social network system.
368
 Federated social network system.
357
 </p>
369
 </p>
361
 </p>
373
 </p>
362
 </div>
374
 </div>
363
 </div>
375
 </div>
364
-<div id="outline-container-orga0e917c" class="outline-2">
365
-<h2 id="orga0e917c">Ghost</h2>
366
-<div class="outline-text-2" id="text-orga0e917c">
376
+<div id="outline-container-org98e4708" class="outline-2">
377
+<h2 id="org98e4708">Ghost</h2>
378
+<div class="outline-text-2" id="text-org98e4708">
367
 <p>
379
 <p>
368
 Modern looking blogging system.
380
 Modern looking blogging system.
369
 </p>
381
 </p>
373
 </p>
385
 </p>
374
 </div>
386
 </div>
375
 </div>
387
 </div>
376
-<div id="outline-container-org5741481" class="outline-2">
377
-<h2 id="org5741481">GNU Social</h2>
378
-<div class="outline-text-2" id="text-org5741481">
388
+<div id="outline-container-orgcd73257" class="outline-2">
389
+<h2 id="orgcd73257">GNU Social</h2>
390
+<div class="outline-text-2" id="text-orgcd73257">
379
 <p>
391
 <p>
380
 Federated social network based on the OStatus protocol. You can "<i>remote follow</i>" other users within the GNU Social federation.
392
 Federated social network based on the OStatus protocol. You can "<i>remote follow</i>" other users within the GNU Social federation.
381
 </p>
393
 </p>
385
 </p>
397
 </p>
386
 </div>
398
 </div>
387
 </div>
399
 </div>
388
-<div id="outline-container-org0b7fe9f" class="outline-2">
389
-<h2 id="org0b7fe9f">Gogs</h2>
390
-<div class="outline-text-2" id="text-org0b7fe9f">
400
+<div id="outline-container-org5f6afde" class="outline-2">
401
+<h2 id="org5f6afde">Gogs</h2>
402
+<div class="outline-text-2" id="text-org5f6afde">
391
 <p>
403
 <p>
392
 Lightweight git project hosting system. You can mirror projects from Github, or if Github turns evil then just host your own projects while retaining the familiar <i>fork-and-pull</i> workflow. If you can use Github then you can also use Gogs.
404
 Lightweight git project hosting system. You can mirror projects from Github, or if Github turns evil then just host your own projects while retaining the familiar <i>fork-and-pull</i> workflow. If you can use Github then you can also use Gogs.
393
 </p>
405
 </p>
397
 </p>
409
 </p>
398
 </div>
410
 </div>
399
 </div>
411
 </div>
400
-<div id="outline-container-org0cb9182" class="outline-2">
401
-<h2 id="org0cb9182">HTMLy</h2>
402
-<div class="outline-text-2" id="text-org0cb9182">
412
+<div id="outline-container-org4d1d8ba" class="outline-2">
413
+<h2 id="org4d1d8ba">HTMLy</h2>
414
+<div class="outline-text-2" id="text-org4d1d8ba">
403
 <p>
415
 <p>
404
 Databaseless blogging system. Quite simple and with a markdown-like format.
416
 Databaseless blogging system. Quite simple and with a markdown-like format.
405
 </p>
417
 </p>
409
 </p>
421
 </p>
410
 </div>
422
 </div>
411
 </div>
423
 </div>
412
-<div id="outline-container-orgd9569c1" class="outline-2">
413
-<h2 id="orgd9569c1">Hubzilla</h2>
414
-<div class="outline-text-2" id="text-orgd9569c1">
424
+<div id="outline-container-org4039820" class="outline-2">
425
+<h2 id="org4039820">Hubzilla</h2>
426
+<div class="outline-text-2" id="text-org4039820">
415
 <p>
427
 <p>
416
 Web publishing platform with social network like features and good privacy controls so that it's possible to specify who can see which content. Includes photo albums, calendar, wiki and file storage.
428
 Web publishing platform with social network like features and good privacy controls so that it's possible to specify who can see which content. Includes photo albums, calendar, wiki and file storage.
417
 </p>
429
 </p>
421
 </p>
433
 </p>
422
 </div>
434
 </div>
423
 </div>
435
 </div>
424
-<div id="outline-container-orgab4800e" class="outline-2">
425
-<h2 id="orgab4800e">Icecast media stream</h2>
426
-<div class="outline-text-2" id="text-orgab4800e">
436
+<div id="outline-container-orgd7ea9f5" class="outline-2">
437
+<h2 id="orgd7ea9f5">Icecast media stream</h2>
438
+<div class="outline-text-2" id="text-orgd7ea9f5">
427
 <p>
439
 <p>
428
 Make your own internet radio station.
440
 Make your own internet radio station.
429
 </p>
441
 </p>
433
 </p>
445
 </p>
434
 </div>
446
 </div>
435
 </div>
447
 </div>
436
-<div id="outline-container-orgd862282" class="outline-2">
437
-<h2 id="orgd862282">IRC Server (ngirc)</h2>
438
-<div class="outline-text-2" id="text-orgd862282">
448
+<div id="outline-container-org4b18262" class="outline-2">
449
+<h2 id="org4b18262">IRC Server (ngirc)</h2>
450
+<div class="outline-text-2" id="text-org4b18262">
439
 <p>
451
 <p>
440
 Run your own IRC chat channel which can be secured with a password and accessible via an onion address. A bouncer is included so that you can receive messages sent while you were offline. Works with Hexchat and other popular clients.
452
 Run your own IRC chat channel which can be secured with a password and accessible via an onion address. A bouncer is included so that you can receive messages sent while you were offline. Works with Hexchat and other popular clients.
441
 </p>
453
 </p>
445
 </p>
457
 </p>
446
 </div>
458
 </div>
447
 </div>
459
 </div>
448
-<div id="outline-container-orgd19b0f8" class="outline-2">
449
-<h2 id="orgd19b0f8">Jitsi Meet</h2>
450
-<div class="outline-text-2" id="text-orgd19b0f8">
460
+<div id="outline-container-org3244c52" class="outline-2">
461
+<h2 id="org3244c52">Jitsi Meet</h2>
462
+<div class="outline-text-2" id="text-org3244c52">
451
 <p>
463
 <p>
452
 Experimental WebRTC video conferencing system, similar to Google Hangouts. This may not be fully functional, but is hoped to be in the near future.
464
 Experimental WebRTC video conferencing system, similar to Google Hangouts. This may not be fully functional, but is hoped to be in the near future.
453
 </p>
465
 </p>
454
 </div>
466
 </div>
455
 </div>
467
 </div>
456
 
468
 
457
-<div id="outline-container-org4fd23ed" class="outline-2">
458
-<h2 id="org4fd23ed">KanBoard</h2>
459
-<div class="outline-text-2" id="text-org4fd23ed">
469
+<div id="outline-container-org7f54f3b" class="outline-2">
470
+<h2 id="org7f54f3b">KanBoard</h2>
471
+<div class="outline-text-2" id="text-org7f54f3b">
460
 <p>
472
 <p>
461
 A simple kanban system for managing projects or TODO lists.
473
 A simple kanban system for managing projects or TODO lists.
462
 </p>
474
 </p>
466
 </p>
478
 </p>
467
 </div>
479
 </div>
468
 </div>
480
 </div>
469
-<div id="outline-container-org091b6da" class="outline-2">
470
-<h2 id="org091b6da">Key Server</h2>
471
-<div class="outline-text-2" id="text-org091b6da">
481
+<div id="outline-container-org511a639" class="outline-2">
482
+<h2 id="org511a639">Key Server</h2>
483
+<div class="outline-text-2" id="text-org511a639">
472
 <p>
484
 <p>
473
 An OpenPGP key server for storing and retrieving GPG public keys.
485
 An OpenPGP key server for storing and retrieving GPG public keys.
474
 </p>
486
 </p>
478
 </p>
490
 </p>
479
 </div>
491
 </div>
480
 </div>
492
 </div>
481
-<div id="outline-container-org471027b" class="outline-2">
482
-<h2 id="org471027b">Koel</h2>
483
-<div class="outline-text-2" id="text-org471027b">
493
+<div id="outline-container-org058add3" class="outline-2">
494
+<h2 id="org058add3">Koel</h2>
495
+<div class="outline-text-2" id="text-org058add3">
484
 <p>
496
 <p>
485
 Access your music collection from any internet connected device.
497
 Access your music collection from any internet connected device.
486
 </p>
498
 </p>
490
 </p>
502
 </p>
491
 </div>
503
 </div>
492
 </div>
504
 </div>
493
-<div id="outline-container-org0424b63" class="outline-2">
494
-<h2 id="org0424b63">Lychee</h2>
495
-<div class="outline-text-2" id="text-org0424b63">
505
+<div id="outline-container-org611fc47" class="outline-2">
506
+<h2 id="org611fc47">Lychee</h2>
507
+<div class="outline-text-2" id="text-org611fc47">
496
 <p>
508
 <p>
497
 Make your photo albums available on the web.
509
 Make your photo albums available on the web.
498
 </p>
510
 </p>
502
 </p>
514
 </p>
503
 </div>
515
 </div>
504
 </div>
516
 </div>
505
-<div id="outline-container-orga6a88dd" class="outline-2">
506
-<h2 id="orga6a88dd">Mailpile</h2>
507
-<div class="outline-text-2" id="text-orga6a88dd">
517
+<div id="outline-container-org3a59d15" class="outline-2">
518
+<h2 id="org3a59d15">Mailpile</h2>
519
+<div class="outline-text-2" id="text-org3a59d15">
508
 <p>
520
 <p>
509
 Modern email client which supports GPG encryption.
521
 Modern email client which supports GPG encryption.
510
 </p>
522
 </p>
514
 </p>
526
 </p>
515
 </div>
527
 </div>
516
 </div>
528
 </div>
517
-<div id="outline-container-org6518c3d" class="outline-2">
518
-<h2 id="org6518c3d">Matrix</h2>
519
-<div class="outline-text-2" id="text-org6518c3d">
529
+<div id="outline-container-org36c7c61" class="outline-2">
530
+<h2 id="org36c7c61">Matrix</h2>
531
+<div class="outline-text-2" id="text-org36c7c61">
520
 <p>
532
 <p>
521
 Multi-user chat with some security and moderation controls.
533
 Multi-user chat with some security and moderation controls.
522
 </p>
534
 </p>
526
 </p>
538
 </p>
527
 </div>
539
 </div>
528
 </div>
540
 </div>
529
-<div id="outline-container-org1413e81" class="outline-2">
530
-<h2 id="org1413e81">Mediagoblin</h2>
531
-<div class="outline-text-2" id="text-org1413e81">
541
+<div id="outline-container-org69bd95e" class="outline-2">
542
+<h2 id="org69bd95e">Mediagoblin</h2>
543
+<div class="outline-text-2" id="text-org69bd95e">
532
 <p>
544
 <p>
533
 Publicly host video and audio files so that you don't need to use YouTube/Vimeo/etc.
545
 Publicly host video and audio files so that you don't need to use YouTube/Vimeo/etc.
534
 </p>
546
 </p>
538
 </p>
550
 </p>
539
 </div>
551
 </div>
540
 </div>
552
 </div>
541
-<div id="outline-container-orgb8d2738" class="outline-2">
542
-<h2 id="orgb8d2738">Mumble</h2>
543
-<div class="outline-text-2" id="text-orgb8d2738">
553
+<div id="outline-container-org083b086" class="outline-2">
554
+<h2 id="org083b086">Mumble</h2>
555
+<div class="outline-text-2" id="text-org083b086">
544
 <p>
556
 <p>
545
 The popular VoIP and text chat system. Say goodbye to old-fashioned telephony conferences with silly dial codes. Also works well on mobile.
557
 The popular VoIP and text chat system. Say goodbye to old-fashioned telephony conferences with silly dial codes. Also works well on mobile.
546
 </p>
558
 </p>
550
 </p>
562
 </p>
551
 </div>
563
 </div>
552
 </div>
564
 </div>
553
-<div id="outline-container-org78d79cd" class="outline-2">
554
-<h2 id="org78d79cd">NextCloud</h2>
555
-<div class="outline-text-2" id="text-org78d79cd">
565
+<div id="outline-container-orga89941d" class="outline-2">
566
+<h2 id="orga89941d">NextCloud</h2>
567
+<div class="outline-text-2" id="text-orga89941d">
556
 <p>
568
 <p>
557
 Store files on your server and sync them with laptops or mobile devices. Includes many plugins including videoconferencing and collaborative document editing.
569
 Store files on your server and sync them with laptops or mobile devices. Includes many plugins including videoconferencing and collaborative document editing.
558
 </p>
570
 </p>
562
 </p>
574
 </p>
563
 </div>
575
 </div>
564
 </div>
576
 </div>
565
-<div id="outline-container-org40a7fdc" class="outline-2">
566
-<h2 id="org40a7fdc">PeerTube</h2>
567
-<div class="outline-text-2" id="text-org40a7fdc">
577
+<div id="outline-container-org1855642" class="outline-2">
578
+<h2 id="org1855642">PeerTube</h2>
579
+<div class="outline-text-2" id="text-org1855642">
568
 <p>
580
 <p>
569
 Peer-to-peer video hosting. Similar to Mediagoblin, but the P2P aspect better enables the streaming load to be shared across servers.
581
 Peer-to-peer video hosting. Similar to Mediagoblin, but the P2P aspect better enables the streaming load to be shared across servers.
570
 </p>
582
 </p>
574
 </p>
586
 </p>
575
 </div>
587
 </div>
576
 </div>
588
 </div>
577
-<div id="outline-container-orgfca92a1" class="outline-2">
578
-<h2 id="orgfca92a1">PI-Hole</h2>
579
-<div class="outline-text-2" id="text-orgfca92a1">
589
+<div id="outline-container-org75f549b" class="outline-2">
590
+<h2 id="org75f549b">PI-Hole</h2>
591
+<div class="outline-text-2" id="text-org75f549b">
580
 <p>
592
 <p>
581
 The black hole for web adverts. Block adverts at the domain name level within your local network. It can significantly reduce bandwidth, speed up page load times and protect your systems from being tracked by spyware.
593
 The black hole for web adverts. Block adverts at the domain name level within your local network. It can significantly reduce bandwidth, speed up page load times and protect your systems from being tracked by spyware.
582
 </p>
594
 </p>
586
 </p>
598
 </p>
587
 </div>
599
 </div>
588
 </div>
600
 </div>
589
-<div id="outline-container-org78a2d24" class="outline-2">
590
-<h2 id="org78a2d24">PostActiv</h2>
591
-<div class="outline-text-2" id="text-org78a2d24">
601
+<div id="outline-container-orga1fbb11" class="outline-2">
602
+<h2 id="orga1fbb11">PostActiv</h2>
603
+<div class="outline-text-2" id="text-orga1fbb11">
592
 <p>
604
 <p>
593
 An alternative federated social networking system compatible with GNU Social, Pleroma and Mastodon. It includes some optimisations and fixes currently not available within the main GNU Social project.
605
 An alternative federated social networking system compatible with GNU Social, Pleroma and Mastodon. It includes some optimisations and fixes currently not available within the main GNU Social project.
594
 </p>
606
 </p>
598
 </p>
610
 </p>
599
 </div>
611
 </div>
600
 </div>
612
 </div>
601
-<div id="outline-container-org233a0fb" class="outline-2">
602
-<h2 id="org233a0fb">PrivateBin</h2>
603
-<div class="outline-text-2" id="text-org233a0fb">
613
+<div id="outline-container-org1448160" class="outline-2">
614
+<h2 id="org1448160">PrivateBin</h2>
615
+<div class="outline-text-2" id="text-org1448160">
604
 <p>
616
 <p>
605
 A pastebin where the server has zero knowledge of the content being pasted.
617
 A pastebin where the server has zero knowledge of the content being pasted.
606
 </p>
618
 </p>
610
 </p>
622
 </p>
611
 </div>
623
 </div>
612
 </div>
624
 </div>
613
-<div id="outline-container-org70bfbdf" class="outline-2">
614
-<h2 id="org70bfbdf">Profanity</h2>
615
-<div class="outline-text-2" id="text-org70bfbdf">
625
+<div id="outline-container-org9d310cf" class="outline-2">
626
+<h2 id="org9d310cf">Profanity</h2>
627
+<div class="outline-text-2" id="text-org9d310cf">
616
 <p>
628
 <p>
617
 A shell based XMPP client which you can run on the Freedombone server via ssh.
629
 A shell based XMPP client which you can run on the Freedombone server via ssh.
618
 </p>
630
 </p>
622
 </p>
634
 </p>
623
 </div>
635
 </div>
624
 </div>
636
 </div>
625
-<div id="outline-container-org3e596b4" class="outline-2">
626
-<h2 id="org3e596b4">Riot Web</h2>
627
-<div class="outline-text-2" id="text-org3e596b4">
637
+<div id="outline-container-orge6aa619" class="outline-2">
638
+<h2 id="orge6aa619">Riot Web</h2>
639
+<div class="outline-text-2" id="text-orge6aa619">
628
 <p>
640
 <p>
629
 A browser based user interface for the Matrix federated communications system, including WebRTC audio and video chat.
641
 A browser based user interface for the Matrix federated communications system, including WebRTC audio and video chat.
630
 </p>
642
 </p>
634
 </p>
646
 </p>
635
 </div>
647
 </div>
636
 </div>
648
 </div>
637
-<div id="outline-container-org19a30bc" class="outline-2">
638
-<h2 id="org19a30bc">SearX</h2>
639
-<div class="outline-text-2" id="text-org19a30bc">
649
+<div id="outline-container-org50e63cb" class="outline-2">
650
+<h2 id="org50e63cb">SearX</h2>
651
+<div class="outline-text-2" id="text-org50e63cb">
640
 <p>
652
 <p>
641
 A metasearch engine for customised and private web searches.
653
 A metasearch engine for customised and private web searches.
642
 </p>
654
 </p>
646
 </p>
658
 </p>
647
 </div>
659
 </div>
648
 </div>
660
 </div>
649
-<div id="outline-container-orgfdae631" class="outline-2">
650
-<h2 id="orgfdae631">tt-rss</h2>
651
-<div class="outline-text-2" id="text-orgfdae631">
661
+<div id="outline-container-orgec6ad33" class="outline-2">
662
+<h2 id="orgec6ad33">tt-rss</h2>
663
+<div class="outline-text-2" id="text-orgec6ad33">
652
 <p>
664
 <p>
653
 Private RSS reader. Pulls in RSS/Atom feeds via Tor and is only accessible via an onion address. Have "<i>the right to read</i>" without the Surveillance State knowing what you're reading. Also available with a user interface suitable for viewing on mobile devices via a browser such as OrFox.
665
 Private RSS reader. Pulls in RSS/Atom feeds via Tor and is only accessible via an onion address. Have "<i>the right to read</i>" without the Surveillance State knowing what you're reading. Also available with a user interface suitable for viewing on mobile devices via a browser such as OrFox.
654
 </p>
666
 </p>
658
 </p>
670
 </p>
659
 </div>
671
 </div>
660
 </div>
672
 </div>
661
-<div id="outline-container-org6c1fb9a" class="outline-2">
662
-<h2 id="org6c1fb9a">Syncthing</h2>
663
-<div class="outline-text-2" id="text-org6c1fb9a">
673
+<div id="outline-container-org4de6eec" class="outline-2">
674
+<h2 id="org4de6eec">Syncthing</h2>
675
+<div class="outline-text-2" id="text-org4de6eec">
664
 <p>
676
 <p>
665
 Possibly the best way to synchronise files across all of your devices. Once it has been set up it "just works" with no user intervention needed.
677
 Possibly the best way to synchronise files across all of your devices. Once it has been set up it "just works" with no user intervention needed.
666
 </p>
678
 </p>
670
 </p>
682
 </p>
671
 </div>
683
 </div>
672
 </div>
684
 </div>
673
-<div id="outline-container-org313c9b7" class="outline-2">
674
-<h2 id="org313c9b7">Tahoe-LAFS</h2>
675
-<div class="outline-text-2" id="text-org313c9b7">
685
+<div id="outline-container-orgebbf48a" class="outline-2">
686
+<h2 id="orgebbf48a">Tahoe-LAFS</h2>
687
+<div class="outline-text-2" id="text-orgebbf48a">
676
 <p>
688
 <p>
677
 Robust and encrypted storage of files on one or more server.
689
 Robust and encrypted storage of files on one or more server.
678
 </p>
690
 </p>
682
 </p>
694
 </p>
683
 </div>
695
 </div>
684
 </div>
696
 </div>
685
-<div id="outline-container-org74af2ab" class="outline-2">
686
-<h2 id="org74af2ab">Tox</h2>
687
-<div class="outline-text-2" id="text-org74af2ab">
697
+<div id="outline-container-org3275ee7" class="outline-2">
698
+<h2 id="org3275ee7">Tox</h2>
699
+<div class="outline-text-2" id="text-org3275ee7">
688
 <p>
700
 <p>
689
 Client and bootstrap node for the Tox chat/VoIP system.
701
 Client and bootstrap node for the Tox chat/VoIP system.
690
 </p>
702
 </p>
694
 </p>
706
 </p>
695
 </div>
707
 </div>
696
 </div>
708
 </div>
697
-<div id="outline-container-org5d5986e" class="outline-2">
698
-<h2 id="org5d5986e">Turtl</h2>
699
-<div class="outline-text-2" id="text-org5d5986e">
709
+<div id="outline-container-orgceb6c24" class="outline-2">
710
+<h2 id="orgceb6c24">Turtl</h2>
711
+<div class="outline-text-2" id="text-orgceb6c24">
700
 <p>
712
 <p>
701
 A system for privately creating and sharing notes and images, similar to Evernote but without the spying.
713
 A system for privately creating and sharing notes and images, similar to Evernote but without the spying.
702
 </p>
714
 </p>
706
 </p>
718
 </p>
707
 </div>
719
 </div>
708
 </div>
720
 </div>
709
-<div id="outline-container-org2b614c0" class="outline-2">
710
-<h2 id="org2b614c0">Vim</h2>
711
-<div class="outline-text-2" id="text-org2b614c0">
721
+<div id="outline-container-org1216de4" class="outline-2">
722
+<h2 id="org1216de4">Vim</h2>
723
+<div class="outline-text-2" id="text-org1216de4">
712
 <p>
724
 <p>
713
 If you use the Mutt client to read your email then this will set it up to use vim for composing new mail.
725
 If you use the Mutt client to read your email then this will set it up to use vim for composing new mail.
714
 </p>
726
 </p>
715
 </div>
727
 </div>
716
 </div>
728
 </div>
717
 
729
 
718
-<div id="outline-container-orgdb6427c" class="outline-2">
719
-<h2 id="orgdb6427c">Virtual Private Network (VPN)</h2>
720
-<div class="outline-text-2" id="text-orgdb6427c">
730
+<div id="outline-container-org057b184" class="outline-2">
731
+<h2 id="org057b184">Virtual Private Network (VPN)</h2>
732
+<div class="outline-text-2" id="text-org057b184">
721
 <p>
733
 <p>
722
 Set up a VPN on your server so that you can bypass local internet censorship.
734
 Set up a VPN on your server so that you can bypass local internet censorship.
723
 </p>
735
 </p>
727
 </p>
739
 </p>
728
 </div>
740
 </div>
729
 </div>
741
 </div>
730
-<div id="outline-container-org15bc23b" class="outline-2">
731
-<h2 id="org15bc23b">XMPP</h2>
732
-<div class="outline-text-2" id="text-org15bc23b">
742
+<div id="outline-container-org93a66a0" class="outline-2">
743
+<h2 id="org93a66a0">XMPP</h2>
744
+<div class="outline-text-2" id="text-org93a66a0">
733
 <p>
745
 <p>
734
 Chat server which can be used together with client such as Gajim or Conversations to provide end-to-end content security and also onion routed metadata security. Includes advanced features such as <i>client state notification</i> to save battery power on your mobile devices, support for seamless roaming between networks and <i>message carbons</i> so that you can receive the same messages while being simultaneously logged in to your account on more than one device.
746
 Chat server which can be used together with client such as Gajim or Conversations to provide end-to-end content security and also onion routed metadata security. Includes advanced features such as <i>client state notification</i> to save battery power on your mobile devices, support for seamless roaming between networks and <i>message carbons</i> so that you can receive the same messages while being simultaneously logged in to your account on more than one device.
735
 </p>
747
 </p>