Compare commits

..

5 Commits

Author SHA1 Message Date
6ea54b1218 Add update-kuma monitoring tool 2024-02-17 18:49:44 +01:00
2fa462c0ee Update python, postgres, linux and textual notes 2023-07-29 08:29:54 +02:00
9dfa0e63bb Add batcat node 2023-05-21 18:03:38 +02:00
6e78335f5d Add readflow node 2023-05-21 18:03:08 +02:00
aa8990e1c7 Add keycloak node 2023-05-21 18:01:31 +02:00
8 changed files with 406 additions and 11 deletions

View File

@@ -1,6 +1,6 @@
:PROPERTIES: :PROPERTIES:
:ID: 4fabfe6a-b104-464f-8a87-dfd7d761dbcc :ID: 4fabfe6a-b104-464f-8a87-dfd7d761dbcc
:mtime: 20220720145510 :mtime: 20221003215204
:ctime: 20211230101535 :ctime: 20211230101535
:END: :END:
#+title: Python #+title: Python
@@ -30,10 +30,12 @@ La méthode ~__repr__~ est utilisée pour le debug quand ~__str__~ pour l'utilis
** Functools module ** Functools module
*** [[id:25d994fd-375b-429d-af38-6afba818159f][functools.singledispatch]] *** [[id:25d994fd-375b-429d-af38-6afba818159f][functools.singledispatch]]
* Frameworks * Frameworks
** Web ** Web
*** [[id:26b04294-75e8-4043-a9a6-a20acd952963][Flask]] *** [[id:26b04294-75e8-4043-a9a6-a20acd952963][Flask]]
* UI * UI
** GUI ** GUI
*** [[https://kivy.org/#home][Kiwi]] *** [[https://kivy.org/#home][Kiwi]]
@@ -48,6 +50,7 @@ Bindings python pour Qt.
** Text UI ** Text UI
*** [[id:6cc56ee4-6d42-4d50-beb3-bb22a98298dd][textual]] *** [[id:6cc56ee4-6d42-4d50-beb3-bb22a98298dd][textual]]
* Outils * Outils
** Analyseur statique de code ** Analyseur statique de code
*** [[id:1d258869-5421-496a-b296-2d157ebdf3b6][mypy]] *** [[id:1d258869-5421-496a-b296-2d157ebdf3b6][mypy]]
@@ -61,11 +64,14 @@ Outil en ligne de commande permettant d'automatiser les tests dans multiples env
** Couverture de code ** Couverture de code
*** [[https://github.com/plasma-umass/slipcover][Slipcover]] *** [[https://github.com/plasma-umass/slipcover][Slipcover]]
Outil de mesure de couverture de code plus rapide que [[https://github.com/nedbat/coveragepy][coverage.py]]. Outil de mesure de couverture de code plus rapide que [[https://github.com/nedbat/coveragepy][coverage.py]].
** Debugger
*** [[https://github.com/ionelmc/python-manhole][Manhole]]
Service (interface via une socket Unix permettant l'accès à un REPL) permettant l'inspection d'un programme en cours d'exécution.
** Formatter ** Formatter
*** [[https://github.com/hhatto/autopep8][autopep8]] *** [[https://github.com/hhatto/autopep8][autopep8]]
Utilitaire formattant le code afin de respecter la [[https://www.python.org/dev/peps/pep-0008/][PEP8]] guideline. Il est basé sur l'analyse de code effectuée par Utilitaire formattant le code afin de respecter la [[https://www.python.org/dev/peps/pep-0008/][PEP8]] guideline. Il est basé sur l'analyse de code effectuée par
[[https://github.com/PyCQA/pycodestyle][pycodestyle]]. Autopep8 ne modifie que les espaces contenus dans le code (l'option ~--aggressive~ permet d'accroitre le [[https://github.com/PyCQA/pycodestyle][pycodestyle]]. ~Autopep8~ ne modifie que les espaces contenus dans le code (l'option ~--aggressive~ permet d'accroître le
pouvoir d'autopep8 et le laisser modifier le code). pouvoir d'~autopep8~ et le laisser modifier le code).
*** [[https://github.com/PyCQA/isort][isort]] *** [[https://github.com/PyCQA/isort][isort]]
Outil classant les imports par ordre alphabétique, les séparant par section et par type. Outil classant les imports par ordre alphabétique, les séparant par section et par type.
*** [[https://black.readthedocs.io/en/stable/][Black]] *** [[https://black.readthedocs.io/en/stable/][Black]]
@@ -81,6 +87,8 @@ Génération de données pouvant être utilisées pour:
* Créer des fichiers JSON ou XML d'après une structure arbitraire. * Créer des fichiers JSON ou XML d'après une structure arbitraire.
*** [[https://github.com/joke2k/faker][Faker]] *** [[https://github.com/joke2k/faker][Faker]]
Génération de données. Génération de données.
** Gestion dépendances
*** [[id:01f24d29-e833-4bfa-acb0-95140800d081][poetry]]
** Mockup ** Mockup
*** [[https://github.com/spulec/freezegun][FreezeGun]] *** [[https://github.com/spulec/freezegun][FreezeGun]]
Mockup du module [[https://docs.python.org/fr/3/library/datetime.html][datetime]] permettant de simuler des changements de temps. Mockup du module [[https://docs.python.org/fr/3/library/datetime.html][datetime]] permettant de simuler des changements de temps.
@@ -94,6 +102,8 @@ méthode et le temps passé).
/Memory profiler/ traçant les allocations mémoire dans le code Python, les modules extensions et l'interpréteur. /Memory profiler/ traçant les allocations mémoire dans le code Python, les modules extensions et l'interpréteur.
*** [[https://jiffyclub.github.io/snakeviz/][SnakeViz]] *** [[https://jiffyclub.github.io/snakeviz/][SnakeViz]]
Visualisation des rapports de /cProfile/ (web browser). Visualisation des rapports de /cProfile/ (web browser).
*** [[https://github.com/brandtbucher/specialist][Specialist]]
Outil permettant d'indiquer le code optimisé par la spécialisation du bécote (cf. [[https://peps.python.org/pep-0659/][PEP 659 Specializing Adaptive Interpreter]]).xo
*** [[https://github.com/nvdv/vprof][vprof]] *** [[https://github.com/nvdv/vprof][vprof]]
Profiling de programmes python permettant de surveiller le temps d'exécution et l'usage mémoire. Profiling de programmes python permettant de surveiller le temps d'exécution et l'usage mémoire.
~vprof -c hpm "<cmd>"~ ~vprof -c hpm "<cmd>"~
@@ -104,9 +114,6 @@ Outil permettant de tester la tenue en charge d'applications (initialement web s
** Traceur d'exécution de code ** Traceur d'exécution de code
*** [[https://github.com/ionelmc/python-hunter][Python-hunter]] *** [[https://github.com/ionelmc/python-hunter][Python-hunter]]
Traçage des appels de fonctions, du code exécuté et des valeurs retournées (vs. smiley, pytrace, PySnooper). Traçage des appels de fonctions, du code exécuté et des valeurs retournées (vs. smiley, pytrace, PySnooper).
** Debugger
*** [[https://github.com/ionelmc/python-manhole][Manhole]]
Service (interface via une socket Unix permettant l'accès à un REPL) permettant l'inspection d'un programme en cours d'exécution.
* Implémentations * Implémentations
** CPython ** CPython
@@ -121,6 +128,7 @@ Activation du mode développeur ~python -X dev~ ou ~PYTHONDEVMODE=1 python~ (cf.
Implémentation CPython optimisée par Instagram : Implémentation CPython optimisée par Instagram :
* [[https://engineering.fb.com/2022/05/02/open-source/cinder-jits-instagram/][Jit]] * [[https://engineering.fb.com/2022/05/02/open-source/cinder-jits-instagram/][Jit]]
* Modules intéressants * Modules intéressants
** Bases de données ** Bases de données
*** [[https://spark.apache.org/docs/latest/api/python/][PySpark]] *** [[https://spark.apache.org/docs/latest/api/python/][PySpark]]
@@ -157,6 +165,8 @@ Wrapper permettant l'accès au contenu de wikipedia.
*** [[https://github.com/ICRAR/ijson][ijson]] *** [[https://github.com/ICRAR/ijson][ijson]]
Parser JSON ne nécessitant pas que l'ensemble de la donnée soit chargée pour la parser (optimisation de la mémoire Parser JSON ne nécessitant pas que l'ensemble de la donnée soit chargée pour la parser (optimisation de la mémoire
consommée, cf. [[https://pythonspeed.com/articles/json-memory-streaming/][JSON memory streaming - Pythonspeed]]). consommée, cf. [[https://pythonspeed.com/articles/json-memory-streaming/][JSON memory streaming - Pythonspeed]]).
** Stockage des données
*** [[https://github.com/theskumar/python-dotenv][dotenv]]
** Surveillance de fichers ** Surveillance de fichers
*** [[https://watchfiles.helpmanual.io/][watchfiles]] *** [[https://watchfiles.helpmanual.io/][watchfiles]]
Surveillance de fichiers basé sur la librarie Rust /Notify/. Surveillance de fichiers basé sur la librarie Rust /Notify/.
@@ -166,6 +176,12 @@ Surveillance de fichiers basé sur la librarie Rust /Notify/.
*** [[https://scrapy.org/][scrapy]] *** [[https://scrapy.org/][scrapy]]
Framework d'extraction de données depuis des site web. Framework d'extraction de données depuis des site web.
* Modules amustants
*** [[https://github.com/gahjelle/pythonji][pythonji]]
Utilisation d'emojis pour l'écriture de code en Python
* Performances * Performances
** [[id:b9f392bd-bd45-4e9e-94ec-b19caedff86f][List vs tuple]] ** [[id:b9f392bd-bd45-4e9e-94ec-b19caedff86f][List vs tuple]]
** [[id:26e1fdfb-1f8e-4c62-a08f-468a56ab03c8][Peephole optimization]] ** [[id:26e1fdfb-1f8e-4c62-a08f-468a56ab03c8][Peephole optimization]]
@@ -198,6 +214,14 @@ Framework d'extraction de données depuis des site web.
* utiliser ~python -m pip~ et ~python -m venv~ (exécution du module en tant que script, au lieu de ~pip~ et ~virtualenv~) permet d'éviter les incohérences * utiliser ~python -m pip~ et ~python -m venv~ (exécution du module en tant que script, au lieu de ~pip~ et ~virtualenv~) permet d'éviter les incohérences
entre les différents répertoires des packages Python (cas lorsqu'un répertoire est présent dans le ~PYTHONPATH~ et qu'un autre l'est dans le ~PATH~). entre les différents répertoires des packages Python (cas lorsqu'un répertoire est présent dans le ~PYTHONPATH~ et qu'un autre l'est dans le ~PATH~).
* Optimisations
** Création automatique de constantes numériques lors de la génération du bytecode
#+BEGIN_SRC python :results output
y = x * 5 / 9 # Une multiplcation par un entier, suivie par une division par un entier
y = x * (5 / 9) # Le ratio 5 / 9 est calculé lors de la génération du bytecode associé à la ligne : une seule multiplication par un flottant lors de l'exécution de l'opération
#+END_SRC
A partir de Python3.11, les opérations entre types identiques (ie: int+int) peuvent être spécialisées (cf. [[https://www.youtube.com/watch?v=tNs18GDmAfg][Python Perf: Specializing, Adaptive Interpreter - Talk Python Live Stream - YouTube]] - augmentation des perfs).
* Tips * Tips
** [[id:24408701-21d8-4f4e-aed9-c58746df2244][Différence entre les opérateurs + et +=]] ** [[id:24408701-21d8-4f4e-aed9-c58746df2244][Différence entre les opérateurs + et +=]]
** [[id:a32ab138-f9a8-4d61-9c09-97953c5a0a92][type == object]] ** [[id:a32ab138-f9a8-4d61-9c09-97953c5a0a92][type == object]]

View File

@@ -1,6 +1,6 @@
:PROPERTIES: :PROPERTIES:
:ID: 171ce2f7-4028-47b0-b4e0-5a4a6ccb74ac :ID: 171ce2f7-4028-47b0-b4e0-5a4a6ccb74ac
:mtime: 20221229103915 :mtime: 20230729082927
:ctime: 20220104155310 :ctime: 20220104155310
:END: :END:
#+title: Postgres #+title: Postgres
@@ -86,6 +86,11 @@ Différents sites permettent de visualiser graphiquement les query plans:
* Payants: * Payants:
* [[https://app.pgmustard.com/login][PgMustard]] * [[https://app.pgmustard.com/login][PgMustard]]
** Audit
Possibilité de logger ou de stocker en base les ajout/modifications ou suppressions de donnéées:
* logs: [[https://www.pgaudit.org/]]
* En base: [[https://wiki.postgresql.org/wiki/Audit_trigger_91plus]] ([[https://github.com/2ndQuadrant/audit-trigger]])
* Références * Références
* [[https://stackoverflow.com/questions/45395538/postgres-md5-password-plain-password][Postgres: MD5 Password / Plain password - Github]] * [[https://stackoverflow.com/questions/45395538/postgres-md5-password-plain-password][Postgres: MD5 Password / Plain password - Github]]
* [[https://www.postgresql.org/docs/current/sql-explain.html][Sql-explain - PostgreSQL]] * [[https://www.postgresql.org/docs/current/sql-explain.html][Sql-explain - PostgreSQL]]

View File

@@ -1,6 +1,6 @@
:PROPERTIES: :PROPERTIES:
:ID: e7581fe3-f83f-4243-91ed-6ef7ade6a844 :ID: e7581fe3-f83f-4243-91ed-6ef7ade6a844
:mtime: 20220530204913 :mtime: 20220910172209
:ctime: 20220109134723 :ctime: 20220109134723
:END: :END:
#+title: Linux #+title: Linux
@@ -10,13 +10,18 @@
* Distributions * Distributions
** [[id:393342ff-bf38-4472-8713-3de5ebe43eca][Guix]] ** [[id:393342ff-bf38-4472-8713-3de5ebe43eca][Guix]]
* Gestionnaire de paquets
** [[id:4cb68913-62c6-43bb-835f-85237b2a8b40][apt]]
* Systèmes d'initialisation * Systèmes d'initialisation
** [[id:af912c20-4752-44ba-bdc0-99451ac0cd10][systemd]] ** [[id:af912c20-4752-44ba-bdc0-99451ac0cd10][systemd]]
* Gestionnaire de volumes logiques : [[id:f202b810-0fba-4c90-bc4c-f8cbc001fe88][LVM]] * Gestionnaire de volumes logiques :
** [[id:f202b810-0fba-4c90-bc4c-f8cbc001fe88][LVM]]
* Fonctionnalités * Fonctionnalités
** [[id:fad57303-ce0c-4ae4-9529-294f70ecfaa5][Inotify]] ** Surveillance de fichiers
*** [[id:fad57303-ce0c-4ae4-9529-294f70ecfaa5][Inotify]]
* Interpreteur de commandes * Interpreteur de commandes
** [[id:72eb2d10-5b92-4fb7-9e4e-1398bd933335][bash]] ** [[id:72eb2d10-5b92-4fb7-9e4e-1398bd933335][bash]]
@@ -25,3 +30,5 @@
** Parsing de contenu json (lib+bin) : [[id:83908b49-3945-4dce-8b26-2a5e4636df13][jq]] ** Parsing de contenu json (lib+bin) : [[id:83908b49-3945-4dce-8b26-2a5e4636df13][jq]]
** Transfert de données à un serveur (lib+bin) : [[id:5ea61eaa-7f37-464c-aa69-8251de8f81af][curl]] ** Transfert de données à un serveur (lib+bin) : [[id:5ea61eaa-7f37-464c-aa69-8251de8f81af][curl]]
** Template utilisant les variables d'environnement : [[https://manpage.me/?q=envsubst][envsubst]] ** Template utilisant les variables d'environnement : [[https://manpage.me/?q=envsubst][envsubst]]
** Lecture de fichiers
*** [[id:d5b19724-9559-44de-aef7-c4d57fb6dc95][batcat]]

View File

@@ -1,6 +1,6 @@
:PROPERTIES: :PROPERTIES:
:ID: 6cc56ee4-6d42-4d50-beb3-bb22a98298dd :ID: 6cc56ee4-6d42-4d50-beb3-bb22a98298dd
:mtime: 20220528185642 :mtime: 20220814131534
:ctime: 20220130153624 :ctime: 20220130153624
:END: :END:
#+title: textual #+title: textual
@@ -73,6 +73,11 @@ division(5, 0)
#+END_SRC #+END_SRC
#+RESULTS: #+RESULTS:
* Projets
** [[https://github.com/Traumatism/ToastCord][ToastCord - Github]]
** [[https://github.com/kraanzu/dooit][Dooit - Github]]
* Références * Références
* [[https://github.com/Textualize/textual][Textual - Github]] * [[https://github.com/Textualize/textual][Textual - Github]]
* [[https://github.com/Textualize/rich][Rich - Github]] * [[https://github.com/Textualize/rich][Rich - Github]]

13
20220825081058-batcat.org Normal file
View File

@@ -0,0 +1,13 @@
:PROPERTIES:
:ID: d5b19724-9559-44de-aef7-c4d57fb6dc95
:mtime: 20230521174952
:ctime: 20220825081058
:END:
#+title: batcat
* Introduction
utilitaire permettant de visualiser les fichiers depuis un terminal avec une mise en forme plus évoluée que /cat/
(coloration syntaxique).
* Références
* [[https://github.com/sharkdp/bat][GitHub - sharkdp/bat: A cat(1) clone with wings.]]

145
20230520112339-readflow.org Normal file
View File

@@ -0,0 +1,145 @@
:PROPERTIES:
:ID: af021596-3d07-42bf-9131-0c203ac1c26f
:mtime: 20230521180253
:ctime: 20230520112339
:END:
#+title: readflow
* Introduction
Sauvegarde de page web pour lecture offline.
* Installation
** API
*** Build
#+BEGIN_SRC shell
cd /opt/
git clone https://github.com/ncarlier/readflow.git readflow
cd readflow
git submodule init
git submodule update
make
#+END_SRC
*** Configuration
**** Préparation des variables d'environnement
Contenu du fichier ~env~:
#+BEGIN_SRC shell
export READFLOW_DB="postgres://<db_user>:<db_pass>@localhost/readflow"
export READFLOW_LISTEN_ADDR="localhost:8010"
export READFLOW_LISTEN_METRICS=
export READFLOW_AUTHN="https://login.adrien.run/realms/readings"
export READFLOW_PUBLIC_URL="https://readflow.adrien.run"
export READFLOW_SECRET_SALT="<salt>"
export READFLOW_BLOCK_LIST=
export READFLOW_BROKER_URI=
export READFLOW_WEB_SCRAPER_URL=
export READFLOW_IMAGE_PROXY_URL=
export READFLOW_AVATAR_PROVIDER=
export READFLOW_SECRETS_ENGINE_PROVIDER=
export READFLOW_SENTRY_DSN=
export READFLOW_POCKET_CONSUMER_KEY=
export REACT_APP_API_ROOT="/api"
export REACT_APP_AUTHORITY="https://login.adrien.run/realms/readings"
export REACT_APP_CLIENT_ID="readflow"
export REACT_APP_REDIRECT_URL="https://readflow.adrien.run/login"
#+END_SRC
**** Substitution des variables du fichier de configuration
#+BEGIN_SRC shell
source ./env
envsubst < ./readflow.toml > ./config.toml
#+END_SRC
*** Exécution
#+BEGIN_SRC shell
./release/readflow -config ./config.toml
#+END_SRC
Ou
#+BEGIN_SRC shell
cat >/lib/systemd/system/readflow.service <<EOF
[Unit]
Description=Readflow service
[Service]
User=readflow
ExecStart=/opt/readflow/release/readflow -config /opt/readflow/config.toml
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
RestartSec=3
SyslogIdentifier=readflow
[Install]
WantedBy=multi-user.target
EOF
#+END_SRC
#+BEGIN_SRC shell
adduser --system --no-create-home --disabled-password --disabled-login readflow
systemctl enable readflow
systemctl start readflow
#+END_SRC
** Webclient
#+BEGIN_SRC shell
n lts # Require a up to date node version
npm install --legacy-peer-deps
npm run build
#+END_SRC
** Nginx
#+BEGIN_SRC conf
server {
server_name readflow.adrien.run;
listen 443 ssl http2;
listen [::]:443 ssl http2;
# SSL configuration
include /etc/nginx/ssl.conf;
ssl_certificate /etc/letsencrypt/live/readflow.adrien.run/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/readflow.adrien.run/privkey.pem;
# Logging configuration
access_log /var/log/nginx/readflow.access.log;
error_log /var/log/nginx/readflow.error.log;
gzip on;
gzip_static on; # allows pre-serving of .gz file if it exists
gzip_disable "msie6"; # Disable for user-agent Internet explorer 6. Not supported.
gzip_proxied any; # enable gzip for all proxied requests
gzip_buffers 16 8k; # number and size of buffers to compress a response
gzip_http_version 1.1;
gzip_min_length 256; # Only gzip files of size in bytes
gzip_types text/plain text/css text/html application/javascript application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon;
gunzip on;
add_header 'Access-Control-Allow-Origin' 'https://login.adrien.run';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
location /api {
rewrite /api/(.*) /$1 break;
proxy_redirect off;
proxy_pass http://127.0.0.1:8010;
}
location / {
try_files $uri $uri/ /index.html;
root /opt/readflow/ui/build;
}
}
server {
server_name readflow.adrien.run;
listen 80;
listen [::]:80;
if ($host = readflow.adrien.run) {
return 301 https://$host$request_uri;
}
return 404;
}
#+END_SRC
* Références
* [[https://github.com/ncarlier/readflow][Readflow - Github]]
* [[https://github.com/ncarlier/readflow/issues/48][Can a simple tutorial be provided for non-professionals #48 - Github]]

View File

@@ -0,0 +1,99 @@
:PROPERTIES:
:ID: e0695c59-6fd5-4074-81ca-8e14ec965bbd
:mtime: 20230521180042
:ctime: 20230520122106
:END:
#+title: keycloak
* Introduction
Service open-source de gestion d'authentification et d'accès.
* Installation
** Application
#+BEGIN_SRC shell
apt install openjdk-19-jre
cd /opt/
wget https://github.com/keycloak/keycloak/releases/download/21.1.1/keycloak-21.1.1.zip
unzip keycloak-21.1.1.zip
cd keycloak-21.1.1
# bin/kc.sh start-dev
cat >/opt/keycloak/conf/keycloak.conf <<EOF
db=postgres
db-username=keycloak
db-password=<db_password>
proxy=edge
hostname=login.adrien.run
http-host=127.0.0.1
http-port=9090
hostname-strict-https=false
EOF
bin/kc.sh build
cat >/lib/systemd/system/keycloak.service <<EOF
[Unit]
Description=Keycloak service
[Service]
User=keycloak
ExecStart=/opt/keycloak/bin/kc.sh start
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
RestartSec=3
SyslogIdentifier=keycloak
[Install]
WantedBy=multi-user.target
EOF
adduser --system --no-create-home --disabled-password --disabled-login keycloak
chown keycloak ./data/ -R
systemctl enable keycloak
systemctl start keycloak
#+END_SRC
** Nginx
#+BEGIN_SRC conf
server {
server_name login.adrien.run;
listen 443 ssl http2;
listen [::]:443 ssl http2;
# SSL configuration
include /etc/nginx/ssl.conf;
ssl_certificate /etc/letsencrypt/live/login.adrien.run/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/login.adrien.run/privkey.pem;
# Loggin coinfuguration
access_log /var/log/nginx/login.access.log;
error_log /var/log/nginx/login.error.log;
location / {
proxy_pass http://127.0.0.1:9090;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
server_name login.adrien.run;
listen 80;
listen [::]:80;
if ($host = login.adrien.run) {
return 301 https://$host$request_uri;
}
return 404;
}
#+END_SRC
* Références
* [[https://github.com/keycloak/keycloak][Keycloak - Github]]

View File

@@ -0,0 +1,97 @@
:PROPERTIES:
:ID: e5e49b61-ee56-4364-a96e-48d72217ef95
:mtime: 20240217184904
:ctime: 20240215223404
:END:
#+title: uptime-kuma
* Installation
#+BEGIN_SRC shell
cd /opt
mkdir uptime-kuma
chown ubuntu:ubuntu uptime-kuma/
git clone https://github.com/louislam/uptime-kuma.git
cd uptime-kuma
npm run setup
npm install vite
npm run build
useradd -m --system uptime
cat <<EOF > /usr/lib/systemd/system/update-kuma.service
[Unit]
Description=Uptime-Kuma - A free and open source uptime monitoring solution
Documentation=https://github.com/louislam/uptime-kuma
After=network.target
[Service]
Type=simple
User=uptime
WorkingDirectory=/opt/uptime-kuma
ExecStart=/bin/bash -c 'PATH=/home/uptime/.n/bin:$PATH npm run start-server'
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now uptime-kuma
cat <<EOF > /etc/nginx/sites-available/uptime
server {
server_name tools.adrien.run;
listen 80;
listen [::]:80;
return 404;
}
server {
server_name uptime.tools.adrien.run;
listen 443 ssl http2;
listen [::]:443 ssl http2;
# SSL configuration
include /etc/nginx/ssl.conf;
ssl_certificate /etc/letsencrypt/live/uptime.tools.adrien.run/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/uptime.tools.adrien.run/privkey.pem;
# Logging configuration
access_log /var/log/nginx/uptime.access.log;
error_log /var/log/nginx/uptime.error.log;
root /opt/uptime-kuma;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:3002/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
server {
server_name uptime.tools.adrien.run;
listen 80;
listen [::]:80;
if ($host = uptime.tools.adrien.run) {
return 301 https://$host$request_uri;
}
return 404;
}
EOF
systemctl restart nginx.service
certbot -d uptime.tools.adrien.run --nginx
#+END_SRC