Une base de données permet à une application de retrouver rapidement des informations reliées entre elles.
Prenons le cas d'un blog par exemple. Les commentaires peuvent être stockés dans une base de données. Chaque commentaire est écrit pour un article précis, par un visiteur donné, à une date précise. Le commentaire comme l'article ont un lien bien précis. L'utilisateur peut avoir donné son adresse e-mail pour être averti de nouveaux messages…
Vous l'aurez compris, toutes ces données s'entrecroisent, et il est plus efficace d'utiliser une base de données pour les retrouver rapidement.
Cependant, ce n'est pas forcément obligatoire. Surtout sur un serveur auto-hébergé, où vous n'aurez sans doute pas des milliers d'utilisateurs.
Comprenez donc bien que si vous pouvez choisir des applications qui n'ont pas besoin de base de données, c'est un avantage pour vous car c'est un élément en moins à administrer et sécuriser. Eh oui, car une base de données peut elle aussi subir des attaques.
Une alternative est d'utiliser dans ce cas SQLite, puisque ce moteur de base de données ne nécessite pas d'administration particulière, c'est l'application qui s'en charge. Tous les avantages d'une base de données avec ceux des fichiers simples en somme.
SQlite est un moteur de base de données tout simplement génial.
Vous n'avez rien de particulier à faire pour l'administrer, c'est l'application qui en a besoin qui se chargera de créer la base. En plus, c'est très facile à sauvegarder puisqu'il s'agit dans ce cas d'un simple fichier à copier. Enfin, ce moteur sait se montrer léger et fonctionne bien même sur du matériel peu puissant.
Alors certains diront que ce n'est pas le moteur le plus performant. C'est vrai. Il reste plus efficace que pas de base de données du tout. À moins d'avoir des milliers de visiteurs sur votre site, vous ne verrez pas la différence avec un autre moteur de base de données. N'hésitez pas, il y a plus d'avantages que d'inconvénients à utiliser SQLite en auto-hébergement.
Pour l'installer, c'est tout bête : pkg_add sqlite3
.
Afin de l'utiliser avec PHP, installez php-pdo_sqlite-7.3.10
et php-sqlite3-7.3.10
.
MySQL est un autre moteur de base de données, sans doute le plus répandu. Puisqu'Oracle possède désormais MySQL et en distribue une version propriétaire, un fork a été créé qui s'appelle MariaDB. Ce dernier est entièrement libre et est empaqueté pour OpenBSD.
Veillez à vous renseigner sur la sécurisation de ce service pour compléter les informations suivantes.
Vous voudrez certainement utiliser MariaDB avec PHP. Installez dans ce cas les
paquet php-mysqli-7.3.10
et php-pdo_mysql-7.3.10:
et activez l'extension mysqli comme indiqué dans la
partie sur PHP.
Afin d'installer MariaDB, il faut lancer les commandes suivantes :
# pkg_add mariadb-server # /usr/local/bin/mysql_install_db
La deuxième commande prépare la base de données par défaut et les fichiers dont MariaDB aura besoin.
On ajoute ensuite les lignes suivantes au fichier /etc/login.conf
afin de laisser
l'utilisateur _mysqld travailler :
mysqld:\ :openfiles-cur=1024:\ :openfiles-max=2048:\ :tc=daemon:
On peut maintenant lancer la commande suivante pour prendre les changements en compte :
# [ -f /etc/login.conf.db ] && cap_mkdb /etc/login.conf
On démarre mysql :
# rcctl enable mysqld # rcctl start mysqld
Très importante, la commande suivante permet de sécuriser un minimum l'installation de mysql :
# /usr/local/bin/mysql_secure_installation
Donner un mot de passe fort pour l'utilisateur root, et suivez les recommandations. Cela ressemblera à ça :
Setting the root password ensures that nobody can log into the MySQL root user without the proper authorisation. You already have a root password set, so you can safely answer 'n'. Change the root password? [Y/n] n ... skipping. By default, a MySQL installation has an anonymous user, allowing anyone to log into MySQL without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. Remove anonymous users? [Y/n] Y ... Success! Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? [Y/n] Y ... Success! By default, MySQL comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? [Y/n] Y - Dropping test database... ERROR 1008 (HY000) at line 1: Can't drop database 'test'; database doesn't exist ... Failed! Not critical, keep moving... - Removing privileges on test database... ... Success! Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? [Y/n] Y ... Success! Cleaning up... All done! If you've completed all of the above steps, your MySQL installation should now be secure. Thanks for using MySQL!
MariaDB devra être accessible par le serveur web. Ce dernier étant dans un chroot, on lance la commande suivante qui nous permet de reproduire la structure de la racine tout en attribuant les droits nécessaires pour l'utilisateur _mysql :
# install -d -m 0711 -o _mysql -g _mysql /var/www/var/run/mysql
Il faut en plus mettre ces lignes dans le fichier /etc/my.cnf
, afin de
modifier les chemins pour le serveur httpd :
[client] socket = /var/www/var/run/mysql/mysql.sock [mysqld] socket = /var/www/var/run/mysql/mysql.sock
Enfin, on relance mysql :
# rcctl restart mysqld
À partir de ce moment, vous pouvez créer et utiliser des bases de données avec MariaDB.
À titre d'exemple, on va créer une nouvelle base de données pour Wordpress. Adaptez-le à votre cas.
Entrez la commande mysql -u root -p
afin “d'entrer” dans MariaDB (MySQL). Les commandes à exécuter sont indiquées ci-dessous avec la
réponse attendue :
# mysql -u root -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 3 Server version: 10.0.23-MariaDB-log openBSD port: mariadb-server-10.0.23p0v1 Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> CREATE DATABASE wordpress_base; Query OK, 1 row affected (0.01 sec) MariaDB [(none)]> CREATE USER 'wp'@'localhost' IDENTIFIED BY 'motdepasse'; Query OK, 0 rows affected (0.01 sec) MariaDB [(none)]> GRANT ALL PRIVILEGES ON wordpress_base.* TO 'wp'@'localhost'; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> exit Bye
Et voilà, vous pouvez utiliser cette base dans votre application.
Quelques explications tout de même :
CREATE DATABASE wordpress_base;
: On crée la base de données pour Wordpress, appelée wordpress_base
,CREATE USER 'wp'@'localhost' IDENTIFIED BY 'motdepasse';
: On crée un utilisateur wp
avec son mot de passe,wp
les droits suffisants sur la base créée juste avant.GRANT ALL PRIVILEGES ON wordpress_base.* TO 'wp'@'localhost';
PostgreSQL est un autre moteur de base de données, entièrement libre.
Pour l'installer, il faut le paquet postgresql-server
.
Afin de l'utiliser avec PHP, installez php-pgsql-7.3.10
et php-pdo_pgsql-7.3.10
.
Veillez à bien lire
le contenu du fichier
/usr/local/share/doc/pkg-readmes/postgresql*
Ensuite, créez une base par défaut :
# su - _postgresql $ mkdir /var/postgresql/data $ initdb -D /var/postgresql/data -U postgres -A scram-sha-256 -E UTF8 -W $ exit
L'utilisateur par défaut s'appelle donc postgres
.
Des options supplémentaires seront à adapter à votre cas dans le fichier :
/var/postgresql/data/postgresql.conf
Par exemple, pour que le serveur httpd qui est enfermé dans un chroot puisse accéder à la base :
unix_socket_directories = '/var/www/tmp/postgresql, /tmp'
Les permissions sur ce dossier doivent d'ailleurs être modifiées ainsi pour que postgresql puisse écrire dedans :
# mkdir -p /var/www/tmp/postgresql # chown _postgresql:www /var/www/tmp/postgresql
Démarrez le serveur postgresql avec :
# rcctl enable postgresql # rcctl start postgresql
Pour se connecter à postgresql, on utilise la commande :
# su _postgresql -c psql
Voici quelques commandes permettant de gérer PostgreSQL.
Modifier le mot de passe administrateur | # psql -U postgres -c “ALTER USER postgres WITH PASSWORD 'mot_de_passe'”; |
Ajouter un utilisateur nommé “toto” à la base | # psql -U postgres -c “CREATE USER toto WITH PASSWORD 'mot_de_passe';” |
Créer une nouvelle base et donner à toto tous les droits dessus | # psql -U postgres \connect template1 CREATE DATABASE "nouvelle_base" WITH ENCODING 'UTF-8'; GRANT ALL PRIVILEGES ON DATABASE "nouvelle_base" TO toto; ALTER DATABASE "nouvelle_base" OWNER TO toto; \q |
Ici, nous verrons comment sauvegarder et restaurer vos bases de données. Si vous n'en utilisez pas, alors passez votre chemin.
Il vous suffit de copier le fichier sqlite présent dans le dossier de votre site web. Oui, c'est tout ! :)
Pour la copie, c'est comme vous voulez. Utilisez cp
ou
openrsync,
ne vous compliquer pas la vie.
Pour MariaDB ou MySQL, la sauvegarde s'appelle un “dump” et se réalise via la commande suivante :
# mysqldump -u root -p nom-de-la-base > /var/sauvegarde/base-sauvee
Bien entendu, vous aurez adapté cette commande en changeant root
pour le nom d'utilisateur
qui a accès à cette base ainsi que le nom de la base. Normalement, root
a
accès à toutes les bases.
Le mot de passe à entrer est celui de l'utilisateur.
Pour restaurer la base de données plus tard, cela se fait en trois étapes :
# mysql -u root -p -e “DROP DATABASE nom-de-la-base”
# mysql -u utilisateur -e “CREATE DATABASE nom-de-la-nouvelle-base”
# mysql -u utilisateur -p nom-de-la-nouvelle-base < /var/sauvegarde/base-sauvee
Vous aurez remarqué le sens du chevron “<
” qui est en sens inverse lors de
la restauration.
La sauvegarde d'une base de données avec PostgreSQL est bien pensée. Vous allez enregistrer dans un fichier toutes les instructions permettant à PostgreSQL de créer une base identique si besoin.
La sauvegarde dans un fichier n'est pas très compliquée et se déroule ainsi :
# pg_dump nom-de-la-base > /var/sauvegarde
Et pour restaurer la base plus tard, procéder ainsi :
# psql -U postgres nom-de-la-base < /var/sauvegarde
Pour plus d'informations, je vous laisse lire la documentation officielle très bien écrite, mais en anglais.