Mi használja a swap-ot?
for file in /proc/*/status ; do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 2 -n -r | less
Magánjellegű internetes dokumentációs és publikációs felület és kísérleti weboldal a Morkpy tartalomkezelő rendszer fejlesztési folyamatainak tesztelésére és szemléltetésére
for file in /proc/*/status ; do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 2 -n -r | less
Ha a docker login sipákol a dbus miatt.
Azaz a
docker login
eredménye például az, hogy
error getting credentials - err: exit status 1, out: `GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.secrets was not provided by any .service files`
akkor
apt install gnupg2 pass
Ideje lenne végre dokumentálni.
egyszerre
for i in $(virsh list | awk '{print $2}'); do virsh shutdown $i; done
for i in $(virsh list | awk '{print $2}'); do virsh destroy $i; done
docker system prune -a --volumes
truncate -s 0 /var/lib/docker/containers/*/*-json.log
--all -a Remove all unused images not just dangling ones
--force -f Do not prompt for confirmation
--volumes Prune anonymous volumes
Másoljuk az easy-rsa könyvtárat az /etc/openvpn alá
cd /etc/openvpn
cp -r /usr/share/easy-rsa/ .
cd easy-rsa
Vidáman létrehozzuk a nyilvános kulcsú infrastruktúrát, a dh cserekulcsot, a tanúsító kulcsot, a szerver kulcsot és tanúsítványt, és a ta kulcsot.
./easyrsa init-pki
./easyrsa gen-dh
./easyrsa build-ca nopass
./easyrsa build-server-full SERVER_NAME nopass
openvpn --genkey --secret ta.key
Aztán jöhetnek is a kliensek.
./easyrsa build-client-full CLIENT_NAME nopass
A konfigokat a saját fejlesztésű szkriptünkkel hozzuk létre.
/usr/bin/dlt_genovpn -a server -n servername
/usr/bin/dlt_genovpn -a client -n clientname -r server_hostname
Miért cannot bind socket [0.0.0.0:82][/0] ?
netstat -ltnp | grep ":82"
Find és xargs.
find ./ -type d -empty -print0 | xargs -0 -I {} rmdir -v "{}"
-print0
-0
: A szpészek és sortörések okozta problémák kiküszöbölésére szolgál.
-I {}
: Az xargs által átvett argumentumokat helyettesíti be a meghívott parancs argumentum listájába. Nézhetne ki úgy is, hogy
xargs -0 -I dir rmdir -v "dir"
.
Amikor az kell, hogy az aktuális könyvtár a szkript saját könyvtára legyen.
#!/bin/sh
cd "$(dirname $0)"
Hogy a könyvtár váltás kövesse a szimbolikus linkeket.
#!/usr/bin/env bash
SCRIPTDIR="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"
cd "${SCRIPTDIR}" || exit 1
A játékok start.sh szkriptjének első sorai.
#!/usr/bin/env bash
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd "${CURRENT_DIR}"
#!/usr/bin/env sh
cd "$(dirname "$(readlink -f "$0")")" || exit
Azaz segítség abban az esetben, mikor a gyerkedli szórakozásból a kamrában levő mikroszerver összes virtuális terminálján bejelentkezik, csak azért, hogy az Icinga riasztást küldjön.
pkill -KILL -u username
Leállítjuk a MySQL szervert
Elindítjuk a
--skip-grant-tables
paraméterrel, aminek hatására localhostról jelszó nélkül tudunk csatlakozni.
mysqld_safe --skip-grant-tables &
Módosítjuk a root jelszót.
UPDATE mysql.user SET Password=PASSWORD('ujjelszo') WHERE User='root';
FLUSH PRIVILEGES;
CTRL + C
Újraindítjuk a MySQL szervert.
Örülünk.
Debian 10-re való frissítéskor észrevehetjük, hogy a phpMyAdmin csomag obsolete lett, azaz hivatalos tárolóból már nem telepíthető. Nem nagy baj, többnyire eddig is kerültük az
apt install webescuccrengetegfüggőséggelésésdisztribúcióspecifikuskonfigurációval
típusú megoldásokat, de ha esetleg van még ilyenünk, akkor ideje eltakarítani és beüzemelni egy jobb megoldást.
apt --purge remove phpmyadmin
Reading package lists... Done Building dependency tree Reading state information... Done The following packages were automatically installed and are no longer required: dbconfig-common dbconfig-mysql libjs-sphinxdoc libjs-underscore php-bz2 php-curl php-gd php-mysql php-php-gettext php-phpseclib php7.3-bz2 php7.3-curl php7.3-gd php7.3-mysql Use 'apt autoremove' to remove them. The following packages will be REMOVED: phpmyadmin* 0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded. After this operation, 24.8 MB disk space will be freed. Do you want to continue? [Y/n]y (Reading database ... 55135 files and directories currently installed.) Removing phpmyadmin (4:4.6.6-4+deb9u2) ... Determining localhost credentials from /etc/mysql/debian.cnf: succeeded.
A felmerülő kérdésekre igent mondunk, azaz:
Deconfigure database for phpmyadmin with dbconfig-common?
Yes.
Delete the database for phpmyadmin?
Yes.
dbconfig-common: dumping mysql database phpmyadmin to /var/tmp/phpmyadmin.phpmyadmin.2020-12-01-10.08.mysql.5w9c3U. dbconfig-common: dropping mysql database phpmyadmin. dropping database phpmyadmin: success. verifying database phpmyadmin was dropped: success. dbconfig-common: revoking privileges for user phpmyadmin on phpmyadmin. revoking access to database phpmyadmin from phpmyadmin@localhost: success. Processing triggers for man-db (2.8.5-2) ... (Reading database ... 53470 files and directories currently installed.) Purging configuration files for phpmyadmin (4:4.6.6-4+deb9u2) ...
Egyetlen PHP fájlból álló MySQL adminisztrációs felület, amit bemásolhatunk bármely PHP projektünkbe.
version: '3'
services:
phpmyadmin:
image: phpmyadmin
container_name: phpmyadmin
network_mode: bridge
environment:
- PMA_HOSTS=172.17.0.1
restart: always
ports:
- 127.0.0.1:81:80
A
PMA_HOSTS
(vesszővel tagolt lista) környezeti változóval adhatjuk meg a MySQL szervek ip címeit, vagy hosztneveit.
docker-compose up -d
server {
listen 80;
server_name phpmyadmin.domain.hu;
location / {
proxy_pass http://127.0.0.1:81;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
proxy_set_header X-Real-IP $remote_addr;
}
}
A MySQL szerver figyeljen az összes interface-en.
[server]
bind-address = 0.0.0.0
mysql -h localhost -u root -p
SHOW GRANTS FOR 'root'@'localhost';
+--------------------------------------------------------------------------------------------------------------------------------------------------+ | Grants for root@localhost | +--------------------------------------------------------------------------------------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *.* TO `root`@`localhost` IDENTIFIED VIA unix_socket USING '*...' WITH GRANT OPTION | | GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION | +--------------------------------------------------------------------------------------------------------------------------------------------------+ 2 rows in set (0.000 sec)
SHOW GRANTS FOR 'root'@'%';
ERROR 1141 (42000): There is no such grant defined for user 'root' on host '%'
UPDATE mysql.user SET Host='%' WHERE Host='localhost';
UPDATE mysql.user SET plugin='mysql_native_password';
FLUSH PRIVILEGES;
SHOW GRANTS FOR 'root'@'%';
+--------------------------------------------------------------------------------------------------------------------------------+ | Grants for root@% | +--------------------------------------------------------------------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *.* TO `root`@`%` IDENTIFIED BY PASSWORD '*...' WITH GRANT OPTION | +--------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.001 sec)
Működik
Azzal itt most nem foglakozunk. A dokumentum arról szól, hogy hogyan érhetjük el a működőképes állapotot.
Azaz nyílt forrású Windows (meg egyébb Microsoft termék) aktiváló szerver üzembe helyezése helyi hálózaton
version: '2'
services:
vlmcsd:
image: 'mikolatero/vlmcsd:latest'
network_mode: bridge
ports:
- '1688:1688'
docker-compose up -d
Megmondjuk a Windows-nak, hogy mostantól a server hosztnévvel, vagy ip címmel érheti el a KMS szervert. Természetesen adminisztrátorként, parancssorból.
slmgr /skms server
Megadjuk a termékkulcsot. Windows 10 Professional esetén például:
slmgr /ipk W269N-WFGWX-YVC9B-4J6C9-T83GX
Végül elvégezzük az aktiválást.
slmgr /ato
A Moodle telepítés leírásából kimaradtak a Nextcloud docker image beállításának egyes részletei. Szándékosan, mivel Nextcloud-ot máshol, más okból is használunk, ezért a leírásának külön dokumentumban a helye.
Ugyanúgy docker-compose-t használunk.
version: '2'
services:
nextcloud:
image: 'nextcloud:20.0.2'
network_mode: bridge
ports:
- '127.0.0.1:18083:80'
volumes:
- ./volumes/nextcloud:/var/www/html
extra_hosts:
- 'docker:172.17.42.1'
environment:
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD=password
- MYSQL_HOST=172.17.42.1
- NEXTCLOUD_ADMIN_USER=root
- NEXTCLOUD_ADMIN_PASSWORD=password
- NEXTCLOUD_TRUSTED_DOMAINS=cloud.domain.hu
- SMTP_HOST=172.17.42.1
- SMTP_PORT=25
- MAIL_FROM_ADDRESS=cloud@domain.hu
image
értéknél fontos a pontos verzió megadása, hogy az ismételt
docker-compose up
hívásokkor még véletlenül se frissüljön automatikusan az image, mint ahogy a
latest
tag esetén tenné.
network_mode: bridge
szükséges, hogy a konténer a megadott ip címen elérje a docker host-on futó adatbázis szervert. Szép, ha a teljes szolgáltatás saját alhálózaton helyezkedik el, saját adatbázis szerverrel, azaz microservices, de futtasson és backup-oljon külön mysql konténert minden projekthez az, akinek ahhoz van kedve.
extra_hosts
alatti elemek hostname / ip cím párok. Az így definiált hostnevek ugyanúgy használhatóak a konténerben, mintha az /etc/hosts fájlban lennének megadva.
# indítás
docker-compose up
# vagy
# indítás a háttérben
docker-compose up -d
server {
listen 80;
listen 443 ssl;
server_name cloud.domain.hu;
ssl_certificate /etc/letsencrypt/live/cloud.domain.hu/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/cloud.domain.hu/privkey.pem;
if ($scheme = http) {
return 301 https://$host$request_uri;
}
include includes/letsencrypt;
location = /.well-known/carddav {
return 301 $scheme://$host:$server_port/remote.php/dav;
}
location = /.well-known/caldav {
return 301 $scheme://$host:$server_port/remote.php/dav;
}
location / {
proxy_pass http://127.0.0.1:18083;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
proxy_buffering off;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}
}
location = /.well-known/carddav
és
location = /.well-known/caldav
bejegyzések teszik lehetővé, hogy
carddav
és
caldav
protokollon keresztül elérjük a konténerben futó Nextcloud címtárát és naptárát.
proxy_set_header Upgrade $http_upgrade;
és
proxy_set_header Connection "upgrade";
sorok a websocket kapcsolatok működéséhez szükségesek. Lsd:
http://nginx.org/en/docs/http/websocket.html
.
proxy_redirect off;
és
proxy_buffering off;
miért kellenek.
'trusted_domains' =>
array (
0 => 'localhost',
1 => 'cloud.domain.hu'
),
'overwrite.cli.url' => 'https://cloud.domain.hu',
'overwriteprotocol' => 'https',
Azaz eLearning rendszer felépítése Docker alapon Nextcloud integrációval
Mindenek előtt adjunk hálát a Dockernek, mert nélküle nemigen telepítenénk ilyen összetett cuccokat, inkább megírnánk magunk - mint ahogy azt még pár nappal ezelőtt is terveztük. Áldott legyen.
Miben is van a Moodle megírva? Nem mindegy? Hát ezért adunk hálát a Dockernek. Még az is lehet, hogy Ruby-ban, mint a GitLab, de az se baj.
Mondjuk ki érti, miért kell egy webalkalmazást Ruby-ban csinálni, mikor ott a jó öreg PHP, meg van már Python, ami ennek a honlapnak is az alapja, ha meg igazán durvát akarunk, programozhatjuk C++(cémegmeg)-ben is. ... Egyesek nem tudják jódolgukban micsinálnak. Jó, hogy nem mindjárt Scratch-ben, vagy Perl-ben ...
Először használtam
docker-compose
-t a saját feljesztésű szkriptjeim és konfigurációs fájljaim helyett. Nem esett rosszul. A docker-compose hátránya, hogy a
docker-compose.yml
-ből nem lehet shell parancsokat hívni. Előnye, hogy a docker összes funkciója elérhető rajta keresztül és nem kell évekkel ezelőtt írott szkripteket túrni, hogy lássuk, hogy egy adott beállítást hogyan kell megvalósítani. Elég a
docker-compose
dokumentációját túrni, ami talán rendesen meg van írva. Mert azok ott ráérnek arra is.
Tanulság : ne próbáljunk meg egy kész eszközt saját megoldásokkal kiváltani csak azért, mert nem akarjuk elolvasni a dokumentációját.
Feladat : a régi docker kezelő szkriptjeim lecserélése docker-compose-ra.
version: '2'
services:
nextcloud:
image: 'nextcloud:20.0.2'
network_mode: bridge
ports:
- '127.0.0.1:18083:80'
volumes:
- ./volumes/nextcloud:/var/www/html
extra_hosts:
- 'docker:172.17.42.1'
environment:
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD=password
- MYSQL_HOST=172.17.42.1
- NEXTCLOUD_ADMIN_USER=root
- NEXTCLOUD_ADMIN_PASSWORD=password
- NEXTCLOUD_TRUSTED_DOMAINS=cloud.domain.hu
- SMTP_HOST=172.17.42.1
- SMTP_PORT=25
- MAIL_FROM_ADDRESS=cloud@domain.hu
moodle:
image: 'docker.io/bitnami/moodle:3.10.0'
network_mode: bridge
ports:
- '127.0.0.1:18082:8080'
volumes:
- ./volumes/moodle_data:/bitnami/moodle
- ./volumes/moodledata_data:/bitnami/moodledata
extra_hosts:
- 'docker:172.17.42.1'
environment:
- MOODLE_USERNAME=root
- MOODLE_PASSWORD=password
- MOODLE_EMAIL=moodle@domain.hu
- MOODLE_SITE_NAME=moodle
- MOODLE_DATABASE_HOST=172.17.42.1
- MOODLE_DATABASE_PORT_NUMBER=3306
- MOODLE_DATABASE_NAME=moodle
- MOODLE_DATABASE_USER=moodle
- MOODLE_DATABASE_PASSWORD=password
- ALLOW_EMPTY_PASSWORD=yes
image
értéknél fontos a pontos verzió megadása, hogy az ismételt
docker-compose up
hívásokkor még véletlenül se frissüljön automatikusan az image, mint ahogy a
latest
tag esetén tenné.
network_mode: bridge
szükséges, hogy a konténer a megadott ip címen elérje a docker host-on futó adatbázis szervert. Szép, ha a teljes szolgáltatás saját alhálózaton helyezkedik el, saját adatbázis szerverrel, azaz microservices, de futtasson és backup-oljon külön mysql konténert minden projekthez az, akinek ahhoz van kedve.
extra_hosts
alatti elemek hostname / ip cím párok. Az így definiált hostnevek ugyanúgy használhatóak a konténerben, mintha az /etc/hosts fájlban lennének megadva.
# indítás
docker-compose up
# vagy
# indítás a háttérben
docker-compose up -d
server {
listen 80;
listen 443 ssl;
server_name moodle.domain.hu;
ssl_certificate /etc/letsencrypt/live/moodle.domain.hu/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/moodle.domain.hu/privkey.pem;
if ($scheme = http) {
return 301 https://$host$request_uri;
}
include includes/letsencrypt;
location / {
proxy_pass http://127.0.0.1:18082;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
proxy_set_header X-Real-IP $remote_addr;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}
}
A titkosítást szokás szerint a docker host-on futó nginx reverse proxy intézi, a konténerben levő Moodle meg persze, hogy nem viseli ezt olyan jól. A konfiguráció így némi módosításra szorul.
$CFG->wwwroot = 'https://moodle.domain.hu';
$CFG->reverseproxy = true;
$CFG->sslproxy = true;
HTTPS nélkül nem fog működni. Nem úgy megy az manapság, hogy webes szolgáltatásokat csinálunk külső fél, legalább a letsencrypt igénybevétele nélkül.
Az
Administration / Security / OAuth 2.0 clients
menüpontban felveszünk egy új klienst mondjuk Moodle néven. A
Redirection URI
https://moodle.domain.hu/admin/oauth2callback.php
lesz. Mentés után láthatóvá válik a
Client Identifier
és a
Secret
, amiket a kliens beállításánál használhatunk.
A
Site administration / Server / OAuth 2 services / Create new Nextcloud service
menüpontban beállítjuk a Nextcloud OAuth 2 szolgáltatót. A
Name
lehet Nextcloud, a
Client id
és a
Client secret
az előző bekezdésben említett értékek. A
Service base URL
a Nextcloud szolgáltatásunk címe, azaz https://cloud.domain.hu.
A következő lépés:
Site administration / Plugins / Repositories / Manage repositories
, ahol engedélyezzük a Nextcloud-ot, majd a
Settings
menüpontban létrehozunk egy repository-t.
A dolog elméletileg készen van. A felhaszálók felhasználhatnak a Nextcloudban tárolt fájlokat a Moodle tartalmainak szerkesztéséhez.
Memóriában tárolt tömörített swap eszköz létrehozása Linux-on.
Amikor nem telik egy-két nagyobb memória modulra...
# Kernel modul betöltése
modprobe zram num_devices=2
# Tömörítési algoritmus beállítása
echo lz4 > /sys/block/zram0/comp_algorithm
# Blokk eszköz méretének beállírása 4Gb-ra
echo 4G > /sys/blk/zram0/disksize
# Blokk eszköz formázása swap-ként
mkswap /dev/zram0
# Prioritás beállítása. A nagyobb érték magasabb prioritást jelent.
# Lehetséges értékek: -1 - 32767
swapon -p 100 /dev/zram0