Category Archives: Projects

Deploy nowiki

Mettere nowiki pare facile, l’ho scritto io e manco sapevo come si faceva, quindi mo socializzo.

Installa

apt-get install nginx-full python-virtualenv git uwsgi uwsgi-plugin-python uwsgi-plugin-syslog
cd /var
git clone git://github.com/boyska/nowiki
cd nowiki
sudo -u nowiki virtualenv --no-site-packages venv
source venv/bin/activate
pip install -r requirements.txt
deactivate
cd nowiki
cp nowiki.example.cfg nowiki.cfg

Configurazione

Configurare nowiki

Il file nowiki.cfg permette di cambiare alcuni settaggi base.

E’ poi importante mettere i permessi con accuratezza, in modo che uwsgi possa soltanto leggere i file di nowiki, con l’eccezione di /data/ per cui ci deve essere possibilita’ di scrittura.

chown nowiki:nogroup /var/nowiki -R
chmod g-w /var/nowiki -R
chmod o-rwx /var/nowiki -R
chown nobody /var/nowiki/nowiki/data -R
chmod ug+rwX /var/nowiki/nowiki/data -R

Configurare uwsgi

In /etc/uwsgi/apps-enabled/uwsgi-nowiki:

[uwsgi]
socket = /run/uwsgi/nowiki.sock
chdir = /var/nowiki/nowiki
virtualenv = /var/nowiki/venv
module = nowiki
callable = app
uid = nobody
gid = nogroup
chmod = 600
chown-socket = www-data
plugins = python,syslog
log-syslog = uwsgi-nowiki

In /etc/uwsgi/emperor.ini basta mettere

[uwsgi]
emperor = /etc/uwsgi/apps-enabled
uid = nobody
gid = nogroup
chown-socket = www-data
master = true

Bisogna poi configurare systemd per gestire l’avvio di uwsgi, mettendo questo in /etc/systemd/system/emperor.uwsgi.service. Nota: uwsgi potrebbe partire con il socketactivation (vedi ListenStream), ma non ho capito se c’e’ un modo decente di farlo senza dover elencare tutte le socket coinvolte dentro l’emperor.uwsgi.socket . Quindi non l’ho fatto, non mi pareva pulito.

[Unit]
Description=uWSGI Emperor
After=syslog.target

[Service]
ExecStart=/usr/bin/uwsgi --ini /etc/uwsgi/emperor.ini
ExecStartPre=/bin/mkdir -p /run/uwsgi
ExecStartPre=/bin/chown nobody:nogroup /run/uwsgi
Restart=always
Type=notify
StandardError=syslog
NotifyAccess=main

[Install]
WantedBy=multi-user.target

Configurare nginx

server  {
        listen 80;
        rewrite ^/nowiki$ /nowiki/ permanent;
        location /nowiki { #try_files $uri @nowiki; }
        #location @nowiki {
            include uwsgi_params;
            uwsgi_param SCRIPT_NAME /nowiki;
            uwsgi_modifier1 30;
            uwsgi_pass unix:/run/uwsgi/uwsgi.sock;
        }
    }

Nerd, server e documentazione

Le premesse:

  • La documentazione e’ bella (da leggere)
  • La documentazione e’ brutta (da scrivere)
  • I browser sono bruttissimi
  • Gli Hidden Service sono lentissimi
  • Le cose importanti non sono poi tanto importanti
  • Le cose pulite sono noiose

In genere risolvevo questo insieme di dubbi mettendo dei file in /etc/doc, e uno cosi’ risolve. Ma:

  • Devo loggarmi per aggiornare la documentazione
  • Se uso ssh su hidden service, usare un editor e’ dolorosissimo

E quindi la soluzione “browser” torna in vantaggio. Ma hidden service web e’ ancora piu’ frustrante che web normale.

Ci vorrebbe una cosa web che:

  • Puoi comunque modificare anche da terminale senza sbattimenti
  • Richiede il caricamento di 0 risorse esterne (tor ha alta latenza, ma banda piu’ che accettabile sugli hidden service); anche le richieste AJAX andrebbero centellinate

Per farlo siamo disposti a rinunciare a:

  • Pulizia
  • Sistema di controllo versioni integrato (in realta’ questa e’ pigrizia di implementazione, non un limite di design; incron + git risolverebbe egregiamente)
  • Gestione del locking: per richiedere il lock dovremmo fare una richiesta e attendere la risposta, ma noi non vogliamo
  • Scalabilita’: assumiamo che il contenuto sia “piccolo”

La risposta e’ nowiki, un wiki che viola qualsiasi “best practice”: carica tutti i css, i javascript, le immagini (con base64encode) e tutte le pagine in un’unica pagina html. La navigazione quindi non richiede nessun altro caricamento. L’edit e’ gestito con javascript e, fino alla PUT per aggiornare i dati, non avviene nessuna richiesta.

Infine, dopo il connubio nerd-documentazione, eccovi un video di altre accoppiate improbabili: