Table des matières

Sans-nuage.fr

ARN propose à ses membres un compte sur une instance YunoHost mutualisée sans-nuage.fr (anciennement hub.netlib.re ) .

Sur cette même instance se trouve la carte wifi-with-me dédié à la collecte des données géographique des personnes intéressées par le projet ( wifi.arn-fai.net )

Aujourd'hui, les services sans-nuage.fr, sont décomposés en 2 serveurs, pour éviter les conflits entre app et diminuer l'impact d'une panne:

Provisionnement d'un compte sans-nuage.fr

Voici comment un

Base de données de MDP (keepassXC ou firefox avec mdp fort)

Ordi sous linux

Pour la procédure, il faut :

Provisionnement de compte - Découverte de COIN

Modification du quota Nextcloud - Administration Nextcloud

Modification de compte YunoHost et nom sur Nextcloud - Pistes de debug du provisionnement sans-nuage.fr

Modification de mot-de-passe par un administrateur

Pour séparer/rattacher un compte d'un groupe/asso

Suppression

Lufi

Retirer un contenu illégal de lufi

mv /var/www/lufi__3/files/UBERwJ5g9e /root/legal/lufi__3/
sudo -u postgres psql
\c lufi__3
UPDATE files SET abuse=1 files WHERE short='UBERwJ5g9e';

Nextcloud

Faire le ménage dans les comptes nextcloud

