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:
Voici comment un
Base de données de MDP (keepassXC ou firefox avec mdp fort)
Ordi sous linux
Expliquer l'architecture de l'infra https://wiki.arn-fai.net/benevoles:technique
Créer un compte sur le wiki avec des droits user https://wiki.arn-fai.net/benevoles:technique:yunohost_mutu
Donner des droits superutilisateur sur COIN https://adherents.arn-fai.net/admin/
Pour la procédure, il faut :
CONTOURNEMENT : seul un admin peut le modifier et le transmettre de manière sécurisée en suivant cette procédure
La modification se passe sur https://sans-nuage.fr/yunohost/admin/#/users/
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';
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
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
Editier le fichier /var/www/nextcloud/config/config.php et y ajouter la ligne suivante
'lost_password_link' => 'disabled',
Si vous avez un problème de taille de base de données etherpad: https://github.com/YunoHost-Apps/etherpad_mypads_ynh/issues/188
Interface CLI synadm
synadm room make-admin -u @user:sans-nuage.fr '!room_id:sans-nuage.fr'
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 :
Niveau 1 - via l'interface web Synapse Admin
su --command="psql matrix_synapse" postgres <<< "UPDATE users SET admin = 1 WHERE name = '@user:sans-nuage.fr'"
Niveau 2 utilisation de l'API d'administration synadm
Aide et A propos
> Advanced
> jeton d'accès
export SYNAPSE_HS=matrix.sans-nuage.fr export SYNAPSE_TOKEN=le_jeton_recupere
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)"'}'"'"
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