Project

General

Profile

Segnalazione #85

Debian packaging

Added by Christopher R. Gabriel over 5 years ago. Updated over 5 years ago.

Status:
Chiuso
Priority:
Normale
Assignee:
Start date:
11/23/2016
Due date:
% Done:

100%


Description

Realizzare pacchetto debian per octonet.

Non deve dipendere da octofussd, solo da pyoctofuss (pacchetto python3-octofuss)

Il pacchetto deve contere i locale compilati, e una volta installato deve avviare il servizio automaticamente tramite unit systemd, in ascolto sulla porta 13402 (default vecchio, per cui i fw hanno gia' aperture)

Associated revisions

Revision aa95a2e5 (diff)
Added by Enrico Zini over 5 years ago

Added setup.py and autogenerated debian/ from it. refs: #85

Revision d27722fb (diff)
Added by Enrico Zini over 5 years ago

Use python3, added include filters for package data. refs: #85

Revision cf5adccc (diff)
Added by Enrico Zini over 5 years ago

Package a python3 program instead of a python2 module. refs: #85

Revision 7efdca5c (diff)
Added by Enrico Zini over 5 years ago

Updated message catalogs. refs: #85

Revision 34e847c5 (diff)
Added by Enrico Zini over 5 years ago

Install locale files. refs: #85

Revision 937238dc (diff)
Added by Enrico Zini over 5 years ago

New language catalogs. refs: #85

Revision 64000db2 (diff)
Added by Enrico Zini over 5 years ago

Also package manage.py. refs: #85

Revision ca405131 (diff)
Added by Enrico Zini over 5 years ago

Do not package local_settings.py. refs: #85

Revision 96c73c25 (diff)
Added by Enrico Zini over 5 years ago

Manage /var/cache/octonet. refs: #85

Revision 6bbb795f (diff)
Added by Enrico Zini over 5 years ago

Install systemd service to run octonet via gunicorn3. refs: #85

Revision d638d371 (diff)
Added by Enrico Zini over 5 years ago

Updated unit file after /usr/share/doc/gunicorn-examples/examples/gunicorn-mysite.service. refs: #85

Revision e7ee27dc (diff)
Added by Enrico Zini over 5 years ago

Package an initial apache configuration. refs: #85

Revision d62a0b3a (diff)
Added by Enrico Zini over 5 years ago

Deploy with FORCE_SCRIPT_NAME to work in a sub-url. refs: #85

Revision a50a33c3 (diff)
Added by Enrico Zini over 5 years ago

Use reverse_lazy, because reverse would be called too early to get things right. refs: #85

Revision aae1aa64 (diff)
Added by Enrico Zini over 5 years ago

Collect static files and serve them via apache. refs: #85

Revision 5310f7e7 (diff)
Added by Enrico Zini over 5 years ago

Use the right reverse function. refs: #85

Revision 3129ec97 (diff)
Added by Enrico Zini over 5 years ago

Completely ignore all apache config if mod_proxy is not available. refs: #85

Revision 2c683cdc (diff)
Added by Enrico Zini over 5 years ago

Assume it's running again at / instead of /octofuss. refs: #85

Revision 0ac1b805 (diff)
Added by Enrico Zini over 5 years ago

Use Whitenoise to serve static files. refs: #85

Revision 74b3eba1 (diff)
Added by Enrico Zini over 5 years ago

Do not ship apache configuration snippet. refs: #85

Revision d345b7cc (diff)
Added by Enrico Zini over 5 years ago

Use /etc/octonet.conf as extra settings, and generate a secret key for it. refs: #85

Revision dd99dbc0
Added by Enrico Zini over 5 years ago

Added Debian packaging. Fixes #85

History

#1 Updated by Christopher R. Gabriel over 5 years ago

Ricordarsi di esplicitare la dipendenza da python3-django >= 1.8, che viene da backports, altrimenti con la 1.7 standard di jessie ci sono problemi (non compatibile)

#2 Updated by Enrico Zini over 5 years ago

  • Assignee set to Enrico Zini

#3 Updated by Enrico Zini over 5 years ago

Documentazione di riferimento: https://wiki.debian.org/DjangoPackagingDraft

#6 Updated by Enrico Zini over 5 years ago

  • translation missing: en.field_checklist set to [ ] Packaging dei file in /usr/share/octonet, [ ] Gestione directory per la cache in /var/cache/octonet, [ ] Aggiunta configurazione per deploy apache+wsgi in /etc/apache2/sites-available, [ ] Attivazione configurazione di apache al momento dell'installazione

#7 Updated by Enrico Zini over 5 years ago

  • translation missing: en.field_checklist changed from [ ] Packaging dei file in /usr/share/octonet to [x] Packaging dei file in /usr/share/octonet

#8 Updated by Enrico Zini over 5 years ago

  • translation missing: en.field_checklist changed from [ ] Gestione directory per la cache in /var/cache/octonet to [x] Gestione directory per la cache in /var/cache/octonet

#9 Updated by Christopher R. Gabriel over 5 years ago

Rileggendo anche la descrizione del ticket, mi ero dimenticato l'altro giorno dell'aspetto dei firewall: dobbiamo metterlo in ascolto su 13402, e poi forniamo il pezzo per apache2/conf.d per il reverse proxy dal vhost 'octofuss'. Ma almeno e' accessibile da entrambi i canali.

Per il deploy, gunicorn3 funziona molto bene, e ha il suo supporto (gunicorn3-debian e relativa conf.d) per fornire snippet di configurazione per l'avvio/stop del servizio

#11 Updated by Enrico Zini over 5 years ago

@cgabriel, non trovo il pacchetto gunicorn3-debian. Mi puoi mandare uno snippet di configurazione d'esempio per lo start/stop di un servizio django?

#12 Updated by Christopher R. Gabriel over 5 years ago

  • Status changed from Nuovo to Commenti

Scusa, gunicorn3-debian e' il comando per fare start/stop, e' contenuto nei pacchetti gunicorn3/python3-gunicorn.

Questo lo snippet che ho creato per l'installazione demo di octonet, che poi vorrei sostituire con quella fornita dal pacchetto:

natalia:~# cat /etc/gunicorn.d/octonet 
CONFIG = {
    'mode': 'wsgi',
    'working_dir': '/var/lib/octofuss/octonet/',
    'python': '/usr/bin/python3',
    'user': 'www-data',
    'group': 'www-data',
    'args': (
        '--bind=127.0.0.1:8091',
        '--workers=4',
        'octonet.wsgi',
    ),
}

#13 Updated by Enrico Zini over 5 years ago

Sull'attuale testing, nessuno di quei due pacchetti contiene gunicorn3-debian. L'ho cercato anche in packages.debian.org ma non trovo un pacchetto che lo fornisca.

Intanto, in 6bbb795f ho aggiunto una unit di systemd per far partire il server via gunicorn3.

Hai uno snippet di apache pronto per fare il reverse proxy, da qualche altro progetto?

#14 Updated by Christopher R. Gabriel over 5 years ago

Enrico Zini ha scritto:

Sull'attuale testing, nessuno di quei due pacchetti contiene gunicorn3-debian. L'ho cercato anche in packages.debian.org ma non trovo un pacchetto che lo fornisca.

Ti rammento che l'attuale target e' stable, incluso backports:

cgabriel@filippone ~ $ apt-cache policy python3-debian gunicorn3
python3-debian:
  Installed: 0.1.27
  Candidate: 0.1.27
  Version table:
 *** 0.1.27 0
        500 http://httpredir.debian.org/debian/ jessie/main amd64 Packages
        100 /var/lib/dpkg/status
gunicorn3:
  Installed: (none)
  Candidate: 19.6.0-2~bpo8+1
  Version table:
     19.6.0-2~bpo8+1 0
        100 http://httpredir.debian.org/debian/ jessie-backports/main amd64 Packages

Intanto, in 6bbb795f ho aggiunto una unit di systemd per far partire il server via gunicorn3.

Hai uno snippet di apache pronto per fare il reverse proxy, da qualche altro progetto?

Da altri progetti no, te lo scrivo qui:

<Location /octofuss>
        <Directory /var/lib/FIXME/DIR/WITH/CODE>
                Options -Indexes
                AllowOverride None
                Require all granted
        </Directory>

        Alias /static/ /var/lib/FIXME/PATH/TO/COLLECTED/STATIC
        ProxyPass /static !
        ProxyPass / http://127.0.0.1:13402/
        ProxyPassReverse / http://127.0.0.1:13402/
        ProxyPreserveHost On

</Location>

da testare poi, scritto a braccio. Lo snippet da piazzare direi in /etc/apache2/conf.d/

#15 Updated by Enrico Zini over 5 years ago

https://packages.debian.org/search?searchon=contents&keywords=gunicorn3-debian&mode=exactfilename&suite=stable&arch=any
mi dice:
"You have searched for files named gunicorn3-debian in suite jessie, all sections, and all architectures. Sorry, your search gave no results"

Ad ogni modo, sembra basti systemd.

#16 Updated by Christopher R. Gabriel over 5 years ago

Non so che dirti, guarda qua su stable:

natalia:~# dpkg -S gunicorn3-debian 
gunicorn3: /usr/share/man/man8/gunicorn3-debian.8.gz
gunicorn3: /usr/sbin/gunicorn3-debian

natalia:~# apt-cache policy gunicorn3
gunicorn3:
  Installed: 19.6.0-2~bpo8+1
  Candidate: 19.6.0-2~bpo8+1
  Version table:
 *** 19.6.0-2~bpo8+1 0
        100 http://httpredir.debian.org/debian/ jessie-backports/main i386 Packages
        100 /var/lib/dpkg/status
natalia:~# 

Forse packages non cerca in backports?

#17 Updated by Enrico Zini over 5 years ago

Confermo, al momento esiste solo in backports. Il nuovo gunicorn dice questo:

$ cat /usr/share/doc/gunicorn/README.Debian
README.Debian for gunicorn
==========================

The /etc/gunicorn.d (and related usr/sbin/gunicorn{,3}-debian) scripts were
removed in 19.6.0-3 due to inflexibility, lack of documentation, not
adopted/supported upstream, did not work with virtualenvs, etc.

They were dropped prior to the stretch release to avoid having to support it
for another full release.

Users relying on this feature should invoke gunicorn manually. For an example
systemd .service file, please see the ``gunicorn-mysite.service`` file in the
gunicorn-examples package or a process manager such as runit, etc.

 -- Chris Lamb <lamby@debian.org>  Thu, 06 Oct 2016 19:45:15 +0100

Quindi direi che possiamo stare sulla configurazione di systemd che ho già fatto e funziona.

#18 Updated by Christopher R. Gabriel over 5 years ago

Ottimo! Allora non vedo l'ora di poterla usare cosi' elimino gunicorn3-debian :D

#19 Updated by Enrico Zini over 5 years ago

In e7ee27dc ho aggiunto una configurazione iniziale per apache. Ha due problemi:

1. se il modulo proxy_http non è attivo, non parte. Non ho trovato ancora un modo per far attivare il modulo mod_proxy_http all'installazione del pacchetto. Lo aggiungo alla checklist.
2. django è fatto per girare come http://sito/ e non come http://sito/octonet/. Questo vuol dire che se al momento vado su http://localhost/octonet lui mi ridirige su http://localhost/login/?next=http%3A//localhost/.

Per risolvere il secondo punto, la soluzione consigliata è fare un NameVirtualHost http://octonet.sito, però significa che in fase di deploy c'è da assicurarsi che il dominio risolva, e da chiedere il nome del dominio per metterlo nel file.

In alternativa, si cambia il root urlconf per avere tutto sempre sotto a /octonet. Procedo con questa seconda ipotesi?

#20 Updated by Enrico Zini over 5 years ago

  • translation missing: en.field_checklist changed from [x] Packaging dei file in /usr/share/octonet, [x] Gestione directory per la cache in /var/cache/octonet, [ ] Aggiunta configurazione per deploy apache+wsgi in /etc/apache2/sites-available, [ ] Attivazione configurazione di apache al momento dell'installazione to [x] Packaging dei file in /usr/share/octonet, [x] Gestione directory per la cache in /var/cache/octonet, [ ] Aggiunta configurazione per deploy apache+wsgi in /etc/apache2/sites-available, [ ] Attivazione configurazione di apache al momento dell'installazione, [ ] Attivare mod_proxy_http al momento dell'installazione

#21 Updated by Enrico Zini over 5 years ago

Ho risolto il punto 2 con FORCE_SCRIPT_NAME: https://docs.djangoproject.com/en/1.8/ref/settings/#force-script-name

Cosí va da apache, ma genera URL sbagliati se uno visita direttamente http://localhost:13402/

Al momento non ho idea se sia possibile far andare entrambi

#22 Updated by Enrico Zini over 5 years ago

...forse pastrugnando con un middleware? Bisogna vedere come django gestisce FORCE_SCRIPT_NAME, e se vale la pena lavorare per far andare entrambi i casi.

#23 Updated by Enrico Zini over 5 years ago

  • translation missing: en.field_checklist changed from [ ] Aggiunta configurazione per deploy apache+wsgi in /etc/apache2/sites-available to [x] Aggiunta configurazione per deploy apache+wsgi in /etc/apache2/sites-available

#24 Updated by Enrico Zini over 5 years ago

  • translation missing: en.field_checklist changed from [ ] Attivazione configurazione di apache al momento dell'installazione to [x] Attivazione configurazione di apache al momento dell'installazione

#25 Updated by Enrico Zini over 5 years ago

Ora gestisce anche gli static file. Manca solo attivare mod_proxy e mod_proxy_http a tempo di installazione.

#26 Updated by Enrico Zini over 5 years ago

Riguardo a mod_proxy, ho cercato un po' e ho trovato questo:

enrico> codehelp: I'm studying lava-server's debian/ dir because I have a similar case at hand (django website to be packaged deployed with gunicorn3 and mod_proxy). How do you make sure mod_proxy and mod_proxy_http are loaded by apache?
enrico> codehelp: (if you do)
codehelp> enrico: not part of the packaging - it's a documented installation step
enrico> codehelp: ack, thanks

"A documented installation step" conflitta con la richiesta di avere octonet che è installato e va.

Vuoi che aggiunga una domanda di debconf "attivo mod_proxy?" con default a no, che poi uno lo mette a si coi preseeding, o anche quello è un passo in piú che crea fastidio?

In alternativa, chiamo a2enmod proxy_http in postinst, e il pacchetto avrà il side effect che se lo installo e lo purgio, mi ritrovo con mod_proxy attivo in apache.

#27 Updated by Enrico Zini over 5 years ago

  • translation missing: en.field_checklist changed from [x] Packaging dei file in /usr/share/octonet, [x] Gestione directory per la cache in /var/cache/octonet, [x] Aggiunta configurazione per deploy apache+wsgi in /etc/apache2/sites-available, [x] Attivazione configurazione di apache al momento dell'installazione, [ ] Attivare mod_proxy_http al momento dell'installazione to [x] Packaging dei file in /usr/share/octonet, [x] Gestione directory per la cache in /var/cache/octonet, [x] Aggiunta configurazione per deploy apache+wsgi in /etc/apache2/sites-available, [x] Attivazione configurazione di apache al momento dell'installazione, [ ] Attivare mod_proxy_http al momento dell'installazione, [ ] Far servire i file statici a gunicorn3

Consenso dopo telefonata: il pacchetto si occupa di tirar su tutto che giri correttamente con gunicorn, e aggiunge una configurazione opzionale per apache che lo serve via mod_proxy_http con il rewrite degli url

#28 Updated by Enrico Zini over 5 years ago

gunicorn non supporta il servire file statici, e Django in teoria nemmeno a meno di non fare una porcheria: http://stackoverflow.com/questions/12800862/how-to-make-django-serve-static-files-with-gunicorn

In alternativa si può dipendere da WhiteNoise (http://whitenoise.evans.io/en/stable/), che però non c'è in jessie.

#29 Updated by Christopher R. Gabriel over 5 years ago

Farli servire a django direttamente, aggiungendo

from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns()

Visto il tipo di deploy, non lo vedo problematico, no?

#30 Updated by Enrico Zini over 5 years ago

Uploadati backport di python-whitenoise e python3-whitenoise nel nostro repository reprepro.

#31 Updated by Christopher R. Gabriel over 5 years ago

Messi anche nel repository FUSS, che e' quello che viene utilizzato

#32 Updated by Enrico Zini over 5 years ago

Altra documentazione di riferimento:
https://code.djangoproject.com/wiki/SplitSettings

#33 Updated by Enrico Zini over 5 years ago

  • translation missing: en.field_checklist changed from [ ] Far servire i file statici a gunicorn3 to [x] Far servire i file statici a gunicorn3

#34 Updated by Enrico Zini over 5 years ago

Fatto usando /etc/octonet.conf come altro nuovo settings.py. All'installazione, viene fatto girare il management command makesecret che genera un SECRET_KEY nel file se non è ancora stato fatto.

#35 Updated by Anonymous over 5 years ago

  • Status changed from Commenti to Risolto
  • % Done changed from 0 to 100

#36 Updated by Enrico Zini over 5 years ago

  • Status changed from Risolto to Chiuso

Also available in: Atom PDF