Quand on supprime un compte sur YunoHost, le compte Nextcloud reste présent (bien qu'il ne soit plus utilisable). Pour faire le ménage:

sudo -u nextcloud /usr/bin/php8.2 --define apc.enable_cli=1 /var/www/nextcloud/occ ldap:show-remnants

Là il faut faire le tris et vérifier celleux qu'il faut supprimer

sudo -u nextcloud /usr/bin/php8.2 --define apc.enable_cli=1 /var/www/nextcloud/occ user:delete ljf2

Bug synchro Nom LDAP / Nom Nextcloud

Si le nom d'affichage est changé dans YunoHost, celui-ci n'est pas répercuté dans Nextcloud, c'est un problème de synchro LDAP. https://github.com/YunoHost-Apps/nextcloud_ynh/issues/49

J'ai ajouté un petit script qui se lance chaque jour pour contrer ce problème, de cette façon les utilisateurices peuvent modifier leur nom dans le SSO YunoHost. /usr/local/bin/sync_nextcloud_ldap

#!/bin/bash
yunohost user list --output-as json | jq -r '.users[] | "\(.username),\(.fullname)"' | while read -r line ; do
     username=$(echo "$line" | cut -d, -f1)
     fullname=$(echo "$line" | cut -d, -f2)
     fullname2="$(sudo -u nextcloud /usr/bin/php8.2 --define apc.enable_cli=1 /var/www/nextcloud/occ user:setting $username settings display_name)"
     if [[ "$fullname" != "$fullname2" ]] ; then
         echo $username $fullname
         sudo -u nextcloud /usr/bin/php8.2 --define apc.enable_cli=1 /var/www/nextcloud/occ user:setting $username settings display_name "$fullname"
     fi
done

Il faut ajouter les droits sur le script

chmod u+x /usr/local/bin/sync_nextcloud_ldap

Et mettre un cron (ici tous les jours à 7h12)

/etc/cron.d/sync_nextcloud_ldap

12 7  *  *  * root /usr/local/bin/sync_nextcloud_ldap

Désactiver la possibilitée d'utiliser la fonction "Mot de passe oublié?"

Editier le fichier /var/www/nextcloud/config/config.php et y ajouter la ligne suivante

'lost_password_link' => 'disabled',

Etherpad

Diminuer la taille de la base de donnée

Si vous avez un problème de taille de base de données etherpad: https://github.com/YunoHost-Apps/etherpad_mypads_ynh/issues/188

Matrix

Administration

Interface CLI synadm

Problème de mot de passe dans Element

Une fois connecté sur Element, certaines opérations nécessitent de re-rentrer son mdp. Il semble que cette demande de mdp ne soit pas implémenté en CAS. Du coup le mdp échoue.

Contournement :

Nettoyer la base de données

Niveau 1 - via l'interface web Synapse Admin

Niveau 2 utilisation de l'API d'administration synadm

Opérations de nettoyage

\c matrix_synapse
copy (select room_id, count(*) as cnt from events group by room_id order by cnt desc) to '/tmp/rooms_to_clean' csv;
SELECT room_id, stream_ordering, COUNT(event_id) AS c FROM events GROUP BY room_id, stream_ordering ORDER BY c DESC;
SELECT nspname || '.' || relname AS "relation",
    pg_size_pretty(pg_total_relation_size(C.oid)) AS "total_size"
  FROM pg_class C
  LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
  WHERE nspname NOT IN ('pg_catalog', 'information_schema')
    AND C.relkind <> 'i'
    AND nspname !~ '^pg_toast'
  ORDER BY pg_total_relation_size(C.oid) DESC
  LIMIT 20;
jq -r '.rooms | map(select(.creator == "@signalbot:sans-nuage.fr")) | .[].room_id' < rooms.json | xargs -ti $SHELL -ic 'synadm POST '"'"'v1/purge_history/{}'"'"' -d '"'"'{"purge_up_to_ts":'"$(date -d-365days +%s000)"'}'"'"
jq -r '.rooms | map(select(.creator == "@whatsappbot:sans-nuage.fr")) | .[].room_id' < rooms.json | xargs -ti $SHELL -ic 'synadm POST '"'"'v1/purge_history/{}'"'"' -d '"'"'{"purge_up_to_ts":'"$(date -d-365days +%s000)"'}'"'"
SELECT * FROM state_groups_state LIMIT 5;
SELECT COUNT(*) as nb FROM state_groups_state LIMIT 5;
SELECT COUNT(*) as nb FROM state_groups_state;
REINDEX DATABASE CONCURRENTLY matrix_synapse;

ou

REINDEX DATABASE matrix_synapse;
VACUUM 

ou

VACUUM FULL;

semblent avoir le même résultat

\q

Autres commandes utiles :

su -c /usr/bin/psql postgres
synadm GET 'v2/users?name=bot' | jq
postgres=# SELECT pg_size_pretty( pg_database_size( 'matrix_synapse' ) );

full log

122  synadm POST "v1/purge_media_cache?before_ts=$(date -d-60days +%s000)"                                          
  123  synadm POST "v1/purge_media_cache?before_ts=$(date -d-30days +%s000)"                                          
  124  df -h                                                                                                          
  125  synadm POST "v1/media/delete?before_ts=$(date -d-900days +%s000)"                                              
  126  df -h                                                                                                          
  127  synadm POST "v1/media/delete?before_ts=$(date -d-899days +%s000)"                                              
  128  df -h                                                                                                          
  129  synadm POST "v1/media/delete?before_ts=$(date -d-800days +%s000)"                                              
  130  df -h                                                                                                          
  131  synadm POST "v1/media/delete?before_ts=$(date -d-700days +%s000)"                                              
  132  df -h                                                                                                          
  133  synadm POST "v1/media/delete?before_ts=$(date -d-600days +%s000)"                                              
  134  df -h                                                                                                          
  135  synadm POST "v1/media/delete?before_ts=$(date -d-500days +%s000)"                                              
  136  df -h                                                                                                          
  137  synadm POST "v1/media/delete?before_ts=$(date -d-500days +%s000)"                                              
  138  df -h                                                                                                          
  139  synadm POST "v1/media/delete?before_ts=$(date -d-400days +%s000)"                                              
  140  synadm POST "v1/media/delete?before_ts=$(date -d-450days +%s000)"                                              
  141  synadm POST "v1/media/delete?before_ts=$(date -d-400days +%s000)"                                              
  142  df -h                                                                                                          
  143  synadm POST "v1/media/delete?before_ts=$(date -d-365days +%s000)"                                              
  144  df -h                                                                                                          
  145  synadm GET 'v1/rooms?limit=999999' > rooms.json                                                                
  146  jq '.rooms | map(select(.joined_local_members == 0))' < rooms.json                                             
  147  nano rooms.json                                                                                                
  148  jq '.rooms | map(select(.joined_local_members == 0)) | map(.state_events) | add' < rooms.json                  
  149  df -h                                                                                                          
  150  synadm GET 'v1/rooms?limit=500' > rooms.json                                                                   
  151  jq '.rooms | map(select(.joined_local_members == 0))' < rooms.json                                             
  152  synadm GET 'v1/rooms?limit=5000' > rooms.json                                                                  
  153  jq '.rooms | map(select(.joined_local_members == 0))' < rooms.json                                             
  154  synadm GET 'v1/rooms?limit=1000' > rooms.json                                                                  
  155  synadm GET 'v1/rooms?limit=2000' > rooms.json                                                                  
  156  synadm GET 'v1/rooms?limit=1000' > rooms.json                                                                  
  157  jq '.rooms | map(select(.joined_local_members == 0))' < rooms.json                                             
  158  nano rooms.json                                                                                                
  159  jq -r '.rooms | map(select(.joined_local_members == 0)) | .[].room_id' < rooms.json | xargs -ti synadm DELETE '
v1/rooms/{}' -d '{"purge": true}'                                                                                     
  160  synadm POST "v1/purge_media_cache?before_ts=$(date -d-30days +%s000)"                                          
  161  nano rooms.json                                                                                                
  162  sudo su                                                                                                        
  163  exit                                                                                                           
  164  tmux a                                                                                                         
  165  sudo su                                                                                                        
  166  df -h                                                                                                          
  167  lsblk                                                                                                          
  168  fdisk -l                                                                                                       
  169  sudo fdisk -l                                                                                                  
  170  dfc -Taisob 
  185  synadm GET 'v1/rooms?limit=999999' > rooms.json                                                                
  186  jq '.rooms | map(select(.joined_local_members == 0)                                                            
  187  nano rooms.json                                                                                                
  188  sudo su                                                                                                        
  189  synadm -o json room list -s joined_local_members -r -l 500 | jq -r '.rooms[] | select(.joined_local_members == 
0) | .room_id'                                                                                                        
  190  synadm POST "v1/purge_media_cache?before_ts=$(date -d-30days +%s000)"                                          
  191  history | grep synadm                                                                                          
  192  synadm GET v2/users/@gauthier67:sans-nuage.fr | jq                                                             
  193  synadm GET 'v1/rooms?limit=500' > rooms.json                                                                   
  194  nano rooms.json                                                                                                
  195  exit                                                                                                           
  196  tmux a
  197  tmux
  198  exit
  199  sudo su
  200  exit
  201  sudo su
  202  jq -r '.rooms | map(select(.joined_local_members == 0)) | .[].room_id' < rooms.json | xargs -ti synadm DELETE '
