Spip

Principe

Spip est un CMS qui a la particularité de fonctionner avec des squelettes.
Il n’y a donc pas besoin de se prendre la tête quand on écrit des articles, et il est relativement facile d’ajouter des fonctionnalités et de modifier des thèmes.

Installation

https://github.com/ashledombos/docker-spip
https://github.com/ipeos-and-co/docker-spip/blob/master/docker-compose.yml
https://hub.docker.com/r/ipeos/spip/
https://github.com/nbc/spip-compose

Docker compose

J’utilise la distribution d’ispeos, qui n’est pas la plus optimisée (car tourne via Ubuntu), mais qui fonctionne sans trop se casser la tête. Il y a également besoin d’une bdd mysql, ici créée via mariadb.

Volumes

* core :
* data :
* IMG :
* plugins : Avoir un accès aux plugins installés
* config/mes_options.php : Permettre la compatibilité forcée. Attention : ne pas monter tout le répertoire, car config existe déjà
* squelettes : pour personnaliser les squelles

Fichier


docker-compose.yml

version: '3'
services:
  db_spip:
   container_name: db_spip
   image: mariadb:10
   restart: always
   environment:
     MYSQL_RANDOM_ROOT_PASSWORD: 1
     MYSQL_DATABASE: spip
     MYSQL_USER: spip
     MYSQL_PASSWORD: ${SPIP_DB_PASS}
   volumes:
     - ./volumes/mysql:/var/lib/mysql

  spip:
    container_name: spip
    image: ipeos/spip:4.2
    depends_on:
      - db_spip
    volumes:
      - ./volumes/spip-core:/var/www/html/core
      - ./volumes/spip-data:/var/www/html/data
      - ./volumes/spip-img:/var/www/html/IMG
      - ./volumes/plugins:/var/www/html/plugins/
      - ./volumes/plugins-dist/:/var/www/html/plugins-dist
      - ./volumes/config-monter-fichiers-dedans/mes_options.php:/var/www/html/config/mes_options.php
      - ./volumes/squelettes:/var/www/html/squelettes
      - type: bind
        source: ./volume_bind/data
        target: /mnt/data/

    restart: always
    environment:
      SPIP_AUTO_INSTALL: 1
      SPIP_DB_SERVER: mysql
      SPIP_DB_HOST: db_spip
      SPIP_DB_NAME: spip
      SPIP_DB_LOGIN: spip
      SPIP_DB_PASS: ${SPIP_DB_PASS}

      SPIP_ADMIN_NAME: ${SPIP_ADMIN_NAME}
      SPIP_ADMIN_LOGIN: ${SPIP_ADMIN_LOGIN}
      SPIP_ADMIN_EMAIL: ${SPIP_ADMIN_EMAIL}
      SPIP_ADMIN_PASS: ${SPIP_ADMIN_PASS}

      SPIP_SITE_ADDRESS: ${SPIP_SITE_ADDRESS}

      PHP_MEMORY_LIMIT: 256M
      PHP_POST_MAX_SIZE: 40M
      PHP_UPLOAD_MAX_FILESIZE: 32M
      PHP_TIMEZONE: ${PHP_TIMEZONE}
    ports:
      - '8090:80'
    networks:
      default:
        ipv4_address: 172.19.1.12

networks:
  default:
    name: nginx-docker
    external: true


/etc/nginx/conf.d/sub.domain.ext.conf

