Network diagram as code / Π‘Ρ…Π΅ΠΌΠ° Π½Π° ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π° ΠΊΠ°Ρ‚ΠΎ ΠΊΠΎΠ΄

ΠŸΡ€Π΅Π· послСднитС няколко Π³ΠΎΠ΄ΠΈΠ½ΠΈ сС Π·Π°Π½ΠΈΠΌΠ°Π²Π°ΠΌ ΠΏΠΎΠ²Π΅Ρ‡Π΅ с докумСнтация. Π”Π° напиша обяснитСлСн тСкст Π·Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚ΠΈ Π΄Π°Π΄Π΅Π½Π° систСма β€” Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚, Ρ‚ΠΎΠ²Π° Π΅ доста лСсно. Π”Π° нарисувам схСма, Π½Π° която Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΈ всички ΠΊΠ»ΡŽΡ‡ΠΎΠ²ΠΈ ΠΎΠ±Π΅ΠΊΡ‚ΠΈ ΠΈ Π²Ρ€ΡŠΠ·ΠΊΠΈΡ‚Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ тях, ΡΡŠΡ‰ΠΎ Π΅ напълно възмоТно.

Но Π½Π°ΠΉ-проблСмният ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΅ Π΄Π° ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Ρˆ Ρ‚Π°Π·ΠΈ докумСнтация Π°ΠΊΡ‚ΡƒΠ°Π»Π½Π°. И Π½Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ само Π·Π° тСкста, Π° ΠΈ Π·Π° схСмитС… Въй ΠΊΠ°Ρ‚ΠΎ цялата докумСнтация Π΅ ΠΎΠ½Π»Π°ΠΉΠ½, Ρ‚.Π΅. Π² html Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, към тСкста сС прикрСпят ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ gif/jpeg/png, Π½Π° ΠΊΠΎΠΈΡ‚ΠΎ Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ са ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈ схСмитС. А схСмитС сС рисуват Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ ΠΊΠ°Ρ‚ΠΎ Visio ΠΈΠ»ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ услуги Ρ‚ΠΈΠΏ draw.io. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Π΅ΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€Π°Ρˆ схСмата Π² Π³Ρ€Π°Ρ„ΠΈΡ‡Π΅Π½ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΈ я ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΡΡˆ към html. Всичко Π·Π²ΡƒΡ‡ΠΈ лСсно.

Π’ Ρ‡Π΅ΠΌ Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚?

Π‘Ρ…Π΅ΠΌΠΈΡ‚Π΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ са прости. По-Ρ‚ΠΎΡ‡Π½ΠΎ, Π½Π΅ особСно слоТни. Π”Π°, броят Π½Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈΡ‚Π΅ Π΅ дСсСтина-Π΄Π²Π°, Π° броят Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠΈΡ‚Π΅ Π΅ ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»Π½ΠΎ Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π°. Плюс надписи, някакви означСния. ΠŸΡ€ΠΎΡΡ‚ΠΈΡ‚Π΅ схСми ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΠΎΠΏΠΈΡˆΠ°Ρ‚ ΠΈ с Π΄ΡƒΠΌΠΈ, Π° ΠΏΡ€Π΅ΠΊΠ°Π»Π΅Π½ΠΎ слоТнитС, хм… (с) "Π½Π΅ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚-с". Има ΠΌΠ½ΠΎΠ³ΠΎ схСми, трябва Π΄Π° сС внасят ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π½ΠΈ-Π΅ΠΏΠΈΠ·ΠΎΠ΄ΠΈΡ‡Π½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ, Ρ‚.Π΅. постоянно, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Ρ‚Π΅ слСдват Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π° Π½Π° Π½Π°ΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΈ.

МоТС Π»ΠΈ Π΄Π° Π²Π³Ρ€Π°ΠΆΠ΄Π°Ρˆ html Π½Π° услугата? ΠŸΡ€ΠΎΠ±Π²Π°Π» Π»ΠΈ си?