v1/rooms/{}' -d '{"purge": true}'
  203  source .bashrc 
  204  jq -r '.rooms | map(select(.joined_local_members == 0)) | .[].room_id' < rooms.json | xargs -ti synadm DELETE '
v1/rooms/{}' -d '{"purge": true}'
  205  nano .bashrc
  206  source .bashrc 
  207  synadm GET v2/users/@gauthier67:sans-nuage.fr | jq
  
 208  jq -r '.rooms | map(select(.joined_local_members == 0)) | .[].room_id' < rooms.json | xargs -ti synadm [0/1972]
v1/rooms/{}' -d '{"purge": true}'
  209  nano rooms.json 
  210  history | grep synadm
  211  synadm POST "v1/media/delete?before_ts=$(date -d-365days +%s000)"
  212  synadm POST "v1/media/delete?before_ts=$(date -d-465days +%s000)"
  213  synadm POST "v1/media/delete?before_ts=$(date -d-365days +%s000)"
  214  synadm POST "v1/media/delete?before_ts=$(date -d-400days +%s000)"
  215  synadm POST "v1/media/delete?before_ts=$(date -d-430days +%s000)"
  216  synadm POST "v1/media/delete?before_ts=$(date -d-400days +%s000)"
  217  synadm POST "v1/media/delete?before_ts=$(date -d-365days +%s000)"
  218  synadm POST "v1/purge_media_cache?before_ts=$(date -d-300days +%s000)"
  219  synadm POST "v1/purge_media_cache?before_ts=$(date -d-200days +%s000)"
  220  synadm POST "v1/purge_media_cache?before_ts=$(date -d-100days +%s000)"
  221  synadm POST "v1/purge_media_cache?before_ts=$(date -d-150days +%s000)"
  222  synadm POST "v1/purge_media_cache?before_ts=$(date -d-100days +%s000)"
  223  synadm POST "v1/purge_media_cache?before_ts=$(date -d-70days +%s000)"
  224  synadm POST "v1/purge_media_cache?before_ts=$(date -d-30days +%s000)"
  225  synadm GET 'v1/rooms?limit=999999' > rooms.json
  226  jq '.rooms | map(select(.joined_local_members == 0))' < rooms.json
  227  jq '.rooms | map(select(.joined_local_members == 0)) | map(.state_events) | add' < rooms.json
  228  jq -r '.rooms | map(select(.joined_local_members == 0)) | .[].room_id' < rooms.json | xargs -ti synadm DELETE '