server {

    server_name sub.domain.ext;
    
     location / {
        proxy_pass http://this.is.local.ip:port;
        proxy_buffering off;
        proxy_set_header Host $host; # ajout pour bonne redirection pages privees
        proxy_set_header X-Real-IP $remote_addr; # idem
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # idem
    }

    listen 443 ssl; # managed by Certbot
    listen [::]:443 ssl; # ajout

    ssl_certificate /etc/letsencrypt/live/sub.domain.ext/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/sub.domain.ext/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

server {
    if ($host = sub.domain.ext) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;
    listen [::]:80; # Ajout

    server_name sub.domain.ext;

    return 404; # managed by Certbot
}
Attention

SPIP_DB_SERVER : ne pas utiliser l’ip ni l’ip:port de la db pour s’y connecter, mais conserver mysql

Problème avec Nginx

J’ai une erreur 502, et n’ai pas encore trouvé ce qui n’allait pas...

Plugins

Thème

* Penser à désactiver les autres plugin thème pour que ça fonctionne...

Hyperspace

* https://contrib.spip.net/HTML5UP-Hyperspace-V3-5240
* Problème de version pour Adaptive Images. Il y a surement en plus des soucis cachés à cause de l’utilisation de php8, mais en ajoutant le mode rétrocomptabilité forcée via le fichier mes_options.php avant d’essayer d’installer le plugin, il est possible de l’installer tout de même.

* Il n’est visiblement possible de n’avoir qu’une seule grille

Photon

Photon est un thème un peu différent, car il permet d’inclure 3 pages complètes à l’intérieur de la page d’accueil. Bien évidemment, il y a des choses à modifier.

Catégorie

Les catégories ne sont pas disponibles avec ce thème nativement. Pour créer des pages de catégorie, il faut créer le fichier
./squelette/rubrique.html

<!DOCTYPE HTML>
<BOUCLE_rubrique(RUBRIQUES){id_rubrique}>
<html>
	<head>
                <title>[(#TITRE) - ][(#NOM_SITE_SPIP|textebrut)]</title>
		[<meta name="description" content="(#DESCRIPTIF{150}|attribut_html)" />]
                [<link rel="canonical" href="(#URL_RUBRIQUE|url_absolue)" />]
                <INCLURE{fond=inclure/head} />
        </head>
	<body class="is-preload">
	                <!-- Header -->
			<INCLURE{fond=inclure/header_categorie,id_rubrique} />
			<!-- Main -->
			<section id="one" class="main style1">
			<div class="rubrique">
			<div class="row gtr-150">
				<div class="container">
                                  [<div class="image fit">(#LOGO_RUBRIQUE|image_recadre{1200,600})</div>]
                                  <h1 class="titre #EDIT{titre}">Les articles</h1>
                                  <B_articles><ul class="actions">
                                      <BOUCLE_articles(ARTICLES){id_rubrique}><li><a href="#URL_ARTICLE" class="button small">#TITRE</a></li></BOUCLE_articles>
                                  </ul></B_mots>
                                  [<div class="texte #EDIT{texte}">(#DESCRIPTIF|image_reduire{1400})</div>]
				</div>
				<div >
                                      	<INCLURE{fond=inclure/documents,id_article,id_rubrique,ajax,env} />
				</div>
			</div>
			</div>
			</section>
			<!-- Footer -->
			<INCLURE{fond=inclure/footer,self=#SELF} />
	</body>
</html>
</BOUCLE_rubrique>

Ainsi que

./inclure/header_categorie.html

        <section id="header">
                <div class="inner">
                        <span>[(#LOGO_SITE_SPIP|non)#FA_ICON{img/fa/solid/cloud.svg}]</span>
	                        <a href="#URL_SITE_SPIP/" class="logo">
                                        [<div>(#LOGO_SITE_SPIP|image_reduire{150,150})</div>][<h1 class="title">(#NOM_SITE_SPIP)</h1>]
		                </a>
<BOUCLE_rubriqueheader(RUBRIQUES){id_rubrique}>
  <h2>#TITRE</h2>
</BOUCLE_rubriqueheader>
	        </div>
	</section>

https://contrib.spip.net/Html5up-Photon#comment513293

Squelette

* Il est possible de personnaliser les pages en copiant les squelettes accueil_one.html (1 à 4) présents dans ./plugins/auto/html5up_photo/vXXXX/include/ en le mettant dans ./squelettes/include/. Ces derniers seront alors prioritairement pris en compte.
* Pour utiliser le squelette ./squelettes/coucou.html, il faut appeler l’article avec le lien (url propre ici : monsite.fr/monarticle ?page=coucou .
** L’idéal serait de trouver comment forcer cela via le htaccess

###
# PERSO !!!
RewriteRule ^cheveux_environnement(\.html)?$    spip.php?page=graphes&id_article=13 [QSA,L]
#
###

Modèles

Cela permet d’inclure des boucles spips et autres éléments de squelette dans un article (cela est impossible directement)
* Créer le dossier ./modeles (ajouté aux volumes)
* Créer article_xxx.html et y mettre le squelette souhaité
* Appeler, dans l’article le module <article|xxx|param=value|param2=value>

Classes

A faire

Autres

Personnaliser un peu plus via des plugins : le couteau suisse est très utile, par exemple, en activant l’option "des menus déroulants" comme ici.

Attention

* Faire des sauvegardes régulières !
* Ne pas ajouter d’images (ou toute autre donnée) manuellement via le volume IMG : ça casse la base de donnée ou de modifier le répertoire de base de spip avec qqc imprévu !!!
** Possibilité de monter des trucs à la racine du container (ex : /mnt/data)
** Visiblement, ajouter des données au répertoire data ne casse pas tout
* En cas de base de donnée cassée, je fais (non optimal) une nouvelle instance :
** Conserver uniquement les volumes : plugins, plugins_dist, sql_export, config_..., squelettes (-> renommer les autres par exemple)
** Reimporter la dernière sauvegarde. Ça risque de casse le login/passwd admin, dans ce cas, le reset avec :
** (docker)# mv config/connect.php config/connect.php_
** (docker)# mv config/chmod.php config/chmod.php_
** https://site.ext/ecrire
*** Base de donnée : valeur de SPIP_DB_HOST
*** Ensuite, il n’y a plus qu’à suivre suivre le reste.
** Réactiver les plugins et remettre leur configuration (c’est le plus embêtant)

* Autre proposition de réinstallation : passer par le CLI (via docker)
* spip sql:repair
* spip core:maj:bdd
* spip core:installer