From 31ffe6e01638c9011ec57510efc0306bbc268f09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reynir=20Bj=C3=B6rnsson?= Date: Sat, 22 Feb 2025 11:55:00 +0100 Subject: [PATCH 1/8] Add menu item blog and sub menu item devops blog --- config.yaml | 15 ++++++++++++++- themes/datacoop2020/layouts/partials/nav.html | 10 +++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/config.yaml b/config.yaml index a82151c..69c39a1 100644 --- a/config.yaml +++ b/config.yaml @@ -41,6 +41,13 @@ languages: - name: "Vedtægter" url: "rights/" weight: 4 + - name: "Blog" + url: "blog/" + weight: 5 + - name: "DevOps blog" + url: "devops-blog/" + parent: "Blog" + weight: 6 en: title: data.coop params: @@ -62,4 +69,10 @@ languages: - name: "Statutes" url: "en/rights/" weight: 4 - + - name: "Blog" + url: "en/blog/" + weight: 5 + - name: "DevOps Blog" + url: "en/devops-blog/" + parent: "Blog" + weight: 6 diff --git a/themes/datacoop2020/layouts/partials/nav.html b/themes/datacoop2020/layouts/partials/nav.html index 5d2f0e6..6c801d1 100644 --- a/themes/datacoop2020/layouts/partials/nav.html +++ b/themes/datacoop2020/layouts/partials/nav.html @@ -4,7 +4,15 @@ {{ range .Site.Menus.nav }} {{ $atURL := absURL $currentPage.RelPermalink }} {{ $compURL := absURL .URL }} -
  • {{ .Name }}
  • +
  • {{ .Name }} + +
  • {{ end }} From af2ed491e19f1a3d34a0d0c026fb90c7a55dae4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reynir=20Bj=C3=B6rnsson?= Date: Sat, 22 Feb 2025 11:56:52 +0100 Subject: [PATCH 2/8] Fix content missing from /blog/, add devops blog --- content/devops-blog/_index.da.md | 5 +++++ content/devops-blog/_index.en.md | 5 +++++ themes/datacoop2020/layouts/_default/list.html | 2 ++ 3 files changed, 12 insertions(+) create mode 100644 content/devops-blog/_index.da.md create mode 100644 content/devops-blog/_index.en.md diff --git a/content/devops-blog/_index.da.md b/content/devops-blog/_index.da.md new file mode 100644 index 0000000..fa8ca00 --- /dev/null +++ b/content/devops-blog/_index.da.md @@ -0,0 +1,5 @@ +--- +title: "DevOps blog" +--- + +Teknisk blog fra admin-holdet. diff --git a/content/devops-blog/_index.en.md b/content/devops-blog/_index.en.md new file mode 100644 index 0000000..26409f0 --- /dev/null +++ b/content/devops-blog/_index.en.md @@ -0,0 +1,5 @@ +--- +title: "DevOps Blog" +--- + +We currently only blog in Danish. diff --git a/themes/datacoop2020/layouts/_default/list.html b/themes/datacoop2020/layouts/_default/list.html index 541c711..54925c5 100644 --- a/themes/datacoop2020/layouts/_default/list.html +++ b/themes/datacoop2020/layouts/_default/list.html @@ -2,6 +2,8 @@

    {{ .Title }}

    +{{ .Content }} + {{ $pages := .Pages }} {{ range $pages.ByPublishDate.Reverse }}

    From 5141ff62257e79fcfdc38f0cb7ecf7766fb95d56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reynir=20Bj=C3=B6rnsson?= Date: Sat, 22 Feb 2025 11:57:44 +0100 Subject: [PATCH 3/8] Add devops blog post about Nextcloud incident --- content/devops-blog/nextcloud-incident.da.md | 229 ++++++++++++++++++ .../img/devops-blog/nextcloud-screenshot.png | Bin 0 -> 102790 bytes 2 files changed, 229 insertions(+) create mode 100644 content/devops-blog/nextcloud-incident.da.md create mode 100644 static/static/img/devops-blog/nextcloud-screenshot.png diff --git a/content/devops-blog/nextcloud-incident.da.md b/content/devops-blog/nextcloud-incident.da.md new file mode 100644 index 0000000..8882a8a --- /dev/null +++ b/content/devops-blog/nextcloud-incident.da.md @@ -0,0 +1,229 @@ +--- +title: Performance problemer grundet bug i Nextcloud +summary: En fejl i synkronisering af Nextcloud servere resulterede i dårlig performance af data.coops server. +date: 2025-02-22 +params: + author: Reynir (admin team) +--- + +**Den korte version:** der er tilsyneladende en bug i synkronisering mellem Nextcloud-servere samt i log vieweren i admin-panelet. Medlemmer bør derfor indtil videre ikke sætte synkronisering op mellem cloud.data.coop og andre Nextcloud servere uden nærmere aftale med administratorholdet. + +I mindst en måned har data.coop haft udfordringer på performance og disk plads. +Det har vi i [admin-teamet](/rights/#-7-administratorer) haft kig på når vi har kunne finde tid. +Vi fandt nogle årsager: + +- [Mastodon remote profilbilleder, der aldrig bliver ryddet op i](https://git.data.coop/data.coop/ansible/pulls/228) +- [bots der scraper dyre forgejo endpoints,](https://git.data.coop/data.coop/ansible/pulls/233) +- [nginx-proxy logs der aldrig bliver roteret eller ryddet op i,](https://git.data.coop/data.coop/ansible/pulls/234) +- [Synapse (matrix server) database der vokser sig gevaldigt stor,](https://element-hq.github.io/synapse/latest/usage/administration/state_groups.html) +- og Nextcloud bruger meget CPU tid i cron.php. + +Problemet med Synapse har er endnu uløst. Der findes et værktøj til at komprimere den problematiske tabel, men vi har endnu ikke undersøgt om det virker for os. +Vi står over for at migrere vores services over til vores anden server, der har langt større diskkapacitet. + +Denne artikel kommer dog til at handle om problemet i Nextcloud: +hvordan vi identificerede det og hvad vi gjorde for at løse det. + +## Nextcloud + +På [cloud.data.coop](https://cloud.data.coop/) kører vi en filsynkroniserings- og delingssoftware Nextcloud til vores medlemmer. +Det er et stykke software der kan utroligt meget[^for-meget] udover at gemme og synkronisere filer. +Det er en service vi har kørt længe. +Indtil for nylig har det kørt relativt godt. +Men så begyndte vi at se en process `php -f /var/www/nextcloud/cron.php` bruge meget CPU-tid. +Navnet `cron.php` leder tankerne hen på UNIX-programmet `cron` som er et program til at planlægge og køre programmer på faste tidspunkter. +Det bliver typisk brugt til eks. at køre oprydningsjobs om natten. +Ved at køre `lsof -p $pid_for_cron.php` kunne jeg få indsigt i hvilke filer processen har åben. +Der bed jeg mærke i `nextcloud.log`. + +Da jeg begyndte at undersøge det nærmere kiggede jeg i admin-interfacet i Nextcloud. +Det er ikke et stykke software jeg personligt har meget erfaring med at køre, så jeg måtte kigge rundt og opdage hvad der var muligt at lære om hvad `cron.php` har gang i. +Jeg fandt desværre ikke meget andet en generel information om systemet og en side med logs som ikke virkede. + +![Screenshot der viser information og tal om systemet, eks. grafer for CPU-belastning og hukommelsesforbrug.](/static/img/devops-blog/nextcloud-screenshot.png) + +Log-siden gav en fejlbesked. +Noget i retning af at det gik for langsomt at få fat i logs. +Det fik mig til at lede efter logfilerne via ssh. +Logfilerne viste sig at være flere GB store, og programmer som `less` havde svært ved at håndtere at læse og vise de store filer. +Nextcloud skriver [json][json]-objekter i sine logs, og det viste sig at flere af linjerne var over 100 MB store. +Altimens oplevede jeg at serveren blev langsommere og langsommere, og der kom flere og flere apache processer fra Nextcloud-containeren som brugte 100% CPU-tid (dvs. en hel CPU-kerne). +Det blev nødvendigt at lukke Nextcloud ned, så vores andre services kunne køre videre. +Jeg åbnede et maintenance window i [status.data.coop](https://status.data.coop/) og meldte ud på vores Matrix-kanal. + +Ved hjælp af [`jq`][jq] kunne jeg få *pretty printet* logfilen så linjerne ikke blev så lange, og `less` kunne følge med. +Det viste sig at `cron.php` kørte synkronisering mod et medlems egen Nextcloud-server. +Det i sig selv er fint, men der var tilsyneladende en bug som gjorde at når vores Nextcloud skannede medlemets Nextcloud for filer i en bestemt mappe blev der sat en ekstra skråstreg på og scannet rekursivt igen. +Sådan blev det ved indtil der var næsten 9000 skråstreger(!!), hvor programmet så kunne finde en videofil (lad os kalde den `foo.mkv`). +Så var programmet glad, og prøvede at tilføje metadata om filen til databasen. +Her blev databasen så utilfreds! +For i tabellen må filnavne højest være 4000 tegn langt! +Det resulterede i en fejl (exception) som blev logget inklusive de næsten 9000 rekursive kald inklusive argumenter! +Det var altså årsagen til den problematiske logfil. + +

    +Anonymiseret uddrag fra logfilen - meget lange linjer! + +Det skaber selvfølgelig problemer at vise så lange linjer i en web browser, så det er desværre ikke så læseligt. Beklager! + +```javascript + { + "file": "/var/www/html/3rdparty/doctrine/dbal/src/Connection.php", + "line": 1208, + "function": "convertExceptionDuringQuery", + "class": "Doctrine\\DBAL\\Connection", + "type": "->", + "args": [ + { "__class__": "Doctrine\\DBAL\\Driver\\PDO\\Exception" }, + "INSERT INTO \"oc_filecache\" (\"name\", \"mtime\", \"storage_mtime\", \"size\", \"permissions\", \"etag\", \"mimepart\", \"mimetype\", \"parent\", \"checksum\", \"path_hash\", \"path\", \"storage\") VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + [ + "foo.mkv", 1565527058, 1565527058, 239054537, 27, + "01234567890123456789012345678901", 15, 73, 242654, "", + "09876543210987654321098765432109", + "Min Mappe//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////foo.mkv", + 41 + ], + [ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 ] + ] + }, + { + "file": "/var/www/html/lib/private/DB/Connection.php", + "line": 307, + "function": "executeStatement", + "class": "Doctrine\\DBAL\\Connection", + "type": "->", + "args": [ + "INSERT INTO \"oc_filecache\" (\"name\", \"mtime\", \"storage_mtime\", \"size\", \"permissions\", \"etag\", \"mimepart\", \"mimetype\", \"parent\", \"checksum\", \"path_hash\", \"path\", \"storage\") VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + [ + "foo.mkv", 1565527058, 1565527058, 239054537, 27, + "01234567890123456789012345678901", 15, 73, 242654, "", + "09876543210987654321098765432109", + "Min Mappe//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////foo.mkv", + 41 + ], + [ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 ] + ] + }, + { + "file": "/var/www/html/3rdparty/doctrine/dbal/src/Query/QueryBuilder.php", + "line": 386, + "function": "executeStatement", + "class": "OC\\DB\\Connection", + "type": "->", + "args": [ + "INSERT INTO \"oc_filecache\" (\"name\", \"mtime\", \"storage_mtime\", \"size\", \"permissions\", \"etag\", \"mimepart\", \"mimetype\", \"parent\", \"checksum\", \"path_hash\", \"path\", \"storage\") VALUES(:dcValue1, :dcValue2, :dcValue3, :dcValue4, :dcValue5, :dcValue6, :dcValue7, :dcValue8, :dcValue9, :dcValue10, :dcValue11, :dcValue12, :dcValue13)", + { + "dcValue1": "foo.mkv", + "dcValue2": 1565527058, + "dcValue3": 1565527058, + "dcValue4": 239054537, + "dcValue5": 27, + "dcValue6": "01234567890123456789012345678901", + "dcValue7": 15, + "dcValue8": 73, + "dcValue9": 242654, + "dcValue10": "", + "dcValue11": "09876543210987654321098765432109", + "dcValue12": "Min Mappe//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////foo.mkv", + "dcValue13": 41 + }, + { + "dcValue1": 2, + "dcValue2": 2, + "dcValue3": 2, + "dcValue4": 2, + "dcValue5": 2, + "dcValue6": 2, + "dcValue7": 2, + "dcValue8": 2, + "dcValue9": 2, + "dcValue10": 2, + "dcValue11": 2, + "dcValue12": 2, + "dcValue13": 2 + } + ] + }, + { + "file": "/var/www/html/lib/private/DB/QueryBuilder/QueryBuilder.php", + "line": 280, + "function": "execute", + "class": "Doctrine\\DBAL\\Query\\QueryBuilder", + "type": "->", + "args": [] + }, + { + "file": "/var/www/html/lib/private/Files/Cache/Cache.php", + "line": 326, + "function": "execute", + "class": "OC\\DB\\QueryBuilder\\QueryBuilder", + "type": "->", + "args": [] + }, + { + "file": "/var/www/html/lib/private/Files/Cache/Scanner.php", + "line": 312, + "function": "insert", + "class": "OC\\Files\\Cache\\Cache", + "type": "->", + "args": [ + "Min Mappe//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////foo.mkv", +/* mange, mange flere linjer */ + { + "file": "/var/www/html/lib/private/Files/Cache/Scanner.php", + "line": 458, + "function": "scanChildren", + "class": "OC\\Files\\Cache\\Scanner", + "type": "->", + "args": [ "Min Mappe//", 2, 3, 242654, false, -1, false ] + }, + { + "file": "/var/www/html/lib/private/Files/Cache/Scanner.php", + "line": 458, + "function": "scanChildren", + "class": "OC\\Files\\Cache\\Scanner", + "type": "->", + "args": [ "Min Mappe/", 2, 3, 242654, false, -1, false ] + }, + { + "file": "/var/www/html/lib/private/Files/Cache/Scanner.php", + "line": 359, + "function": "scanChildren", + "class": "OC\\Files\\Cache\\Scanner", + "type": "->", + "args": [ "Min Mappe", 2, 3, 242654, false, -1 ] + }, +``` + +
    + +I logfilen stod der et brugernavn på medlemmet som gjorde at vi kunne komme i kontakt med vedkommende. +Medlemmet slog så synkronisering fra på sin Nextcloud-server, og vi kunne starte vores service op dagen efter uden problemer. + +### Den egentlige performance-killer + +Det blev først _*rigtigt*_ et problem med performance efter jeg begyndte at undersøge hvad Nextcloud havde gange i. +Min teori er at Nextcloud forsøgte at læse den enormt store logfil og præsentere den for min browser. +Det tager selvsagt lidt tid at læse så store filer, og min browser har tænkt at det tog for lang tid. +Der hvor jeg tror det gik galt er at min browser måske forsøgte dernæst at få nextcloud til at læse logfilen igen! +Og så videre. +Resulterende i efterhånden mange processer der forsøgte at læse og forstå de gigantiske logfiler. + +Ideelt set bør vi undersøge problemet nærmere, evt. prøve at reproducere og skrive en god bug report til Nextcloud. +Desværre er Nextcloud-kodebasen meget stor, med rigtig mange plugins, og det hele er skrevet i et sprog jeg ikke har erfaring med (PHP). +Derfor bliver det ikke til andet end at vi prøver at opgradere Nextcloud og håber det er et kendt problem de har løst. + +## Afsluttende noter + +Som administratorer hviler der et stort ansvar på os. +Vi sørger efter bedste evne, og den tid vi har til det frivillige arbejde, at sørge for at data.coops services fungerer i et acceptabelt niveau. +Til det har vi nogle gange brug for at kigge i logs og undersøge systemet. +Det kan nogle gange gå lidt på tværs med vores mål om privatlivsbeskyttelse og zero-knowledge. + +I denne omgang har jeg lært et medlems mappenavn og filnavn på en af deres filer via logfilerne. +I forsøg på at lokalisere problemet har jeg kigget i mine **egne** Nextcloud filer i filsystemet og derefter søgt filsystemet for den problematiske fil (uden held). +Det er noget vi for så vidt muligt prøver at minimere. + +[json]: https://www.json.org/json-en.html + +[^for-meget]: Nogle vil måske endda gå så langt at sige at det kan [for meget](https://en.wikipedia.org/wiki/Unix_philosophy). diff --git a/static/static/img/devops-blog/nextcloud-screenshot.png b/static/static/img/devops-blog/nextcloud-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..55f2d41a93b5a06a8b98eb4843628224f564aafb GIT binary patch literal 102790 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 Date: Sat, 22 Feb 2025 13:19:02 +0000 Subject: [PATCH 4/8] Update content/devops-blog/nextcloud-incident.da.md --- content/devops-blog/nextcloud-incident.da.md | 71 ++++++++++++-------- 1 file changed, 42 insertions(+), 29 deletions(-) diff --git a/content/devops-blog/nextcloud-incident.da.md b/content/devops-blog/nextcloud-incident.da.md index 8882a8a..98460fa 100644 --- a/content/devops-blog/nextcloud-incident.da.md +++ b/content/devops-blog/nextcloud-incident.da.md @@ -1,63 +1,72 @@ --- -title: Performance problemer grundet bug i Nextcloud -summary: En fejl i synkronisering af Nextcloud servere resulterede i dårlig performance af data.coops server. +title: Performance-problemer grundet bug i Nextcloud 🐞 🔍 +summary: En fejl i synkronisering af Nextcloud-servere resulterede i dårlig ydeevne på data.coops server. date: 2025-02-22 params: author: Reynir (admin team) --- -**Den korte version:** der er tilsyneladende en bug i synkronisering mellem Nextcloud-servere samt i log vieweren i admin-panelet. Medlemmer bør derfor indtil videre ikke sætte synkronisering op mellem cloud.data.coop og andre Nextcloud servere uden nærmere aftale med administratorholdet. +**Den korte version:** der er tilsyneladende en bug i synkronisering mellem Nextcloud-servere samt i log vieweren i Nexclouds adminpanel. Medlemmer bør derfor indtil videre ikke sætte synkronisering op mellem cloud.data.coop og andre Nextcloud-servere uden nærmere aftale med administratorholdet. -I mindst en måned har data.coop haft udfordringer på performance og disk plads. +I mindst en måned har data.coop haft udfordringer med CPU, hukommelse og disk plads. Det har vi i [admin-teamet](/rights/#-7-administratorer) haft kig på når vi har kunne finde tid. Vi fandt nogle årsager: - [Mastodon remote profilbilleder, der aldrig bliver ryddet op i](https://git.data.coop/data.coop/ansible/pulls/228) -- [bots der scraper dyre forgejo endpoints,](https://git.data.coop/data.coop/ansible/pulls/233) -- [nginx-proxy logs der aldrig bliver roteret eller ryddet op i,](https://git.data.coop/data.coop/ansible/pulls/234) -- [Synapse (matrix server) database der vokser sig gevaldigt stor,](https://element-hq.github.io/synapse/latest/usage/administration/state_groups.html) -- og Nextcloud bruger meget CPU tid i cron.php. +- [bots scraper dyre forgejo endpoints,](https://git.data.coop/data.coop/ansible/pulls/233) +- [nginx-proxy logs blev aldrig roteret eller ryddet op i,](https://git.data.coop/data.coop/ansible/pulls/234) +- [Synapse (matrix server) database vokser sig gevaldigt stor](https://element-hq.github.io/synapse/latest/usage/administration/state_groups.html) +- og Nextcloud bruger for meget CPU-tid i cron.php. -Problemet med Synapse har er endnu uløst. Der findes et værktøj til at komprimere den problematiske tabel, men vi har endnu ikke undersøgt om det virker for os. +Problemet med Synapse er endnu uløst. Der findes et værktøj til at komprimere den problematiske tabel, men vi har endnu ikke undersøgt, om det virker for os. Vi står over for at migrere vores services over til vores anden server, der har langt større diskkapacitet. Denne artikel kommer dog til at handle om problemet i Nextcloud: -hvordan vi identificerede det og hvad vi gjorde for at løse det. +Hvordan vi identificerede det og hvad vi gjorde for at løse det. ## Nextcloud -På [cloud.data.coop](https://cloud.data.coop/) kører vi en filsynkroniserings- og delingssoftware Nextcloud til vores medlemmer. -Det er et stykke software der kan utroligt meget[^for-meget] udover at gemme og synkronisere filer. +På [cloud.data.coop](https://cloud.data.coop/) kører vi en filsynkroniserings- og delingssoftware [Nextcloud]({{ ref "/services/nextcloud" }}) til vores medlemmer. +Det er et stykke software, der kan utroligt meget[^for-meget] udover at gemme og synkronisere filer. Det er en service vi har kørt længe. + Indtil for nylig har det kørt relativt godt. + Men så begyndte vi at se en process `php -f /var/www/nextcloud/cron.php` bruge meget CPU-tid. Navnet `cron.php` leder tankerne hen på UNIX-programmet `cron` som er et program til at planlægge og køre programmer på faste tidspunkter. Det bliver typisk brugt til eks. at køre oprydningsjobs om natten. Ved at køre `lsof -p $pid_for_cron.php` kunne jeg få indsigt i hvilke filer processen har åben. Der bed jeg mærke i `nextcloud.log`. -Da jeg begyndte at undersøge det nærmere kiggede jeg i admin-interfacet i Nextcloud. -Det er ikke et stykke software jeg personligt har meget erfaring med at køre, så jeg måtte kigge rundt og opdage hvad der var muligt at lære om hvad `cron.php` har gang i. -Jeg fandt desværre ikke meget andet en generel information om systemet og en side med logs som ikke virkede. +Da jeg begyndte at undersøge det nærmere, kiggede jeg i admin-interfacet i Nextcloud. +Det er ikke et stykke software, jeg personligt har meget erfaring med at køre, så jeg måtte kigge rundt og opdage, hvad der var muligt at lære om `cron.php`. +Jeg fandt desværre ikke meget andet en generel information om systemet og en side med logs (som ikke virkede!). ![Screenshot der viser information og tal om systemet, eks. grafer for CPU-belastning og hukommelsesforbrug.](/static/img/devops-blog/nextcloud-screenshot.png) Log-siden gav en fejlbesked. -Noget i retning af at det gik for langsomt at få fat i logs. +Noget i retning af, at det gik for langsomt at få fat i logs. + Det fik mig til at lede efter logfilerne via ssh. Logfilerne viste sig at være flere GB store, og programmer som `less` havde svært ved at håndtere at læse og vise de store filer. -Nextcloud skriver [json][json]-objekter i sine logs, og det viste sig at flere af linjerne var over 100 MB store. -Altimens oplevede jeg at serveren blev langsommere og langsommere, og der kom flere og flere apache processer fra Nextcloud-containeren som brugte 100% CPU-tid (dvs. en hel CPU-kerne). +Nextcloud skriver [json][json]-objekter i sine logs, og det viste sig, at flere af linjerne var over 100 MB store ‼️. +Altimens oplevede jeg at serveren blev langsommere og langsommere, og der kom flere og flere apache processer fra Nextcloud-containeren som brugte 100% CPU-tid (dvs. en hel CPU-kerne ‼️). + Det blev nødvendigt at lukke Nextcloud ned, så vores andre services kunne køre videre. Jeg åbnede et maintenance window i [status.data.coop](https://status.data.coop/) og meldte ud på vores Matrix-kanal. Ved hjælp af [`jq`][jq] kunne jeg få *pretty printet* logfilen så linjerne ikke blev så lange, og `less` kunne følge med. Det viste sig at `cron.php` kørte synkronisering mod et medlems egen Nextcloud-server. -Det i sig selv er fint, men der var tilsyneladende en bug som gjorde at når vores Nextcloud skannede medlemets Nextcloud for filer i en bestemt mappe blev der sat en ekstra skråstreg på og scannet rekursivt igen. -Sådan blev det ved indtil der var næsten 9000 skråstreger(!!), hvor programmet så kunne finde en videofil (lad os kalde den `foo.mkv`). + +Det er der ingenting galt med; men der var tilsyneladende en bug som gjorde, at når vores Nextcloud scannede medlemmets Nextcloud for filer i en bestemt mappe, så blev der sat en ekstra skråstreg på og scannet rekursivt igen. + +Sådan blev det ved, indtil der var næsten 9000 skråstreger ‼️, hvor programmet så kunne finde en videofil (lad os kalde den `foo.mkv`). Så var programmet glad, og prøvede at tilføje metadata om filen til databasen. + Her blev databasen så utilfreds! + For i tabellen må filnavne højest være 4000 tegn langt! + Det resulterede i en fejl (exception) som blev logget inklusive de næsten 9000 rekursive kald inklusive argumenter! Det var altså årsagen til den problematiske logfil. @@ -197,32 +206,36 @@ Det skaber selvfølgelig problemer at vise så lange linjer i en web browser, s -I logfilen stod der et brugernavn på medlemmet som gjorde at vi kunne komme i kontakt med vedkommende. +I logfilen stod der et brugernavn på medlemmet, som gjorde at vi kunne komme i kontakt med vedkommende. Medlemmet slog så synkronisering fra på sin Nextcloud-server, og vi kunne starte vores service op dagen efter uden problemer. ### Den egentlige performance-killer -Det blev først _*rigtigt*_ et problem med performance efter jeg begyndte at undersøge hvad Nextcloud havde gange i. -Min teori er at Nextcloud forsøgte at læse den enormt store logfil og præsentere den for min browser. +Det blev først _*rigtigt*_ et problem med performance, efter jeg begyndte at undersøge hvad Nextcloud havde gange i. +Min teori er, at Nextcloud forsøgte at læse den enormt store logfil og præsentere den for min browser. Det tager selvsagt lidt tid at læse så store filer, og min browser har tænkt at det tog for lang tid. Der hvor jeg tror det gik galt er at min browser måske forsøgte dernæst at få nextcloud til at læse logfilen igen! Og så videre. Resulterende i efterhånden mange processer der forsøgte at læse og forstå de gigantiske logfiler. -Ideelt set bør vi undersøge problemet nærmere, evt. prøve at reproducere og skrive en god bug report til Nextcloud. +Ideelt set bør vi undersøge problemet nærmere, evt. prøve at reproducere og skrive en god bug-report til Nextcloud. Desværre er Nextcloud-kodebasen meget stor, med rigtig mange plugins, og det hele er skrevet i et sprog jeg ikke har erfaring med (PHP). -Derfor bliver det ikke til andet end at vi prøver at opgradere Nextcloud og håber det er et kendt problem de har løst. +Derfor bliver det ikke til andet, end at vi prøver at opgradere Nextcloud og håber det er et kendt problem de har løst. -## Afsluttende noter +## Afsluttende eftertanker Som administratorer hviler der et stort ansvar på os. -Vi sørger efter bedste evne, og den tid vi har til det frivillige arbejde, at sørge for at data.coops services fungerer i et acceptabelt niveau. + +Vi forsøger efter bedste evne (f.eks. den tid vi har til det frivillige arbejde) at sørge for, at data.coops services fungerer på et acceptabelt niveau. + Til det har vi nogle gange brug for at kigge i logs og undersøge systemet. -Det kan nogle gange gå lidt på tværs med vores mål om privatlivsbeskyttelse og zero-knowledge. + +Det kan nogle gange gå lidt på tværs med vores mål om privatlivsbeskyttelse og zero-knowledge 🤔 I denne omgang har jeg lært et medlems mappenavn og filnavn på en af deres filer via logfilerne. I forsøg på at lokalisere problemet har jeg kigget i mine **egne** Nextcloud filer i filsystemet og derefter søgt filsystemet for den problematiske fil (uden held). -Det er noget vi for så vidt muligt prøver at minimere. + +Det er noget, vi for så vidt muligt prøver at minimere; men det er også noget, vi skal diskutere løbende og aftale faste rammer omkring. [json]: https://www.json.org/json-en.html From 85c2d9cdb3b59c765f4d02b239acb6fc7d01229f Mon Sep 17 00:00:00 2001 From: bbb Date: Sat, 22 Feb 2025 14:25:35 +0100 Subject: [PATCH 5/8] Move files and add taxonomies for blog posts --- config.yaml | 14 ++++++-------- content/blog/_index.da.md | 2 +- .../{devops-blog => blog}/nextcloud-incident.da.md | 7 ++++++- content/devops-blog/_index.da.md | 5 ----- content/devops-blog/_index.en.md | 5 ----- 5 files changed, 13 insertions(+), 20 deletions(-) rename content/{devops-blog => blog}/nextcloud-incident.da.md (99%) delete mode 100644 content/devops-blog/_index.da.md delete mode 100644 content/devops-blog/_index.en.md diff --git a/config.yaml b/config.yaml index 69c39a1..e223f8a 100644 --- a/config.yaml +++ b/config.yaml @@ -8,6 +8,11 @@ theme: datacoop2020 defaultContentLanguage: da enableGitInfo: true +# Todo: create translations? +taxonomies: + category: categories + tag: tags + markup: goldmark: renderer: @@ -44,10 +49,6 @@ languages: - name: "Blog" url: "blog/" weight: 5 - - name: "DevOps blog" - url: "devops-blog/" - parent: "Blog" - weight: 6 en: title: data.coop params: @@ -72,7 +73,4 @@ languages: - name: "Blog" url: "en/blog/" weight: 5 - - name: "DevOps Blog" - url: "en/devops-blog/" - parent: "Blog" - weight: 6 + diff --git a/content/blog/_index.da.md b/content/blog/_index.da.md index d2a4c0f..bffee4d 100644 --- a/content/blog/_index.da.md +++ b/content/blog/_index.da.md @@ -2,4 +2,4 @@ title: "Blog" --- -Vigtige opdateringer fra bestyrelsen mv. +Vigtige opdateringer fra bestyrelsen, admin-teamet mv. diff --git a/content/devops-blog/nextcloud-incident.da.md b/content/blog/nextcloud-incident.da.md similarity index 99% rename from content/devops-blog/nextcloud-incident.da.md rename to content/blog/nextcloud-incident.da.md index 98460fa..946074c 100644 --- a/content/devops-blog/nextcloud-incident.da.md +++ b/content/blog/nextcloud-incident.da.md @@ -4,9 +4,14 @@ summary: En fejl i synkronisering af Nextcloud-servere resulterede i dårlig yde date: 2025-02-22 params: author: Reynir (admin team) +categories: +- Admins +tags: +- devops +- nextcloud --- -**Den korte version:** der er tilsyneladende en bug i synkronisering mellem Nextcloud-servere samt i log vieweren i Nexclouds adminpanel. Medlemmer bør derfor indtil videre ikke sætte synkronisering op mellem cloud.data.coop og andre Nextcloud-servere uden nærmere aftale med administratorholdet. +**Den korte version:** der er tilsyneladende en bug i synkronisering mellem Nextcloud-servere samt i log vieweren i Nextclouds adminpanel. Medlemmer bør derfor indtil videre ikke sætte synkronisering op mellem cloud.data.coop og andre Nextcloud-servere uden nærmere aftale med administratorholdet. I mindst en måned har data.coop haft udfordringer med CPU, hukommelse og disk plads. Det har vi i [admin-teamet](/rights/#-7-administratorer) haft kig på når vi har kunne finde tid. diff --git a/content/devops-blog/_index.da.md b/content/devops-blog/_index.da.md deleted file mode 100644 index fa8ca00..0000000 --- a/content/devops-blog/_index.da.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: "DevOps blog" ---- - -Teknisk blog fra admin-holdet. diff --git a/content/devops-blog/_index.en.md b/content/devops-blog/_index.en.md deleted file mode 100644 index 26409f0..0000000 --- a/content/devops-blog/_index.en.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: "DevOps Blog" ---- - -We currently only blog in Danish. From 237e5e6f08a780ff93ae9f6fc17c287061bab791 Mon Sep 17 00:00:00 2001 From: bbb Date: Sat, 22 Feb 2025 14:27:04 +0100 Subject: [PATCH 6/8] Add some more taxonomy --- content/blog/_index.en.md | 2 +- content/blog/defederating-meta.da.md | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/content/blog/_index.en.md b/content/blog/_index.en.md index 0788e11..709f6d1 100644 --- a/content/blog/_index.en.md +++ b/content/blog/_index.en.md @@ -1,3 +1,3 @@ # Blog -We currently only blog in Danish. +Important updates from admins, board etc. Note that we primarily blog in Danish. diff --git a/content/blog/defederating-meta.da.md b/content/blog/defederating-meta.da.md index d35c484..e5c26d8 100644 --- a/content/blog/defederating-meta.da.md +++ b/content/blog/defederating-meta.da.md @@ -4,6 +4,13 @@ summary: Bestyrelsen er enige om, at der samlet set er gode nok argumenter for a date: 2025-01-12 params: author: bestyrelsen +categories: +- Admins +tags: +- board +- fediverse +- moderation +- policy --- *Vedtaget af bestyrelsen 12. januar 2025* From eb3660280cd91015ff21814e213e603c85ee8dbe Mon Sep 17 00:00:00 2001 From: bbb Date: Sat, 22 Feb 2025 15:08:11 +0100 Subject: [PATCH 7/8] Add more info about how file/directory name was read --- content/blog/nextcloud-incident.da.md | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/content/blog/nextcloud-incident.da.md b/content/blog/nextcloud-incident.da.md index 946074c..96f63f4 100644 --- a/content/blog/nextcloud-incident.da.md +++ b/content/blog/nextcloud-incident.da.md @@ -11,7 +11,7 @@ tags: - nextcloud --- -**Den korte version:** der er tilsyneladende en bug i synkronisering mellem Nextcloud-servere samt i log vieweren i Nextclouds adminpanel. Medlemmer bør derfor indtil videre ikke sætte synkronisering op mellem cloud.data.coop og andre Nextcloud-servere uden nærmere aftale med administratorholdet. +**Den korte version:** der er tilsyneladende en bug i synkronisering mellem Nextcloud-servere samt i Nextclouds adminpanels logvisning. Medlemmer bør derfor indtil videre ikke benytte synkronisering mellem cloud.data.coop og andre Nextcloud-servere uden nærmere aftale med administratorholdet. I mindst en måned har data.coop haft udfordringer med CPU, hukommelse og disk plads. Det har vi i [admin-teamet](/rights/#-7-administratorer) haft kig på når vi har kunne finde tid. @@ -233,14 +233,11 @@ Som administratorer hviler der et stort ansvar på os. Vi forsøger efter bedste evne (f.eks. den tid vi har til det frivillige arbejde) at sørge for, at data.coops services fungerer på et acceptabelt niveau. -Til det har vi nogle gange brug for at kigge i logs og undersøge systemet. +Til det har vi nogle gange brug for at kigge i logs og undersøge systemet. Og netop dette kan nogle gange gå lidt på tværs med vores mål om privatlivsbeskyttelse og zero-knowledge 🤔 -Det kan nogle gange gå lidt på tværs med vores mål om privatlivsbeskyttelse og zero-knowledge 🤔 +I denne omgang jeg lærte jeg ved et uheld et stk. privat mappenavn og et stk. privat filnavn via logfilerne. *Heldigvis* var disse blot generiske, og jeg kunne straks efter informere medlemmet om hændelsen. Og det vil ofte være sådan, at man kun kan finde et problem i den høstak, det er opstået: I forsøget på at lokalisere problemet har jeg kigget i mine **egne** Nextcloud filer i filsystemet og derefter søgt filsystemet for den problematiske fil, og det var altså uden held. -I denne omgang har jeg lært et medlems mappenavn og filnavn på en af deres filer via logfilerne. -I forsøg på at lokalisere problemet har jeg kigget i mine **egne** Nextcloud filer i filsystemet og derefter søgt filsystemet for den problematiske fil (uden held). - -Det er noget, vi for så vidt muligt prøver at minimere; men det er også noget, vi skal diskutere løbende og aftale faste rammer omkring. +Men omfanget af admin-aktivitet i medlemmernes data er noget, vi skal minimere; det er også noget, vi skal diskutere løbende og aftale faste rammer or procedurer for. [json]: https://www.json.org/json-en.html From c91b466da485e6260eecb72ff9a427496e4fe218 Mon Sep 17 00:00:00 2001 From: bbb Date: Sat, 22 Feb 2025 15:10:26 +0100 Subject: [PATCH 8/8] =?UTF-8?q?Fix=20l=C3=A6rte=20jeg=20l=C3=A6rte=20jeg?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/blog/nextcloud-incident.da.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/nextcloud-incident.da.md b/content/blog/nextcloud-incident.da.md index 96f63f4..b35ba75 100644 --- a/content/blog/nextcloud-incident.da.md +++ b/content/blog/nextcloud-incident.da.md @@ -235,7 +235,7 @@ Vi forsøger efter bedste evne (f.eks. den tid vi har til det frivillige arbejde Til det har vi nogle gange brug for at kigge i logs og undersøge systemet. Og netop dette kan nogle gange gå lidt på tværs med vores mål om privatlivsbeskyttelse og zero-knowledge 🤔 -I denne omgang jeg lærte jeg ved et uheld et stk. privat mappenavn og et stk. privat filnavn via logfilerne. *Heldigvis* var disse blot generiske, og jeg kunne straks efter informere medlemmet om hændelsen. Og det vil ofte være sådan, at man kun kan finde et problem i den høstak, det er opstået: I forsøget på at lokalisere problemet har jeg kigget i mine **egne** Nextcloud filer i filsystemet og derefter søgt filsystemet for den problematiske fil, og det var altså uden held. +I denne omgang jeg lærte ved et uheld et stk. privat mappenavn og et stk. privat filnavn via logfilerne. *Heldigvis* var disse blot generiske, og jeg kunne straks efter informere medlemmet om hændelsen. Og det vil ofte være sådan, at man kun kan finde et problem i den høstak, det er opstået: I forsøget på at lokalisere problemet har jeg kigget i mine **egne** Nextcloud filer i filsystemet og derefter søgt filsystemet for den problematiske fil, og det var altså uden held. Men omfanget af admin-aktivitet i medlemmernes data er noget, vi skal minimere; det er også noget, vi skal diskutere løbende og aftale faste rammer or procedurer for.