Π”Π°, Ρ€Π°Π·Π±ΠΈΡ€Π° сС. НапримСр, Π½Π° ΠΌΠ΅Π½ ΠΌΠΈ харСсват Π³Ρ€Π°Ρ„ΠΈΠΊΠΈΡ‚Π΅ Π½Π° gliffy.com. Но Π·Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ трябва Π΄Π° ΠΎΡ‚ΠΈΠ΄Π΅Ρˆ Π² страничната услуга, Ρ‚Π°ΠΌ Π΄Π° Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€Π°Ρˆ. И Π΅ ΠΏΠΎ-Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π΄Π° Π΄Π΅Π»Π΅Π³ΠΈΡ€Π°Ρˆ Π½Π° ΠΊΠΎΠ»Π΅Π³Π° Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈ ΠΏΠΎΠΏΡ€Π°Π²ΠΊΠΈ.

Какво Π΄Π° ΠΏΡ€Π°Π²ΠΈΠΌ?

Наскоро Π² GitHub ΠΌΠΈ ΠΏΠΎΠΏΠ°Π΄Π° Π² ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΠΊΠΈΡ‚Π΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ github.com/RaoulMeyer/diagram-as-code. Π”ΠΈΠ°Π³Ρ€Π°ΠΌΠ° ΠΊΠ°Ρ‚ΠΎ ΠΊΠΎΠ΄. Π’.Π΅. описвамС Π½Π° js Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ°Ρ‚Π° схСма. Π’ΠΎΠ·ΠΈ js пишСм Π½Π°ΠΏΡ€Π°Π²ΠΎ Π² ΡΡŠΡ‰ΠΈΡ html, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ Π΅ ΠΈ останалият тСкст Π½Π° докумСнтацията.

И Π΄Π° ΠΊΠ°ΠΆΠ°, Ρ‡Π΅ Π½Π΅ пиша докумСнтация изцяло Π² html. ОбикновСно докумСнтацията Π΅ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ с markdown тСкст, ΠΊΠΎΠΉΡ‚ΠΎ слСд Ρ‚ΠΎΠ²Π° сС ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€Π° Π² напълно Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π°Ρ‰ сайт Π½Π° докумСнтацията с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° някой Π΄Π²ΠΈΠΆΠΎΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ wintersmith. Или wiki систСма.

Π‘Ρ‚Π°Π²Π° ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ: Π΅Ρ‚ΠΎ, написахмС тСкста, слСд Ρ‚ΠΎΠ²Π° отварямС Ρ‚Π°Π³ script ΠΈ Π² Π½Π΅Π³ΠΎ сС описва js ΠΊΠΎΠ΄Π° Π½Π° схСмата.

Какво ΠΎΡ‚Π½ΠΎΠ²ΠΎ Π½Π΅ Π΅ Π½Π°Ρ€Π΅Π΄?

Π’ΠΎΠ·ΠΈ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΌΠΈ харСсва, Π½ΠΎ Ρ‚ΠΎΠ²Π° Π½Π΅ Π΅ СдинствСният ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ³Π°Ρ‚ΠΎ схСмата сС рисува с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΊΠΎΠ΄ ΠΈΠ»ΠΈ тСкстово прСдставянС. (Π’ края Π½Π° статията Ρ‰Π΅ ΠΈΠΌΠ° Π»ΠΈΠ½ΠΊΠΎΠ²Π΅ към ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ ΠΈ статии, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π°ΠΌΠ΅Ρ€ΠΈΡ… ΠΏΠΎ Ρ‚Π΅ΠΌΠ°Ρ‚Π° diagram as code.)

