Git Repositories

Commit Initial
authorCyrille Pontvieux <cyrille.pontvieux@april-waf.com>
Fri, 5 Jul 2013 07:50:30 +0000 (09:50 +0200)
committerCyrille Pontvieux <cyrille.pontvieux@april-waf.com>
Fri, 5 Jul 2013 07:50:30 +0000 (09:50 +0200)
54 files changed:
.gitignore [new file with mode: 0644]
Animeka/Installation.txt [new file with mode: 0644]
Animeka/Installation/Bases_de_données.txt [new file with mode: 0644]
Animeka/Installation/Bases_de_données/MySql.txt [new file with mode: 0644]
Animeka/Installation/Bases_de_données/MySql/mysqld_multi [new file with mode: 0755]
Animeka/Installation/Bases_de_données/PhpMyAdmin.txt [new file with mode: 0644]
Animeka/Installation/Bases_de_données/Sqlite.txt [new file with mode: 0644]
Animeka/Installation/Noyau_Linux.txt [new file with mode: 0644]
Animeka/Installation/Réseau.txt [new file with mode: 0644]
Animeka/Installation/SSL.txt [new file with mode: 0644]
Animeka/Installation/SSL/ssl-Animeka-2012.tar.xz [new file with mode: 0644]
Animeka/Installation/SSL/ssl-Animeka-2013.tar.xz [new file with mode: 0644]
Animeka/Installation/SSL/sslmanager-1.1.tar.gz [new file with mode: 0644]
Animeka/Installation/SSL/sslmanager-1.2.tar.gz [new file with mode: 0644]
Animeka/Installation/Serveur_Web.txt [new file with mode: 0644]
Animeka/Installation/Serveur_Web/Apache.txt [new file with mode: 0644]
Animeka/Installation/Serveur_Web/Apache/default [new file with mode: 0644]
Animeka/Installation/Serveur_Web/Apache/default-pages/.testmysql.inc [new file with mode: 0644]
Animeka/Installation/Serveur_Web/Apache/default-pages/index.html [new file with mode: 0644]
Animeka/Installation/Serveur_Web/Apache/default-pages/testmysql.php [new file with mode: 0644]
Animeka/Installation/Serveur_Web/Apache/default-pages/testphp.php [new file with mode: 0644]
Animeka/Installation/Serveur_Web/Apache/mkvhost [new file with mode: 0755]
Animeka/Installation/Serveur_Web/Apache/vhostforcessl [new file with mode: 0755]
Animeka/Installation/Serveur_Web/Php.txt [new file with mode: 0644]
Animeka/Installation/Serveur_de_courriels.txt [new file with mode: 0644]
Animeka/Installation/Serveur_de_courriels/Comptes_Virtuels.txt [new file with mode: 0644]
Animeka/Installation/Serveur_de_courriels/Comptes_Virtuels/diagram.dot [new file with mode: 0644]
Animeka/Installation/Serveur_de_courriels/Comptes_Virtuels/diagram.png [new file with mode: 0644]
Animeka/Installation/Serveur_de_courriels/DSpam.txt [new file with mode: 0644]
Animeka/Installation/Serveur_de_courriels/Dovecot.txt [new file with mode: 0644]
Animeka/Installation/Serveur_de_courriels/Mailman.txt [new file with mode: 0644]
Animeka/Installation/Serveur_de_courriels/Postfix.txt [new file with mode: 0644]
Animeka/Installation/Serveur_de_courriels/Postfixadmin.txt [new file with mode: 0644]
Animeka/Installation/Serveur_de_courriels/Postfixadmin/postfixadmin-sqlite3.patch [new file with mode: 0644]
Animeka/Installation/Serveur_de_courriels/Quota.txt [new file with mode: 0644]
Animeka/Installation/Serveur_de_courriels/Roundcube.txt [new file with mode: 0644]
Animeka/Installation/Serveur_de_courriels/Roundcube/Plugins.txt [new file with mode: 0644]
Animeka/Installation/Serveur_de_courriels/Roundcube/Plugins/advanced_search.txt [new file with mode: 0644]
Animeka/Installation/Serveur_de_courriels/Roundcube/Plugins/automatic_addressbook.txt [new file with mode: 0644]
Animeka/Installation/Serveur_de_courriels/Roundcube/Plugins/contextmenu.txt [new file with mode: 0644]
Animeka/Installation/Serveur_de_courriels/Roundcube/Plugins/globaladdressbook.txt [new file with mode: 0644]
Animeka/Installation/Serveur_de_courriels/Roundcube/Plugins/markasjunk2.txt [new file with mode: 0644]
Animeka/Installation/Serveur_de_courriels/Roundcube/Plugins/password.txt [new file with mode: 0644]
Animeka/Installation/Serveur_de_courriels/Roundcube/Plugins/sieverules.txt [new file with mode: 0644]
Animeka/Installation/Serveur_de_courriels/Roundcube/Plugins/topline.txt [new file with mode: 0644]
Animeka/Installation/Serveur_de_courriels/Roundcube/Plugins/zipdownload.txt [new file with mode: 0644]
Animeka/Installation/Serveur_de_courriels/Sieve.txt [new file with mode: 0644]
Animeka/Installation/Serveur_de_courriels/Vacation.txt [new file with mode: 0644]
Animeka/Installation/Serveur_de_courriels/Vacation/vacation.pl.sqlite3.patch [new file with mode: 0644]
Animeka/Installation/Serveur_de_courriels/diagram.dot [new file with mode: 0644]
Animeka/Installation/Serveur_de_courriels/diagram.png [new file with mode: 0644]
Animeka/Installation/Système.txt [new file with mode: 0644]
Animeka/Installation/i18n.txt [new file with mode: 0644]
Animeka/notebook.zim [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..c0d271b
--- /dev/null
@@ -0,0 +1 @@
+.zim
diff --git a/Animeka/Installation.txt b/Animeka/Installation.txt
new file mode 100644 (file)
index 0000000..5db1f07
--- /dev/null
@@ -0,0 +1,14 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-11T20:42:20+02:00
+
+====== Installation ======
+Created mardi 11 juin 2013
+
+* [[+Système|Système]] 
+* [[+Noyau Linux|Noyau Linux]]
+* [[+Réseau|Réseau]]
+* [[+i18n|Internationalisation]]
+* [[+Serveur Web|Serveur Web]]
+* [[+Bases de données|Bases de données]]
+* [[+Serveur de courriels|Serveur de courriels]]
diff --git a/Animeka/Installation/Bases_de_données.txt b/Animeka/Installation/Bases_de_données.txt
new file mode 100644 (file)
index 0000000..20e6790
--- /dev/null
@@ -0,0 +1,10 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-11T20:07:21+02:00
+
+====== Bases de données ======
+Created mardi 11 juin 2013
+
+* [[+MySql|MySql]]
+* [[+PhpMyAdmin|PhpMyAdmin]]
+* [[+Sqlite|Sqlite]]
diff --git a/Animeka/Installation/Bases_de_données/MySql.txt b/Animeka/Installation/Bases_de_données/MySql.txt
new file mode 100644 (file)
index 0000000..9c75c1f
--- /dev/null
@@ -0,0 +1,124 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-11T20:03:22+02:00
+
+====== MySql ======
+Created mardi 11 juin 2013
+
+===== Paquets : =====
+mysql-server
+mysql-utilities
+musqltuner
+
+===== Configuration : =====
+MySql sera installé avec plusieurs instances, ce qui permet un meilleur contrôle.
+Une instance pour le site, une pour le forum, et une pour le reste (si besoin).
+L'instance pour le "reste" sera l'instance principale, on ne modifiera pas son adresse de socket pour simplifier les installation.
+
+Installer le démon [[./mysqld_multi]] à placer dans [[/etc/init.d]] et à rendre exécutable.
+On va commencer par désinstaller le démon [[/etc/init.d/mysql.]] Pour ça on va faire propre et simplement le supprimer des différents runlevel :
+'''
+# service mysql stop
+# update-rc.d mysql remove
+'''
+Puis on active ''mysqld_mutli'' pour les runlevels par défaut :
+'''
+# update-rc.d mysqld_mutli start 03 2 3 4 5 stop 01 0 1 6
+'''
+
+Ensuite on copie [[/var/lib/mysql]] and [[/var/lib/mysql_site]] et [[/var/lib/mysql_forum]] :
+'''
+# for ext in site forum; do cp -a /var/lib/mysql /var/lib/mysql_$ext; done
+'''
+
+Il reste à configurer [[/etc/mysql/my_multi.cnf]] :
+'''
+[mysqld_mutli]
+mysqld                 = /usr/bin/mysqld_safe
+mysqladmin     = /usr/bin/mysqladmin
+user                           = root
+password               = 'mot de passe'
+log                                    = /var/log/mysqld_multi.log
+[client]
+port                           = 3306
+socket                 = /var/run/mysqld/mysqld.sock
+[mysqld_safe]
+socket                 = /var/run/mysqld/mysqld.sock
+nice                           = 0
+[mysqld1]
+datadir                        = /var/lib/mysql
+socket                 = /var/run/mysqld/mysqld.sock
+port                           = 3306
+pid-file               = /var/run/mysqld/mysqld.pid
+log-error              = /var/log/mysqld.log
+user                           = mysql
+basedir                        = /usr
+tmpdir                 = /tmp
+lc-messages-dir        = /usr/share/mysql
+skip-external-locking
+bind-address           = 127.0.0.1
+key_buffer             = 16M
+max_allowed_packet     = 16M
+thread_stack           = 192K
+thread_cache_size       = 8
+myisam-recover         = BACKUP
+query_cache_limit      = 1M
+query_cache_size        = 16M
+expire_logs_days       = 10
+max_binlog_size         = 100M
+[mysqld2]
+datadir                        = /var/lib/mysql_site
+socket                 = /var/run/mysqld/mysqld_site.sock
+port                           = 3307
+pid-file               = /var/run/mysqld/mysqld_site.pid
+log-error              = /var/log/mysqld_site.log
+user                           = mysql
+basedir                        = /usr
+tmpdir                 = /tmp
+lc-messages-dir        = /usr/share/mysql
+skip-external-locking
+bind-address           = 127.0.0.1
+key_buffer             = 16M
+max_allowed_packet     = 16M
+thread_stack           = 192K
+thread_cache_size       = 8
+myisam-recover         = BACKUP
+query_cache_limit      = 1M
+query_cache_size        = 16M
+expire_logs_days       = 10
+max_binlog_size         = 100M
+[mysqld3]
+datadir                        = /var/lib/mysql_forum
+socket                 = /var/run/mysqld/mysqld_forum.sock
+port                           = 3308
+pid-file               = /var/run/mysqld/mysqld_forum.pid
+log-error              = /var/log/mysqld_forum.log
+user                           = mysql
+basedir                        = /usr
+tmpdir                 = /tmp
+lc-messages-dir        = /usr/share/mysql
+skip-external-locking
+bind-address           = 127.0.0.1
+key_buffer             = 16M
+max_allowed_packet     = 16M
+thread_stack           = 192K
+thread_cache_size       = 8
+myisam-recover         = BACKUP
+query_cache_limit      = 1M
+query_cache_size        = 16M
+expire_logs_days       = 10
+max_binlog_size         = 100M
+[mysqldump]
+quick
+quote-names
+max_allowed_packet     = 16M
+[mysql]
+[isamchk]
+key_buffer             = 16M
+!includedir /etc/mysql/conf.d/
+'''
+
+Et enfin, démarrer les instances :
+'''
+# service mysqld_multi start
+'''
diff --git a/Animeka/Installation/Bases_de_données/MySql/mysqld_multi b/Animeka/Installation/Bases_de_données/MySql/mysqld_multi
new file mode 100755 (executable)
index 0000000..8936a32
--- /dev/null
@@ -0,0 +1,75 @@
+#!/bin/sh
+#
+### BEGIN INIT INFO
+# Provides:          mysqld_multi
+# Required-Start:    $remote_fs $syslog
+# Required-Stop:     $remote_fs $syslog
+# Should-Start:      $network $time
+# Should-Stop:       $network $time
+# Default-Start:     2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: Start and stop the multiple mysql database server daemons
+# Description:       Controls multiple MySQL database server instances with "mysqld_mutli".
+### END INIT INFO
+#
+# A simple startup script for mysqld_multi by Tim Smith and Jani Tolonen.
+# This script assumes that my.cnf file exists either in /etc/my.cnf or
+# /root/.my.cnf and has groups [mysqld_multi] and [mysqldN]. See the
+# mysqld_multi documentation for detailed instructions.
+#
+# This script can be used as /etc/init.d/mysql.server
+#
+# Comments to support chkconfig on RedHat Linux
+# chkconfig: 2345 64 36
+# description: A very fast and reliable SQL database engine.
+#
+# Version 1.0
+#
+
+. /lib/lsb/init-functions
+# priority can be overriden and "-s" adds output to stderr
+ERR_LOGGER="logger -p daemon.err -t /etc/init.d/mysql -i"
+
+mysqld_multi=/usr/bin/mysqld_multi
+conf=/etc/mysql/my_multi.cnf
+
+if [ ! -x "$mysqld_multi" ]; then
+  log_failure_msg "$0: Can't execute $mysqld_multi"
+  echo                "Can't execute $mysqld_multi" | $ERR_LOGGER
+  exit 1
+fi
+if [ ! -r "$conf" ]; then
+  log_failure_msg "$0: Can't read config file $conf"
+  echo                "Can't read config file $conf" | $ERR_LOGGER
+  exit 1
+fi
+
+# mysqladmin likes to read /root/.my.cnf. This is usually not what I want
+# as many admins e.g. only store a password without a username there and
+# so break my scripts.
+export HOME=/etc/mysql/
+
+case "$1" in
+  'start')
+    log_daemon_msg "Starting MySQL database instances ($2)" "mysqld_multi"
+    "$mysqld_multi" --defaults-file="$conf" start $2
+         log_end_msg 0
+    ;;
+  'stop')
+    log_daemon_msg "Stopping MySQL database instances ($2)" "mysqld_multi"
+    "$mysqld_multi" --defaults-file="$conf" stop $2
+         log_end_msg 0
+    ;;
+  'report')
+    "$mysqld_multi" --defaults-file="$conf" report $2
+    ;;
+  'restart')
+    log_daemon_msg "Restarting MySQL database instances ($2)" "mysqld_multi"
+    "$mysqld_multi" --defaults-file="$conf" stop $2
+    "$mysqld_multi" --defaults-file="$conf" start $2
+         log_end_msg 0
+    ;;
+  *)
+    echo "Usage: $0 {start|stop|report|restart}" >&2
+    ;;
+esac
diff --git a/Animeka/Installation/Bases_de_données/PhpMyAdmin.txt b/Animeka/Installation/Bases_de_données/PhpMyAdmin.txt
new file mode 100644 (file)
index 0000000..ad30eac
--- /dev/null
@@ -0,0 +1,17 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-11T21:59:16+02:00
+
+====== PhpMyAdmin ======
+Created mardi 11 juin 2013
+
+===== Installation : =====
+On n'utilise pas les paquets Debian car ils sont trop vieux et inutiles dans ce genre d'installation.
+Il faut bien sûr au préalable avoir [[Installation:Serveur Web:Apache|Apache]] et [[Installation:Serveur Web:Php|Php]] de configurés.
+
+On décompresse l'archive de [[http://www.phpmyadmin.net|phpmyadmin.net]] dans [[/var/vhosts/sql.animeka.org/pages/.]]
+On positionne le groupe ''www-data'', récursivement pour le répertoire ''phpmyadmin''.
+Ensuite, il suffit de suivre la documentation de configuration en spécifiant les connexion avec les sockets :
+* /var/run/mysqld/mysqld.sock
+* /var/run/mysqld/mysqld_site.sock
+* /var/run/mysqld/mysqld_forum.sock
diff --git a/Animeka/Installation/Bases_de_données/Sqlite.txt b/Animeka/Installation/Bases_de_données/Sqlite.txt
new file mode 100644 (file)
index 0000000..1ebae54
--- /dev/null
@@ -0,0 +1,12 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-11T20:03:47+02:00
+
+====== Sqlite ======
+Created mardi 11 juin 2013
+
+===== Paquets : =====
+sqlite3
+php5-sqlite
+
+Attention de ne pas prendre le vieux paquet sqlite. S'il doit être installé pour une dépendance d'un autre logiciel, faire bien attention d'utiliser le binaire sqlite3 et pas sqlite !
diff --git a/Animeka/Installation/Noyau_Linux.txt b/Animeka/Installation/Noyau_Linux.txt
new file mode 100644 (file)
index 0000000..2e2c18f
--- /dev/null
@@ -0,0 +1,51 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-11T20:10:16+02:00
+
+====== Noyau Linux ======
+Created mardi 11 juin 2013
+
+===== Paquets : =====
+linux-image-amd64
+linux-headers-amd64
+linux-source
+firmware-linux-nonfree
+firmware-ralink
+firmware-realtek
+lilo
+
+===== Configuration : =====
+Dans [[/boot]] :
+       ''# ln -s vmlinuz-* vmlinuz''
+       ''# ln -s initrd.img-* initrd.img''
+       ''# ln -s config-* config''
+       ''# ln -s System.map-* System.map''
+Mettre à jour quand on met à jour le noyau, avant de lancer ''lilo -v''.
+
+Pour du RAID 1, la configuration de [[/etc/lilo.conf]] est la suivante :
+'''
+large-memory
+lba32
+boot = /dev/md1
+raid-extra-boot=mbr-only
+compact
+map = /boot/map
+install = text
+prompt
+timeout = 500
+default = Linux
+vga = normal
+append = "" 
+image = /boot/vmlinuz
+       label = "Linux"
+       root = /dev/md1
+       #root = "UUID=fcba8883-9a08-444f-a8f0-7d6cf7a6a4b6"
+       read-only
+       initrd = /boot/initrd.img
+       append = " rootfstype=ext4"
+'''
+
+Installer lilo :
+'''
+# lilo -v
+'''
diff --git a/Animeka/Installation/Réseau.txt b/Animeka/Installation/Réseau.txt
new file mode 100644 (file)
index 0000000..c9555c9
--- /dev/null
@@ -0,0 +1,37 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-11T20:14:44+02:00
+
+====== Réseau ======
+Created mardi 11 juin 2013
+
+===== Paquets : =====
+adns-tools
+curl
+elinks
+ftp
+host
+iproute
+iptables
+iputils-ping
+isc-dhcp-client
+isc-dhcp-common
+net-tools
+netcat-traditional
+openssh-server
+openssl-blacklist
+rsync
+sshguard
+traceroute
+wget
+
+===== Configuration : =====
+* Ajouter dans [[/etc/network/interfaces]] les lignes :
+       ''auto eth0''
+       ''iface eth0 inet dhcp''
+
+* Mettre dans [[/etc/hostname]] :
+       ''nami.animeka.org''
+
+* Ajuster le contenu de [[/etc/resolv.conf]] comme suit :
+       ''nameserver 213.186.33.99''
diff --git a/Animeka/Installation/SSL.txt b/Animeka/Installation/SSL.txt
new file mode 100644 (file)
index 0000000..7f5782a
--- /dev/null
@@ -0,0 +1,298 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-26T23:47:47+02:00
+
+====== SSL ======
+Created mercredi 26 juin 2013
+
+===== Installation : =====
+Récupérer l'archive [[./sslmanager-1.2.tar.gz|sslmanager-1.2.tar.gz]]
+Extraire dans [[/usr/local/pkissl/]]
+Récupérer le CA et les anciennes clés, de l'archive [[./ssl-Animeka-2013.tar.xz|ssl-Animeka-2013.tar.xz]]
+Le script sslmanager.sh requiert bash. Il ne fonctionnera sûrement pas avec dash ou zsh (en tout cas jusqu'à la version 1.2 du script).
+Il faut donc s'assurer que bash est installé même si non-utilisé
+uudecode est nécessaire, donc il faut installer le paquet sharutils :
+'''
+# apt-get install sharutils
+'''
+
+
+===== Configuration : =====
+
+==== Installer le CA dans le système : ====
+Normalement le certificat racine a déjà été créé et est valide jusqu'en 2023.
+Si on veut en récréer un autre, voici la marche à suivre à partir d'un répertoire vide.
+
+=== Création du CA : ===
+'''
+# ./sslmanager.sh --init
+Please fill the required informations for your CA :
+ [C]  City code on 2 letters [default: FR]: 
+ [ST] Your state or region [default: Rhone-Alpes]: 
+ [L]  Your city or location [default: Lyon]: 
+ [O]  Your organisation or company [default: My Company]: Animeka
+ [OU] Your unit organisation [default: -]: 
+ [CN] Your FQDN [default: my-domain.com]: animeka.com
+ [E]  Email [default: contact@my-domain.com]: contact@animeka.com
+'''
+Édition de ca_openssl.cnf pour modifier/ajouter :
+'''
+#nsCaRevocationUrl               = http://cert.animeka.com/ca.crl
+keyUsage = digitalSignature,keyEncipherment
+extendedKeyUsage = serverAuth
+crlDistributionPoints = URI:http://cert.animeka.com/ca.crl
+'''
+Puis on demande la création du certificat sur 10 ans :
+'''
+./sslmanager.sh --days $((10 * 365)) --create-ca
+'''
+On utilise le mot de passe "La maison francophone de l'Animation"
+Dans le répertoire [[/ca]] on a donc les fichiers suivants :
+* ca.crt : le certificat auto-signé racine
+* ca.key : la clé du certificat, à ne ppas partager et à garder précieusement, sera utile pour signer des certificats
+* ca.srl : le numéro de série de génération du certificat
+* db.index : ???
+* ca.pem : même chose que ca.crt au format PEM (chaine dans le même fichier, ici ça ne changer rien pour un certificat auto-signé)
+* ca.der : même chose que ca.crt au format DER
+
+=== Vérification du certificat racine : ===
+Le certificat racine s'étend sur 10 ans :
+'''
+# openssl x509 -noout -in ca/ca.crt -serial -subject -email -dates
+serial=E66C7FED16EE0637
+subject= /CN=animeka.com/C=FR/ST=Rhone-Alpes/L=Lyon/O=Animeka/OU=-/emailAddress=contact@animeka.com
+contact@animeka.com
+notBefore=Jun 27 18:14:34 2013 GMT
+notAfter=Jun 25 18:14:34 2023 GMT
+'''
+
+
+=== Installation dans le système : ===
+'''
+# cp ca/ca.crt /usr/local/share/ca-certificates/Animeka.crt
+# update-ca-certificates
+'''
+
+
+=== Vérifier que le certificat racine est bien installé : ===
+'''
+# openssl verify ca/ca.crt
+ca/ca.crt: OK
+'''
+
+
+==== Création/Mise à jour de liste de révocation : ====
+'''
+# ./sslmanager.sh -u
+Using configuration from ./ca_openssl.cnf
+Enter pass phrase for ./ca/ca.key:
+'''
+
+
+==== Créer un certificat pour le serveur web : ====
+
+=== Création de la requête : ===
+       # ./sslmanager.sh --generate-csr=webserver-2013
+       Please fill informations for your certificate (default to CA infos).
+        [C]  City code on 2 letters [default : FR]: 
+        [ST] Your state or region [default : Rhone-Alpes]: 
+        [L]  Your city or location [default : Lyon]: 
+        [O]  Your organisation or company [default : Animeka]: 
+        [OU] Your unit organisation [default : webserver-2013]: 
+        [CN] Your FQDN [default : animeka.com]: 
+        [E]  Email [default : contact@animeka.com]: 
+       Additional FQDN, one per line. End with an empty line.
+       SubjectAltName: DNS:animeka.com
+       SubjectAltName: DNS:*.animeka.com
+       SubjectAltName: DNS:animeka.org
+       SubjectAltName: DNS:*.animeka.org
+       SubjectAltName: DNS:
+       CSR_EV_URL=
+       Password for the key: 
+       Password for the key (again): 
+Pour le mot de passe, utiliser un mot de passe généré. On ne va pas signer autre chose avec ce certificat.
+
+=== Création du certificat : ===
+'''
+# ./sslmanager.sh --days 365 --sign-csr=webserver-2013
+Signature ok
+subject=/C=FR/ST=Rhone-Alpes/L=Lyon/O=Animeka/OU=webserver-2013/CN=animeka.com/emailAddress=contact@animeka.com
+Getting CA Private Key
+Enter pass phrase for ./ca/ca.key:
+'''
+
+
+=== Vérification du certificat : ===
+'''
+# openssl x509 -noout -in certs/webserver-2013.crt -subject -dates
+subject= /C=FR/ST=Rhone-Alpes/L=Lyon/O=Animeka/OU=webserver-2013/CN=animeka.com/emailAddress=contact@animeka.com
+notBefore=Jun 27 19:10:39 2013 GMT
+notAfter=Jun 27 19:10:39 2014 GMT
+'''
+
+
+==== Créer le vhost qui contients les informations du certificat racine : ====
+'''
+[/var/vhosts] # ./mkvhost cert.animeka.com && a2ensite cert.animeka.com && service apache2 reload
+[/var/vhosts/cert.animeka.com/pages] # ln -s /usr/local/pkissl/ca/ca.crt . && ln -s /usr/local/pkissl/crl/ca-der.crl ca.crl
+'''
+Il faudra sûrement compléter cette section pour créer une jolie page pour le certificat.
+Cliquer sur ca.crt depuis le navigateur et ajouter le certificat racine comme autorité de confiance.
+Cliquer sur ca.crl depuis le navigateur et se mettre à jour par rapport au fichier de révocations.
+
+==== Configurer Apache pour utiliser le certificat SSL : ====
+
+=== Installer le certificat pour Apache : ===
+Pour ne pas demander la clé pour utiliser le certificat, il faut utiliser la clé "insecure" qui se trouve dans [[/keys.]]
+Pour l'installer il suffit de faire :
+'''
+# ./installapachesslcert.sh webserver-2013
+'''
+
+
+=== Activation et configuration du module SSL : ===
+[[/etc/apache2/mods-available/ssl.conf]] :
+'''
+SSLCertificateFile /etc/apache2/ssl/webserver.crt
+SSLCertificateKeyFile /etc/apache2/ssl/webserver.key
+SSLCACertificateFile /etc/apache2/ssl/ca.pem
+SSLCARevocationFile /etc/apache2/ssl.crl/ca.crl
+'''
+Activation et redémarrage :
+'''
+# a2enmod ssl && service apache2 restart
+'''
+
+
+=== Activer SSL sur les vhosts : ===
+'''
+[/var/vhosts] # ./vhostforcessl assoc.animeka.org on
+'''
+Idem pour les autres vhost.
+Pour animeka.com, on va copier la config plutôt que de forcer :
+'''
+[/etc/apache2/sites-available] # cp www.animeka.com www.animeka.com-ssl
+'''
+On édite www.animeka.com-ssl et on modifie les deux premières lignes :
+'''
+<VirtualHost _default_:443>
+  SSLEngine on
+'''
+Pour le webmail, il faut préciser à roundcube qu'il fonctionne en SSL :
+//config/main.inc.php ://
+'''
+$rcmail_config['force_https'] = true;
+$rcmail_config['skin_logo'] = '
+'''
+https://www.animeka.com/_img/animeka_ban_88x31.gif';
+
+===== Ajouter un certificat pour Postfix : =====
+Le certificat va être utilisé au niveau du démon SMTP.
+'''
+[/usr/local/pkissl] # ./sslmanager.sh -g postfix-2013
+Please fill informations for your certificate (default to CA infos).
+ [C]  City code on 2 letters [default : FR]: 
+ [ST] Your state or region [default : Rhone-Alpes]: 
+ [L]  Your city or location [default : Lyon]: 
+ [O]  Your organisation or company [default : Animeka]: 
+ [OU] Your unit organisation [default : postfix-2013]: 
+ [CN] Your FQDN [default : animeka.com]: mail.animeka.org
+ [E]  Email [default : contact@animeka.com]: 
+Additional FQDN, one per line. End with an empty line.
+SubjectAltName: DNS:mail.animeka.com
+SubjectAltName: DNS:
+Password for the key: 
+Password for the key (again): 
+[/usr/local/pkissl] # ./sslmanager.sh -s postfix-2013 -d 365
+DNS:mail.animeka.com
+Signature ok
+subject=/C=FR/ST=Rhone-Alpes/L=Lyon/O=Animeka/OU=postfix-2013/CN=mail.animeka.org/emailAddress=contact@animeka.com
+Getting CA Private Key
+Enter pass phrase for ./ca/ca.key:
+[/etc/postfix] # mkdir certs
+[/etc/postfix/certs] # ln -s /usr/local/pkissl/ca/ca.pem .
+[/etc/postfix/certs] # ln -s /usr/local/pkissl/certs/postfix-2013.crt postfix.crt
+[/etc/postfix/certs] # ln -s /usr/local/pkissl/keys/postfix-2013.
+'''
+''insecure.''''key postfix.key''
+Édition de [[/etc/postfix/main.cf]] :
+'''
+smtpd_tls_CAfile=/etc/postfix/certs/ca.pem
+smtpd_tls_cert_file=/etc/postfix/certs/postfix.crt
+smtpd_tls_key_file=/etc/postfix/certs/postfix.key
+smtp_tls_CAfile=/etc/postfix/certs/ca.pem
+smtp_use_tls = yes
+smtp_tls_note_starttls_offer = yes
+smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
+'''
+
+=== Cas particuliers (gmail) : ===
+[[/etc/postfix/deny_tls_per_domains]] :
+'''
+# File /etc/postfix/deny_tls_per_domains
+#
+# Insert the DNS domain should to be denied to use client-side TLS
+#
+# Example: mybusinessdomain.com                None
+#
+# DNS domain name                                              Action (None)
+#
+gmail.com None
+#  End File
+
+
+[/etc/postfix] # postmap deny_tls_per_domains
+'''
+Édition de [[/etc/postfix/main.cf]] :
+'''
+smtp_tls_per_site = hash:/etc/postfix/deny_tls_per_domains
+'''
+Redémarrage de postfix :
+'''
+# service postfix reload
+'''
+
+
+===== Ajouter un certificat pour Dovecot : =====
+Le certificat va être utilisé au nivau du démon IMAP.
+'''
+[/usr/local/pkissl] # ./sslmanager.sh -g dovecot-2013
+Please fill informations for your certificate (default to CA infos).
+ [C]  City code on 2 letters [default : FR]: 
+ [ST] Your state or region [default : Rhone-Alpes]: 
+ [L]  Your city or location [default : Lyon]: 
+ [O]  Your organisation or company [default : Animeka]: 
+ [OU] Your unit organisation [default : dovecot-2013]: 
+ [CN] Your FQDN [default : animeka.com]: mail.animeka.org
+ [E]  Email [default : contact@animeka.com]: 
+Additional FQDN, one per line. End with an empty line.
+SubjectAltName: DNS:mail.animeka.com
+SubjectAltName: DNS:
+Password for the key: 
+Password for the key (again): 
+[/usr/local/pkissl] # ./sslmanager.sh -s dovecot-2013
+DNS:mail.animeka.com
+Signature ok
+subject=/C=FR/ST=Rhone-Alpes/L=Lyon/O=Animeka/OU=dovecot-2013/CN=mail.animeka.org/emailAddress=contact@animeka.com
+Getting CA Private Key
+Enter pass phrase for ./ca/ca.key:
+'''
+
+
+Édition de [[/etc/dovecot/conf.d/10-ssl.conf]] :
+'''
+ssl = yes
+ssl_cert = </etc/dovecot/dovecot.pem
+ssl_key = </etc/dovecot/private/dovecot.pem
+'''
+Sauvegarde pem de Debian et mise en place des certificats :
+'''
+[/etc/dovecot] # mv dovecot.pem dovecot-debian.pem
+[/etc/dovecot] # mv private/dovecot.pem private/dovecot-debian.pem
+[/etc/dovecot] # ln -s /usr/local/pkissl/certs/dovecot-2013.crt dovecot.pem
+[/etc/dovecot] # (cd private && ln -s /usr/local/pkissl/keys/dovecot-2013.insecure.key dovecot.pem)
+'''
+Redémarrage du service IMAP :
+'''
+service dovecot restart
+'''
diff --git a/Animeka/Installation/SSL/ssl-Animeka-2012.tar.xz b/Animeka/Installation/SSL/ssl-Animeka-2012.tar.xz
new file mode 100644 (file)
index 0000000..aa09a63
Binary files /dev/null and b/Animeka/Installation/SSL/ssl-Animeka-2012.tar.xz differ
diff --git a/Animeka/Installation/SSL/ssl-Animeka-2013.tar.xz b/Animeka/Installation/SSL/ssl-Animeka-2013.tar.xz
new file mode 100644 (file)
index 0000000..24962d4
Binary files /dev/null and b/Animeka/Installation/SSL/ssl-Animeka-2013.tar.xz differ
diff --git a/Animeka/Installation/SSL/sslmanager-1.1.tar.gz b/Animeka/Installation/SSL/sslmanager-1.1.tar.gz
new file mode 100644 (file)
index 0000000..95e64aa
Binary files /dev/null and b/Animeka/Installation/SSL/sslmanager-1.1.tar.gz differ
diff --git a/Animeka/Installation/SSL/sslmanager-1.2.tar.gz b/Animeka/Installation/SSL/sslmanager-1.2.tar.gz
new file mode 100644 (file)
index 0000000..477433c
Binary files /dev/null and b/Animeka/Installation/SSL/sslmanager-1.2.tar.gz differ
diff --git a/Animeka/Installation/Serveur_Web.txt b/Animeka/Installation/Serveur_Web.txt
new file mode 100644 (file)
index 0000000..f8e40f4
--- /dev/null
@@ -0,0 +1,9 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-11T20:06:51+02:00
+
+====== Serveur Web ======
+Created mardi 11 juin 2013
+
+* [[+Apache|Apache]]
+* [[+Php|Php]]
diff --git a/Animeka/Installation/Serveur_Web/Apache.txt b/Animeka/Installation/Serveur_Web/Apache.txt
new file mode 100644 (file)
index 0000000..f5f73c7
--- /dev/null
@@ -0,0 +1,51 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-11T19:59:57+02:00
+
+====== Apache ======
+Created mardi 11 juin 2013
+
+===== Paquets : =====
+apache2
+apache2-mpm-prefork
+apache2-doc
+apachetop
+
+===== Configuration : =====
+Créer un répertoire [[/var/vhosts]] et y placer les scripts [[./mkvhost]] et [[./vhostforcessl]] en lui donnant les droits d'exécution.
+
+Dans [[/etc/apache2/sites-available]] placer le fichier [[./default.]] Dans [[/var/vhosts/default/pages]] placer les fichiers suviants :
+* [[./default-pages/index.html|index.html]]
+* [[./default-pages/testphp.php|testphp.php]]
+* [[./default-pages/testmysql.php|testmysql.php]]
+* [[./default-pages/.testmysql.inc|.testmysql.inc]] (mettre le login et mot de passe de base de données, ainsi que les différents sockets, une fois mysql configuré)
+
+Créer les vhosts suivants :
+'''
+[/var] # ./mkvhost www.animeka.com v1.nami.animeka.org animeka.com www.animeka.org animeka.org www.animeka.info animeka.info www.animeka.mobi animeka.mobi
+[/var] # ./mkvhost forum.animeka.com forum.nami.animeka.org
+[/var] # ./mkvhost chat.animeka.com chat.nami.animeka.org
+[/var] # ./mkvhost sql.animeka.org
+[/var] # ./mkvhost webmail.animeka.org
+'''
+
+Dans [[/etc/apache2/apache2.conf]] changer les propriétés comme suit :
+'''
+ServerLimit 2048
+<IfModule mpm_prefork_module>
+    StartServers          5
+    MinSpareServers       5
+    MaxSpareServers      50
+    MaxClients          600
+    MaxRequestsPerChild   0
+</IfModule>
+DefaultType text/plain
+'''
+
+Activer les modules suivants :
+'''
+alias auth_basic authn_file authz_default authz_groupfile authz_host authz_user autoindex
+cgi deflate dir env mime negociation reqtimeout rewrite setenvif ssl status
+'''
+
+Mettre ''ServerSignature'' à ''Off'' dans [[/etc/apache2/conf.d/security]].
diff --git a/Animeka/Installation/Serveur_Web/Apache/default b/Animeka/Installation/Serveur_Web/Apache/default
new file mode 100644 (file)
index 0000000..f5cafb0
--- /dev/null
@@ -0,0 +1,27 @@
+<VirtualHost *:80>
+  ServerName nami.animeka.org
+       ServerAdmin admin@animeka.com
+       DocumentRoot /var/vhosts/default/pages
+       <Directory />
+               Options FollowSymLinks
+               AllowOverride None
+       </Directory>
+       <Directory /var/vhosts/default/pages>
+               Options Indexes FollowSymLinks MultiViews
+               AllowOverride None
+               Order allow,deny
+               allow from all
+       </Directory>
+#      ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
+#      <Directory "/usr/lib/cgi-bin">
+#              AllowOverride None
+#              Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
+#              Order allow,deny
+#              Allow from all
+#      </Directory>
+       ErrorLog /var/vhosts/default/logs/error.log
+       # Possible values include: debug, info, notice, warn, error, crit,
+       # alert, emerg.
+       LogLevel warn
+       CustomLog /var/vhosts/default/logs/access.log combined
+</VirtualHost>
diff --git a/Animeka/Installation/Serveur_Web/Apache/default-pages/.testmysql.inc b/Animeka/Installation/Serveur_Web/Apache/default-pages/.testmysql.inc
new file mode 100644 (file)
index 0000000..ae496ba
--- /dev/null
@@ -0,0 +1,9 @@
+<?php
+$username = 'login';
+$password = 'mot de passe';
+$sockets = array(
+  'principal' => '/var/run/mysqld/mysqld.sock',
+  'site' => '/var/run/mysqld/mysqld_site.sock',
+  'forum' => '/var/run/mysqld/mysqld_forum.sock'
+);
+?>
diff --git a/Animeka/Installation/Serveur_Web/Apache/default-pages/index.html b/Animeka/Installation/Serveur_Web/Apache/default-pages/index.html
new file mode 100644 (file)
index 0000000..df2af2e
--- /dev/null
@@ -0,0 +1,51 @@
+<html>
+  <head>
+    <title>nami.animeka.com</title>
+    <style type="text/css">
+      html, body {
+        background-color: light-grey;
+        color: navy;
+        margin: auto auto auto auto;
+        height: 100%;
+        overflow: hidden;
+      }
+      div.title {
+        display: block;
+        position: relative;
+        top: 30%;
+        text-align: center;
+      }
+      h1 {
+        font-size: 40px;
+        font-weight: bold;
+        font-style: normal;
+      }
+      h2 {
+        font-size: 25px;
+        font-weight: bold;
+        font-style: italic;
+      }
+      div.contact {
+        display: block;
+        position: absolute;
+        bottom: 0;
+        text-align: left;
+        padding-left: 20px;
+      }
+      h3 {
+        font-size: 20px;
+        font-weight: bold;
+        font-style: normal;
+      }
+    </style>
+  </head>
+  <body>
+    <div class="title">
+      <h1>nami.animeka.com</h1>
+      <h2>Serveur d'Animeka</h2>
+    </div>
+    <div class="contact">
+      <h3><u>contact :</u> admin AT animeka DOT com</h3>
+    </div>
+  </body>
+</html>
diff --git a/Animeka/Installation/Serveur_Web/Apache/default-pages/testmysql.php b/Animeka/Installation/Serveur_Web/Apache/default-pages/testmysql.php
new file mode 100644 (file)
index 0000000..e114894
--- /dev/null
@@ -0,0 +1,17 @@
+<html>
+  <head>
+    <title>Test PHP</title>
+  </head>
+  <body>
+    <?php
+    require ('.testmysql.inc');
+    foreach ($sockets as $name => $s) {
+      if (mysql_connect(":$s", $username, $password)) {
+        echo "MySql $name : <span style=\"color: green; font-weight: bold;\">Ok</span><br/>\n";
+      } else {
+        echo "MySql $name : <span style=\"color: red; font-weight: bold;\">KO</span><br/>\n";
+      }
+    }
+    ?>
+  </body>
+</html>
diff --git a/Animeka/Installation/Serveur_Web/Apache/default-pages/testphp.php b/Animeka/Installation/Serveur_Web/Apache/default-pages/testphp.php
new file mode 100644 (file)
index 0000000..48c1764
--- /dev/null
@@ -0,0 +1,20 @@
+<html>
+  <head>
+    <title>Test PHP</title>
+  </head>
+  <body>
+    <div id="fail" style="color: red; font-weight: bold;">
+      Test KO
+    </div>
+    <div id="ok" style="color: green; font-weight: bold; display: none">
+      Test Ok
+      <?php echo <<<'EOF'
+      <script type="text/javascript">
+        document.getElementById('ok').style.display = 'block';
+        document.getElementById('fail').style.display = 'none';
+      </script>
+EOF;
+?>
+    </div>
+  </body>
+</html>
diff --git a/Animeka/Installation/Serveur_Web/Apache/mkvhost b/Animeka/Installation/Serveur_Web/Apache/mkvhost
new file mode 100755 (executable)
index 0000000..2aadfde
--- /dev/null
@@ -0,0 +1,44 @@
+#!/bin/sh
+cd $(dirname "$0")
+VHOST="$1"
+if [ -z "$VHOST" ]; then
+  echo "mkvhost vhost_name [alias1] [alias2]" >&2
+  exit 1
+elif [ -d "$VHOST" ]; then
+  echo "$VHOST already exist" >&2
+  exit 2
+elif echo "$VHOST" | grep -q ' '; then
+  echo "vhost name cannot contains spaces" >&2
+  exit 3
+else
+  shift
+  VALIASES="$@"
+  mkdir -p $VHOST/pages $VHOST/logs
+  touch $VHOST/logs/access.log $VHOST/logs/error.log
+  chown www-data: $VHOST/logs/access.log $VHOST/logs/error.log
+  chown :www-data $VHOST/pages
+  chmod g+w $VHOST/pages
+  if [ -n "$VALIASES" ]; then
+    ALIASES=$(/bin/echo -e "\n  ServerAlias $VALIASES")
+  else
+    ALIASES=""
+  fi
+  cat <<EOF > /etc/apache2/sites-available/$VHOST
+<VirtualHost *:80>
+  ServerName $VHOST$ALIASES
+  ServerAdmin admin@animeka.com
+  DocumentRoot /var/vhosts/$VHOST/pages/
+  <Directory /var/vhosts/$VHOST/pages/>
+    Options Indexes Includes FollowSymLinks MultiViews
+    AllowOverride All
+    Order allow,deny
+    allow from all
+  </Directory>
+  ErrorLog /var/vhosts/$VHOST/logs/error.log
+  # Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
+  LogLevel warn
+  CustomLog /var/vhosts/$VHOST/logs/access.log combined
+</VirtualHost>
+EOF
+  /bin/echo -e "To enable it, type:\na2ensite $VHOST\n"
+fi
diff --git a/Animeka/Installation/Serveur_Web/Apache/vhostforcessl b/Animeka/Installation/Serveur_Web/Apache/vhostforcessl
new file mode 100755 (executable)
index 0000000..1d85068
--- /dev/null
@@ -0,0 +1,41 @@
+#!/bin/sh
+cd $(dirname "$0")
+VHOST="$1"
+SSL="$2"
+if [ -z "$SSL" ]; then
+  echo "vhostforcessl vhost_name on|off" >&2
+  exit 1
+elif [ ! -d "$VHOST" ] || [ ! -f /etc/apache2/sites-available/"$VHOST" ]; then
+  echo "$VHOST should exist, is is a vhost?" >&2
+  exit 2
+elif [ "$SSL" != "on" ] && [ "$SSL" != "off" ]; then
+  echo "option should either be 'on' or 'off'" >&2
+  exit 3
+else
+  OLDSSL=off
+  if [ -f /etc/apache2/sites-available/$VHOST-ssl ]; then
+    OLDSSL=on
+  fi
+  if [ "$SSL" = "on" ] && [ "$OLDSSL" = "off" ]; then
+    sed '
+      s/^<VirtualHost \*:80>/<VirtualHost _default_:443>/;
+      s/^\([ \t]*\)ServerName.*/\1SSLEngine on\n\0/;
+      ' /etc/apache2/sites-available/$VHOST > /etc/apache2/sites-available/$VHOST-ssl
+    sed -i -n '1,/^[ \t]*ServerAdmin/p;' /etc/apache2/sites-available/$VHOST
+    cat <<'EOF' >> /etc/apache2/sites-available/$VHOST
+  RewriteEngine on
+  RewriteCond %{HTTPS} !^on$ [NC]
+  RewriteRule . https://%{HTTP_HOST}%{REQUEST_URI}  [L]
+</VirtualHost>
+EOF
+    a2ensite $VHOST-ssl
+  elif [ "$SSL" = "off" ] && [ "$OLDSSL" = "on" ]; then
+    a2dissite $VHOST-ssl
+    sed '
+      s/^<VirtualHost _default_:443>/<VirtualHost *:80>/;
+      /^[ \t]*SSLEngine on/d;
+      ' /etc/apache2/sites-available/$VHOST-ssl > /etc/apache2/sites-available/$VHOST
+    rm /etc/apache2/sites-available/$VHOST-ssl
+  fi
+  /bin/echo -e "To take into account, please reload apache2, type:\nservice apache2 reload\n"
+fi
diff --git a/Animeka/Installation/Serveur_Web/Php.txt b/Animeka/Installation/Serveur_Web/Php.txt
new file mode 100644 (file)
index 0000000..195c02d
--- /dev/null
@@ -0,0 +1,45 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-11T20:01:59+02:00
+
+====== Php ======
+Created mardi 11 juin 2013
+
+===== Paquets : =====
+libapache2-mod-php5
+php5-common
+php5-curl
+php5-gd
+php5-mcrypt
+php5-mysql
+php5-tidy
+php5-xsl
+php-pear
+
+===== Configuration : =====
+Une fois que [[Installation:Serveur Web:Apache|Apache]] et [[Installation:Bases de données:MySql|Mysql]] sont configurés, il faut activer le module ''php5''.
+
+Créer le répertoire [[/tmp/php_sessions]] et le monter en tmpfs éventuellement.
+'''
+mkdir /tmp/php_sessions && chown :www-data /tmp/php_sessions && chmod g+w /tmp/php_sessions
+'''
+
+Dans [[/etc/php5/apache2/php.ini]] mettre les options comme suit :
+'''
+short_open_tag = Off
+expose_php = Off
+max_execution_time = 600
+error_log = syslog
+post_max_size = 100M
+upload_max_filesize = 100M
+max_file_uploads = 100
+date.timezone = Europe/Paris
+session.save_path = "1;/tmp/php_sessions"
+session.gc_probablity = 1
+'''
+
+Dans [[/etc/php5/cli/php.ini]] mettre les options comme suit :
+'''
+shot_open_tag = Off
+date.timezone = Europe/Paris
+'''
diff --git a/Animeka/Installation/Serveur_de_courriels.txt b/Animeka/Installation/Serveur_de_courriels.txt
new file mode 100644 (file)
index 0000000..62f9d03
--- /dev/null
@@ -0,0 +1,40 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-11T20:06:43+02:00
+
+====== Serveur de courriels ======
+Created mardi 11 juin 2013
+
+Cette [[http://wiki2.dovecot.org/MailServerOverview|doc sur Dovecot]] explique clairement les principes d'un serveur de mails et de tout ce qui gravite autour.
+
+Globalement on va construire une chaîne comme ça :
+{{./diagram.png?type=diagram}}
+
+On va donc utiliser postfix pour recevoir et envoyer des emails, et Dovecot pour délivrer les emails dans les boîtes mails et pour servir la boîte mail au webmail et éventuellement au client IMAP.
+Dovecot peut également faire du POP3 mais je n'en vois plus l'utilité de nos jours.
+Afin d'envoyer un courriel, il faut se connecter au SMTP. Celui-ci doit pouvoir identifier l'utilisateur. Même chose pour accéder aux courriels via IMAP. Le MDA doit également avoir accès aux paramètres des comptes de courriels. Toutes ces informations sont en général stockées en base de données.
+Nous choisissons d'utiliser Sqlite (version 3) pour stocker ces informations pour plusieurs raisons :
+* Ne dépend d'aucun démon
+* Ne partage aucune ressource avec d'autres services
+* Reste performant et flexible
+* Facilité de sauvegarde
+
+Ordre d'installation :
+* [[+Postfix|Postfix]]
+* [[+Dovecot|Dovecot]]
+* [[+Postfixadmin|Postfixadmin]]
+* [[+Roundcube|Roundcube]]
+* [[+Mailman|Mailman]]
+* [[+DSpam|DSpam]]
+
+Ordre de configuration :
+* [[+Postfix|Postfix]] (pour la réception et l'envoie d'emails)
+* [[+Dovecot|Dovecot]] (pour délivrer les courriels en local)
+* [[+Postfixadmin|Postfixadmin]] (pour la création de la base de données SQLite3 surtout)
+* [[+Comptes Virtuels|Comptes Virtuels]] (pour les comptes virtuels)
+* [[+Quota|Gestion des quotas]]
+* [[+Sieve|Sieve]] (pour la gestion des filtres)
+* [[+Vacation|Vacation]] (pour la réponse automatique en cas d'absence prolongée)
+* [[+DSpam|Spamassassin]] (antispam)
+* [[+Mailman|Mailman]] (gestion des mailing lists)
+* [[+Roundcube|Roundcube]] (webmail)
diff --git a/Animeka/Installation/Serveur_de_courriels/Comptes_Virtuels.txt b/Animeka/Installation/Serveur_de_courriels/Comptes_Virtuels.txt
new file mode 100644 (file)
index 0000000..57b220a
--- /dev/null
@@ -0,0 +1,184 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-15T16:24:34+02:00
+
+====== Comptes Virtuels ======
+Created samedi 15 juin 2013
+
+Là ça se corse. on va définir un domaine et des utilisateurs virtuels, le tout stocké dans des bases sqlite3.
+Pour cela, il faut que la configuration de [[Installation:Serveur de courriels:Postfix|Postfix,]] [[Installation:Serveur de courriels:Dovecot|Dovecot]] et [[Installation:Serveur de courriels:Postfixadmin|Postfixadmin]] est été faite.
+
+Pour la suite on va adapter deux tutoriels :
+       http://johnny.chadda.se/article/mail-server-howto-postfix-and-dovecot-with-mysql-and-tlsssl-postgrey-and-dspam/ pour la partie principes
+       http://rob0.nodns4.us/howto/ pour la partie sqlite
+
+Le tuto sur SQLite va baucoup plus loin et permet de faire des choses très compliquées.
+On n'a pas besoin de tout ça, donc le schéma proposé par postfix-admin est suffisant et c'est celui qu'on va utiliser.
+
+===== Schéma SQLite3 : =====
+'''
+# echo '.schema' | sqlite3 /var/vmail/sqlite/emails.sqlite3
+'''
+devrait'' afficher le schéma des tables.''
+Le schéma est le suivant :
+{{./diagram.png?type=diagram}}
+
+===== Configuration Système : =====
+Création du compte système vmail qui va gérer nos comptes virtuels :
+'''
+# useradd -r -u 150 -g mail -d /var/vmail/accounts -s /sbin/nologin -c 'Virtual mailbox' vmail
+# mkdir -p /var/vmail/accounts
+# chown vmail: /var/vmail/accounts
+# chmod g+rwX,o= /var/vmail/accounts
+# service postfix stop
+# service dovecot stop
+'''
+
+
+===== Configuration de Postfix : =====
+
+==== Création des requêtes SQL : ====
+'''
+# mkdir /etc/postfix/query
+'''
+
+
+=== query/dom-vmbox.query ===
+'''
+dbpath = /var/vmail/sqlite/emails.sqlite3
+query = SELECT domain FROM domain WHERE active = 1 AND transport = 'virtual' AND domain = '%s'
+'''
+
+
+=== query/maps-vmbox.query ===
+'''
+dbpath = /var/vmail/sqlite/emails.sqlite3
+query = SELECT maildir FROM mailbox WHERE active = 1 AND username = '%s'
+'''
+
+
+=== query/maps-valias.query ===
+'''
+dbpath = /var/vmail/sqlite/emails.sqlite3
+query = SELECT goto FROM alias WHERE active = 1 AND address = '%s'
+'''
+
+
+==== master.cf : ====
+On va déclarer un service vdovecot pour postfix qui définit que Dovecot va être utilisé comme transport virtuel.
+'''
+vdovecot  unix  -       n       n       -       -       pipe
+  flags=DRhu user=vmail argv=/usr/lib/dovecot/dovecot-lda -d ${recipient}
+'''
+
+
+==== main.cf : ====
+On va redéfinir les informations générales, de manière à recevoir des emails locaux sur animeka.org et les virtuels sur animeka.com :
+'''
+myhostname = nami.animeka.org
+mydomain = animeka.org
+myorigin = /etc/mailname # animeka.org
+mydestination = animeka.org, localhost.animeka.org, localhost
+'''
+On va maintenant définir d'utiliser le transport virtuel vdovecot :
+'''
+virtual_transport = vdovecot
+'''
+On définit les autres options de traitements des courriers virtuels :
+'''
+vdovecot_destination_recipient_limit = 1
+virtual_mailbox_base = /var/vmail/accounts
+virtual_minimum_uid = 150
+virtual_uid_maps = static:150
+virtual_gid_maps = static:8
+query = sqlite:$config_directory/query
+virtual_mailbox_domains = $query/dom-vmbox.query
+virtual_mailbox_maps = $query/maps-vmbox.query
+virtual_alias_maps = $query/maps-valias.query
+'''
+On ajoute l'authentification SASL :
+'''
+smtpd_sasl_auth_enable = yes
+smtpd_sasl_exceptions_networks = $mynetworks
+smtpd_sasl_security_options = noanonymous
+broken_sasl_auth_clients = yes
+smtpd_sasl_type = dovecot
+smtpd_sasl_path = private/auth
+'''
+
+
+===== Configuration de Dovecot : =====
+Juste quelque configuration à ajuster…
+
+==== 10-auth.conf : ====
+'''
+disable_plaintext_auth = yes
+auth_cache_size = 10M
+auth_cache_ttl = 1 hour
+auth_master_user_separator = *
+!include auth-master.conf.ext
+!include auth-system.conf.ext
+!include auth-sql.conf.ext
+'''
+
+==== /etc/dovecot/master-users : ====
+'''
+[/etc/dovecot] # echo 'jrd:'$(doveadm pw -s SHA512-CRYPT) > master-users && chown :dovecot master-users && chmod o= master-users
+'''
+
+
+==== 10-mail.conf : ====
+'''
+mail_location = maildir:/var/vmail/accounts/%d/%u
+mail_fsync = never
+first_valid_uid = 150
+last_valid_uid = 0
+'''
+
+
+==== 10-master.conf : ====
+'''
+service auth {
+       unix_listener /var/spool/postfix/private/auth {
+               mode = 0660
+               user = postfix
+               group = postfix
+       }
+}
+'''
+
+
+==== 15-lda.conf : ====
+'''
+lda_mailbox_autocreate = yes
+lda_mailbox_autosubscribe = yes
+protocol lda {
+       mail_fsync = optimized
+}
+'''
+
+
+==== dovecot-sql.conf : ====
+'''
+driver = sqlite
+connect = /var/vmail/sqlite/emails.sqlite3
+default_pass_scheme = MD5-CRYPT
+password_query = SELECT username as user, password FROM mailbox WHERE active = 1 AND username = '%u'
+user_query = SELECT '/var/vmail/accounts/%d/%n' as home, 'maildir:/var/vmail/accounts/%d/%n' as mail, 150 as uid, 8 as gid, ('dirsize:storage=' || quota) as quota FROM mailbox WHERE active = 1 AND username = '%u'
+'''
+
+On ajuste les droits sur dovecot-sql.conf :
+'''
+# chmod o+r /etc/dovecot/dovecot-sql.conf.ext
+'''
+
+On démarre les services Dovecot et Postfix :
+'''
+# service dovecot start
+# service postfix start
+'''
+
+
+===== Internet : =====
+Une fois que tout fonctionne comme on le souhaite, on peut ouvrir les courriels au reste du monde.
+Pour cela, il suffit d'éditer le fichier [[/etc/postfix/main.cf]] et de remplacer ''inet_interfaces = localhost'' par ''inet_interfaces = all'' et de redémarrer ''postfix''.
diff --git a/Animeka/Installation/Serveur_de_courriels/Comptes_Virtuels/diagram.dot b/Animeka/Installation/Serveur_de_courriels/Comptes_Virtuels/diagram.dot
new file mode 100644 (file)
index 0000000..a5d4f2a
--- /dev/null
@@ -0,0 +1,129 @@
+digraph d {
+rankdir=LR;
+fetchmail [shape = Mrecord] [label = "« fetchmail »\
+  |<id> id\
+  |<mailbox> mailbox\
+  |<src_server> src_server\
+  |<src_auth> src_auth\
+  |<src_user> src_user\
+  |<src_password> src_password\
+  |<src_folder> src_folder\
+  |<poll_time> poll_time\
+  |<fetchall> fetchall\
+  |<keep> keep\
+  |<protocol> protocol\
+  |<usessl> usessl\
+  |<extra_options> extra_options\
+  |<returned_text> returned_text\
+  |<mda> mda\
+  |<date> date\
+  "]
+quota [shape = Mrecord] [label = "« quota »\
+  |<username> username\
+  |<path> path\
+  |<current> current\
+  "]
+quota2 [shape = Mrecord] [label = "« quota2 »\
+  |<username> username\
+  |<bytes> bytes\
+  |<messages> messages\
+  "]
+vacation [shape = Mrecord] [label = "« vacation »\
+  |<email> email\
+  |<subject> subject\
+  |<body> body\
+  |<cache> cache\
+  |<domain> domain\
+  |<created> created\
+  |<active> active\
+  "]
+vacation_notification [shape = Mrecord] [label = "« vacation_notification »\
+  |<on_vacation> on_vacation\
+  |<notified> notified\
+  |<notified_at> notified_at\
+  "]
+mailbox [shape = Mrecord] [label = "« mailbox »\
+  |<username> username\
+  |<password> password\
+  |<name> name\
+  |<maildir> maildir\
+  |<quota> quota\
+  |<local_part> local_part\
+  |<domain> domain\
+  |<created> created\
+  |<modified> modified\
+  |<active> active\
+  "]
+alias [shape = Mrecord] [label = "« alias »\
+  |<address> address\
+  |<goto> goto\
+  |<domain> domain\
+  |<created> created\
+  |<modified> modified\
+  |<active> active\
+  "]
+domain [shape = Mrecord] [label = "« domain »\
+  |<domain> domain\
+  |<description> description\
+  |<aliases> aliases\
+  |<mailboxes> mailboxes\
+  |<maxquota> maxquota\
+  |<quota> quota\
+  |<transport> transport\
+  |<backupmx> backupmx\
+  |<created> created\
+  |<modified> modified\
+  |<active> active\
+  "]
+alias_domain [shape = Mrecord] [label = "« alias_domain »\
+  |<alias_domain> alias_domain\
+  |<target_domain> target_domain\
+  |<created> created\
+  |<modified> modified\
+  |<active> active\
+  "]
+config [shape = Mrecord] [label = "« config »\
+  |<id> id\
+  |<name> name\
+  |<value> value\
+  "]
+log [shape = Mrecord] [label = "« log »\
+  |<timestamp> timestamp\
+  |<username> username\
+  |<domain> domain\
+  |<action> action\
+  |<data> data\
+  "]
+admin [shape = Mrecord] [label = "« admin »\
+  |<username> username\
+  |<password> password\
+  |<created> created\
+  |<modified> modified\
+  |<active> active\
+  "]
+domain_admins [shape = Mrecord] [label = "« domain_admins »\
+  |<username> username\
+  |<domain> domain\
+  |<created> created\
+  |<active> active\
+  "]
+vacation_notification:on_vacation -> vacation:email
+alias:goto -> mailbox:username
+alias:domain -> domain:domain
+alias_domain:target_domain -> domain:domain
+mailbox:domain -> domain:domain
+log:domain -> domain:domain
+admin:username -> mailbox:username
+domain_admins:username -> mailbox:username
+domain_admins:domain -> domain:domain [style=dashed]
+fetchmail:mailbox -> mailbox:username
+quota:username -> mailbox:username
+quota2:username -> mailbox:username
+vacation:email -> mailbox:username
+vacation:domain -> domain:domain
+{rank=same; "quota" "quota2";}
+{rank=same; "mailbox" "alias";}
+{rank=same; "domain" "alias_domain";}
+{rank=same; "vacation" "vacation_notification";}
+{rank=same; "admin" "domain_admins";}
+}
\ No newline at end of file
diff --git a/Animeka/Installation/Serveur_de_courriels/Comptes_Virtuels/diagram.png b/Animeka/Installation/Serveur_de_courriels/Comptes_Virtuels/diagram.png
new file mode 100644 (file)
index 0000000..18a1ad2
Binary files /dev/null and b/Animeka/Installation/Serveur_de_courriels/Comptes_Virtuels/diagram.png differ
diff --git a/Animeka/Installation/Serveur_de_courriels/DSpam.txt b/Animeka/Installation/Serveur_de_courriels/DSpam.txt
new file mode 100644 (file)
index 0000000..dfd561b
--- /dev/null
@@ -0,0 +1,131 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-11T22:40:17+02:00
+
+====== DSpam ======
+Created mardi 11 juin 2013
+
+==== Paquets : ====
+dspam
+dspam-doc
+dovecot-antispam
+
+Désélectionner procmail, on n'en n'a pas besoin
+
+===== Configuration : =====
+
+Les [[Comptes Virtuels|comptes virtuels]] doivent avoir été créés.
+[[Sieve]] doit être configuré.
+
+==== Configuration de dspam : ====
+'''
+# cp -a /var/spool/dspam /var/vmail/
+'''
+[[/etc/dspam/dspam.conf]] :
+'''
+Home /var/vmail/dspam
+StorageDriver /usr/lib/x86_64-linux-gnu/dspam/libhash_drv.so
+TrustedDeliveryAgent "/usr/lib/dovecot/dovecot-lda"
+EnablePlusedDetail on
+PlusedCharacter +
+OnFail error
+Trust root
+Trust dspam
+Trust vmail
+TrainingMode teft
+TestConditionalTraining on
+Feature whitelist
+Algorithm graham burton
+Tokenizer chain
+PValue bcr
+WebStats on
+Preference […]
+Preference "spamAction=deliver"
+Preference "signatureLocation=headers"
+ParseToHeaders on
+ChangeModeOnParse off
+ChangeUserOnParse full
+MaxMessageSize 4194304
+'''
+[[/etc/dspam/default.prefs]] :
+'''
+spamAction=deliver
+signatureLocation=headers
+'''
+Mettre le fichier default.prefs dispo dans [[/var/vmail/dspam/]] :
+'''
+# (cd /var/vmail/dspam && ln -s /etc/dspam/default.pref .)
+'''
+
+
+==== Ajout de dspam comme LDA à postfix : ====
+[[/etc/postfix/master.cf]] :
+'''
+dspam     unic  -       n       n       -       10      pipe
+  flags=Ru user=vmail argv=/usr/bin/dspam --deliver=innocent,spam --user ${recipient} -f ${sender} -d ${recipient}
+#vdovecot ...
+'''
+
+[[/etc/postfix/main.cf]] :
+'''
+smtpd_client_restrictions = permit_sasl_authenticated reject_rbl_client zen.spamhaus.org permit
+virtual_transport = dspam
+dspam_destination_recipient_limit = 1
+#virtual_transport = vdovecot
+#vdovecot_destination_recipient_limit = 1
+'''
+
+
+==== Déplacer les Spams dans le dossier Junk : ====
+[[/var/vmail/sieve/01-dspam.sieve]] :
+'''
+require ["regex", "fileinto", "mailbox", "imap4flags"];
+
+# Catch mail tagged as Spam, except Spam retrained and delivered to the mailbox
+if allof (
+  header :regex "X-DSPAM-Result" "^(Spam|Virus|Bl[ao]cklisted)$",
+  not header :contains "X-DSPAM-Reclassified" "Innocent"
+  ) {
+  # Mark as read
+  setflag "\\Seen";
+
+  # Move into the Junk folder (create it if needed)
+  fileinto :create "Junk";
+
+  # Stop processing here
+  stop;
+}
+'''
+Les bons droits :
+'''
+[/] # cd /var/vmail/sieve
+[/var/vmail/sieve] # sievec *.sieve
+[/var/vmail/sieve] # chown dovecot *
+'''
+
+
+==== Apprendre à Dspam : ====
+[[/etc/dovecot/conf.d/20-imap.conf]] :
+'''
+protocol imap {
+'''
+       '''
+       mail_plugins = $mail_plugins imap_quota antispam
+       }
+       '''
+[[/etc/dovecot/conf.d/90-plugin.conf]] :
+'''
+plugin {
+'''
+       '''
+       # antispam_debug_target = syslog
+       # antispam_verbose_debug = 1
+       antispam_signature = X-DSPAM-Signature
+       antispam_signature_missing = move
+       antispam_trash = Trash
+       antispam_spam = Junk
+       antispam_backend = dspam-exec
+       antispam_dspam_binary = /usr/bin/dspam
+       antispam_dspam_args = --deliver;--user;%u
+       }
+       '''
diff --git a/Animeka/Installation/Serveur_de_courriels/Dovecot.txt b/Animeka/Installation/Serveur_de_courriels/Dovecot.txt
new file mode 100644 (file)
index 0000000..5e7809f
--- /dev/null
@@ -0,0 +1,90 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-11T22:39:59+02:00
+
+====== Dovecot ======
+Created mardi 11 juin 2013
+
+===== Paquets : =====
+dovecot-common
+dovecot-sqlite
+dovecot-imapd
+dovecot-sieve
+dovecot-managesieved
+
+===== Configuration : =====
+
+==== Imap  : ====
+On ne garde que le serveur IMAP. POP3 est désuet et n'intéresse plus personne.
+Pour tweaker le service IMAP, éditer le fichier [[/etc/dovecot/conf.d/10-master.conf]] et dans la section ''imap-login'' indiquer :
+'''
+service_count = 1
+process_min_avail = 1
+'''
+Avec un ''netstats -tanp'' on devrait constater que les ports 143 (imap), 993 (imap tls) et 4190 (sieve) sont en écoute.
+
+==== Postfix : ====
+postfix inclut un MDA que l'on va remplacer par Dovecot.
+Du coup la configuration de postfix consistera surtout à configurer Dovecot LDA comme MDA.
+
+Il faut changer les permissions des fichiers dans [[/var/mail]] pour donner les droits d'écriture à tous, car le LDA est exécuté avec les droits de l'utilisateur, qui ne fait pas partie du groupe ''mail (attention à ne pas le faire de manière récursive !) :''
+'''
+# chmod a+rw /var/mail
+'''
+Ensuite il faut indiquer à postfix qu'on va utiliser Dovecot LDA et non plus postfix local. Pour cela il faut éditer le fichier [[/etc/postfix/main.conf]] et y ajouter ceci :
+'''
+mailbox_command = /usr/lib/dovecot/dovecot-lda -f "${SENDER}" -a "${RECIPIENT}"
+'''
+
+
+==== Convertir les boîtes de mbox à maildir : ====
+On va utiliser le script perl défini à cette adresse : http://batleth.sapienti-sat.org/projects/mb2md/
+On a également besoin d'installer le paquet perl timedate :
+'''
+# apt-get install libtimedate-perl
+'''
+Mettre le script perl dans [[/usr/local/bin/]]
+Migrer les boîtes aux lettres de [[/var/mail]] :
+'''
+[/] # cd /var/mail
+[/var/mail] # for u in *; do su -c "mb2md-3.20.pl -m" $u; done
+'''
+
+
+''mailx'' peut toujours être utilisé mais il faut préciser le chemin où se trouve le répertoire ''Maildir'' dans la variable ''MAIL''.
+Il faut s'assurer que les utilisateurs ont bien un répertoire ''Maildir'' présent dans leur home.
+mutt fonctionne bien mais veut toujours créer un répertoire Mail pour rien. Éditer [[/etc/Muttrc]] et ajouter la directive :
+'''
+set folder=/var/mail/$USER/
+'''
+
+On va reconfigurer Dovecot pour qu'il livre dans les boîtes maildir et pas les vieilles mbox.
+Dans [[/etc/dovecot/conf.d/10-mail.conf]] on indique qu'on utilise maildir :
+'''
+mail_location = maildir:/var/mail/%u
+'''
+Dans un soucis de clareté on va également l'indiquer à postfix en ajoutant cette ligne dans [[/etc/postfix/main.cf]] :
+'''
+home_mailbox = /
+'''
+Dans [[/etc/dovecot/conf.d/15-mailboxes.conf]] :
+'''
+namespace inbox {
+  mailbox Drafts {
+    special_use = \Drafts
+    auto = subscribe
+  }
+  mailbox Junk {
+    special_use = \Junk
+    auto = subscribe
+  }
+  mailbox Trash {
+    special_use = \Trash
+    auto = subscribe
+  }
+  mailbox Sent {
+    special_use = \Sent
+    auto = subscribe
+  }
+}
+'''
diff --git a/Animeka/Installation/Serveur_de_courriels/Mailman.txt b/Animeka/Installation/Serveur_de_courriels/Mailman.txt
new file mode 100644 (file)
index 0000000..a8a86ba
--- /dev/null
@@ -0,0 +1,143 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-18T19:01:21+02:00
+
+====== Mailman ======
+Created mardi 18 juin 2013
+
+==== Paquets : ====
+mailman
+
+===== Configuration : =====
+Sélectionner "fr" comme langue par défaut de mailman dans debconf.
+Mais comme ça ne marchera pas, il faut reconfigurer mailman juste après :
+'''
+# dpkg-reconfigure -p low mailman
+'''
+
+
+==== Config et liens symboliques : ====
+[[/etc/mailman/mm_cfg.py]] :
+'''
+MAILMAN_SITE_LIST = 'mailman'
+DEFAULT_URL_PATTERN = 'http://%s/'
+PRIVATE_ARCHIVE_URL = '/private'
+IMAGE_LOGOS = '/images/mailman/'
+DEFAULT_EMAIL_HOST = 'animeka.com'
+DEFAULT_URL_HOST = 'ml.animeka.org'
+add_virtualhost(DEFAULT_URL_HOST, DEFAULT_EMAIL_HOST)
+DEFAULT_SERVER_LANGUAGE = 'fr'
+USE_ENVELOPE_SENDER = 0
+DEFAULT_SEND_REMINDERS = 0
+MTA = 'Postfix'
+POSTFIX_STYLE_VIRTUAL_DOMAINS = ['animeka.com']
+POSTFIX_ALIAS_CMD = 'postalias'
+POSTFIX_MAP_CMD = 'postmap'
+DEB_LISTMASTER = 'postmaster@animeka.com'
+'''
+Créer les liens symboliques suivants :
+'''
+[/etc/mailman] # ln -s /var/lib/mailman/data/aliases .
+[/etc/mailman] # ln -s /var/lib/mailman/data/aliases.db .
+[/etc/mailman] # ln -s /var/lib/mailman/data/virtual-mailman .
+[/etc/mailman] # ln -s /var/lib/mailman/data/virtual-mailman.db .
+'''
+
+
+==== Configuration de mailman dans postfix : ====
+[[/etc/postfix/main.cf]] :
+'''
+alias_maps = hash:/etc/aliases, hash:/etc/mailman/aliases
+virtual_alias_maps = $query/maps-valias.query, hash:/etc/mailman/virtual-mailman
+'''
+
+
+==== Création de la liste principale d'administration : ====
+'''
+# newlist mailman
+Enter the email of the person running the list: postmaster@animeka.com
+Initial mailman password: 
+To finish creating your mailing list, you must edit your /etc/aliases (or
+equivalent) file by adding the following lines, and possibly running the
+`newaliases' program:
+
+## mailman mailing list
+mailman:              "|/var/lib/mailman/mail/mailman post mailman"
+mailman-admin:        "|/var/lib/mailman/mail/mailman admin mailman"
+mailman-bounces:      "|/var/lib/mailman/mail/mailman bounces mailman"
+mailman-confirm:      "|/var/lib/mailman/mail/mailman confirm mailman"
+mailman-join:         "|/var/lib/mailman/mail/mailman join mailman"
+mailman-leave:        "|/var/lib/mailman/mail/mailman leave mailman"
+mailman-owner:        "|/var/lib/mailman/mail/mailman owner mailman"
+mailman-request:      "|/var/lib/mailman/mail/mailman request mailman"
+mailman-subscribe:    "|/var/lib/mailman/mail/mailman subscribe mailman"
+mailman-unsubscribe:  "|/var/lib/mailman/mail/mailman unsubscribe mailman"
+
+Hit enter to notify mailman owner...
+'''
+On va faire plus simple :
+'''
+# /usr/lib/mailman/bin/genaliases
+'''
+
+
+==== Activation de la nouvelle configuration de postfix : ====
+'''
+# service postfix reload
+'''
+
+
+==== Démarrage de mailman  : ====
+'''
+# service mailman start
+'''
+
+
+===== Administration Web : =====
+Créer le vhost ml.animeka.org :
+'''
+[/var/vhosts] # ./mkvhost ml.animeka.org
+'''
+[[/etc/apache2/sites-available/ml.animeka.org]] :
+'''
+<VirtualHost *:80>
+  ServerName ml.animeka.org
+  
+  ServerAdmin admin@animeka.com
+  DocumentRoot /var/vhosts/ml.animeka.org/pages/
+  <Directory /var/vhosts/ml.animeka.org/pages/>
+    Options Indexes Includes FollowSymLinks MultiViews
+    AllowOverride All
+    Order allow,deny
+    allow from all
+  </Directory>
+  <Directory /var/lib/mailman/archives/>
+      Options Indexes FollowSymLinks
+      AllowOverride None
+  </Directory>
+  Alias /pipermail/ /var/lib/mailman/archives/public/
+  Alias /images/mailman/ /usr/share/images/mailman/
+  ScriptAlias /admin /usr/lib/cgi-bin/mailman/admin
+  ScriptAlias /admindb /usr/lib/cgi-bin/mailman/admindb
+  ScriptAlias /confirm /usr/lib/cgi-bin/mailman/confirm
+  ScriptAlias /create /usr/lib/cgi-bin/mailman/create
+  ScriptAlias /edithtml /usr/lib/cgi-bin/mailman/edithtml
+  ScriptAlias /listinfo /usr/lib/cgi-bin/mailman/listinfo
+  ScriptAlias /options /usr/lib/cgi-bin/mailman/options
+  ScriptAlias /private /usr/lib/cgi-bin/mailman/private
+  ScriptAlias /rmlist /usr/lib/cgi-bin/mailman/rmlist
+  ScriptAlias /roster /usr/lib/cgi-bin/mailman/roster
+  ScriptAlias /subscribe /usr/lib/cgi-bin/mailman/subscribe
+  ScriptAlias /mailman/ /usr/lib/cgi-bin/mailman/
+       ErrorLog /var/vhosts/ml.animeka.org/logs/error.log
+  # Possible values include: debug, info, notice, warn, error, crit,
+  # alert, emerg.
+  LogLevel warn
+       CustomLog /var/vhosts/ml.animeka.org/logs/access.log combined
+</VirtualHost>
+'''
+Démarrer le vhost :
+'''
+# a2ensite ml.animeka.org
+# service apache2 reload
+'''
diff --git a/Animeka/Installation/Serveur_de_courriels/Postfix.txt b/Animeka/Installation/Serveur_de_courriels/Postfix.txt
new file mode 100644 (file)
index 0000000..66c8f3b
--- /dev/null
@@ -0,0 +1,53 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-11T20:07:36+02:00
+
+====== Postfix ======
+Created mardi 11 juin 2013
+
+===== Paquets : =====
+postfix
+postfix-doc
+heirloom-mailx
+mutt
+swaks
+
+===== Configuration : =====
+La configuration par défaut de postfix permet de recevoir et d'envoyer des emails.
+La configuration retenue pour un postfix seul est la suivante pour [[/etc/postfix/main.cf]] :
+'''
+myhostname = nami.animeka.org
+mydomain = animeka.com
+myorigin = /etc/mailname
+inet_interfaces = localhost
+mydestination = animeka.com, nami.animeka.org, localhost.animeka.org, localhost
+mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
+relayhost =
+alias_maps = hash:/etc/aliases
+alias_database = hash:/etc/aliases
+recipient_delimiter = +
+mailbox_size_limit = 0
+smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
+biff = no
+append_dot_mydomain = no
+readme_directory = /usr/share/doc/postfix
+html_directory = /usr/share/doc/postfix/html
+smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
+smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
+smtpd_use_tls=yes
+smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
+smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
+smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination permit
+'''
+
+Le fichier [[/etc/mailname]] contient ''animeka.com''.
+J'ai aussi ajouter ceci dans [[/etc/aliases]] :
+'''
+root: jrd
+'''
+afin de rediriger tous les messages de ''root'' vers un vrai utilisateur.
+
+===== Tests : =====
+On va utiliser ''swaks'' pour tester que l'envoie fonctionne bien.
+On utilise ''mailx'' pour tester que la réception fonctionne bien.
+''mutt'' peut également être utilisé pour tester l'ensemble.
diff --git a/Animeka/Installation/Serveur_de_courriels/Postfixadmin.txt b/Animeka/Installation/Serveur_de_courriels/Postfixadmin.txt
new file mode 100644 (file)
index 0000000..2b8831c
--- /dev/null
@@ -0,0 +1,88 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-11T22:59:51+02:00
+
+====== Postfixadmin ======
+Created mardi 11 juin 2013
+
+===== Paquets : =====
+postfixadmin
+
+===== Installation : =====
+Ne pas installer de base de données lors des dialogues de debconf.
+Apache, PHP et SQLite3 doivent avoir été installés et être fonctionnels.
+
+==== Patch SQLite3 : ====
+postfixadmin ne fonctionne pas avec SQLite3.
+Qu'à celà ne tienne, j'ai patché postfixadmin pour qu'il se connecte et gère une base de données SQLite3.
+Je vais fournir le patch upstream, donc il faut vérifier si les prochaines version de postfixadmin ne gèreraient pas déjà SQLite3.
+Le patch est [[./postfixadmin-sqlite3.patch.]]
+Pour l'appliquer :
+'''
+[/] # cd /usr/share/postfixadmin
+[/usr/share/postfixadmin] # patch -p1 -i chemin/vers/postfixadmin-sqlite3.patch
+'''
+
+
+===== Configuration : =====
+La configuration est relativement simple, il suffit de créer le fichier [[/var/vmail/sqlite/emails.sqlite3]] et de lui attribuer le groupe www-data avec les droits d'écriture :
+'''
+# mkdir -p /var/vmail/sqlite
+# touch /var/vmail/sqlite/emails.sqlite3
+# chown -R :www-data /var/vmail/sqlite
+# chmod -R g+w /var/vmail/sqlite
+'''
+Le répertoire a besoin d'être écrisible car SQLite crée des fichiers temporaires, genre emails-journal.sqlite3.
+
+Éditer [[/etc/postfixadmin/config.inc.php]] :
+'''
+postfix_admin_url = /postfixadmin
+default_language = fr
+admin_email = postmaster@animeka.com
+page_size= 50
+default_aliases = abuse => abuse@animeka.com, postmaster => postmaster@animeka.com
+domain_path = yes
+domain_in_mailbox = no
+maxquota = 1024
+quota = yes
+quota_multiplier = 1048576
+vacation_domain = autoreply.animeka.com
+vacation_control = yes
+alias_domain = yes
+footer_text = Retour à mail.animeka.org
+footer_link = http://mail.animeka.org
+welcome_text =
+       Bonjour et bienvenue !
+       
+       Votre compte de courriel Animeka vient d'être créé.
+       Pour toute information ou question, veuillez contacter l'administrateur : postmaster@animeka.com
+       Si vous avez des difficultées pour envoyer un courriel ou consulter vos messages, merci de passer par le forum.
+       
+       Cordialement,
+       
+       L'équipe Animeka.
+show_status = yes
+show_status_key = yes
+show_popimap = yes
+recipient_delimiter = +
+used_quotas = yes
+new_quota_table = yes
+'''
+
+Créer un vhost pour les emails :
+'''
+[/var/vhosts] # ./mkvhost mail.animeka.org
+'''
+
+Éditer le vhost ([[/etc/apache2/sites_available/mail.animeka.org]]) pour ajouter l'alias pour postfixadmin, avant la directive ErrorLog :
+'''
+Include /etc/postfixadmin/apache.conf
+'''
+
+Activer le vhost :
+'''
+# a2ensite mail.animeka.org && service apache2 reload
+'''
+
+Se rendre sur le site http://mail.animeka.org/postfixadmin/setup.php et attendre la création de la base de données.
+Créer un compte admin et voilà.
diff --git a/Animeka/Installation/Serveur_de_courriels/Postfixadmin/postfixadmin-sqlite3.patch b/Animeka/Installation/Serveur_de_courriels/Postfixadmin/postfixadmin-sqlite3.patch
new file mode 100644 (file)
index 0000000..8eff191
--- /dev/null
@@ -0,0 +1,728 @@
+diff -ru postfixadmin.orig/backup.php postfixadmin/backup.php
+--- postfixadmin.orig/backup.php       2012-01-10 16:46:25.000000000 +0100
++++ postfixadmin/backup.php    2013-06-15 15:11:17.543860464 +0200
+@@ -53,78 +53,110 @@
+ if ($_SERVER['REQUEST_METHOD'] == "GET")
+ {
+-    umask (077);
+-    $path = (ini_get('upload_tmp_dir') != '') ? ini_get('upload_tmp_dir') : '/tmp';
+-    $filename = "postfixadmin-" . date ("Ymd") . "-" . getmypid() . ".sql";
+-    $backup = $path . DIRECTORY_SEPARATOR . $filename;
+-
+-    $header = "#\n# Postfix Admin $version\n# Date: " . date ("D M j G:i:s T Y") . "\n#\n";
+-
+-    if (!$fh = fopen ($backup, 'w'))
+-    {
+-        $tMessage = "<div class=\"error_msg\">Cannot open file ($backup)</div>";
+-        include ("templates/header.php");
+-        include ("templates/menu.php");
+-        include ("templates/message.php");
+-        include ("templates/footer.php");
+-    } 
+-    else
+-    {
+-        fwrite ($fh, $header);
+-
+-        $tables = array(
+-            'admin',
+-            'alias',
+-            'alias_domain',
+-            'config',
+-            'domain',
+-            'domain_admins',
+-            'fetchmail',
+-            'log',
+-            'mailbox',
+-            'quota',
+-            'quota2',
+-            'vacation',
+-            'vacation_notification'
+-        );
+-
+-        for ($i = 0 ; $i < sizeof ($tables) ; ++$i)
+-        {
+-            $result = db_query ("SHOW CREATE TABLE " . table_by_key($tables[$i]));
+-            if ($result['rows'] > 0)
+-            {
+-                while ($row = db_array ($result['result']))
+-                {
+-                    fwrite ($fh, "$row[1];\n\n");
+-                }
+-            }
+-        }   
+-
+-        for ($i = 0 ; $i < sizeof ($tables) ; ++$i)
+-        {
+-            $result = db_query ("SELECT * FROM " . table_by_key($tables[$i]));
+-            if ($result['rows'] > 0)
+-            {
+-                while ($row = db_assoc ($result['result']))
+-                {
+-                    $fields = array_keys($row);
+-                    $values = array_values($row);
+-                    $values = array_map('escape_string', $values);
+-                    fwrite ($fh, "INSERT INTO ". $tables[$i] . " (". implode (',',$fields) . ") VALUES ('" . implode ('\',\'',$values) . "');\n");
+-                    $fields = "";
+-                    $values = "";
+-                }
+-            }
+-        }
+-    }
+-    header ("Content-Type: text/plain");
+-    header ("Content-Disposition: attachment; filename=\"$filename\"");
+-    header ("Content-Transfer-Encoding: binary");
+-    header ("Content-Length: " . filesize("$backup"));
+-    header ("Content-Description: Postfix Admin");
+-    $download_backup = fopen ("$backup", "r");
+-    unlink ("$backup");
+-    fpassthru ($download_backup);
++   if ('mysql'==$CONF['database_type'] || 'mysqli'==$CONF['database_type'])
++   {
++       umask (077);
++       $path = (ini_get('upload_tmp_dir') != '') ? ini_get('upload_tmp_dir') : '/tmp';
++       $filename = "postfixadmin-" . date ("Ymd") . "-" . getmypid() . ".sql";
++       $backup = $path . DIRECTORY_SEPARATOR . $filename;
++
++       $header = "#\n# Postfix Admin $version\n# Date: " . date ("D M j G:i:s T Y") . "\n#\n";
++
++       if (!$fh = fopen ($backup, 'w'))
++       {
++           $tMessage = "<div class=\"error_msg\">Cannot open file ($backup)</div>";
++           include ("templates/header.php");
++           include ("templates/menu.php");
++           include ("templates/message.php");
++           include ("templates/footer.php");
++       } 
++       else
++       {
++           fwrite ($fh, $header);
++
++           $tables = array(
++               'admin',
++               'alias',
++               'alias_domain',
++               'config',
++               'domain',
++               'domain_admins',
++               'fetchmail',
++               'log',
++               'mailbox',
++               'quota',
++               'quota2',
++               'vacation',
++               'vacation_notification'
++           );
++
++           for ($i = 0 ; $i < sizeof ($tables) ; ++$i)
++           {
++               $result = db_query ("SHOW CREATE TABLE " . table_by_key($tables[$i]));
++               if ($result['rows'] > 0)
++               {
++                   while ($row = db_array ($result['result']))
++                   {
++                       fwrite ($fh, "$row[1];\n\n");
++                   }
++               }
++           }   
++
++           for ($i = 0 ; $i < sizeof ($tables) ; ++$i)
++           {
++               $result = db_query ("SELECT * FROM " . table_by_key($tables[$i]));
++               if ($result['rows'] > 0)
++               {
++                   while ($row = db_assoc ($result['result']))
++                   {
++                       $fields = array_keys($row);
++                       $values = array_values($row);
++                       $values = array_map('escape_string', $values);
++                       fwrite ($fh, "INSERT INTO ". $tables[$i] . " (". implode (',',$fields) . ") VALUES ('" . implode ('\',\'',$values) . "');\n");
++                       $fields = "";
++                       $values = "";
++                   }
++               }
++           }
++       }
++       header ("Content-Type: text/plain");
++       header ("Content-Disposition: attachment; filename=\"$filename\"");
++       header ("Content-Transfer-Encoding: binary");
++       header ("Content-Length: " . filesize("$backup"));
++       header ("Content-Description: Postfix Admin");
++       $download_backup = fopen ("$backup", "r");
++       unlink ("$backup");
++       fpassthru ($download_backup);
++   }
++   if ('sqlite3'==$CONF['database_type'])
++   {
++       umask (077);
++       $path = (ini_get('upload_tmp_dir') != '') ? ini_get('upload_tmp_dir') : '/tmp';
++       $filename = "postfixadmin-" . date ("Ymd") . "-" . getmypid() . ".sql";
++       $backup = $path . DIRECTORY_SEPARATOR . $filename;
++       $header = "#\n# Postfix Admin $version\n# Date: " . date ("D M j G:i:s T Y") . "\n#\n";
++       if (!file_put_contents($backup, $header))
++       {
++           $tMessage = "<div class=\"error_msg\">Cannot open file ($backup)</div>";
++           include ("templates/header.php");
++           include ("templates/menu.php");
++           include ("templates/message.php");
++           include ("templates/footer.php");
++       } 
++       else
++       {
++           $dbfile = $CONF['database_name'];
++           file_put_contents($backup, shell_exec("echo '.dump'|sqlite3 $dbfile"), FILE_APPEND);
++       }
++       header ("Content-Type: text/plain");
++       header ("Content-Disposition: attachment; filename=\"$filename\"");
++       header ("Content-Transfer-Encoding: binary");
++       header ("Content-Length: " . filesize("$backup"));
++       header ("Content-Description: Postfix Admin");
++       $download_backup = fopen ("$backup", "r");
++       unlink ("$backup");
++       fpassthru ($download_backup);
++   }
+ }
+ /* vim: set expandtab softtabstop=3 tabstop=3 shiftwidth=3: */
+ ?>
+diff -ru postfixadmin.orig/create-mailbox.php postfixadmin/create-mailbox.php
+--- postfixadmin.orig/create-mailbox.php       2010-05-18 00:56:23.000000000 +0200
++++ postfixadmin/create-mailbox.php    2013-06-15 17:32:19.613821605 +0200
+@@ -221,11 +221,11 @@
+         {
+             $tDomain = $fDomain;
+             $tMessage .= $PALANG['pCreate_mailbox_result_error'] . "<br />($fUsername)<br />";
+-            db_query('ROLLBACK');
++            if ($CONF['database_type'] == "pgsql") db_query('ROLLBACK');
+         }
+         else
+         {
+-            db_query('COMMIT');
++            if ($CONF['database_type'] == "pgsql") db_query('COMMIT');
+             db_log ($SESSID_USERNAME, $fDomain, 'create_mailbox', "$fUsername");
+             $tDomain = $fDomain;
+diff -ru postfixadmin.orig/functions.inc.php postfixadmin/functions.inc.php
+--- postfixadmin.orig/functions.inc.php        2012-01-15 13:10:59.000000000 +0100
++++ postfixadmin/functions.inc.php     2013-06-15 17:17:04.685284708 +0200
+@@ -352,6 +352,10 @@
+                 $escaped_string = pg_escape_string($string);
+             }
+         }
++        if ($CONF['database_type'] == "sqlite3")
++        {
++            $escaped_string = $link->escapeString($string);
++        }
+     }
+     else
+     {
+@@ -1455,6 +1459,7 @@
+     <a href='https://sourceforge.net/forum/forum.php?forum_id=676076'>Forums</a>
+     ";
++$SQLITE_CONNECTION = false;
+ /**
+  * db_connect
+@@ -1473,6 +1478,7 @@
+ {
+     global $CONF;
+     global $DEBUG_TEXT;
++    global $SQLITE_CONNECTION;
+     if ($ignore_errors != 0) $DEBUG_TEXT = '';
+     $error_text = '';
+     $link = 0;
+@@ -1525,6 +1531,26 @@
+             $error_text .= "<p />DEBUG INFORMATION:<br />PostgreSQL functions not available! (php5-pgsql installed?)<br />database_type = 'pgsql' in config.inc.php, are you using a different database? $DEBUG_TEXT";
+         }
+     }
++    elseif ($CONF['database_type'] == "sqlite3")
++    {
++        if (defined ("SQLITE3_OPEN_CREATE"))
++        {
++            if ($SQLITE_CONNECTION) {
++                $SQLITE_CONNECTION->close();
++                $SQLITE_CONNECTION = null;
++            }
++            try {
++                $SQLITE_CONNECTION = new SQLite3($CONF['database_name']);
++            } catch (Exception $e) {
++                $error_text .= ("<p />DEBUG INFORMATION:<br />Connect: failed to connect to database.<br/>\n".$e->getMessage()."<br/>\n $DEBUG_TEXT");
++            }
++            $link = $SQLITE_CONNECTION;
++        }
++        else
++        {
++            $error_text .= "<p />DEBUG INFORMATION:<br />SQLite3 object not available!<br />database_type = 'sqlite3' in config.inc.php, are you using a different database? $DEBUG_TEXT";
++        }
++    }
+     else
+     {
+         $error_text = "<p />DEBUG INFORMATION:<br />Invalid \$CONF['database_type']! Please fix your config.inc.php! $DEBUG_TEXT";
+@@ -1549,11 +1575,35 @@
+         print "Connect: Unable to connect to database<br />\n";
+         print "<br />\n";
+         print "Make sure that you have set the correct database type in the config.inc.php file<br />\n";
++        print $error_text;
+         print $DEBUG_TEXT;
+         die();
+     }
+ }
++function db_close ($link)
++{
++    global $SQLITE_CONN;
++    if ($CONF['database_type'] == "mysql")
++    {
++        mysql_close($link);
++    }
++    elseif ($CONF['database_type'] == "mysqli")
++    {
++        mysqli_close($link);
++    }
++    elseif ($CONF['database_type'] == "pgsql")
++    {
++        pg_close($link);
++    }
++    elseif ($CONF['database_type'] == "sqlite3")
++    {
++        if ($link) {
++            $link->close();
++        }
++    }
++}
++
+ /**
+  * Returns the appropriate boolean value for the database.
+  * Currently only PostgreSQL and MySQL are supported.
+@@ -1579,6 +1629,12 @@
+         } 
+         return 0;
+     }
++    elseif($CONF['database_type'] == 'sqlite3') {
++        if($bool) {
++            return 1;  
++        } 
++        return 0;
++    }
+ }
+ //
+@@ -1608,6 +1664,18 @@
+         $result = @pg_query ($link, $query) 
+             or $error_text = "<p />DEBUG INFORMATION:<br />Invalid query: " . pg_last_error() . "$DEBUG_TEXT";
+     }
++    if ($CONF['database_type'] == "sqlite3")
++    {
++        $query = str_ireplace('NOW()', "DATETIME('NOW')", $query); // SQLite3 does not support the NOW function directly.
++        if (preg_match("/^SELECT/i", trim($query))) {
++            $result = $link->query($query);
++        } else {
++            $result = $link->exec($query);
++        }
++        if (!$result) {
++            $error_text = "<p />DEBUG INFORMATION:<br />Invalid query: " . $link->lastErrorCode() . ":" . $link->lastErrorMsg() . "$DEBUG_TEXT";
++        }
++    }
+     if ($error_text != "" && $ignore_errors == 0) die($error_text);
+     if ($error_text == "") {
+@@ -1617,6 +1685,13 @@
+             if ($CONF['database_type'] == "mysql") $number_rows = mysql_num_rows ($result);
+             if ($CONF['database_type'] == "mysqli") $number_rows = mysqli_num_rows ($result);
+             if ($CONF['database_type'] == "pgsql") $number_rows = pg_num_rows ($result);
++            if ($CONF['database_type'] == "sqlite3") {
++                $number_rows = 0;
++                while ($result->fetchArray(SQLITE3_NUM)) {
++                    $number_rows++;
++                }
++                $result->reset();
++            }
+         }
+         else
+         {
+@@ -1625,6 +1700,7 @@
+             if ($CONF['database_type'] == "mysql") $number_rows = mysql_affected_rows ($link);
+             if ($CONF['database_type'] == "mysqli") $number_rows = mysqli_affected_rows ($link);
+             if ($CONF['database_type'] == "pgsql") $number_rows = pg_affected_rows ($result);
++            if ($CONF['database_type'] == "sqlite3") $number_rows = $link->changes();
+         }
+     }
+@@ -1649,6 +1725,7 @@
+     if ($CONF['database_type'] == "mysql") $row = mysql_fetch_row ($result);
+     if ($CONF['database_type'] == "mysqli") $row = mysqli_fetch_row ($result);
+     if ($CONF['database_type'] == "pgsql") $row = pg_fetch_row ($result);
++    if ($CONF['database_type'] == "sqlite3") $row = $result->fetchArray(SQLITE3_NUM);
+     return $row;
+ }
+@@ -1665,6 +1742,7 @@
+     if ($CONF['database_type'] == "mysql") $row = mysql_fetch_array ($result);
+     if ($CONF['database_type'] == "mysqli") $row = mysqli_fetch_array ($result);
+     if ($CONF['database_type'] == "pgsql") $row = pg_fetch_array ($result);
++    if ($CONF['database_type'] == "sqlite3") $row = $result->fetchArray(SQLITE3_BOTH);
+     return $row;
+ }
+@@ -1681,6 +1759,7 @@
+     if ($CONF['database_type'] == "mysql") $row = mysql_fetch_assoc ($result);
+     if ($CONF['database_type'] == "mysqli") $row = mysqli_fetch_assoc ($result);
+     if ($CONF['database_type'] == "pgsql") $row = pg_fetch_assoc ($result);
++    if ($CONF['database_type'] == "sqlite3") $row = $result->fetchArray(SQLITE3_ASSOC);
+     return $row;
+ }
+diff -ru postfixadmin.orig/setup.php postfixadmin/setup.php
+--- postfixadmin.orig/setup.php        2011-02-19 21:10:22.000000000 +0100
++++ postfixadmin/setup.php     2013-06-14 02:50:01.218879812 +0200
+@@ -48,6 +48,7 @@
+ $f_mysql_connect = function_exists ("mysql_connect");
+ $f_mysqli_connect = function_exists ("mysqli_connect");
+ $f_pg_connect = function_exists ("pg_connect");
++$c_sqlite3_num = defined ("SQLITE3_NUM");
+ $f_session_start = function_exists ("session_start");
+ $f_preg_match = function_exists ("preg_match");
+ $f_mb_encode_mimeheader = function_exists ("mb_encode_mimeheader");
+@@ -145,7 +146,7 @@
+ //
+ // Check if there is support for at least 1 database
+ //
+-if (($f_mysql_connect == 0) and ($f_mysqli_connect == 0) and ($f_pg_connect == 0))
++if (($f_mysql_connect == 0) and ($f_mysqli_connect == 0) and ($f_pg_connect == 0) and ($c_sqlite3_num == 0))
+ {
+     print "<li><b>Error: There is no database support in your PHP setup</b><br />\n";
+     print "To install MySQL 3.23 or 4.0 support on FreeBSD:<br />\n";
+@@ -202,6 +203,19 @@
+     }
+     print "</li>";
+ }
++
++//
++// SQLite3 object
++//
++if ($c_sqlite3_num  == 1)
++{
++    $sqver = SQLite3::version();
++    print "<li>Depends on: SQLite3 - OK (" . $sqver['versionString'] . ")\n";
++    if ( !($config_loaded && $CONF['database_type'] == 'sqlite3') ) {
++        print "(change the database_type to 'sqlite3' in config.inc.php!!)\n";
++    }
++    print "</li>";
++}
+ //
+ // Database connection
+diff -ru postfixadmin.orig/upgrade.php postfixadmin/upgrade.php
+--- postfixadmin.orig/upgrade.php      2011-02-19 21:10:22.000000000 +0100
++++ postfixadmin/upgrade.php   2013-06-17 21:05:56.090244015 +0200
+@@ -74,8 +74,7 @@
+                     )";
+         db_query_parsed($pgsql);
+     }
+-}
+-else {
++} elseif($CONF['database_type'] == 'mysql' || $CONF['database_type'] == 'mysqli') {
+     $mysql = "
+         CREATE TABLE {IF_NOT_EXISTS} $table (
+         `id` {AUTOINCREMENT} {PRIMARY},
+@@ -85,6 +84,15 @@
+         )
+     ";
+     db_query_parsed($mysql, 0, " ENGINE = MYISAM COMMENT = 'PostfixAdmin settings'");
++} elseif($CONF['database_type'] == 'sqlite3') {
++    $sqlite3 = "
++        CREATE TABLE {IF_NOT_EXISTS} \"$table\" (
++        \"id\" {BIGINT} {PRIMARY} {AUTOINCREMENT},
++        \"name\"  VARCHAR(20) {LATIN1} NOT NULL DEFAULT '' UNIQUE,
++        \"value\" VARCHAR(20) {LATIN1} NOT NULL DEFAULT ''
++        )
++    ";
++    db_query_parsed($sqlite3);
+ }
+ $sql = "SELECT * FROM $table WHERE name = 'version'";
+@@ -122,6 +130,7 @@
+         $function = "upgrade_$i";
+         $function_mysql = $function . "_mysql";
+         $function_pgsql = $function . "_pgsql";
++        $function_sqlite3 = $function . "_sqlite3";
+         if (function_exists($function)) {
+             echo "<p>updating to version $i (all databases)...";
+             $function();
+@@ -139,6 +148,12 @@
+                 $function_pgsql();
+                 echo " &nbsp; done";
+             }
++        } elseif($CONF['database_type'] == 'sqlite3') {
++            if (function_exists($function_sqlite3)) {
++                echo "<p>updating to version $i (SQLite3)...";
++                $function_sqlite3();
++                echo " &nbsp; done";
++            }
+         } 
+         // Update config table so we don't run the same query twice in the future.
+         $i = (int) $i;
+@@ -197,6 +212,26 @@
+                 'int(4)'            => 'int', 
+                 );
++    } elseif($CONF['database_type'] == 'sqlite3') {
++        $replace = array(
++                '{AUTOINCREMENT}'   => 'AUTOINCREMENT', 
++                '{PRIMARY}'         => 'PRIMARY KEY', 
++                '{UNSIGNED}'        => '', 
++                '{FULLTEXT}'        => '', 
++                '{BOOLEAN}'         => 'INTEGER NOT NULL', 
++                '{UTF-8}'           => '', # UTF-8 is simply ignored.
++                '{LATIN1}'          => '', # same for latin1 
++                '{IF_NOT_EXISTS}'   => 'IF NOT EXISTS',
++                '{RENAME_COLUMN}'   => '', # SQlite3 does not support column rename
++                '{MYISAM}'          => '',
++                '{INNODB}'          => '',
++                '{BIGINT}'          => 'INTEGER',
++                'int(1)'            => 'INTEGER',
++                'int(10)'           => 'INTEGER', 
++                'int(11)'           => 'INTEGER', 
++                'int(4)'            => 'INTEGER', 
++                );
++
+     } else {
+         echo "Sorry, unsupported database type " . $conf['database_type'];
+         exit;
+@@ -224,6 +259,8 @@
+         return "ALTER TABLE $table DROP INDEX $index";
+     } elseif($CONF['database_type'] == 'pgsql') {
+         return "DROP INDEX $index"; # Index names are unique with a DB for PostgreSQL
++    } elseif($CONF['database_type'] == 'sqlite3') {
++        return "DROP INDEX $index"; # Index names are unique with a DB for SQLite3
+     } else {
+         echo "Sorry, unsupported database type " . $conf['database_type'];
+         exit;
+@@ -239,6 +276,9 @@
+     } elseif($CONF['database_type'] == 'pgsql') {
+         $pgindexname = $table . "_" . $indexname . '_idx';
+         return "CREATE INDEX $pgindexname ON $table($fieldlist);"; # Index names are unique with a DB for PostgreSQL
++    } elseif($CONF['database_type'] == 'sqlite3') {
++        $sqindexname = $table . "_" . $indexname . '_idx';
++        return "CREATE INDEX $sqindexname ON $table($fieldlist);"; # Index names are unique with a DB for SQLite3
+     } else {
+         echo "Sorry, unsupported database type " . $conf['database_type'];
+         exit;
+@@ -784,12 +824,20 @@
+ /**
+  * Make logging translatable - i.e. create alias => create_alias
+  */
+-function upgrade_90() {
++function upgrade_90_mypgsql() {
+     $result = db_query_parsed("UPDATE " . table_by_key ('log') . " SET action = REPLACE(action,' ','_')", TRUE);
+     # change edit_alias_state to edit_alias_active
+     $result = db_query_parsed("UPDATE " . table_by_key ('log') . " SET action = 'edit_alias_state' WHERE action = 'edit_alias_active'", TRUE);
+ }
++function upgrade_90_mysql() {
++    upgrade_90_mypgsql();
++}
++
++function upgrade_90_pgsql() {
++    upgrade_90_mypgsql();
++}
++
+ /**
+  * MySQL only allow quota > 2 GB
+  */
+@@ -1086,12 +1134,21 @@
+     db_query_parsed("ALTER TABLE `$table_mailbox` CHANGE `local_part` `local_part` VARCHAR( 255 ) {LATIN1} NOT NULL");
+ }
+-function upgrade_655() {
++function upgrade_655_mypgsql() {
+     db_query_parsed(_add_index('mailbox', 'domain', 'domain'));
+     db_query_parsed(_add_index('alias',   'domain', 'domain'));
+ }
+-function upgrade_729() {
++function upgrade_655_mysql() {
++    upgrade_655_mypgsql();
++}
++
++function upgrade_655_pgsql() {
++    upgrade_655_mypgsql();
++}
++
++
++function upgrade_729_mypgsql() {
+     $table_quota = table_by_key('quota');
+     $table_quota2 = table_by_key('quota2');
+@@ -1116,6 +1173,14 @@
+     ");
+ }
++function upgrade_729_mysql() {
++    upgrade_729_mypgsql();
++}
++
++function upgrade_729_pgsql() {
++    upgrade_729_mypgsql();
++}
++
+ function upgrade_730_pgsql() {
+     $table_quota = table_by_key('quota');
+     $table_quota2 = table_by_key('quota2');
+@@ -1192,3 +1257,156 @@
+     db_query_parsed("ALTER TABLE $table_mailbox ALTER COLUMN quota    type bigint");
+ }
++function upgrade_740_sqlite3() {
++    // Create SQLite3 tables
++    $admin = table_by_key('admin');
++    $alias = table_by_key('alias');
++    $alias_domain = table_by_key('alias_domain');
++    $domain = table_by_key('domain');
++    $domain_admins = table_by_key('domain_admins');
++    $log = table_by_key('log');
++    $mailbox = table_by_key('mailbox');
++    $vacation = table_by_key('vacation');
++    $vacation_notification = table_by_key('vacation_notification');
++    $fetchmail = table_by_key('fetchmail');
++    $quota = table_by_key('quota');
++    $quota2 = table_by_key('quota2');
++    // Needed because of a bug in the way INSERT/UPDATE is done by dovecot
++    $quota_messages = table_by_key('quota_messages');
++    $sql = array();
++    $sql[] = "
++      CREATE TABLE {IF_NOT_EXISTS} \"$admin\" (
++        \"username\" TEXT NOT NULL DEFAULT '',
++        \"password\" TEXT NOT NULL DEFAULT '',
++        \"created\" DATETIME NOT NULL DEFAULT 0,
++        \"modified\" DATETIME NOT NULL DEFAULT 0,
++        \"active\" INTEGER NOT NULL DEFAULT 1,
++        PRIMARY KEY (\"username\")
++      );";
++    $sql[] = "
++      CREATE TABLE {IF_NOT_EXISTS} \"$alias\" (
++        \"address\" TEXT NOT NULL DEFAULT '',
++        \"goto\" TEXT NOT NULL,
++        \"domain\" TEXT NOT NULL DEFAULT '',
++        \"created\" DATETIME NOT NULL DEFAULT 0,
++        \"modified\" DATETIME NOT NULL DEFAULT 0,
++        \"active\" INTEGER NOT NULL DEFAULT 1,
++        PRIMARY KEY (\"address\")
++      );";
++    $sql[] = "
++      CREATE TABLE IF NOT EXISTS \"$alias_domain\" (
++          \"alias_domain\" TEXT NOT NULL DEFAULT '',
++          \"target_domain\" TEXT NOT NULL DEFAULT '',
++          \"created\" DATETIME NOT NULL DEFAULT 0,
++          \"modified\" DATETIME NOT NULL DEFAULT 0,
++          \"active\" INTEGER NOT NULL DEFAULT 1,
++          PRIMARY KEY (\"alias_domain\")
++      );";
++    $sql[] = "
++      CREATE TABLE {IF_NOT_EXISTS} \"$domain\" (
++        \"domain\" TEXT NOT NULL DEFAULT '',
++        \"description\" TEXT NOT NULL DEFAULT '',
++        \"aliases\" INTEGER NOT NULL DEFAULT 0,
++        \"mailboxes\" INTEGER NOT NULL DEFAULT 0,
++        \"maxquota\" INTEGER NOT NULL DEFAULT 0,
++        \"quota\" INTEGER NOT NULL DEFAULT 0,
++        \"transport\" TEXT DEFAULT NULL,
++        \"backupmx\" INTEGER NOT NULL DEFAULT 0,
++        \"created\" DATETIME NOT NULL DEFAULT 0,
++        \"modified\" DATETIME NOT NULL DEFAULT 0,
++        \"active\" INTEGER NOT NULL DEFAULT 1,
++        PRIMARY KEY (\"domain\")
++      );";
++    $sql[] = "
++      CREATE TABLE {IF_NOT_EXISTS} \"$domain_admins\" (
++        \"username\" TEXT NOT NULL DEFAULT '',
++        \"domain\" TEXT NOT NULL DEFAULT '',
++        \"created\" DATETIME NOT NULL DEFAULT 0,
++        \"active\" INTEGER NOT NULL DEFAULT 1
++      );";
++    $sql[] = "
++      CREATE TABLE {IF_NOT_EXISTS} \"$log\" (
++        \"timestamp\" DATETIME NOT NULL DEFAULT 0,
++        \"username\" TEXT NOT NULL DEFAULT '',
++        \"domain\" TEXT NOT NULL DEFAULT '',
++        \"action\" TEXT NOT NULL DEFAULT '',
++        \"data\" TEXT NOT NULL DEFAULT ''
++      );";
++    $sql[] = "
++      CREATE TABLE {IF_NOT_EXISTS} \"$mailbox\" (
++        \"username\" TEXT NOT NULL DEFAULT '',
++        \"password\" TEXT NOT NULL DEFAULT '',
++        \"name\" TEXT NOT NULL DEFAULT '',
++        \"maildir\" TEXT NOT NULL DEFAULT '',
++        \"quota\" INTEGER NOT NULL DEFAULT 0,
++        \"local_part\" TEXT NOT NULL DEFAULT '',
++        \"domain\" TEXT NOT NULL DEFAULT '',
++        \"created\" DATETIME NOT NULL DEFAULT 0,
++        \"modified\" DATETIME NOT NULL DEFAULT 0,
++        \"active\" INTEGER NOT NULL DEFAULT 1,
++        PRIMARY KEY (\"username\")
++      );";
++    $sql[] = "
++      CREATE TABLE {IF_NOT_EXISTS} \"$vacation\" ( 
++        \"email\" TEXT NOT NULL,
++        \"subject\" TEXT NOT NULL,
++        \"body\" TEXT NOT NULL,
++        \"cache\" TEXT NOT NULL,
++        \"domain\" TEXT NOT NULL,
++        \"created\" DATETIME NOT NULL DEFAULT 0,
++        \"active\" INTEGER NOT NULL DEFAULT 1,
++        PRIMARY KEY (\"email\")
++      );";
++    $sql[] = "
++      CREATE TABLE {IF_NOT_EXISTS} \"$vacation_notification\" (
++        \"on_vacation\" TEXT NOT NULL,
++        \"notified\" TEXT NOT NULL,
++        \"notified_at\" datetime NOT NULL DEFAULT (datetime('now')),
++        PRIMARY KEY (\"on_vacation\", \"notified\"),
++        CONSTRAINT \"vacation_notification_pkey\" FOREIGN KEY (\"on_vacation\") REFERENCES \"$vacation\" (\"email\") ON DELETE CASCADE
++      );";
++    $sql[] = "
++      CREATE TABLE IF NOT EXISTS \"$fetchmail\"(
++        \"id\" {BIGINT} NOT NULL {PRIMARY} {AUTOINCREMENT},
++        \"mailbox\" TEXT NOT NULL DEFAULT '',
++        \"src_server\" TEXT NOT NULL DEFAULT '',
++        \"src_auth\" TEXT NOT NULL,
++        \"src_user\" TEXT NOT NULL DEFAULT '',
++        \"src_password\" TEXT NOT NULL DEFAULT '',
++        \"src_folder\" TEXT NOT NULL DEFAULT '',
++        \"poll_time\" INTEGER NOT NULl DEFAULT 10,
++        \"fetchall\" INTEGER NOT NULL DEFAULT 0,
++        \"keep\" INTEGER NOT NULL DEFAULT 0,
++        \"protocol\" TEXT NOT NULL,
++        \"usessl\" INTEGER NOT NULL DEFAULT 0,
++        \"extra_options\" TEXT,
++        \"returned_text\" TEXT,
++        \"mda\" TEXT NOT NULL DEFAULT '',
++        \"date\" datetime
++      );";
++      // src_auth = enum('password', 'kerberos_v5', 'kerberos', 'kerberos_v4', 'gssapi', 'cram-md5', 'otp', 'ntlm', 'msn', 'ssh', 'any')
++      // protocol = enum('POP3', 'IMAP', 'POP2', 'ETRN', 'AUTO')
++    $sql[] = "
++      CREATE TABLE {IF_NOT_EXISTS} \"$quota\" (
++        \"username\" TEXT NOT NULL,
++        \"path\" TEXT NOT NULL,
++        \"current\" {BIGINT},
++        PRIMARY KEY (\"username\", \"path\")
++      );";
++    $sql[] = "
++      CREATE TABLE {IF_NOT_EXISTS} \"$quota2\" (
++        \"username\" TEXT NOT NULL,
++        \"bytes\" {BIGINT} NOT NULL DEFAULT 0,
++        \"messages\" INTEGER NOT NULL DEFAULT 0,
++        PRIMARY KEY (\"username\") ON CONFLICT REPLACE
++      );";
++    $sql[] = "
++      CREATE TABLE {IF_NOT_EXISTS} \"$quota_messages\" (
++        \"username\" TEXT NOT NULL,
++        \"messages\" INTEGER NOT NULL DEFAULT 0,
++        PRIMARY KEY (\"username\") ON CONFLICT REPLACE
++      );";
++    foreach($sql as $query) {
++        db_query_parsed($query);
++    }
++}
diff --git a/Animeka/Installation/Serveur_de_courriels/Quota.txt b/Animeka/Installation/Serveur_de_courriels/Quota.txt
new file mode 100644 (file)
index 0000000..eda75a8
--- /dev/null
@@ -0,0 +1,102 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-17T19:03:25+02:00
+
+====== Quota ======
+Created lundi 17 juin 2013
+
+Les [[Comptes Virtuels|comptes virtuels]] doivent avoir été créés.
+
+===== Configuration : =====
+[[/etc/dovecot/conf.d/10-master.conf]] :
+'''
+service dict {
+'''
+       '''
+       unix_listener dict {
+       '''
+               '''
+               mode = 0600
+               user = vmail
+               group = mail
+               '''
+       '''
+       }
+       }
+       '''
+[[/etc/dovecot/conf.d/10-mail.conf]] :
+'''
+mail_plugins = $mail_plugins quota
+'''
+[[/etc/dovecot/conf.d/20-imap.conf]] :
+'''
+mail_plugins = $mail_plugins imap_quota
+'''
+[[/etc/dovecot/conf.d/90-quota.conf]] :
+'''
+plugin {
+'''
+       '''
+       quota_rule = *:storage=100M
+       quota_rule2 = Trash:storage=+10M
+       }
+       plugin {
+       quota_warning = storage=95%% quota-warning 95 %u
+       }
+       service quota-warning {
+       executable = script /usr/local/bin/quota-warning.sh
+       user = dovecot
+       unix_listener quota-warning {
+       '''
+               '''
+               user = vmail
+               '''
+       '''
+       }
+       }
+       plugin {
+       quota = dict:%u::proxy::quotadict
+       }
+       '''
+[[/etc/dovecot/local.conf]] (à créer) :
+'''
+dict {
+'''
+       '''
+       quotadict = sqlite:/etc/dovecot/dovecot-quota-sql.conf.ext
+       }
+       '''
+[[/etc/dovecot/dovecot-quota-sql.conf.ext]] (à créer) :
+'''
+connect = /var/vmail/sqlite/emails.sqlite3
+map {
+'''
+       '''
+       pattern = priv/quota/storage
+       table = quota2
+       username_field = username
+       value_field = bytes
+       }
+       map {
+       pattern = priv/quota/messages
+       table = quota_messages
+       username_field = username
+       value_field = messages
+       }
+       '''
+Fixer les droits :
+'''
+# chown :dovecot /etc/dovecot/dovecot-quota-sql.conf.ext
+# chmod o-r /etc/dovecot/dovecot-quota-sql.conf.ext
+# chown dovecot -R /var/vmail/sqlite
+# chmod o= -R /var/vmail/sqlite
+'''
+Redémarrer dovecot :
+'''
+# service dovecot restart
+'''
+Recalculer les quotas pour les utilisateurs :
+'''
+[/] # cd /var/vmail/accounts
+[/var/vmail/accounts] # for a in $(find . -mindepth 2 -maxdepth 2 -type d | sed 's,\./\(.*\)/\(.*\),\2@\1,'); do doveadm quota recalc -u $a; done
+'''
diff --git a/Animeka/Installation/Serveur_de_courriels/Roundcube.txt b/Animeka/Installation/Serveur_de_courriels/Roundcube.txt
new file mode 100644 (file)
index 0000000..60232dc
--- /dev/null
@@ -0,0 +1,114 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-11T22:40:26+02:00
+
+====== Roundcube ======
+Created mardi 11 juin 2013
+
+===== Paquets : =====
+php5
+php5-pspell
+php5-intl
+php-auth
+php-auth-sasl
+php-mail-mime
+php-net-smtp
+aspell
+apsell-en
+apsell-fr
+tinymce
+libjs-jquery-ui
+imapproxy
+
+===== Installation : =====
+Au moment de la rédaction de cette documentation, la dernière version était la **0.9.2**.
+http://sourceforge.net/projects/roundcubemail/files/roundcubemail-dependent/0.9.2/roundcubemail-0.9.2-dep.tar.gz
+
+Créer le vhost webmail.animeka.org et y placer roundcube :
+'''
+[/var/vhosts] # ./mkvhost webmail.animeka.org
+[/var/vhosts] # cd webmail.animeka.org/pages
+[/var/vhosts/webmail.animeka.org/pages] # wget -O - \
+       '
+'''
+http://sourceforge.net/projects/roundcubemail/files/roundcubemail-dependent/0.9.2/roundcubemail-0.9.2-dep.tar.gz' | tar xzf -
+'''
+[/var/vhosts/webmail.animeka.org/pages] # mv roundcubemail-0.9.2-dep/* . && mv 
+'''
+''roundcubemail-0.9.2-dep/.??* .''
+'''
+[/var/vhosts/webmail.animeka.org/pages] # rmdir roundcubemail-0.9.2-dep
+[/var/vhosts/webmail.animeka.org/pages] # chown -R root: * .??*
+'''
+Installation de IDNA2 :
+'''
+# pear install Net_IDNA2 || pear install Net_IDNA2-beta
+'''
+
+
+===== Configuration : =====
+
+==== Droits : ====
+'''
+[/var/vhosts/webmail.animeka.org/pages] # chmod g+w logs temp && chown :www-data log temp
+'''
+
+
+==== Base de données : ====
+'''
+[/var/vmail/sqlite] # touch roundcube.sqlite3
+[/var/vmail/sqlite] # chown www-data:www-data roundcube.sqlite3
+[/var/vmail/sqlite] # chmod g=rw,o= roundcube.sqlite3
+'''
+
+
+==== Setup : ====
+Se rendre sur http://webmail.animeka.org/installer/ et suivre les étapes.
+Valeurs par défaut, sauf pour :
+* product_name : Animeka Webmail
+* support_url : mailto:postmaster@animeka.com
+* skin_logo : http://www.animeka.com/_img/animeka_ban_88x31.gif
+* db_dsnw : SQLite, [[/var/vmail/sqlite/roundcube.sqlite3]]
+* default_host : localhost
+* default_port : 1143
+* username_domain : animeka.com
+* smtp_server : localhost
+* smtp_user/smtp_pass : ☑ "Use the current IMAP username and password for SMTP authentication"
+* language : fr_FR
+* htmleditor : "on reply to HTML message only"
+Télécharger les fichier main.inc.php et db.inc.php dans le répertoire config, en utilisant sshfs par exemple.
+Faire un Test d'envoi d'email (pas le login/mdp pour SMTP) et de connexion IMAP.
+
+==== Droits bis : ====
+On va s'assurer qu'uniquement le serveur web peut lire la config, et ne pas l'écrire :
+'''
+[/var/vhosts/webmail.animeka.org/pages] # chmod g=rX,o= -R config
+[/var/vhosts/webmail.animeka.org/pages] # chown :www-data -R config
+[/var/vhosts/webmail.animeka.org/pages] # mv installer .installer && chmod o= -R .installer
+'''
+
+
+==== Ajustement de la configuration : ====
+Dans config/main.inc.php :
+'''
+$rcmail_config['login_autocomplete'] = 2;
+$rcmail_config['password_charset'] = 'UTF-8';
+$rcmail_config['line_length'] = 200;
+$rcmail_config['im_identify_path'] = '/usr/bin/identify';
+$rcmail_config['im_convert_path'] = '/usr/bin/convert';
+$rcmail_config['create_default_folders'] = true;
+$rcmail_config['quota_zero_as_unlimited'] = true;
+$rcmail_config['spellcheck_dictionary'] = 'shared';
+$rcmail_config['spellcheck_ignore_caps'] = true;
+$rcmail_config['spellcheck_ignore_nums'] = true;
+$rcmail_config['spellcheck_ignore_syms'] = true;
+$rcmail_config['min_refresh_interval'] = 300;
+$rcmail_config['compose_extwin'] = true;
+$rcmail_config['preview_pane_mark_read'] = 3; # même si moi je préfère -1, ne jamais marqué comme "lu"
+$rcmail_config['refresh_interval'] = 300;
+$rcmail_config['check_all_folders'] = true;
+$rcmail_config['display_next'] = false;
+$rcmail_config['autoexpand_threads'] = 2;
+$rcmail_config['delete_junk'] = true;
+$rcmail_config['skin'] = 'classic';
+'''
diff --git a/Animeka/Installation/Serveur_de_courriels/Roundcube/Plugins.txt b/Animeka/Installation/Serveur_de_courriels/Roundcube/Plugins.txt
new file mode 100644 (file)
index 0000000..49fefcf
--- /dev/null
@@ -0,0 +1,39 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-22T17:07:45+02:00
+
+====== Plugins ======
+Created samedi 22 juin 2013
+
+===== Paquets : =====
+git
+
+===== Configuration : =====
+Pour installer les plugins, on va utiliser le //composer//.
+On se place dans [[/var/vhosts/webmail.animeka.org/pages]] et on tape :
+'''
+# wget -q -O - 'http://getcomposer.org/installer' | php
+# cp composer.json-dist composer.json
+'''
+Pour chaque plugin, se rendre sur http://plugins.roundcube.net/explore/, ajouter le nom //vendor/plugin// dans la structure //require// en spéciant la version minimum, puis
+'''
+# ./composer.phar update
+'''
+après chaque modification.
+
+===== Plugins à installer : =====
+* johndoh/[[+sieverules|sieverules]] *
+* gms-sa/[[+advanced search|advanced-search]] *
+* johndoh/[[+markasjunk2|markasjunk2]] *
+* johndoh/[[+globaladdressbook|globaladdressbook]] *
+* cor/dovecot_impersonate *
+* cor/listcommands *
+* cor/message_highlight *
+* sblaisot/[[+topline|topline]] *
+
+* [[+password|password]]
+* userinfo
+* vcard_attachments
+* [[+zipdownload|zipdownload]]
+* [[+contextmenu|contextmenu]]
+* [[+automatic_addressbook|automatic_addressbook]]
diff --git a/Animeka/Installation/Serveur_de_courriels/Roundcube/Plugins/advanced_search.txt b/Animeka/Installation/Serveur_de_courriels/Roundcube/Plugins/advanced_search.txt
new file mode 100644 (file)
index 0000000..998eed5
--- /dev/null
@@ -0,0 +1,15 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-30T19:32:08+02:00
+
+====== advanced search ======
+Created dimanche 30 juin 2013
+'''
+
+[plugins] # ln -s advanced-searchadvanced_search
+[plugins/advanced_search] # cp config.inc.php.dist config.inc.php
+'''
+
+
+Mettre à jour le plugin chargé dans config/main.inc.php
+Ne jamais réactiver le plugin d'origine
diff --git a/Animeka/Installation/Serveur_de_courriels/Roundcube/Plugins/automatic_addressbook.txt b/Animeka/Installation/Serveur_de_courriels/Roundcube/Plugins/automatic_addressbook.txt
new file mode 100644 (file)
index 0000000..b68b0cd
--- /dev/null
@@ -0,0 +1,16 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-07-05T01:30:39+02:00
+
+====== automatic addressbook ======
+Created vendredi 05 juillet 2013
+
+Il faut télécharger une archive :
+'''
+[plugins] # wget 
+'''
+http://code.crapouillou.net/attachments/download/19/automatic_addressbook-0.4.tar.bz2
+''[plugins] # tar --no-same-owner -xf ''automatic_addressbook-0.4.tar.bz2 && cd automatic_addressbook
+''[plugins/automatic_addressbook] # cp config/config.inc.php.dist'''' config/config.inc.php''
+
+Il ne reste plus qu'à activer le plugin dans config/main.inc.php.
diff --git a/Animeka/Installation/Serveur_de_courriels/Roundcube/Plugins/contextmenu.txt b/Animeka/Installation/Serveur_de_courriels/Roundcube/Plugins/contextmenu.txt
new file mode 100644 (file)
index 0000000..26d4df4
--- /dev/null
@@ -0,0 +1,15 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-30T21:04:31+02:00
+
+====== contextmenu ======
+Created dimanche 30 juin 2013
+
+Il faut télécharger un tag du dépôt git :
+'''
+[plugins] # git clone -n https://github.com/JohnDoh/Roundcube-Plugin-Context-Menu.git contextmenu
+[plugins] # cd contextmenu
+[plugins/contextmenu] # git checkout -b v0.9.2 v0.9.2
+
+'''
+Il ne reste plus qu'à activer le plugin dans config/main.inc.php.
diff --git a/Animeka/Installation/Serveur_de_courriels/Roundcube/Plugins/globaladdressbook.txt b/Animeka/Installation/Serveur_de_courriels/Roundcube/Plugins/globaladdressbook.txt
new file mode 100644 (file)
index 0000000..6f197e3
--- /dev/null
@@ -0,0 +1,18 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-30T20:12:09+02:00
+
+====== globaladdressbook ======
+Created dimanche 30 juin 2013
+
+'''
+[plugins/globaladdressbook] # cp config.inc.php.dist config.inc.php
+'''
+
+
+===== config.inc.php : =====
+'''
+$rcmail_config['globaladdressbook_admin'] = array('jrd@animeka.com', 'kalnex@animeka.com', 'zell@animeka.com');
+'''
+
+Ajouter les adresses des mailing lists…
diff --git a/Animeka/Installation/Serveur_de_courriels/Roundcube/Plugins/markasjunk2.txt b/Animeka/Installation/Serveur_de_courriels/Roundcube/Plugins/markasjunk2.txt
new file mode 100644 (file)
index 0000000..51350b1
--- /dev/null
@@ -0,0 +1,12 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-30T19:52:29+02:00
+
+====== markasjunk2 ======
+Created dimanche 30 juin 2013
+
+'''
+[plugins/markasjunk2] # cp config.inc.php.dist config.inc.php
+'''
+
+Aucune option d'apprentissage n'est nécessaire, vu qu'on utilise ''dspam'' qui fait déjà le travail conjointement avec ''dovecot''.
diff --git a/Animeka/Installation/Serveur_de_courriels/Roundcube/Plugins/password.txt b/Animeka/Installation/Serveur_de_courriels/Roundcube/Plugins/password.txt
new file mode 100644 (file)
index 0000000..26a89ae
--- /dev/null
@@ -0,0 +1,17 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-30T18:51:10+02:00
+
+====== password ======
+Created dimanche 30 juin 2013
+
+'''
+[plugins/password] # cp config.inc.php.dist config.inc.php
+'''
+
+
+===== config.inc.php : =====
+'''
+$rcmail_config['password_db_dsn'] = 'sqlite:////var/vmail/sqlite/emails.sqlite3';
+$rcmail_config['password_query'] = 'UPDATE mailbox SET password = %c WHERE active = 1 AND username = %u';
+'''
diff --git a/Animeka/Installation/Serveur_de_courriels/Roundcube/Plugins/sieverules.txt b/Animeka/Installation/Serveur_de_courriels/Roundcube/Plugins/sieverules.txt
new file mode 100644 (file)
index 0000000..9fce650
--- /dev/null
@@ -0,0 +1,10 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-22T17:53:05+02:00
+
+====== sieverules ======
+Created samedi 22 juin 2013
+
+'''
+[plugins/sieverules] # cp config.inc.php.dist config.inc.php
+'''
diff --git a/Animeka/Installation/Serveur_de_courriels/Roundcube/Plugins/topline.txt b/Animeka/Installation/Serveur_de_courriels/Roundcube/Plugins/topline.txt
new file mode 100644 (file)
index 0000000..e12d39d
--- /dev/null
@@ -0,0 +1,15 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-30T20:44:31+02:00
+
+====== topline ======
+Created dimanche 30 juin 2013
+'''
+[plugins/topline/config] # cp config.inc.php.dist config.inc.php
+'''
+
+
+===== config.inc.php : =====
+'''
+$rcmail_config['topline_weather_WOEID'] = '609125'; # Lyon
+'''
diff --git a/Animeka/Installation/Serveur_de_courriels/Roundcube/Plugins/zipdownload.txt b/Animeka/Installation/Serveur_de_courriels/Roundcube/Plugins/zipdownload.txt
new file mode 100644 (file)
index 0000000..a47ecd2
--- /dev/null
@@ -0,0 +1,17 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-30T19:21:01+02:00
+
+====== zipdownload ======
+Created dimanche 30 juin 2013
+
+'''
+[plugins/
+'''
+''zipdownload''''] # cp config.inc.php.dist config.inc.php''
+
+
+===== config.inc.php : =====
+'''
+$rcmail_config['zipdownload_charset'] = 'UTF-8';
+'''
diff --git a/Animeka/Installation/Serveur_de_courriels/Sieve.txt b/Animeka/Installation/Serveur_de_courriels/Sieve.txt
new file mode 100644 (file)
index 0000000..dc0eaab
--- /dev/null
@@ -0,0 +1,55 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-17T21:45:44+02:00
+
+====== Sieve ======
+Created lundi 17 juin 2013
+
+Les [[Comptes Virtuels|comptes virtuels]] doivent avoir été créés.
+
+===== Configuration : =====
+[[/etc/dovecot/conf.d/15-lda.conf]] :
+'''
+protocol lda {
+'''
+       '''
+       mail_plugins = $mail_plugins sieve
+       }
+       '''
+[[/etc/dovecot/conf.d/20-managesieve.conf]] :
+'''
+service managesieve-login {
+'''
+       '''
+       inet_listener sieve {
+       '''
+               '''
+               port = 4190
+               '''
+       '''
+       }
+       service_count = 1
+       process_min_avail = 1
+       }
+       service managesieve {
+       }
+       protocol sieve {
+       }
+       '''
+[[/etc/dovecot/conf.d/90-sieve.conf]] :
+'''
+plugin {
+'''
+       '''
+       sieve = ~/dovecot.sieve
+       sieve_dir = ~/sieve
+       sieve_before = /var/vmail/sieve
+       sieve_max_script_size = 0
+       sieve_max_actions = 0
+       }
+       '''
+Création de [[/var/vmail/sieve]] pour y placer les scripts communs :
+'''
+# mkdir /var/vmail/sieve
+# chown dovecot /var/vmail/sieve
+'''
diff --git a/Animeka/Installation/Serveur_de_courriels/Vacation.txt b/Animeka/Installation/Serveur_de_courriels/Vacation.txt
new file mode 100644 (file)
index 0000000..30d6bf0
--- /dev/null
@@ -0,0 +1,62 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-07-04T22:49:12+02:00
+
+====== Vacation ======
+Created jeudi 04 juillet 2013
+
+===== Paquets : =====
+libmail-sender-perl
+libdbd-sqlite3-perl
+libemail-valid-perl
+libmime-perl
+liblog-log4perl-perl
+liblog-dispatch-perl
+libgetopt-argvfile-perl
+libmime-charset-perl
+libmime-encwords-perl
+
+===== Configuration : =====
+'''
+# mkdir /var/vmail/vacation
+# zcat /usr/share/doc/postfixadmin/examples/VIRTUAL_VACATION/vacation.pl.gz > /var/vmail/vacation/vacation.pl
+# chmod +x /var/vmail/vacation/vacation.pl
+# touch /var/vmail/vacation/vacation.log
+# chown dovecot: -R /var/vmail/vacation
+'''
+Le choix de l'utilisateur dovecot est pour pouvoir lire la base de données.
+Modification de [[/var/vmail/vacation/vacation.pl]] avec le patch [[./vacation.pl.sqlite3.patch]]
+Édition de [[/etc/postfixadmin/vacation.conf]] :
+'''
+our $db_type = 'SQLite';
+our $db_host = '';
+our $db_username = '';
+our $db_password = '';
+our $db_name     = '/var/vmail/sqlite/emails.sqlite3';
+our $vacation_domain = 'autoreply.animeka.com';
+our $logfile='/var/vmail/vacation/vacation.log';
+our $syslog = 1;
+our $log_to_file = 1;
+our $log_level = 0;
+'''
+Édition de postfix pour ajouter ce script perl comme transport :
+[[/etc/postfix/master.cf]] :
+'''
+vacation  unix  -       n       n       -       -       pipe
+  flags=Ru user=dovecot argv=/var/vmail/vacation/vacation.pl -f ${sender} ${recipient}
+'''
+[[/etc/postfix/main.cf]] :
+'''
+transport_maps = hash:/etc/postfix/transport
+vacation_destination_recipient_limit = 1
+'''
+Création du fichier [[/etc/postfix/transport]] :
+'''
+# echo 'autoreply.animeka.com vacation:' > /etc/postfix/transport
+# postmap /etc/postfix/transport
+'''
+Mise à jour config de postfixadmin [[/etc/postfixadmin/config.inc.php]] :
+'''
+$CONF['vacation'] = 'YES';
+$CONF['vacation_domain'] = 'autoreply.animeka.com';
+'''
diff --git a/Animeka/Installation/Serveur_de_courriels/Vacation/vacation.pl.sqlite3.patch b/Animeka/Installation/Serveur_de_courriels/Vacation/vacation.pl.sqlite3.patch
new file mode 100644 (file)
index 0000000..faff888
--- /dev/null
@@ -0,0 +1,112 @@
+--- vacation.pl.orig   2013-07-05 01:18:18.204715626 +0200
++++ vacation.pl        2013-07-05 01:01:07.607605134 +0200
+@@ -246,6 +246,9 @@
+ if ($db_type eq "mysql") {
+     $dbh->do("SET CHARACTER SET utf8;");
+     $db_true = '1';
++} elsif ($db_type eq "SQLite") {
++    $dbh->func( 'now', 0, sub { return time }, 'create_function' );
++    $db_true = '1';
+ } else { # Pg
+     $dbh->do("SET CLIENT_ENCODING TO 'UTF8'");
+     $db_true = 'True';
+@@ -320,6 +323,10 @@
+     my $stm = $dbh->prepare($query) or panic_prepare($query);
+     $stm->execute($email) or panic_execute($query,"email='$email'");
+     my $rv = $stm->rows;
++    my @row = $stm->fetchrow_array;
++    if ($rv <= 0 and @row) {
++        $rv = 1;
++    }
+ # Recipient has vacation
+     if ($rv == 1) {
+@@ -334,10 +341,13 @@
+         $stm = $dbh->prepare($query) or panic_prepare($query);
+         $stm->execute($email,"$vemail,%","%,$vemail","%,$vemail,%", "$vemail") or panic_execute($query,"address='$email'");
+         $rv = $stm->rows;
++        @row = $stm->fetchrow_array;
++        if ($rv <= 0 and @row) {
++            $rv = 1;
++        }
+ # Recipient is an alias, check if mailbox has vacation
+         if ($rv == 1) { 
+-            my @row = $stm->fetchrow_array;
+             my $alias = $row[0];
+             if ($alias =~ /,/) {
+                 for (split(/\s*,\s*/, lc($alias))) {
+@@ -347,6 +357,10 @@
+                     $stm = $dbh->prepare($query) or panic_prepare($query);
+                     $stm->execute($singlealias) or panic_execute($query,"email='$singlealias'");
+                     $rv = $stm->rows;
++                    @row = $stm->fetchrow_array;
++                    if ($rv <= 0 and @row) {
++                        $rv = 1;
++                    }
+ # Alias has vacation
+                     if ($rv == 1) {
+                         $realemail = $singlealias;
+@@ -358,6 +372,10 @@
+                 $stm = $dbh->prepare($query) or panic_prepare($query);
+                 $stm->execute($alias) or panic_prepare($query,"email='$alias'");
+                 $rv = $stm->rows;
++                @row = $stm->fetchrow_array;
++                if ($rv <= 0 and @row) {
++                   $rv = 1;
++                }
+ # Alias has vacation
+                 if ($rv == 1) {
+                     $realemail = $alias;
+@@ -372,10 +390,13 @@
+             $stm = $dbh->prepare($query) or panic_prepare($query);
+             $stm->execute($domain) or panic_execute($query,"alias_domain='$domain'");
+             $rv = $stm->rows;
++            @row = $stm->fetchrow_array;
++            if ($rv <= 0 and @row) {
++               $rv = 1;
++            }
+ # The domain has a alias domain level alias
+             if ($rv == 1) {
+-                my @row = $stm->fetchrow_array;
+                 my $alias_domain_dest = $row[0];
+                 ($rv, $realemail) = find_real_address ("$user\@$alias_domain_dest");
+@@ -387,10 +408,13 @@
+                 $stm = $dbh->prepare($query) or panic_prepare($query);
+                 $stm->execute("\@$domain") or panic_execute($query,"address='\@$domain'");
+                 $rv = $stm->rows;
++                @row = $stm->fetchrow_array;
++                if ($rv <= 0 and @row) {
++                   $rv = 1;
++                }
+ # The receipient has a domain level alias
+                 if ($rv == 1) { 
+-                    my @row = $stm->fetchrow_array;
+                     my $wildcard_dest = $row[0];
+                     my ($wilduser, $wilddomain) = split(/@/, $wildcard_dest);
+@@ -419,8 +443,11 @@
+     my $stm = $dbh->prepare($query) or panic_prepare($query);
+     $stm->execute($email) or panic_execute($query,"email='$email'");
+     my $rv = $stm->rows;
++    my @row = $stm->fetchrow_array;
++    if ($rv <= 0 and @row) {
++       $rv = 1;
++    }
+     if ($rv == 1) {
+-        my @row = $stm->fetchrow_array;
+         if (already_notified($email, $orig_from) == 1) { 
+             $logger->debug("Already notified $email, or some error prevented us from doing so");
+             return; 
+@@ -440,7 +467,7 @@
+             'authpwd' => $smtp_authpwd,
+             'skip_bad_recipients' => 'true',
+             'encoding' => 'Base64',
+-            'ctype' => 'text/plain; charset=UTF-8',
++            'ctype' => 'text/html; charset=UTF-8',
+             'headers' => 'Precedence: junk',
+             'headers' => 'X-Loop: Postfix Admin Virtual Vacation',
+         );
diff --git a/Animeka/Installation/Serveur_de_courriels/diagram.dot b/Animeka/Installation/Serveur_de_courriels/diagram.dot
new file mode 100644 (file)
index 0000000..09c3c26
--- /dev/null
@@ -0,0 +1,17 @@
+digraph "mailserver" {
+  rankdir=LR;
+  "email" [style = filled] [color = red]
+  "MTA-Smtp\n(postfix)" [style = filled] [color = blue] [fontcolor = white]
+  "Other MTA\n(redirect)" [style = filled] [color = blue] [fontcolor = white]
+  "MDA\n(Dovecot LDA)" [style = filled] [color = green]
+  "IMAP\n(Dovecot)" [style = filled] [color = green]
+  "MUA\n(Webmail,Thunderbird)" [style = filled] [color = orange]
+
+  "email" -> "MTA-Smtp\n(postfix)" [color = blue]
+  "MTA-Smtp\n(postfix)" -> "Other MTA\n(redirect)" [color = blue]
+  "MTA-Smtp\n(postfix)" -> "MDA\n(Dovecot LDA)" [color = blue]
+  "MDA\n(Dovecot LDA)" -> "répertoire\nvmail" [color = green]
+  "répertoire\nvmail" -> "IMAP\n(Dovecot)" [color = green]
+  "IMAP\n(Dovecot)" -> "MUA\n(Webmail,Thunderbird)" [color = green]
+  "MUA\n(Webmail,Thunderbird)" -> "email" [color = red]
+}
\ No newline at end of file
diff --git a/Animeka/Installation/Serveur_de_courriels/diagram.png b/Animeka/Installation/Serveur_de_courriels/diagram.png
new file mode 100644 (file)
index 0000000..b90560f
Binary files /dev/null and b/Animeka/Installation/Serveur_de_courriels/diagram.png differ
diff --git a/Animeka/Installation/Système.txt b/Animeka/Installation/Système.txt
new file mode 100644 (file)
index 0000000..2195ed4
--- /dev/null
@@ -0,0 +1,114 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-11T20:03:03+02:00
+
+====== Système ======
+Created mardi 11 juin 2013
+
+===== Paquets : =====
+adduser
+apt-clone
+apt-file
+apt-spy
+apt-utils
+atop
+bash
+bash-completion
+bc
+bsdadminutils
+bsdutils
+coreutils
+cpio
+cron
+cruft
+dash
+debianutils
+diffutils
+dmidecode
+expect
+findutils
+fuseiso
+gawk
+gnupg
+gpgv
+grep
+groff
+gzip
+htop
+imagemagick
+less
+logrotate
+m4
+makepasswd
+mawk
+manpages
+mcrypt
+mdadm
+memstat
+nano
+ncurses-bin
+ncdu
+parted
+perl-base
+pv
+pwgen
+readline-common
+rkhunter
+sed
+sensible-utils
+shed
+screen
+swapspace
+tcl
+tcl-tclreadline
+tmux
+udev
+util-linux
+vim
+vim-addon-manager
+vim-common
+xz-utils
+zip
+
+===== Configuration : =====
+Contenu de [[/etc/fstab]] :
+'''
+/dev/md1       /       ext4    defaults,noatime        1       1
+/dev/md6       /var    ext4    defaults,noatime        1       2
+/dev/md5       /home   ext4    defaults,noatime        0       3
+proc           /proc   proc    defaults                0       0
+sys            /sys    sysfs   defaults                0       0
+'''
+
+
+==== Inittab : ====
+Commenter les lignes contenant ''getty'' pour ''tty2'' à ''tty6'' puis lancer ''telinit q''.
+
+==== Apt : ====
+Ajouter ''non-free'' dans les dépôts Debian dans [[/etc/apt/sources.list]] :
+'''
+deb http://ftp.us.debian.org/debian wheezy main non-free
+'''
+C'est utile pour les firmwares de certains drivers
+
+==== Swapspace : ====
+Contenu de [[/etc/swapspace]] :
+'''
+swappath="/var/lib/swapspace"
+lower_freelimit=20
+upper_freelimit=60
+freetarget=30
+min_swapsize=4m
+max_swapsize=1g
+'''
+
+
+==== Vim : ====
+Créer le fichier [[/etc/vim/vimrc.local]] et y ajouter :
+'''
+set enc=utf8
+set fenc=utf8
+syn on
+colorscheme evening
+set modeline et ai ci sw=2 ts=2 tw=0
+'''
diff --git a/Animeka/Installation/i18n.txt b/Animeka/Installation/i18n.txt
new file mode 100644 (file)
index 0000000..ae680a7
--- /dev/null
@@ -0,0 +1,17 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2013-06-11T20:12:07+02:00
+
+====== i18n ======
+Created mardi 11 juin 2013
+
+===== Paquets : =====
+debconf-i18n
+locales
+locales-all
+tzdata
+
+===== Configuration : =====
+# dpkg-reconfigure locales
+-> en_US.utf8 et fr_FR.utf8
+-> défaut : en_US.utf8
diff --git a/Animeka/notebook.zim b/Animeka/notebook.zim
new file mode 100644 (file)
index 0000000..1ea1d89
--- /dev/null
@@ -0,0 +1,5 @@
+[Notebook]
+name=Animeka
+version=0.4
+endofline=unix
+