Ce este actual
Am un server (EX42) și o cutie de stocare (BX21) ambele găzduite la Hetzner. Pe server rulează o instanță peertube și vreau să salvez datele în caseta de stocare.
am instalat sshfs
pe serverul meu rădăcină Debian 10 și am montat caseta de stocare:
/etc/fstab
:
<user>@<user>.your-storagebox.de:/data /peertube/data fuse.sshfs ssh_command=sshpass\040-f\040/peertube/sftp.pass\040ssh,uid=999,gid=999,allow_other ,disable_hardlink,transform_symlinks,reconnect,_netdev 0 0
Am montat sistemul de fișiere cu următoarele opțiuni privind legăturile simbolice:
-o disable_hardlink
link(2) va reveni cu errno setat la ENOSYS. Legături dure
momentan nu funcționează perfect pe sshfs, iar acest lucru derutează
unele programe. Dacă se întâmplă acest lucru, încercați să dezactivați linkurile hard
cu această opțiune.
-o transform_symlinks
transforma legăturile simbolice absolute în relative
Apoi pornesc Peertube în interiorul docker și montez folderul în acest container
peertube:
volume:
- active:/app/client/dist
- /peertube/data/peertube:/data
- /peertube/data/config:/config
retele:
- Mod implicit
Problema
Rulez o instanță peertube cu docker și am încercat să instalez un plugin cu această comandă:
$: NODE_ENV=producție NODE_CONFIG_DIR=/config yarn plugin:install -n peertube-plugin-chapters
Rezultatul a arătat că există o eroare la crearea unui link simbolic
fire run v1.22.17
...
2022-03-29 09:35:16.286 eroare: Nu se poate instala pluginul peertube-plugin-chapters, eliminându-l... {
„err”: {
„err”: {
"stack": "Eroare: Comanda a eșuat: yarn add [email protected]\nwarning package.json: Fără câmp de licență\nwarning Fără câmp de licență\nerror A apărut o eroare neașteptată: \"EIO: eroare i/o , link simbolic „../../../marked/bin/marked” -> „/data/plugins/node_modules/peertube-plugin-chapters/node_modules/.bin/marked'\".\n\n la ChildProcess .exithandler (nod:child_process:399:12)\n la ChildProcess.emit (node:events:526:28)\n la ChildProcess.emit (node:domain:475:12)\n la maybeClose (nod:internal/ child_process:1092:16)\n la Process.ChildProcess._handle.onexit (nod:internal/child_process:302:5)",
"message": "Comandă a eșuat: yarn add [email protected]\nwarning package.json: Fără câmp de licență\nwarning Fără câmp de licență\nerror A apărut o eroare neașteptată: \"EIO: eroare i/o, link simbolic '../../../marked/bin/marked' -> '/data/plugins/node_modules/peertube-plugin-chapters/node_modules/.bin/marked'\".\n",
„ucis”: fals,
„cod”: 1,
„semnal”: nul,
"cmd": "Adăugați fire [email protected]"
},
"stdout": "[1/4] Se rezolvă pachetele...\n[2/4] Se preiau pachetele...\n[3/4] Se leagă dependențe...\ninfo Dacă credeți că aceasta este o eroare, vă rugăm deschideți un raport de eroare cu informațiile furnizate în \"/data/plugins/yarn-error.log\".\ninfo Vizitați https://yarnpkg.com/en/docs/cli/add pentru documentația despre această comandă.\n ",
"stderr": "avertisment package.json: Fără câmp de licență\nwarning Fără câmp de licență\nerror A apărut o eroare neașteptată: \"EIO: eroare i/o, link simbolic '../../../marked/bin/marked ' -> '/data/plugins/node_modules/peertube-plugin-chapters/node_modules/.bin/marked'\".\n"
}
}
...
{
err: Eroare: Comanda a eșuat: yarn add [email protected]
avertisment package.json: Fără câmp de licență
avertisment Fără câmp de licență
eroare A apărut o eroare neașteptată: „EIO: eroare i/o, link simbolic „../../../marked/bin/marked” -> „/data/plugins/node_modules/peertube-plugin-chapters/node_modules/. bin/marcat'".
la ChildProcess.exithandler (nod:child_process:399:12)
la ChildProcess.emit (node:events:526:28)
la ChildProcess.emit (nod:domain:475:12)
la maybeClose (nod:internal/child_process:1092:16)
la Process.ChildProcess._handle.onexit (nod:internal/child_process:302:5) {
ucis: fals,
cod: 1,
semnal: nul,
cmd: „yarn add [email protected]”
},
stdout: '[1/4] Se rezolvă pachetele...\n' +
„[2/4] Se preiau pachetele...\n” +
„[3/4] Se conectează dependențe...\n” +
„info Dacă credeți că este o eroare, vă rugăm să deschideți un raport de eroare cu informațiile furnizate în „/data/plugins/yarn-error.log”.\n” +
„Informații Vizitați https://yarnpkg.com/en/docs/cli/add pentru documentația despre această comandă.\n”,
stderr: „warning package.json: Fără câmp de licență\n” +
„avertisment Fără licență câmp\n” +
`eroare A apărut o eroare neașteptată: „EIO: eroare i/o, legătură simbolică „../../../marked/bin/marked” -> „/data/plugins/node_modules/peertube-plugin-chapters/node_modules/ .bin/marked'".\n`
}
eroare Comanda a eșuat cu codul de ieșire 255.
Dar când mă uit în interiorul acelui folder, pot vedea că linkul simbolic a fost creat și funcționează
$: ls -la /data/plugins/node_modules/peertube-plugin-chapters/node_modules/.bin/
total 12
drwxr-xr-x 1 peertube peertube 3 Mar 29 09:35 .
drwxr-xr-x 1 peertube peertube 3 Mar 29 09:35 ..
lrwxr-xr-x 1 peertube peertube 26 Mar 29 09:35 marcat -> ../../../marked/bin/marked
$: cat /data/plugins/node_modules/peertube-plugin-chapters/node_modules/.bin/marked
#!/usr/bin/env nod
/**
* Marcat CLI
* Drepturi de autor (c) 2011-2013, Christopher Jeffrey (Licență MIT)
*/
const fs = require('fs'),
cale = necesită('cale'),
marcat = cere('../');
/**
* Pagina de manual
*/
function help() {
const spawn = require('child_process').spawn;
opțiuni const = {
cwd: process.cwd(),
env: process.env,
....
Așa că l-am încercat eu în interiorul containerului creând un fișier, le-am legat simbolic și îl modific
$: echo „Bună ziua” > /data/plugins/hello
$: cat /data/plugins/hello
Buna ziua
----
$: ln -s /data/plugins/hello /data/plugins/hello_link
ln: nu s-a putut crea legătura simbolică „/data/plugins/hello_link”: eroare de intrare/ieșire
----
$: cat /data/plugins/hello_link
Buna ziua
----
$: echo "Lumea" >> /data/plugins/hello_link
----
$: cat /data/plugins/hello
Buna ziua
Lume
----
$: ls -la /data/plugins/
total 40
drwxr-xr-x 1 peertube peertube 10 Mar 29 09:38 .
drwxr-xr-x 1 peertube peertube 16 Mar 29 06:32 ..
drwxr-xr-x 1 peertube peertube 2 Mar 28 16:48 .DAV
drwxr-xr-x 1 peertube peertube 3 mar 28 16:48 date
-rw-r--r-- 1 peertube peertube 12 mar 29 09:38 salut
lrwxr-xr-x 1 peertube peertube 5 Mar 29 09:38 hello_link -> hello
drwxr-xr-x 1 peertube peertube 6 mar 29 06:35 node_modules
-rw-r--r-- 1 peertube peertube 76 28 mar 16:48 package.json
-rw-r--r-- 1 peertube peertube 1248 29 mar 09:35 yarn-error.log
-rw-r--r-- 1 peertube peertube 413 Mar 28 16:48 yarn.lock
The ln -s
comanda aruncă o eroare, dar în rest totul arată bine și funcționează conform așteptărilor.
Ce am încercat
Am incercat sa montez si stocarea cu aceasta optiune
-o follow_symlinks
urmați legăturile simbolice de pe server
dar tot ceea ce face a fost spargerea fișierelor și nu le mai puteam șterge, când fișierul țintă a linkului nu mai exista. Deci, am eliminat din nou această opțiune.
Am întrebat serviciul de asistență pentru clienți dacă linkul simbolic este acceptat și răspunsul a fost „da, este acceptat”.
Când creez link-uri simbolice direct pe server, funcționează fără probleme.
Am încercat să montez folderul în interiorul containerului în același folder ca și pe server
/etc/fstab
:
<user>@<user>.your-storagebox.de:/data /var/peertube/data fuse.sshfs ssh_command=sshpass\040-f\040/peertube/sftp.pass\040ssh,uid=999,gid=999 ,allow_other,disable_hardlink,transform_symlinks,reconnect,_netdev 0 0
peertube:
volume:
- active:/app/client/dist
- /var/peertube/data:/var/peertube/data
- /peertube/data/config:/config
retele:
- Mod implicit
dar asta nu a ajutat.
Intrebarea
Mi se pare că, de îndată ce montez sshf-urile într-un container docker, nu poate crea nicio legătură simbolică fără acest mesaj de eroare.
Ce trebuie să fac pentru ca acesta să funcționeze în docker?