И всС ΠΏΠ°ΠΊ, Π½Π΅ съм СдинствСният, ΠΊΠΎΠΉΡ‚ΠΎ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€Π° докумСнтацията. Понякога ΠΈ ΠΊΠΎΠ»Π΅Π³ΠΈΡ‚Π΅ допринасят β€” Π΅Π΄Π½Π° Π΄ΡƒΠΌΠ° Π΄Π° поправят, описаниС Π΄Π° промСнят, Π½ΠΎΠ²ΠΈ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Π΄Π° добавят.Β 

ΠŸΠΎΡ€Π°Π΄ΠΈ Ρ‚ΠΎΠ²Π°, Π±ΠΈΡ… искал Π΄Π° видя схСмата Π² Ρ‡Π΅Ρ‚ΠΈΠΌ ΠΈ Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅ΠΌ тСкстов Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, ΠΊΠΎΠΉΡ‚ΠΎ Π½Π΅ изисква ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈΡ‚Π΅Π»Π½ΠΎ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅. А Π½Π° мСста Π΄ΠΎΡ€ΠΈ ΠΌΠΎΠΆΠ΅ просто Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ copy-paste Π·Π° ускоряванС Π½Π° добавянСто Π½Π° Π½ΠΎΠ²Π° схСма.Β 

ΠžΡ‰Π΅ Π΅Π΄ΠΈΠ½ ΠΊΠΎΠ»Π΅Π³Π° забСляза, Ρ‡Π΅ ΠΊΠΎΠ΄ΡŠΡ‚ Π΅ Π΄ΠΎΠ±Ρ€Π΅, Π½ΠΎ Π°ΠΊΠΎ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° структура, всичко ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΌΠ½ΠΎΠ³ΠΎ строго ΠΈ ΠΈΠ·Ρ€Π°Π·ΠΈΡ‚Π΅Π»Π½ΠΎ.

Π—Π°Ρ‚ΠΎΠ²Π° ΠΎΠΏΠΈΡ‚Π°Ρ… Π΄Π° прСдставя схСмата ΠΊΠ°Ρ‚ΠΎ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ няколко ΠΌΠ°Π»ΠΊΠΈ масива, ΠΊΠΎΠΈΡ‚ΠΎ описват възли, Π²Ρ€ΡŠΠ·ΠΊΠΈ, Π³Ρ€ΡƒΠΏΠΈ ΠΎΡ‚ възли, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Π²ΡŠΠ·Π»ΠΈΡ‚Π΅. На ΠΌΠ΅Π½ ΠΌΠΈ сС струва доста ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Π²ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅, Ρ€Π°Π·Π±ΠΈΡ€Π° сС, Π½Π° вкус ΠΈ Ρ†Π²Π΅Ρ‚...

Как Π΅ схСмата Π² масив?

  • ВсСки възСл сС описва с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, ΠΊΠΎΠΉΡ‚ΠΎ нСдвусмислСно опрСдСля възСла.
  • Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ°, Π½Π° възСла ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π΄ΠΎΠ±Π°Π²ΠΈ ΠΈΠΊΠΎΠ½Π° ΠΈ надпис.
  • ΠœΠ΅ΠΆΠ΄Ρƒ Π΄Π²Π° възСла ΠΌΠΎΠΆΠ΅ Π΄Π° сС посочи Π²Ρ€ΡŠΠ·ΠΊΠ°.
  • Π—Π° Π²Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π° Π½Π° схСмата ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π·Π°Π΄Π°Π΄Π΅ цвят ΠΈ надпис.
  • НаправлСниСто Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π° сС опрСдСля ΠΎΡ‚ ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΠ° към Ρ†Π΅Π»Ρ‚Π°. А ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΡŠΡ‚ ΠΈ Ρ†Π΅Π»Ρ‚Π° сС ΡƒΠΊΠ°Π·Π²Π°Ρ‚ с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ Π½Π° Π²ΡŠΠ·Π»ΠΈΡ‚Π΅.
  • Π•Π΄ΠΈΠ½ ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅Ρ‡Π΅ възли ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ Π² Π³Ρ€ΡƒΠΏΠ°.
  • Π’Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π° ΡΡŠΡ‰ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΡƒΠΊΠ°Π·Π²Π° ΠΈ ΠΎΡ‚ Π³Ρ€ΡƒΠΏΠ°, ΠΈ към Π³Ρ€ΡƒΠΏΠ°.

