Autorisations de fichiers pour Django: Gunicorn, Nginx et Static Files

J’ai une machine standard Ubuntu 14.04. Je l’utilise quotidiennement sous l’utilisateur mh00h . Je souhaite utiliser cette machine en tant que serveur de production. Comment gérer les permissions de fichiers pour Django et Nginx?

Nginx est actuellement configuré pour fonctionner sous www-data:www-data . Cela minimise le risque que le rest d’une machine soit compromis. Django / gunicorn devrait également fonctionner sous un utilisateur autre que mh00h . Mais sous quel utilisateur gunicorn devrait-il réellement être exécuté? nobody , correct?

Suivant: Je stocke tous mes fichiers de développement Web sous /home/mh00h/development . Possédé par mh00h . /home/mh00h/development/project1 (plus all dir/files but /media and /static) ? Possédé par mh00h . Je suis les meilleures pratiques de django à deux scoops pour créer un répertoire de projet contenant des fichiers statiques. Bien sûr, Nginx ne peut plus accéder à /home/mh00h/development/project1/project1/static maintenant, car tous ces répertoires parents appartiennent à mh00h , et non www-data ( ./static appartient à www-data ).

Pour compliquer les choses, virtualenvwrapper crée mes environnements virtuels sous /home/mh00h/.virtualenvs/ .

J’hésite à me séparer des deux meilleures pratiques de scoop et à stocker /static séparément dans /var/www , car je souhaite que tous ces répertoires restnt bien groupés pour faciliter leur transport vers un autre serveur ultérieurement. De plus, cela me rend malpropre si je me compare à la façon dont les deux scoops l’ont fait.

  1. Où mes fichiers statiques doivent-ils être stockés?
  2. Où les fichiers spécifiques à Django doivent-ils être stockés?
  3. Quels utilisateurs / groupes devraient pouvoir accéder à ceux de 1 et 2?
  4. Où les environnements virtualenvwrapper doivent-ils être stockés?
  5. Quelles permissions ces sites doivent-ils posséder?

Je vous remercie.

Tous les fichiers et répertoires de notre environnement de production appartiennent à root:root avec des permissions de fichier 755/644, sauf si cela est requirejs autrement. Certains fichiers privés (pensez aux clés privées, etc.) ne sont lisibles que par l’utilisateur / processus qui en a besoin, tout en restant accessibles en écriture uniquement par root .

En ce qui concerne la structure du projet: tous nos projets ont un répertoire dédié sous /srv/www/vhosts.d/ . Les environnements virtuels sont stockés sous /srv/www/virtualenvs . Il est parfaitement possible de les stocker dans votre dossier personnel, mais j’estime que cette approche centrale correspond davantage à l’idée d’un serveur de production. Avec les bons parameters, tous les envs virtuels sont également accessibles par tous les utilisateurs.

Notre répertoire principal de projet contient plusieurs scripts (manage.py et plusieurs scripts de déploiement / mise à jour) et est divisé en sous-répertoires: web contient des fichiers publics, src contient le code source et frontend contient le dossier modèle et le dossier sass. L’ensemble du répertoire du projet est contenu dans un référentiel git, mais les fichiers spécifiques au déploiement (fichiers téléchargés par l’utilisateur, index de recherche, clés de chiffrement) sont tous dans .git-ignore .

Notre processus nginx s’exécute en tant que www-data . En général, chaque projet Django a son propre utilisateur et le processus gunicorn s’exécute en tant qu’utilisateur.