Scripts for WebSite.

Warning : This is a pre-alpha version, which does not use PostgreSQL yet.

New hosted domain

NB : a new hosted domain is for example bidule.com ; a new site called bla for the bidule.com domain (i.e. http://bla.bidule.com), is not a new hosted domain in frangipane's language.

Directories initialization

In the web VM.

  • mkdir /var/www/$DOMAIN
  • chmod 0755 /var/www/$DOMAIN
  • set the default ACL for newly created files :
    • setfacl -m d:user:www-data:rX /var/www/$DOMAIN
    • setfacl -m d:group::0000 /var/www/$DOMAIN
    • setfacl -m d:other:0000 /var/www/$DOMAIN

Etc.

Hosting a new domain bidule.com implies to :

  • host a new website as well : the root website for this domain, that has to be created as explained next
  • set up some non-www-related stuff, see Scripts

Web site creation

DNS and email

A new website means a new sub-domain, for example site.domain.tld, which has to be created first :

  • add a DNS A record for SITE.DOMAINE.TLD, pointing to the web VMs public IP ; /etc/bind/db.DOMAIN.TLD
  • add a DNS MX record, pointing to the domain managing email for hosted domains ; /etc/bind/db.DOMAIN.TLD
  • set up some non-www-related stuff, as explained on Scripts.

Unix user and group

Chaque site va correspondre à un user et un groupe Unix, portant le même nom, qu'il faut donc créer avant toute chose. Le nom de l'user (USER) se construit sur la base DOMAINE.SITE en remplaçant tout les . par des _, ex : infokiosques_net, infokiosques_net_dev, gendertrouble_org_motenai, etc.

Cet utilisateur doit être créé en double, un sur le serveur web pour le site, et l'autre sur la VM d'accès sftp des webmasters, et évidemment avec les mêmes valeurs de UID/GID. Les seules différences entre les 2 sont juste :

  • le chemin du $home des users, puisque sur la VM web, home=/var/www/DOMAIN.TLD/SITE, et sur la VM webmaster, /home/webmasters/DOMAIN.TLD/SITE
  • Sur la VM web qui fait tourner apache/mysql/php, les users n'ont pas de shell, alors que si on veut leur donner un accès au serveur webmaster faut bien qu'on leur en mette un...

Donc pour mettre tout ça en place:

  • choisir un UID=GID : prendre le plus petit nombre dispo au-dessus de 10000
  • créer l'user sur la VM web :
    • addgroup --gid GID --force-badname USER
    • adduser --home /var/www/DOMAIN/SITE --shell /bin/false --uid UID --gid GID --force-badname --disabled-password USER
    • effacer, dans /var/www/DOMAIN/SITE, les fichiers que adduser a copiés de /etc/skel/
  • créer l'user sur la VM webmaster :
    • addgroup --gid GID --force-badname USER
    • adduser --home /home/webmasters/DOMAIN.TLD/SITE --shell /usr/lib/openssh/sftp-server --uid UID --gid GID --force-badname USER
  • Vérifier/corriger si on est pas sûrE dans les /etc/passwd de chaque vm que l'user a bien les meme UID/GID
  • créer ses aliases mail USER@web.boum.org et USER@webmasters.boum.org, pointant vers webmaster@SITE.DOMAINE.TLD , dans /etc/postfix/valias, tout à la fin du fichier, dans la section "UIDs créés par le groupe Apache" ; puis lancer sudo postmap /etc/postfix/valias pour que les modifications soient prises en compte.

Répertoire du site

Situé sur la VM web.

Les sites ouèbes sont rangés dans un répertoire de la forme /var/www/DOMAINE/SITE avec SITE='root' pour la racine du domaine. Par exemple /var/www/gendertrouble.org/root/ pour le site http://gendertrouble.org/ et /var/www/gendertrouble.org/motenai/ pour http://motenai.gendertrouble.org.

Ce répertoire est créé automatiquement à l'étape précédente par la commande adduser, avec le bon propriétaire, le bon groupe propriétaire.

Set the correct Unix permissions :

  • find /var/www/$DOMAIN/$SITE -type d -exec chmod 700 {} \;
  • find /var/www/$DOMAIN/$SITE -type f -exec chmod 600 {} \;

Set the ACL :

  • setfacl -R -m user:www-data:rX /var/www/$DOMAIN/$SITE
  • setfacl -R -m d:user:www-data:rX /var/www/$DOMAIN/$SITE

Les confs php sont faites en sorte que chaque site met ses fichiers temporaires d'upload et de sessions dans des répertoires qui lui sont propres, il faut donc les créer, sur web:

mkdir -p /var/tmp/frangipane/$DOMAIN/$SITE/php/{upload,sessions}
chmod -R 700 /var/tmp/frangipane/$DOMAIN/$SITE
chown -R UID GID /var/tmp/frangipane/$DOMAINE/$SITE
# cf plus haut pour ce qui est des noms d'utilisateurices

Last but not least, il faut créer un joli lien symbolique dans le home du user sur la VM webmaster vers le /var/www/DOMAIN/SITE de cette VM (puisqu'on y a monté le /var/www de la VM web)

  • ln -s /var/www/DOMAIN/SITE /home/webmasters/DOMAIN/SITE/www

Fichier de configuration Apache

Sur la VM web bien sûr :]

Le fichier de configuration Apache de chaque site se trouve dans /etc/apache2/sites-available/SITE.DOMAINE.TLD. Pour en créer un nouveau il faut partir de celui de maisondelagreve.boum.org, qui est bien fignolé et a le SSL activé, et y remplacer :

  • 'boum.org' par le nom de domaine du site
  • 'maisondelagreve' par le nom du site

C'est pas franchement plus compliqué pour l'instant...

TODO : trouver comment n'activer PHP que si le site en a besoin... cf WebSite et Discussion, c'est là bas qu'on y réfléchit.

PHP configuration

On the web VM...

  • create /etc/php5/fpm/pool.d/SITE.DOMAIN.conf, by copying /etc/php5/fpm/pool.d/gendertrouble.org.conf, and adapting; searching 'gendertrouble' in the copied file can help.

MySQL

On the mailsql VM, create :

Example :

mysql> create database ea82d45e016c7e19;
mysql> GRANT ALL ON ea82d45e016c7e19.* TO 'ea82d45e016c7e19'@'localhost' IDENTIFIED BY 'MOT_DE_PASSE' ;
mysql> GRANT ALL ON ea82d45e016c7e19.* TO 'ea82d45e016c7e19'@'web.boum.org' IDENTIFIED BY 'MOT_DE_PASSE' ;

Service d'upload des sites

Ben ça se fait grâce à l'accés à la VM webmaster où tous les fichiers nécessaires sont montés (cf WebSite et Discussion).

L'aide utilisateurice à ce sujet est sur https://aide.boum.org/AutoAideWeb.

Activer le site

sur la VM web :

sudo a2ensite SITE.DOMAIN.TLD && sudo /etc/init.d/apache2 reload

Logs

Si les webmasters du site souhaitent avoir accès aux logs de leur site, on peut leur mettre à dispo dans leur home sur la VM webmasters en suivant ces instructions.

Apache

Apache envoie ses logs au syslog-ng sur la VM logs, qui écrit deux fichiers de logs :

  • un fichier qui logue les erreurs sur le site : /var/log/frangipane/web/SITE.DOMAIN.TLD/apache/error.log
  • un fichier qui logue les accès au site /var/log/frangipane/web/SITE.DOMAIN.TLD/apache/access.log

syslog-ng se charge tout seul de créer le répertoire /var/log/frangipane/web/SITE.DOMAIN.TLD/apache/ dans la VM logs, à la première visite.

Le répertoire de logs du site est monté dans le home du webmaster correspondant dans la VM webmaster ; au démarrage, ça se fait tout seul, mais à la création d'un site il faut :

Le répertoire de logs du site est monté dans le home du webmaster en l'exportant via nfs depuis la VM logs.

  • créer, en tant que root, le répertoire webmasters:/home/webmasters/$DOMAIN/$SITE/log
  • ajouter la bonne ligne qu'il faut dans /etc/exports sur logs
  • ajouter la bonne ligne qu'li faut dans le /etc/fstab de webmasters

Then restart the webmasters VM so that this bind mount is seen inside it.

Migrate website to Git + sftp

addgroup --gid 10037 --force-badname  nio

sur web :

adduser --home /var/www/indymedia.org/newnantes \
  --shell /bin/false --uid 10036 --gid 10037 \
  --force-badname --disabled-password nio_git
# effacer le contenu de /var/www/indymedia.org/newnantes
adduser --home /var/lib/frangipane/web/indymedia.org/newnantes \
  --shell /bin/false --uid 10037 --gid 10037 \
  --force-badname --disabled-password nio_ftp
# effacer le contenu de /var/lib/frangipane/web/indymedia.org/newnantes

sur webmasters :

adduser --home /home/webmasters/indymedia.org/nio_git \
  --shell /usr/bin/git-shell \
  --uid 10036 --gid 10037 --force-badname --disabled-password nio_git
adduser --home /home/webmasters/indymedia.org/nio_ftp \
  --shell /usr/lib/openssh/sftp-server \
  --uid 10037 --gid 10037 --force-badname --disabled-password nio_ftp

sur web :

find /var/www/indymedia.org/newnantes -type d -exec chmod 700 {} \;
find /var/www/indymedia.org/newnantes -type f -exec chmod 600 {} \;
setfacl -R -m user:www-data:rX /var/www/indymedia.org/newnantes
setfacl -R -m d:user:www-data:rX /var/www/indymedia.org/newnantes
find /var/lib/frangipane/web/indymedia.org/newnantes -type d -exec chmod 700 {} \;
find /var/lib/frangipane/web/indymedia.org/newnantes -type f -exec chmod 600 {} \;
setfacl -R -m user:www-data:rX /var/lib/frangipane/web/indymedia.org/newnantes
setfacl -R -m d:user:www-data:rX /var/lib/frangipane/web/indymedia.org/newnantes

setfacl -R -m user:nio_ftp:rX /var/www/indymedia.org/newnantes
setfacl -R -m d:user:nio_ftp:rX /var/www/indymedia.org/newnantes

sur web, répertoires temporaires PHP :

mkdir -p /var/tmp/frangipane/indymedia.org/nantesnew/php/{upload,sessions}
chmod -R 700 /var/tmp/frangipane/indymedia.org/nantesnew
chown -R 10037:10037 /var/tmp/frangipane/indymedia.org/nantesnew

sur webmasters :

for i in git ftp ; do
  chown root:nio /home/webmasters/indymedia.org/nio_${i}
  chmod 750  /home/webmasters/indymedia.org/nio_${i}
  mkdir /home/webmasters/indymedia.org/nio_${i}/.ssh
  # y mettre authorized_keys
  chown -R root:nio /home/webmasters/indymedia.org/nio_${i}/.ssh
  chmod -R g-w,g+rX,o-rwx  /home/webmasters/indymedia.org/nio_${i}/.ssh
done

mounter ~nio_ftp de web vers webmasters :

  • sur webmasters :

    mkdir /home/webmasters/indymedia.org/nio_ftp/www

  • éditer /etc/fstab et bind mounter /var/www/indymedia.org/newnantes dans le nouveau répertoire www.
  • puis redémarré webmasters pour que ce soit pris en compte

dans webmasters:

# Oscailt
FTPDIRS="cache logs attachments"
### or
# SPIP
FTPDIRS="IMG local tmp"

cd /var/www/indymedia.org/newnantes
git init
chown -R nio_git:nio_git .git
chmod o-rwx .git
sudo -u nio_git mkdir $FTPDIRS
chown o-rwx *
for dir in $FTPDIRS ; do echo "/${dir}/" >> .gitignore ; done
chown nio_git:nio .gitignore
chmod o-rwx .gitignore
sudo -u nio_git git add .gitignore
sudo -u nio_git git commit -m 'Ignorer les repertoires non-Git'

sur web :

# Oscailt
FTPDIRS="cache logs attachments"
### or
# SPIP
FTPDIRS="IMG local tmp"

for dir in $FTPDIRS ; do
  sudo -u nio_ftp mkdir "/var/lib/frangipane/web/indymedia.org/newnantes/${dir}"
done

sur l'hôte :

# Oscailt
FTPDIRS="cache logs attachments"
### or
# SPIP
FTPDIRS="IMG local tmp"

for dir in $FTPDIRS ; do
  mount --bind -o acl \
    /var/lib/vservers/web/var/lib/frangipane/web/indymedia.org/newnantes/${dir} \
    /var/lib/vservers/web/var/www/indymedia.org/newnantes/${dir}
done

puis redémarré web pour que ce soit pris en compte, et ajouté cette commande à /etc/init.d/boum-mountall.sh

Mis un hook Git post-update dans /var/www/indymedia.org/newnantes/.git/hooks/, pris sur http://utsl.gen.nz/git/post-update, pour que la working copy (qui n'est pas bare) soit mise à jour lorsqu'on pousse des modifs dessus. Rendu le hook exécutable.

copier le contenu des répertoires non Git

copier le reste du vieux site dans le Git, git add et git commit

adapter les jobs procreaper

logs : sur webmasters, faire un lien symbolique depuis l’endroit où les logs seront montés vers l’endroit où les webmasters peuvent les regarder ; cf. les sites fastcgi existants, comme exemples.

nettoyer vieux site : - désactiver login sftp anciens sites - ...

Web site importation

First, create the new site instance, without enabling it. Then, on the web VM...

Import files

Copy the files into the new empty web site directory :

tar -cf- --one-file-system -C OLD_WEB_SITE/ . | tar -xf- -C /var/www/$DOMAIN/$SITE -p

Set the correct owner/group on imported files :

chown -R $USER.$USER /var/www/$DOMAIN/$SITE

Set the correct Unix permissions :

find /var/www/$DOMAIN/$SITE -type d -exec chmod 700 {} \;
find /var/www/$DOMAIN/$SITE -type f -exec chmod 600 {} \;

Set the ACL :

setfacl -R -m user:www-data:rX /var/www/$DOMAIN/$SITE
setfacl -R -m d:user:www-data:rX /var/www/$DOMAIN/$SITE

Import MySQL database

If not already done, dump the database on the old server : mysqldump -u root -p NOM_DE_LA_BASE > /tmp/mysqldump

Then, on the mailsql VM :

$ mysql -u root -p NOM_DE_LA_BASE
mysql> source DUMP_FILE;

Web site deletion

DNS and emails

Remove all entries for the hosted website in the dns (if we host it), and all mail aliases for the site in the corresponding postfix valias file.

Mounted directories

You have to unmount the logs in the home directory of the site's user in the webmasters VM if they are there:

umount /var/lib/vservers/webmasters/home/webmasters/$DOMAIN/$SITE/log

Apache

Sur la VM web,

  • Desactiver le site: sudo a2dissite $SITE.$DOMAIN.$TLD ; sudo /etc/init.d/apache2 reload
  • Supprimer la conf du vhost correspondant: =rm -f /etc/apache2/site-available/$SITE.$DOMAIN.$TLD
  • Supprimer la conf php: sudo rm -rf /etc/php5/suphp/$DOMAIN/$SITE (ou sudo rm -rf /etc/php5/suphp/$DOMAIN s'il s'agissait du site du domaine)

Mysql

Supprimer la base de données et l'utilisateurice dans le mysql de la VM mailsql:

mysql -u root -p mysql
mysql> select User from db where Db="DOMAIN_TLD_SITE";

Vous obtenez l'identifiant $USER correspondant au site pour mysql, utilisez le pour supprimer toute references a ce site:

mysql> delete from user where User="$USER";
mysql> delete from db where User="$USER";
mysql> drop database DOMAIN_TLD_SITE;

Users

Sur les 2 VMs, il vous faut supprimer l'utilisateurice pour le site

Files

Il faut supprimer le home de l'utilisateurice dans la VM webmasters et le repertoire correspondant au site dans /var/www/$DOMAIN/$SITE (ou juste /var/www/$DOMAIN si c'etait le site du domaine). Il faut egalement se debarasser des logs d'apache dans /var/log/frangipane/web/$DOMAINE/$SITE

On the web VM, delete /var/tmp/frangipane/$DOMAINE_PARENT/$SITE/php/{upload,sessions}.

Note: actuellement la suppression du home dans la VM webmasters semble problematique: la commande echoue car le repertoire log/ semblerait etre utilise, meme si lsof ne renvoie rien...)