ΠŸΠΎΡ‚Ρ€Π΅Π±ΡΠ²Π°ΠΉΠΊΠΈ Ρ‚Π΅Π·ΠΈ прости ΠΏΡ€Π°Π²ΠΈΠ»Π°, сС ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π° Ρ‚Π°ΠΊΠ°Π²Π° схСма. ЛСсно? Напълно.

Network diagram as code / Π‘Ρ…Π΅ΠΌΠ° Π½Π° ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π° ΠΊΠ°Ρ‚ΠΎ ΠΊΠΎΠ΄

А тя сС описва с Ρ‚ΠΎΠ·ΠΈ js ΠΊΠΎΠ΄. ΠžΡΠ½ΠΎΠ²Π½ΠΎΡ‚ΠΎ Ρ‚ΡƒΠΊ Π΅ ΠΎΠ±Π΅ΠΊΡ‚ΡŠΡ‚ elements. Π’ ΠΊΠΎΠΉΡ‚ΠΎ са Π·Π°Π΄Π°Π΄Π΅Π½ΠΈ nodes β€” Π²ΡŠΠ·Π»ΠΈΡ‚Π΅, edges β€” Π²Ρ€ΡŠΠ·ΠΊΠΈΡ‚Π΅.
Β 

  const elements = {
    nodes: [       // описвамС възли
      { id: 'client', type: 'smartphone', label: 'Mobile App'},
      { id: 'server', type: 'server', label: 'Main Server'},
      { id: 'db1', type: 'database', label: 'DB 1'},
      { id: 'db2', type: 'database', label: 'DB 2'},
    ],
    edges: [       // ΡƒΠΊΠ°Π·Π²Π°ΠΌΠ΅ Π²Ρ€ΡŠΠ·ΠΊΠΈ
      { source: 'client', target: 'server', label: 'request' },
      { source: 'server', target: 'db1', label: 'request' },
      { source: 'server', target: 'db2', label: 'request' },
    ],
  };
  Diagram('scheme1', elements);

Π Π°Π·Π±ΠΈΡ€Π° сС, рисуванСто Π½Π° схСмата Π½Π΅ съм Π³ΠΎ измислил сам, Π° ΠΏΠΎΠ»Π·Π²Π°Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°. cytoscape.js β€” ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠΎΡ‰Π΅Π½ инструмСнт Π·Π° визуализация. Част ΠΎΡ‚ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈΡ‚Π΅ ѝ Π² Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ си ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ само.Β 

Ясно, Ρ‚ΠΎΠ²Π° Π΅ прост ΠΏΡ€ΠΈΠΌΠ΅Ρ€. МоТС Π»ΠΈ Π½Π΅Ρ‰ΠΎ ΠΏΠΎ-слоТно?

Π”Π°, моля. Π—Π° ΡƒΠΊΠ°Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ β€” ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ positions, Π·Π° ΡƒΠΊΠ°Π·Π²Π°Π½Π΅ Π½Π° Π³Ρ€ΡƒΠΏΠΈ β€” ΡƒΠΊΠ°Π·Π²Π°ΠΌΠ΅ списък ΠΎΡ‚ Π³Ρ€ΡƒΠΏΠΈ Π² groups, Π° Π½Π° самитС Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ group.

Network diagram as code / Π‘Ρ…Π΅ΠΌΠ° Π½Π° ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π° ΠΊΠ°Ρ‚ΠΎ ΠΊΠΎΠ΄

А Ρ‚ΠΎΠ²Π° Π΅ ΠΊΠΎΠ΄ΡŠΡ‚:

