Je prends des notes à l'aide de dendron
( première Bulle à ce sujet https://liens.vincent-bonnefille.fr/?AGBhmA )
Bon, les WikiLinks c'est formidable
( Internal links : [[lien_popup_sujet]] - doc wiki )
J'appelle WikiLinks des liens internes, qui lient des pages/notes entre elles...
Comme sur wiki quand on survol un de ces liens il affiche un popup !
Si on clique dessus, le lien ouvre la page vers laquelle cette note/lien pointe.
Trop deep
Mais, quand j'écris en md_markdown avec dendron ...
Je peux me retrouver avec une hiérarchie de notes assez deep (profonde)
Les liens contiennent en effet tout le chemin des sous-parties (séparées par un (.))
[[Root.sujet.partie.élément_child]]
= lien vers =>
Root > sujet > partie > élément_child
Le lien devient long
Difficile à lire
Il prend de la place dans le texte
Je voudrais qu'il prenne moins de place
( comme dans son état final, quand on "preview" le code en HTML )
: qu'il soit +lisible :
lire seulement le titre de la note/fiche ( sans le chemin entier )
EX/ [[gparent.parent.child_name]]
-> [[child_name]]
Solution : plugin
Heureusement, vscode regorge de plugins/extensions...
vscode-inline-fold permet de rétracter ("fold") les bouts de code trop longs ...
( par exemple, on pourra réduire "fold" une chaine de classes dans un élément HTML )
Regex / préférence :
Mes préférences avec le Regex pour les WikiLinks :
"[markdown]": {
"inlineFold.regex":"\\[\\[(([\\.A-Za-zÀ-ú0-9_\\-\\:]{1,}?)\\.)([A-Za-zÀ-ú0-9_\\-\\:]{1,}?)\\]\\]",
"inlineFold.regexFlags": "g",
"inlineFold.regexGroup": 1,
"inlineFold.unfoldedOpacity": 0.6,
"inlineFold.maskChar": "",
"inlineFold.after": "",
"inlineFold.maskColor": "#000",
"inlineFold.unfoldOnLineSelect": true,
"inlineFold.autoFold": true,
}
On peut ensuite ajouter un raccourcis pour afficher/masquer les Wikiliens...
Final Regex
https://regex101.com/library/nlSi7u (me)
https://regex101.com/r/5R0WQ1/1 (other user)
Docker acces via SSH
Objectif :
Simplifier le développement en accédant aux fichiers de mon container Docker via SSH
( on ouvre le container comme dans un gestionnaire de fichier )
STORY (motivation)
J'installe un nouveau Shaarli
( autour d'un #corpus élargi ) ( qui sera privé )
Je voudrais suivre la branche Master du projet Shaarli
( {ici} j'ai bifurqué pour ajouter quelles fonctionnalités )
( {ici} j'ai ajouté un champ pour l'aperçu illustrant chaque {bulle} )
( l'image à gauche... car parfois Shaarli n'en trouve pas dans la page/lien )
Ajout de champ
Dans la nouvelle version je veux ajouter le même champ
... en suivant la documentation : edit_link_plugin
En faisant mes propres recherches...
je m'aperçois que le plugin Démo nous montre la voie :
- https://github.com/shaarli/Shaarli/tree/master/plugins/demo_plugin
( après, intégrer par moi-même un field.champ n'avait pas été compliqué )
( la Démo nous montre comment l'ajouter + enregistrer -pas comment l'intégrer )
Bug
Malheureusement, dans la nouvelle version de shaarli il y a un bug...
- https://github.com/shaarli/Shaarli/issues/2000
- https://github.com/shaarli/Shaarli/issues/1808 )
qui fait que l'ajout de champ + récupération des données ne marche pas...
( ... c'est bien la peine que je mette en place un accès à mon Docker SSH en local )
Docker
Du coup je repars sur une version Docker
Et pour faire ça (mes modifs / ajouts)..
je vais vouloir interagir avec le contenu de container de façon fluide.
. La technique "normale" consiste à récupérer un fichier dans le Container
. L'éditer
. et le remettre...
. . cela me semble fastidieux...
Du coup, j'ai envie de tester avec SSH !
Pour cela le container doit faire tourner SSH
( et ses ports doivent être ouverts vers l'Host )
( Host = hôte = machine.ordi dans lequel est installé Docker qui contient le container)
( Ordi = Host > Docker > Container(s) > OS > Apps.services, ex: Shaarli )
Version courte
( open host -> docker )
sudo docker exec -it -u root DOCKER_NAME sh
( dans docker )
sleep 1
echo "--- Install stuffs"
apk update; apk add openssh-server
apk add openrc openssh
# opt
apk add --no-cache nano
apk add --no-cache bash
echo
echo "--- Generate SSH Keys" && sleep 3
mkdir -p /root/.ssh
chmod 0700 /root/.ssh
ssh-keygen -A
echo
echo "--- allow ROOT Authentification" && sleep 3
echo " " >> /etc/ssh/sshd_config
echo " " >> /etc/ssh/sshd_config
echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config
echo "PermitEmptyPasswords yes" >> /etc/ssh/sshd_config
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
echo
sleep 1
echo "--- creat ROOT password"
passwd
echo "\n------- ALL CONFIGURED ==> reStart \n"
echo
echo "--- reSTART sshd, can be long" && sleep 3
rc-status
touch /run/openrc/softlevel
/etc/init.d/sshd restart
( ok, on exit du Docker_Container )
( on chope son IP, on s'y connecte en SSH )
echo "---- You can exit"
exit
echo "\n------- HOWTO CONNECT \n"
echo
echo "then get Container IP"
echo "D_NAME == Container Name"
echo "docker container inspect -f '{{ .NetworkSettings.Networks.shaarli_default.IPAddress }}' D_NAME"
echo
echo "---- Then connect"
ssh root@172.17.0.X -p 22
Marche à suivre (notes installation)
SOURCES
- https://dev.to/yakovlev_alexey/running-ssh-in-an-alpine-docker-container-3lop
- https://techoverflow.net/2021/05/17/how-to-enable-ssh-root-login-on-alpine-linux/
DOCKERFILE
( ex. instructions - shot version )
- https://gdevillele.github.io/engine/examples/running_ssh_service/
- https://stackoverflow.com/a/68302177
PORT forward
( Port SSH par défaut : 22 )
( Connexion Host -> Docker )
0.0.0.0:2222 22/tcp
! at dock creation
--publish 8800:80 --publish 2222:22
Go into Docker Container
( where to install ssh-serveur access )
( on pourra aussi créer un nouvel utilisateur non root )
docker exec -it -u root D_CONTAINER_NAME sh
INSTALL d'app/services via APK (Alpine)
apk update
apk add openssh-server
apk add openrc openssh
Optionnel
apk add nano
apk add bash
INIT CONFIG SSH
mkdir -p /root/.ssh
chmod 0700 /root/.sshssh-keygen -A
rc-status
touch /run/openrc/softlevel
/etc/init.d/sshd start
SET PWD (root)
passwd
passwd -u root # <- UNSET = null
Allow Host SSH->Container connexion
( default user is root )
( here we allow for root, not most secure )
( ... you can creat a new user if needed )
For Root user :
nano /etc/ssh/sshd_config
PermitRootLogin yes
authentification w/ pwd
PasswordAuthentication yes
PermitEmptyPasswords yes
... THEN on redémarre le service SSH
... pour qu'il fonctionne avec nos nouveaux paramètres
service sshd restart
CONNECTION
GET CONTEINER IP
( into docker > sh/bash )
ifconfig
( or outside, from host )
sudo docker container inspect shaarli_e2jk | grep -i IPAddress
( or )
docker container inspect -f '{{ .NetworkSettings.Networks.shaarli_default.IPAddress }}' D_NAME
FINALY : CONNECT
ssh root@172.21.0.2 -p 22
PASSWORD
AUTOreSTART - OPENRC
- https://docs.alpinelinux.org/user-handbook/0.1a/Working/openrc.html
- https://www.linuxtricks.fr/wiki/openrc-les-commandes-essentielles (FR)
- https://wiki.gentoo.org/wiki/OpenRC_to_systemd_Cheatsheet
- https://www.cyberciti.biz/faq/how-to-enable-and-start-services-on-alpine-linux/
ex
Status
service sshd status
Redémarrer
service sshd restart
-- auto-restart (on host restart)
( rc-update add <service> <runlevel> )
rc-update add sshd
( not working for me )
-> temp. solution
sudo docker restart D_NAME
sudo docker inspect D_NAME -f "{{json .NetworkSettings.Networks.bridge.IPAddress }}"
AUTRES PISTES
C to C
MAJ 2024
Installation de Baikal qui est bien plus complet dans la gestion d'utilisateur.ices / calendriers... UI plus compète.
Un bon tuto, memes conclusions vàv de /NextCloud/
https://nicolasforcet.com/baikal-liberez-vous-de-google-avec-ce-tout-petit-serveur-de-calendrier-caldav/
Story
J'ai installé un service de calendrier / tâches / listes ( et contacts ) : /Raicale/ !
Lire les buts / motivations de ce dev. (en anglais) :
J'aime bien :
- le logo
- le jeu de mot
cal comme dans calendrier
cal comme dans /webcal/
cal comme dans /Radicale/ !
+Léger qu'un /NextCloud/ mais sans interface web (GUI)
+Centré sur les Calendriers+Carnet d'adresses !
+Tourne vite, s'installe vite (python)
+Gestion simple d'Utilisateur.ices à la main (bash-cli)
+URL d'abonnement auto-générée
Compatibilité
Android
Marche super avec https://f-droid.org/packages/at.bitfire.davdroid
Autres
Testé via GoogleAgenda / AppleCalendar (OS 10.10) / Gnome Agenda / Thunderbird : OK
iPad ?
dommage, j'ai pas réussi à interagir depuis l'iPad à jour
Finalement ca marche
-> $URL/$USER/ = ok
( oui c'est un projet familiale, )
( et la mif' est sur des systèmes mentalement clos )
Extras
Quelques Plugins à test todo
Alternativeto
Une alternative avec + de fonctions + GUI
/Wetty/ sert à accéder à un terminal de commandes ( cli_bash ) via le protocole SSH ...
mais en passant par le wwweb (via n'importe quel navigateur ) !
Normalement on se connect avec le protocole SSH via un terminal (application)
ssh user@adresse_du_serveur_ou_son_IP
<
Sur un wifi public (ou protégé) certain admin empêchent l'accès au port :22
(SSH)
Aussi, en passant par le web ( port :80
) on peut contourner cette limitation...
Pratique quand on veut accéder sans délais à son serveur distant !
- https://computingforgeeks.com/run-linux-terminal-on-web-browser-using-wetty/
Full tuto - https://distroid.net/linux-terminal-using-wetty/
. . .
En remplaçant de /Shell in a box/ ( discontinued )
2025
( pas facile à installer wetty )
TRY ttyd
GIT
- https://github.com/tsl0922/ttyd
-
HELP
- https://fr.linux-console.net/?p=20489
- https://github.com/tsl0922/ttyd/wiki/Example-Usage
INSTALL
- https://github.com/tsl0922/ttyd/releases
-> ARCHITECTURE (attention cpu) - `cp /dwl/path/ttyd... /usr/bin/‘
COMMANDE
sudo ttyd -W -p 9000 login
( NB : -W make it interactive, can type, carfulle in prod )
( SOURCE : https://github.com/tsl0922/ttyd/issues/1217#issuecomment-1755851524 )
NGINX
PASSWORD protect NGINX
sudo htpasswd -c /etc/nginx/.htpassttyd USERNAME
Config
server {
server_name shell.host.com;
root /var/www/html/; # Random
charset utf-8;
listen 80;
listen [::]:80;
location / {
# PASSWORD
auth_basic "Administrator’s Area";
auth_basic_user_file /etc/nginx/.htpassttyd;
# PROXY PORT
proxy_pass http://127.0.0.1:9000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 43200000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
}
}
( restart Nginx )
ADD Cert (ssl)
sudo certbot --nginx -d shell.host.com
EXTRA_SCRIPT.sh ( tmux + login )
#!/bin/bash
tmux new -s session_name -c sudo /usr/bin/login
Tmux conf
~/.tmux.conf
Service
sudo nano /etc/systemd/system/ttyd.service
[Unit]
Description=ttyd_login
After=network-online.target
[Service]
Type=simple
ExecStart=COMMANDE EXTRA_SCRIPT.sh
Restart=always
RestartSec=2
TimeoutStopSec=5
SyslogIdentifier=ttyd
[Install]
WantedBy=multi-user.target
Autostart
sudo systemctl enable ttyd