v1/rooms/{}' -d '{"purge": true}'
  229  xargs --help
  230  jq -r '.rooms | map(select(.joined_local_members == 0)) | .[].room_id' < rooms.json | xargs -ti synadm DELETE '
v1/rooms/{}' -d '{"purge": true}'
  231  history | grep psql
  232  psql
  233  synadm GET 'v1/rooms?limit=999999' > rooms.json
  234  nano rooms.json 
  235  jq -r '.rooms | map(select(.joined_local_members == 0)) | .[].room_id' < rooms.json | xargs -ti $SHELL -ic "syn
adm DELETE 'v1/rooms/{}' -d '{\"purge\": true}'"
  236  nano /tmp/rooms_to_clean 
  237  head -n 20 /tmp/rooms_to_clean | cut -d, -f1 | xargs -ti $SHELL -ic 'synadm POST \'v1/purge_history/{}\' -d "{\
"purge_up_to_ts\":$(date -d-365days +%s000)}"'

\q
  238  head -n 20 /tmp/rooms_to_clean | cut -d, -f1 | xargs -ti $SHELL -ic 'synadm POST '"'"'v1/purge_history/{}'"'"' 
-d '"'"'{"purge_up_to_ts":'"$(date -d-30days +%s000)"'}'"'" 
  239  nano /tmp/rooms_to_clean 
  240  jq -r '.rooms | map(select(.creator == \"@whatsappbot:sans-nuage.fr\")) | .[].room_id' < rooms.json
  241  jq -r '.rooms | map(select(.creator == "@whatsappbot:sans-nuage.fr")) | .[].room_id' < rooms.json
  242  jq -r '.rooms | map(select(.creator == "@whatsappbot:sans-nuage.f")) | .[].room_id' < rooms.json
  243  jq -r '.rooms | map(select(.creator == "@signalbot:sans-nuage.fr")) | .[].room_id' < rooms.json
  244  jq -r '.rooms | map(select(.creator == "@whatsappbot:sans-nuage.fr")) | .[].room_id' < rooms.json | xargs -ti $
SHELL -ic 'synadm POST \'v1/purge_history/{}\' -d "{\"purge_up_to_ts\":$(date -d-365days +%s000)}"'
  245  jq -r '.rooms | map(select(.creator == "@whatsappbot:sans-nuage.fr")) | .[].room_id' < rooms.json | xargs -ti $
SHELL -ic "synadm POST 'v1/purge_history/{}' -d '{"'"'"purge_up_to_ts"'"'":"'"'"$(date -d-365days +%s000)"'"'"}'"
  246  jq -r '.rooms | map(select(.creator == "@whatsappbot:sans-nuage.fr")) | .[].room_id' < rooms.json | xargs -ti $