<div id="scheme5" style="height:500px;width:800px;"></div>
<script>
  const elements5 = {
    groups: [
      { id: 'g1', label: 'Π“Ρ€ΡƒΠΏΠΏΠ° сСрвисов 1'},
      { id: 'g2', label: 'Π“Ρ€ΡƒΠΏΠΏΠ° сСрвисов 2'},
    ],
    nodes: [
      { id: 'man1', type: 'person', label: 'Π§Π΅Π»ΠΎΠ²Π΅ΠΊ'},
      { id: 'client', type: 'smartphone', label: 'Π‘ΠΌΠ°Ρ€Ρ‚Ρ„ΠΎΠ½'},
      { id: 'agent-backend', type: 'server', group: 'g1', label: 'agent-backend'},
      { id: 'web', type: 'server', group: 'g1', label: 'ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ admin'},
      { id: 'www', type: 'server', group: 'g1', label: 'страница Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ'},
      { id: 'mongodb1', type: 'database', group: 'g1', label: 'Mongo DB 1'},
      { id: 'mongodb2', type: 'database', group: 'g1', label: 'Mongo DB 2'},
      { id: 'runner-integration1', type: 'worker', group: 'g1', label: 'ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ°'},
      { id: 'runner-integration2', type: 'worker', group: 'g1', label: 'ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ°'},
      { id: 'api', type: 'server', group: 'g1', label: 'API'},
      { id: 'server2', type: 'server', group:'g2', label: 'сСрвСр'},
      { id: 'otherServer', type: 'server', group:'g2', label: 'сСрвСр'},
      { id: 'firebase', type: 'cloud', label: 'Google Firebase'},
    ],
    edges: [
      { source: 'client', target: 'agent-backend', label: 'json', color: 'red' },
      { source: 'agent-backend', target: 'mongodb1', color: 'red' },
      { source: 'agent-backend', target: 'mongodb2',  color: 'red' },
      { source: 'mongodb1', target: 'runner-integration1', label: 'Π΄Π°Π½Π½Ρ‹Π΅' },
      { source: 'mongodb2', target: 'runner-integration2', label: 'Π΄Π°Π½Π½Ρ‹Π΅' },
      { source: 'mongodb1', target: 'web', label: 'Π΄Π°Π½Π½Ρ‹Π΅ для отобраТСния' },
      { source: 'runner-integration1', target: 'server2', label: 'Π΄Π°Π½Π½Ρ‹Π΅' },
      { source: 'runner-integration2', target: 'otherServer', label: 'Π΄Π°Π½Π½Ρ‹Π΅' },
      { source: 'api', target: 'firebase', label: 'запросы', color: 'blue', },
      { source: 'firebase', target: 'client', label: 'push', color: 'blue'},
      { source: 'server2', target: 'api', label: 'увСдомлСния', color: 'blue'},
      { source: 'man1', target: 'client', },
    ],
    positions: [
      { id: 'client', row: 2, col: 1,},
      { id: 'agent-backend', row: 2, col: 3,},
      { id: 'web', row: 6, col: 3,},
      { id: 'www', row: 1, col: 3,},
      { id: 'mongodb1', row: 1, col: 4,},
      { id: 'mongodb2', row: 2, col: 5,},
      { id: 'runner-integration1', row: 3, col: 3,},
      { id: 'runner-integration2', row: 4, col: 3,},
      { id: 'api', row: 5, col: 3,},
      { id: 'server2', row: 6, col: 7,},
      { id: 'otherServer', row: 4, col: 7,},
      { id: 'firebase', row: 5, col: 1,},
      { id: 'logger', row: 2, col: 7,},
      { id: 'crm', row: 5, col: 8,},
    ],
};
  Diagram('scheme5', elements5, {layout: 'grid'});
</script>

