Files
OmniRoute/docs/i18n/lv/CONTRIBUTING.md
Diego Rodrigues de Sa e Souza 9debec71ec feat(i18n): 9 new locales — all 24 official EU languages (51 locales) (#13044)
Batch 1 of the locale expansion: Greek, Croatian, Serbian, Lithuanian, Estonian, Latvian, Slovenian, Maltese and Irish across the dashboard catalog, docs mirrors, CLI catalog, README, locale index and the site. 42 → 51 locales.

Also fixes the ICU literal escape the translation backend dropped around angle placeholders, four translations that invented or renamed a placeholder, the language bars that linked to mirrors that do not exist, and the migration count drift (171 → 172).

⚠️ base-red inherited: #12732 — the four unit shards and Fast Quality Gates fail identically on unrelated PRs cut from the same base.
2026-09-10 10:13:09 -03:00

25 KiB

Contributing to OmniRoute (Latviešu)

🌐 Languages: 🇺🇸 English · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇮🇱 he · 🇮🇳 hi · 🇭🇷 hr · 🇭🇺 hu · 🇮🇩 id · 🇮🇹 it · 🇯🇵 ja · 🇰🇷 ko · 🇱🇹 lt · 🇮🇳 mr · 🇲🇾 ms · 🇲🇹 mt · 🇳🇱 nl · 🇳🇴 no · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇻🇳 vi · 🇨🇳 zh-CN · 🇹🇼 zh-TW


Paldies par interesi sniegt ieguldījumu! Šajā rokasgrāmatā ir aprakstīts viss nepieciešamais, lai sāktu darbu.

Oficiālo katras izmaiņas darbplūsmu skatiet sadaļā Zelta ceļš ieguldījumu veikšanai. Tajā pakalpojumu sniedzēja, maršrutēšanas, UI/UX, i18n, CLI, datubāzes un būvēšanas/izvietošanas izmaiņas ir sasaistītas ar to līgumiem, mērķētiem testiem, CI pārklājumu un saskaņošanas darbībām.


Izstrādes iestatīšana

Priekšnosacījumi

  • Node.js >=22.22.3 <23 vai >=24.0.0 <27 (ieteicams: 24 LTS)
  • npm 10+

npm v11+ lietotājiem (Node 24+): Pēc npm install pārbaudiet, vai vietējie moduļi ir instalēti: node -e "require('better-sqlite3')". Ja komanda neizdodas ar MODULE_NOT_FOUND, palaidiet npm approve-scripts better-sqlite3 && npm install. Skatiet Problēmu novēršana.

  • Git

Klonēšana un instalēšana

git clone https://github.com/diegosouzapw/OmniRoute.git
cd OmniRoute
npm install

Vides mainīgie

# Izveidojiet .env failu no veidnes
cp .env.example .env

# Ģenerējiet nepieciešamos noslēpumus
echo "JWT_SECRET=$(openssl rand -base64 48)" >> .env
echo "API_KEY_SECRET=$(openssl rand -hex 32)" >> .env

Galvenie izstrādes mainīgie:

Mainīgais Noklusējuma vērtība izstrādē Apraksts
PORT 20128 Servera ports
NEXT_PUBLIC_BASE_URL http://localhost:20128 Frontend pamata URL
JWT_SECRET (ģenerējiet iepriekš) JWT parakstīšanas noslēpums
INITIAL_PASSWORD CHANGEME Pirmās pieteikšanās parole
APP_LOG_LEVEL info Žurnāla detalizācijas līmenis

Informācijas paneļa iestatījumi

Informācijas panelī ir pieejami funkciju pārslēgi, kurus var konfigurēt arī, izmantojot vides mainīgos:

Iestatījuma atrašanās vieta Pārslēgs Apraksts
Settings → Advanced Atkļūdošanas režīms Iespējot atkļūdošanas pieprasījumu žurnālus (UI)
Settings → General Sānjoslas redzamība Rādīt/slēpt sānjoslas sadaļas

Šie iestatījumi tiek glabāti datubāzē un saglabājas pēc atkārtotas palaišanas; ja tie ir iestatīti, tie aizstāj vides mainīgo noklusējuma vērtības.

Darbināšana lokāli

# Izstrādes režīms (automātiska pārlāde)
npm run dev

# Produkcijas būvējums
npm run build    # next build → .build/next/ un pēc tam assembleStandalone → dist/
npm run start

# Ātra tikai backend/API kompilēšana izmaiņām, ko veic ieguldītāji
npm run build:contributor

# Izlaiduma būvējums (tīra pārbūve + HEAD marķieris — nepieciešams izvietošanai)
npm run build:release   # rm -rf .build dist un build + ieraksta dist/BUILD_SHA

# Izplatīta porta konfigurācija
PORT=20128 NEXT_PUBLIC_BASE_URL=http://localhost:20128 npm run dev

Ieguldītāja būvējums veic tikai kompilēšanas validāciju: tas neizveido patstāvīgo izplatīšanu un nebūvē neobligātos vietējās pakotnes līdzekļus. Izmantojiet parasto produkcijas būvējumu, ja nepieciešams validēt izplatāmo pakotni.

Būvējuma izvades struktūra

Direktorija Saturs Tiek izsekota
src/ Lietotnes pirmkods (TypeScript / TSX)
.build/ Starpfaili — next build izvade (ignorēta, distDir = .build/next)
dist/ Izplatāmā pakotne — to izveido assembleStandalone (ignorēta)

Būvēšanas konveijers darbojas vienā piegājienā:

npm run build
  └─ next build → .build/next/standalone  (Next.js izvade)
  └─ assembleStandalone()                 (kopē standalone + static + public + native assets)
       └─ izvade: dist/                   (server.js, .next/static/, public/, node_modules/)

npm run build:release papildus vispirms notīra abas direktorijas un ieraksta dist/BUILD_SHA (= git rev-parse --short HEAD) kā izvietošanas integritātes marķieri.

npm run build:contributor izmanto tikai backend paredzēto būvējuma profilu. Būvēšanas laikā tas īslaicīgi aizstāj informācijas paneļa UI failus, saglabā API maršrutu apstrādātājus un pēc būvēšanas atjauno sākotnējos failus. Izmantojiet npm run build, lai pārbaudītu izmaiņas, kas ietekmē informācijas paneļa UI, vai veiktu pilnu izlaiduma validāciju; ieguldītāja profils neaizstāj izlaiduma būvējumu.

Piezīme par izvietošanu VPS: attālā attēla direktorija /usr/lib/node_modules/omniroute/app/ netiek mainīta. Izvietošanas prasmes tajā sinhronizē dist/ saturu, izmantojot rsync. Mainījies ir tikai repozitorijā esošais būvējuma izvades ceļš (app/dist/).

Noklusējuma URL:

  • Informācijas panelis: http://localhost:20128/dashboard
  • API: http://localhost:20128/v1

Git darbplūsma

⚠️ NEKAD neveiciet tiešu commit uz main. Vienmēr izmantojiet funkciju zarus.

PR bāze: mērķējiet uz aktīvo release/vX.Y.Z zaru (nevis main). Skatiet docs/ops/BRANCHING_MODEL.md, lai iepazītos ar modeli “release-per-branch + tag-at-ship”.

# Izveidot zaru no aktīvā release gala (piemērs: release/v3.8.49)
git fetch origin
git checkout -b feat/your-feature-name origin/release/v3.8.49
# ... veikt izmaiņas ...
git commit -m "feat: describe your change"
git push -u origin feat/your-feature-name
# Atveriet Pull Request ar base = release/v3.8.49

Zaru nosaukumi

Prefix Nolūks
feat/ Jaunas funkcijas
fix/ Kļūdu labojumi
refactor/ Koda pārstrukturēšana
docs/ Dokumentācijas izmaiņas
test/ Testu pievienošana/labošana
chore/ Rīki, CI, atkarības

Commit ziņojumi

Ievērojiet Conventional Commits:

feat: add circuit breaker for provider calls
fix: resolve JWT secret validation edge case
docs: update SECURITY.md with PII protection
test: add observability unit tests
refactor(db): consolidate rate limit tables

Tvērumi (v3.8): db, sse, oauth, dashboard, api, cli, docker, ci, mcp, a2a, memory, skills, cloud-agent, guardrails, compression, auto-combo, resilience, providers, executors, translator, domain, authz.


Testu palaišana

# Visi testi (unit + vitest + ecosystem + e2e)
npm run test:all

# Viens testa fails (Node.js native test runner — lielākā daļa testu izmanto šo)
node --import tsx/esm --test tests/unit/your-file.test.ts

# Tikai izmaiņu ietekmētie unit testi (tas pats TIA selektors, ko izmanto CI vārteja, #8084)
npm run test:scoped            # izmaiņas pēdējā commit (vai darba kokā)
npm run test:scoped:staged     # tikai staged izmaiņas — labi piemērots pre-commit palaišanai
npm run test:scoped:full       # vispirms atkārtoti izveidot import-graph karti (pēc failu pievienošanas/pārvietošanas)
# Exit 1 + "run the full suite" nozīmē, ka mainīts hub fails (tsconfig, package.json, …) vai
# nekartēts avots — selektors neuzņemas risku, tas nekad klusi neizlaiž testus.

# Vitest (MCP server, autoCombo, cache)
npm run test:vitest

# E2E testi (nepieciešams Playwright)
npm run test:e2e

# Protokola klientu E2E (MCP transports, A2A)
npm run test:protocols:e2e

# Ecosystem saderības testi
npm run test:ecosystem

# Pārklājuma vārteja: 60% statements/lines/functions/branches
npm run test:coverage
npm run coverage:report

# Lint + format pārbaude
npm run lint
npm run check

# Kontrolēta reālo upstream kombināciju smoke pārbaude (nepieciešama VPS piekļuve + reāla provideru kredītu bilance)
# Izmanto REAL providerus — izmaksas ir nelielas. NEKAD netiek palaists CI. Bez vārtejas tiek korekti izlaists.
# Nepieciešama: ssh root@192.168.0.15 piekļuve (no VPS tiek iegūts tikai lasāms DB momentuzņēmums).
RUN_COMBO_LIVE=1 npm run test:combo:live

# 3. fāzes VPS live smoke pārbaude — vienkārši Node ESM skripti, kas tieši piekļūst live .15 serverim.
# Nepieciešama: ssh root@192.168.0.15 piekļuve (kombinācijas tiek izveidotas/noņemtas, izmantojot SSH sqlite).
# Izmanto REAL providerus (nelielas izmaksas). Izveido/dzēš tikai __live_test__* kombinācijas. NEKAD netiek palaists CI.
# REQUIRE_API_KEY=false uz .15, tāpēc API atslēga nav nepieciešama, bet, ja iestatīti, tiek ņemti vērā COMBO_LIVE_BASE_URL / COMBO_LIVE_API_KEY.
npm run test:combo:live:vps              # 7 HTTP scenāriji (priority/round-robin/weighted/cost/fusion/auto + health)
npm run test:combo:live:vps:failover     # pievieno reālu starp-provideru failover scenāriju (kopā 8)

Pārklājuma piezīmes:

  • npm run test:coverage mēra avota pārklājumu galvenajai unit testu kopai, izslēdz tests/** un ietver open-sse/**
  • Pull Request ir jāsaglabā pārklājuma vārteja vismaz 60%+ apmērā statements/lines/functions/branches
  • Ja PR maina produkcijas kodu mapēs src/, open-sse/, electron/ vai bin/, tajā pašā PR ir jāpievieno vai jāatjaunina automatizētie testi
  • npm run coverage:report izvada detalizētu pārskatu par katru failu no jaunākās pārklājuma palaišanas
  • npm run test:coverage:legacy saglabā vecāko metriku vēsturiskai salīdzināšanai
  • Skatiet docs/ops/COVERAGE_PLAN.md, lai iepazītos ar pakāpenisku pārklājuma uzlabošanas ceļvedi

Pull Request prasības

Pirms PR atvēršanas izmantojiet Contribution Golden Path, lai palaistu mērķēto ciklu atbilstoši veiktajām izmaiņām. Pilnā unit testu kopa (4 CI shards), Vitest, 60%+ pārklājuma vārteja un produkcijas build ir CI atbildība — to palaišana lokāli nedod nekādu papildu informāciju, ko PR pārbaudes jau nesniegs, turklāt mazākās ierīcēs tas var pārslogot hostu (#8084):

  • Palaidiet testa failus, kas aptver jūsu izmaiņas: node --import tsx/esm --test tests/unit/<file>.test.ts
  • Palaidiet npm run lint
  • Ikreiz, kad mainās produkcijas kods, tajā pašā PR iekļaujiet vai atjauniniet automatizētos testus
  • Ja mainījies produkcijas kods, PR aprakstā iekļaujiet mainītos vai pievienotos testa failus
  • Ja CI ir konfigurēti projekta noslēpumi, pārbaudiet SonarQube rezultātu PR

Pašreizējais testu statuss: 122 unit testu faili, kas aptver:

  • Provideru translatorus un formātu konvertēšanu
  • Ātruma ierobežošanu, circuit breaker un noturību
  • Semantisko kešatmiņu, idempotenci, progresa izsekošanu
  • Datu bāzes darbības un shēmu (21 DB modulis)
  • OAuth plūsmas un autentifikāciju
  • API galapunktu validāciju (Zod v4)
  • MCP servera rīkus un tvērumu izpildes kontroli
  • Memory un Skills sistēmas

Koda stils

  • ESLint — Pirms komita izpildiet npm run lint
  • Prettier — Komita laikā automātiski formatē, izmantojot lint-staged (2 atstarpes, semikoli, dubultās pēdiņas, 100 rakstzīmju platums, es5 beigu komati)
  • TypeScript — Viss src/ kods izmanto .ts/.tsx; open-sse/ izmanto .ts/.js; dokumentējiet ar TSDoc (@param, @returns, @throws)
  • Bez eval() — ESLint ievēro no-eval, no-implied-eval, no-new-func
  • Zod validācija — Visai API ievades validācijai izmantojiet Zod v4 shēmas
  • Nosaukumi: faili = camelCase/kebab-case, komponenti = PascalCase, konstantes = UPPER_SNAKE

Kļūdu apstrāde / tukši catch bloki

Nekad neatstājiet catch bez paskaidrojuma. Klasificējiet to vienā no divām kategorijām (tādējādi tiek ieviests stingrais noteikums “nekad klusi neignorēt kļūdas SSE straumēs”):

  • Apzināta (mūsu pašu labāko centienu tīrīšana/telemetrija) — kļūme šeit ir sagaidāma un nekaitīga; pievienojiet vienas rindiņas pamatojuma komentāru, neveiciet reģistrēšanu (reģistrēšana katra pieprasījuma laikā ir troksnis, no kura šī konvencija palīdz izvairīties).

    } catch {} // jau aizvērta kontrollera aizvēršana pēc klienta atvienošanās ir sagaidāma
    
  • Jāreģistrē (ārējs/zvanītāja nodrošināts kods vai kļūdas ignorēšana maina vadības plūsmu) — saglabājiet catch (nekad neļaujiet tam pārtraukt straumi), bet izvadiet kontekstuālu console.debug/warn, lai kļūme būtu atklājama.

    } catch (e) {
      console.debug("[STREAM] onFailure callback error:", e);
    }
    

Skatiet open-sse/utils/stream.ts un open-sse/utils/streamHandler.ts, lai iepazītos ar pielietotajiem piemēriem.


Projekta struktūra

src/                        # TypeScript (.ts / .tsx)
├── app/                    # Next.js 16 App Router
│   ├── (dashboard)/        # Informācijas paneļa lapas (23 sadaļas)
│   ├── api/                # API maršruti (51 direktorija)
│   └── login/              # Autentifikācijas lapas (.tsx)
├── domain/                 # Politiku dzinis (policyEngine, comboResolver, costRules u.c.)
├── lib/                    # Galvenā biznesa loģika (.ts)
│   ├── a2a/                # Agent-to-Agent v0.3 protokola serveris
│   ├── acp/                # Agent Communication Protocol reģistrs
│   ├── compliance/         # Atbilstības politiku dzinis
│   ├── db/                 # SQLite domēna moduļi + 130 migrācijas
│   ├── memory/             # Pastāvīga sarunu atmiņa
│   ├── oauth/              # OAuth nodrošinātāji, pakalpojumi un utilītas
│   ├── skills/             # Paplašināma prasmju infrastruktūra
│   ├── usage/              # Lietojuma uzskaite un izmaksu aprēķināšana
│   └── localDb.ts          # Tikai atkārtotas eksportēšanas slānis — nekad šeit nepievienojiet loģiku
├── middleware/              # Pieprasījumu starpprogrammatūra (promptInjectionGuard)
├── mitm/                   # MITM starpniekserveris (sertifikāts, DNS, mērķa maršrutēšana)
├── shared/
│   ├── components/         # React komponenti (.tsx)
│   ├── constants/          # Nodrošinātāju definīcijas (329), MCP tvērumi, 19 maršrutēšanas stratēģijas
│   ├── utils/              # Automātiskais slēdzis, sanitizētājs, autentifikācijas palīgi
│   └── validation/         # Zod v4 shēmas
└── sse/                    # SSE starpniekservera konveijers

open-sse/                   # @omniroute/open-sse workspace
├── executors/              # 89 izpildītāju ieviešanas moduļi
├── handlers/               # 11 pieprasījumu apstrādātāji (chat, responses, embeddings, images u.c.)
├── mcp-server/             # MCP serveris (110 unikāli rīki, 3 transporti, 33 tvērumi)
├── services/               # 178 augstākā līmeņa pakalpojumi (combo, autoCombo, rateLimitManager u.c.)
├── translator/             # Formātu tulkotāji (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama)
├── transformer/            # Responses API pārveidotājs
└── utils/                  # 22 utilītas moduļi (straume, TLS, starpniekserveris, reģistrēšana)

electron/                   # Electron darbvirsmas lietotne (daudzplatformu)

tests/
├── unit/                   # Node.js testu palaidējs (1,574 testu faili)
├── integration/            # Integrācijas testi
├── e2e/                    # Playwright testi
├── security/               # Drošības testi
├── translator/             # Tulkotājam specifiski testi
└── load/                   # Slodzes testi

docs/
├── adr/                     # Arhitektūras lēmumu ieraksti
├── architecture/            # Sistēmas arhitektūra un noturība
├── comparison/              # OmniRoute salīdzinājumā ar alternatīvām
├── compression/             # Saspiešanas ceļveži un noteikumi
├── dev/                     # Izstrādes ceļveži
├── diagrams/                # Arhitektūras diagrammas
├── frameworks/              # MCP, A2A, OpenCode, Memory, Skills
├── guides/                  # Lietotāja ceļvedis, Docker, iestatīšana, problēmu novēršana
├── i18n/                    # Internacionalizēti README tulkojumi
├── marketing/               # Mārketinga materiāli
├── ops/                     # Izvietošana, starpniekserveris, pārklājums, laidieni
├── providers/               # Konkrētiem nodrošinātājiem paredzēta dokumentācija
├── reference/               # API atsauce, vides mainīgie, CLI rīki, bezmaksas līmeņi
├── releases/                # Laidienu piezīmes
├── routing/                 # Automātiskās kombinēšanas dzinis, spriešanas atkārtošana
├── screenshots/              # Informācijas paneļa ekrānuzņēmumi
├── security/                # Drošības vadīklas, atbilstība, slēpšana, pilnvarojuma marķieri
└── specs/                   # Izstrādes specifikācijas

Jauna nodrošinātāja pievienošana

1. darbība: reģistrējiet nodrošinātāja konstantes

Pievienojiet src/shared/constants/providers.ts — validācija ar Zod tiek veikta moduļa ielādes laikā.

2. darbība: pievienojiet izpildītāju (ja nepieciešama pielāgota loģika)

Izveidojiet izpildītāju open-sse/executors/your-provider.ts, paplašinot bāzes izpildītāju.

3. darbība: pievienojiet tulkotāju (ja formāts nav OpenAI formāts)

Izveidojiet pieprasījumu/atbilžu tulkotājus direktorijā open-sse/translator/.

4. darbība: pievienojiet OAuth konfigurāciju (ja tiek izmantots OAuth)

Pievienojiet OAuth akreditācijas datus failā src/lib/oauth/constants/oauth.ts un pakalpojumu direktorijā src/lib/oauth/services/.

Ja augšupējais nodrošinātājs izplata publisku OAuth client_id/secret vai Firebase Web API key savā publiskajā CLI / pārlūkprogrammas komplektā, neieguliet to kā virknes literāli. Izmantojiet resolvePublicCred() no open-sse/utils/publicCreds.ts un pievienojiet maskētu baitu ierakstu kolekcijai EMBEDDED_DEFAULTS. Pilnā obligātā darbplūsma ir dokumentēta failā docs/security/PUBLIC_CREDS.md.

Apstrādātājos/izpildītājos kļūdu ziņojumiem, kas sasniedz klientu, ir jāizmanto buildErrorBody() / sanitizeErrorMessage() no open-sse/utils/error.ts — nekad neievietojiet neapstrādātu err.stack vai err.message objekta Response pamattekstā. Skatiet docs/security/ERROR_SANITIZATION.md.

5. darbība: reģistrējiet modeļus

Pievienojiet modeļu definīcijas failā open-sse/config/providerRegistry.ts.

6. darbība: pievienojiet testus

Uzrakstiet vienību testus direktorijā tests/unit/, kas aptver vismaz:

  • Nodrošinātāja reģistrāciju
  • Pieprasījumu/atbilžu tulkošanu
  • Kļūdu apstrādi

Pull Request kontrolsaraksts

  • Testi ir veiksmīgi (npm test)
  • Lint pārbaude ir veiksmīga (npm run lint)
  • Būvēšana ir veiksmīga (npm run build)
  • Jaunām publiskajām funkcijām un saskarnēm ir pievienoti TypeScript tipi
  • Nav cietkodētu noslēpumu vai rezerves vērtību
  • Publiskie augšupējā nodrošinātāja akreditācijas dati ir iegulti, izmantojot resolvePublicCred() (skatiet docs/security/PUBLIC_CREDS.md), nekad kā literāļi
  • Kļūdu atbildes tiek novirzītas caur buildErrorBody() / sanitizeErrorMessage() — atbildes pamattekstā nav neapstrādātu steka izsekojumu (skatiet docs/security/ERROR_SANITIZATION.md)
  • Čaulas komandas (exec / spawn) izpildlaika vērtības padod, izmantojot env, nevis virkņu interpolāciju
  • Visas ievades tiek validētas ar Zod shēmām
  • Lietotājiem redzamām izmaiņām ir pievienots izmaiņu žurnāla fragment fails changelog.d/{features|fixes|maintenance}/<PR>-<slug>.md (skatiet changelog.d/README.md) — nerediģējiet CHANGELOG.md tieši; fragmenti tiek apkopoti laidiena izveides laikā un nekad nerada konfliktus starp PR
  • Dokumentācija ir atjaunināta (ja piemērojams)
  • Nav atvērti jauni CodeQL / Secret-Scanning brīdinājumi, vai arī katrs no tiem ir noraidīts ar tehnisku pamatojumu, atsaucoties uz atbilstošo docs/security/ dokumentu
  • Maršruti, kas palaiž bērnprocesus (/api/mcp/, /api/cli-tools/runtime/), failā src/server/authz/routeGuard.ts ir klasificēti ar isLocalOnlyPath() — skatiet Stingro noteikumu #15
  • Komitziņojumos nav Co-Authored-By papildinājumu — komitiem ir jāparādās tikai repozitorija īpašnieka Git identitātes vārdā (Stingrais noteikums #16)

Izlaides

Izlaides tiek pārvaldītas, izmantojot /generate-release darbplūsmu. Kad tiek izveidots jauns GitHub laidiens, pakotne tiek automātiski publicēta npm platformā, izmantojot GitHub Actions.

VPS izvietošanai izmantojiet npm run build:release (nevis npm run build) — tas veic tīru pārbūvi, apkopo komplektu mapē dist/ un izveido dist/BUILD_SHA indikatorfailu. Pēc tam izmantojiet /deploy-vps-*-cc prasmes, kas ar rsync sinhronizē dist/ ar attālo app/ mapi.


Palīdzības saņemšana