SHELL -ic 'synadm POST '"'"'v1/purge_history/{}'"'"' -d '"'"'{"purge_up_to_ts":'"$(date -d-365days +%s000)"'}'"'"
  247  jq -r '.rooms | map(select(.creator == "@signalbot:sans-nuage.fr")) | .[].room_id' < rooms.json | xargs -ti $SH
ELL -ic 'synadm POST '"'"'v1/purge_history/{}'"'"' -d '"'"'{"purge_up_to_ts":'"$(date -d-365days +%s000)"'}'"'"           

Conflit APT entre mobilizon et onlyoffice

OBSOLETE (mobilizon_ynh utilise maintenant des versions précompilées)

En deux mot : rabbitmq-server dépends de pleins de trucs en erlang (des dépôts debian vanilla) … et Mobilizon dépends de erlang, mais d'une version d'un dépot tier. Le tout résulte en un tas de conflit relou.

Une explication / solution possible est de bricoler le fichier control du .deb de esl-erlang (voulu par Mobilizon) pour donner des versions explicites aux paquets dans “Provides”

cd /root/
mkdir hack_esl_erlang_for_compat_with_rabbitmq
apt download esl-erlang
cp esl-erlang_1%3a23.1-1_amd64.deb esl-erlang_1%3a23.1-1_amd64.deb.original
ar x esl-erlang_1%3a23.1-1_amd64.deb
tar -xvf control.tar.xz
vim ./control

Dans le fichier, on ajoute “+arnhack” à la version du paquet, et la liste des Provides devient (N.B. : si nécessaire dans le futur, adapter les numéros de version of course…) :

Provides: erlang-abi-17.0 (= 1:23.1-1), erlang-base-hipe (= 1:23.1-1), erlang-dev (= 1:23.1-1), erlang-appmon (= 1:23.1-1), erlang-asn1 (= 1:23.1-1), erlang-common-test (= 1:23.1-1), erlang-corba (= 1:23.1-1), erlang-crypto (= 1:23.1-1), erlang-debugger (= 1:23.1-1), erlang-dialyzer (= 1:23.1-1), erlang-docbuilder (= 1:23.1-1), erlang-edoc (= 1:23.1-1), erlang-eldap (= 1:23.1-1), erlang-erl-docgen (= 1:23.1-1), erlang-et (= 1:23.1-1), erlang-eunit (= 1:23.1-1), erlang-gs (= 1:23.1-1), erlang-ic (= 1:23.1-1), erlang-inets (= 1:23.1-1), erlang-inviso (= 1:23.1-1), erlang-megaco (= 1:23.1-1), erlang-mnesia (= 1:23.1-1), erlang-observer (= 1:23.1-1), erlang-odbc (= 1:23.1-1), erlang-os-mon (= 1:23.1-1), erlang-parsetools (= 1:23.1-1), erlang-percept (= 1:23.1-1), erlang-pman (= 1:23.1-1), erlang-public-key (= 1:23.1-1), erlang-reltool (= 1:23.1-1), erlang-runtime-tools (= 1:23.1-1), erlang-snmp (= 1:23.1-1), erlang-ssh (= 1:23.1-1), erlang-ssl (= 1:23.1-1), erlang-syntax-tools (= 1:23.1-1), erlang-test-server (= 1:23.1-1), erlang-toolbar (= 1:23.1-1), erlang-tools (= 1:23.1-1), erlang-tv (= 1:23.1-1), erlang-typer (= 1:23.1-1), erlang-webtool (= 1:23.1-1), erlang-wx (= 1:23.1-1), erlang-xmerl (= 1:23.1-1)

puis mettre à jour le .deb avec le nouveau fichier:

rm -f control.tar control.tar.xz
tar -cvf control.tar control
xz control.tar
ar r esl-erlang_1%3a23.1-1_amd64.deb control.tar.xz

Et on peut ensuite faire :

dpkg -i esl-erlang_1%3a23.1-1_amd64.deb