Π’Π°Π·ΠΈ схСма ΠΎΡ‚ Π΅Π΄Π½Π° страна β€” Ρ‚ΠΎΠ²Π° Π΅ ΠΏΠΎΡ‡Ρ‚ΠΈ Π΄Π²Π° Π΅ΠΊΡ€Π°Π½Π° ΠΊΠΎΠ΄ Π½Π° Π»Π°ΠΏΡ‚ΠΎΠΏ, ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° страна структурата Π°-ля json позволява Π±ΡŠΡ€Π·ΠΎ попълванС Π½Π° всички Π΄Π°Π½Π½ΠΈ ΠΏΠΎ аналогия ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΡ€Π°Π²ΠΈ copy-paste.

А Π·Π°Ρ‰ΠΎ positions са ΠΎΡ‚Π΄Π΅Π»Π΅Π½ΠΈ ΠΎΡ‚ Π²ΡŠΠ·Π»ΠΈΡ‚Π΅?

Π’Π°ΠΊΠ° Π΅ ΠΏΠΎ-ΡƒΠ΄ΠΎΠ±Π½ΠΎ. ΠŸΡŠΡ€Π²ΠΎ посочвамС nodes. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° посочим няколко Π³Ρ€ΡƒΠΏΠΈ ΠΈ Π΄Π° Π³ΠΈ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΠΌ Π² ΡƒΠ·Π»ΠΈΡ‚Π΅. ПослС опрСдСлямС Π²Ρ€ΡŠΠ·ΠΊΠΈΡ‚Π΅. А Π΅Π΄Π²Π° слСд ΠΊΠ°Ρ‚ΠΎ ΠΈΠΌΠ°ΠΌΠ΅ основнитС ΠΎΠ±Π΅ΠΊΡ‚ΠΈ ΠΈ Π²Ρ€ΡŠΠ·ΠΊΠΈΡ‚Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ тях, сС Π·Π°Ρ…Π²Π°Ρ‰Π°ΠΌΠ΅ с Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Ρ‚Π΅Π·ΠΈ ΠΎΠ±Π΅ΠΊΡ‚ΠΈ Π½Π° схСмата. Или ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ.

А моТС ли бСз positions?

МоТС ΠΈ Π±Π΅Π· positions. Но Ρ‰Π΅ Π΅ ΠΌΠ°Π»ΠΊΠΎ накъсано, Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈΡ‚Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π²ΠΈΠ΄ΠΈ Ρ‚Π°ΠΊΠ°Π²Π° вСрсия. Π’ΠΎΠ²Π° Π΅ обусловСно ΠΎΡ‚ Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ Π·Π° cytoscape ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌ Π·Π° Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΡƒΠ·Π»ΠΈΡ‚Π΅. fcose, ΠΊΠΎΠΉΡ‚ΠΎ Π²Π·Π΅ΠΌΠ° ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅Ρ‚ΠΎ Π½Π° Π³Ρ€ΡƒΠΏΠΈ. ΠŸΠΎΡΠΎΡ‡Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° positions ΠΏΡ€Π°Π²ΠΈ схСмата ΠΏΠΎ-ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°, Π½ΠΎ Π½Π° Π΅Ρ‚Π°ΠΏΠ° Π½Π° ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΈΡ Ρ‡Π΅Ρ€Ρ‚Π΅ΠΆ Π½Π° схСмата ΠΌΠΎΠΆΠ΅ ΠΈ Π±Π΅Π· positions.

Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° positions ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС посочват Π² стил ΠœΠΎΡ€ΡΠΊΠΈ Π±ΠΎΠΉ. Π’.Π΅. Π΅Π΄ΠΈΠ½ ΡƒΠ·Π΅Π» сС Ρ€Π°Π·ΠΏΠΎΠ»Π°Π³Π° Π² a1, Π° Π΄Ρ€ΡƒΠ³ Π² d5. ОсобСно ΠΏΠΎΠΌΠ°Π³Π°, Ρ‡Π΅ cytoscape Ρ„ΠΎΡ€ΠΌΠΈΡ€Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈΡ‚Π΅ Π½Π° canvas ΠΏΠΎΠ΄Π²ΠΈΠΆΠ½ΠΈ, Ρ‚.Π΅. ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π³ΠΈ прСмСстим, Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΈ Π½Π° Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π° слСд Ρ‚ΠΎΠ²Π° Π΄Π° фиксирамС Π² ΠΊΠΎΠ΄Π° ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π½ΠΎΡ‚ΠΎ Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ‚Π΅.

Π’ ΠΎΠ±Ρ‰ΠΈ Π»ΠΈΠ½ΠΈΠΈ, ясно. МоТС Π»ΠΈ Π΄Π° ΠΏΡ€ΠΎΠ±Π²Π°ΠΌΠ΅?
Β 
Π Π°Π·Π±ΠΈΡ€Π° сС, Π·Π° Π±ΡŠΡ€Π·ΠΎ създаванС Π½Π° схСми си Π½Π°ΠΏΡ€Π°Π²ΠΈΡ… ΠΌΠ°Π»ΠΊΠΎ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€, ΠΊΠΎΠ΅Ρ‚ΠΎ самостоятСлно обновява схСмата ΠΈ Π² Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π° Π·Π°ΠΏΠ°Π·Π²Π° послСдната вСрсия (Π² localStorage).

ΠžΠΏΠΈΡ‚Π°Ρ…Ρ‚Π΅ Π»ΠΈ? Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ ΠΈ Π½Π° Π²Π°ΡˆΠ°Ρ‚Π° страница.

Π’ΠΎΠ³Π°Π²Π° ΠΎΡ‰Π΅ вСднъТ:

1. Π‘Π²ΡŠΡ€Π·Π²Π°ΠΌΠ΅ скрипта

<script src="https://unpkg.com/@antirek/network-diagram@0.1.4/dist/code-full.min.js"></script>

2. ДобавямС Π² HTML ΠΊΠΎΠ΄Π°

<div id="scheme1" style="height:300px;width:800px;"></div>
<script>      
  const elements = {    
    nodes: [
      { id: 'client', type: 'smartphone', label: 'Mobile App'},
      { id: 'server', type: 'server', label: 'Main Server'},
      { id: 'db1', type: 'database', label: 'DB 1'},
      { id: 'db2', type: 'database', label: 'DB 2'},
    ],
    edges: [
      { source: 'client', target: 'server', label: 'request' },
      { source: 'server', target: 'db1', label: 'request' },
      { source: 'server', target: 'db2', label: 'request' },
    ],
  };
  Diagram('scheme1', elements);
</script>

3. поправямС ΠΊΠΎΠ΄Π° Π΄ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ°Ρ‚Π° Π½ΠΈ схСма (мисля, Ρ‡Π΅ Π΅ ΠΏΠΎ-просто ΠΎΡ‚ Ρ‚ΠΎΠ²Π° Π΄Π° нарисувам сова πŸ™‚

ΠžΡ‰Π΅ ΠΏΠΎ-ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Π½Π° страницата Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° GitHub.

Какво Π² ΠΊΡ€Π°ΠΉΠ½Π° смСтка?

Π‘Π²ΠΎΠΈΡ‚Π΅ Ρ†Π΅Π»ΠΈ постигнах β€” Π΄Π° направя добавянСто Π½Π° схСми inline Π² докумСнтацията, Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΡŠΡ‚ Π΅ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ прост ΠΈ Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅ΠΌ. Π—Π° супСрсхСми Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠΆΠ΄Π°, Π½ΠΎ Π·Π° ΠΌΠ°Π»ΠΊΠΈ схСми, обясняващи структурата Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠΈΡ‚Π΅ β€” ΠΌΠ½ΠΎΠ³ΠΎ Π΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎ. Π’ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠΆΠ΅ Π±ΡŠΡ€Π·ΠΎ Π΄Π° сС ΠΏΠΎΠΏΡ€Π°Π²ΠΈ ΠΈ Π½Π΅Ρ‰ΠΎ Π΄Π° сС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ с Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π½Π° Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ. Π”Π°, ΠΈ ΠΊΠΎΠ»Π΅Π³ΠΈΡ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ сами Π΄Π° поправят Π½Π΅Ρ‰ΠΎ Π² докумСнтацията, ΠΏΠΎΠ½Π΅ надписитС към ΠΎΠ±Π΅ΠΊΡ‚ΠΈΡ‚Π΅ Π±Π΅Π· особСно ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ ))

Какво ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΈ?

Π’ΡƒΠΊ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΈΡ‚Π΅, Ρ€Π°Π·Π±ΠΈΡ€Π° сС, са ΠΌΠ½ΠΎΠ³ΠΎ. Π”Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ добавянС Π½Π° Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ ΠΈΠΊΠΎΠ½ΠΊΠΈ (всички Π½Π°Π»ΠΈΡ‡Π½ΠΈ са Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ inline Π² скрипта). Π”Π° сС ΠΏΠΎΠ΄Π±Π΅Ρ€Π΅ ΠΏΠΎ-ΠΈΠ·Ρ€Π°Π·ΠΈΡ‚Π΅Π»Π΅Π½ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ ΠΈΠΊΠΎΠ½ΠΊΠΈ. Π”Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° посочванС Π½Π° стил Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠΈΡ‚Π΅. Π”Π° сС Π΄ΠΎΠ±Π°Π²ΠΈ Ρ„ΠΎΠ½ΠΎΠ²ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.

А ΠΊΠ°ΠΊΠ²ΠΎ мислитС Π²ΠΈΠ΅?
Β 
Имам Π²Π΅Ρ‡Π΅ няколко ΠΈΠ΄Π΅ΠΈ Π·Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π² issues, Π²ΠΈΠ΅ ΡΡŠΡ‰ΠΎ Π΄ΠΎΠ±Π°Π²Π΅Ρ‚Π΅ Π²Π°ΡˆΠΈΡ‚Π΅ Π² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡ‚Π΅.

ΠœΠΎΠ΅Ρ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π΅ подходящо Π·Π° тСсСн ΡΠΏΠ΅ΠΊΡ‚ΡŠΡ€ ΠΎΡ‚ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ ΠΌΠΎΠΆΠ΅ Π±ΠΈ Ρ‰Π΅ Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ ΠΏΠΎ-ΡƒΠ΄ΠΎΠ±Π΅Π½ инструмСнт Π·Π° рисуванС Π½Π° Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΈ, просто ΠΊΠΎΠ΄ΠΈΡ€Π°ΠΉΠΊΠΈ Π³ΠΈ β€” ΠΊΠ°ΠΊΡ‚ΠΎ ΠΊΠ°Π·Π²Π°Ρ‚: β€˜show me your diagram as code’

  1. Π”ΠΎΠ±Ρ€Π° ΠΏΠΎΠ΄Π±Ρ€Π°Π½Π° колСкция
  2. Π‘Ρ‚Ρ€Π°Ρ…ΠΎΡ‚Π΅Π½ сСрвис (9 Ρ‚ΠΈΠΏΠ° Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€)
  3. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, mermaid.js
  4. И Π°ΠΊΠΎ ΠΎΠ±ΠΈΡ‡Π°Ρ‚Π΅ супСр Π΄Π΅Ρ‚Π°ΠΉΠ»Π½ΠΈ ΠΈ слоТни схСми β€” Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Ρ‰Π΅ Π±ΡŠΠ΄Π΅Ρ‚Π΅ Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»Π΅Π½ΠΈ ΠΎΡ‚ Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚: go.drawthe.net

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster