áá»áœááºá¯ááºááá¯á·ááẠSSL áááºááŸááºáá»á¬ážááŸáá·áº á¡áá¯ááºáá¯ááºááá±á·ááŸááááºá áááºááŸááºáá áºáᯠáááºáá®ážááŒááºážááŸáá·áº ááá·áºááœááºážááŒááºáž áá¯ááºáááºážá áẠ(á¡áá»á¬ážá á¯á¡ááœáẠáá±áá°áá»á¡á¬ážááŒáá·áº) ááᯠááááááŒáá«á áá¯á·á
- áááºáá±á¬ááºááŸá¯áá±ážáá°ááá¯ááŸá¬áá« (áá»áœááºá¯ááºááá¯á· SSL áááºááá¯ááºáá±á¬ááá¯ááº)á
- CSR ááá¯áááºáá®ážáá«á
- ááá·áºáááºáá±á¬ááºááŸá¯áá±ážáá°áᶠáá±ážááá¯á·áá«á
- ááá¯ááááºážááá¯ááºááá¯ááºááŸá¯ááᯠá¡áááºááŒá¯áá«á
- áááºááŸááºááá°áá«á
- áááºááŸááºááᯠááá¯á¡ááºáá±á¬áá¯á¶á ᶠ(áá»ááºááŸááºáá¬ážááá¯ááºáááº) ááá¯á· ááŒá±á¬ááºážáá«á á¥ááá¬á pem á០PKCS #12 ááá¯á·á
- áááºááŸááºááᯠáááºáá¬áá¬ááœáẠááá·áºááœááºážáá«á
á¡áá±á¬áºáá±ážááŒááºáááºá áááŸá¯ááºááœá±ážáá² áá¬ážáááºááá¯ááºáá«áááºá áá»áœááºá¯ááºááá¯á·ááœáẠá¡áá»á¬ážáá¯á¶áž ááá±á¬áá»áẠáááºáá¯ááŸááá«á á€ááœá±ážáá»ááºááŸá¯ááẠá¡ááœááºááá·áºáá»á±á¬áºáá«áááºá áááºážááá¯á·á¡áááºá០ááá¯áá»á¬ážááŒá®áž áááºážááá¯á·ááœáẠá¡áááºážáá¯á¶áž áááºáááºážáá»áẠáá¯á¶ážáá¯ááŸááá»áŸááºáá±á¬á ááá¹áááẠdev - áá¬ááºááœáŸááºáž - áá¯ááºáá¯ááºááŒááºážá á€ááá á¹á ááœááºá á€áá¯ááºáááºážá ááºááᯠá¡ááá¯á¡áá»á±á¬ááºáá¯ááºáá±á¬ááºááẠá ááºážá á¬ážááá·áºáááºá ááŒá¿áá¬ááᯠáááºážáááºážáá±ážáááºáááºáá²áá² á á±á·á á±á·á ááºá ááºáá±á·áá¬ááŒá®áž áááºááŸááºáá»á¬ážáááºáá®ážááŒááºážááŸáá·áº ááááºážááááºážááŒááºážá¡ááœáẠá¡áá¯á¶ážááŒá¯áá»áááºááᯠááá¯ááá¯áááºážáá«ážá á±ááá·áº á¡ááŒá±ááá¯ááŸá¬ááœá±ááẠá¡ááá¯ááŒá¯áá«áááºá áá±á¬ááºážáá«ážááœáẠááŒá¿áá¬á ááœá²ááŒááºážá áááºááŒá¬áá»ááºááŸáá·áº áááºááá²áá²áá¯ááºááẠáááºážááœáŸááºáá»ááºáá±ážáá áºáá¯áá«ááŸááááºá
ááŒáá¯áááºááŸá¬áá¬ážáá«áá á±- áá»áœááºá¯ááºááá¯á·áá¯áá¹ááá®á á¡ááá á¡áá°ážááŒá¯áá»ááºááŸá¬ .net ááŒá áºááŒá®ážá ááá¯á·ááŒá±á¬áá·áº IIS ááŸáá·áº á¡ááŒá¬áž Windows áááºá ááºáá¯ááºáá¯ááºáá»á¬ážá ááá¯á·ááŒá±á¬áá·áº ACME client ááŸáá·áº áááºážá¡ááœáẠáá¯ááºáá±á¬ááºáá»ááºáá»á¬ážá¡á¬ážáá¯á¶ážááᯠWindows á¡áá¯á¶ážááŒá¯ááŒááºážá ááŸá¯áá±á¬áá·áºááŸáááºáž áá±á¬áºááŒáá«áááºá
á€á¡áá¬ááẠáááºáá°ááŸáá·áº áááºááá¯ááºááŒá®áž á¡áá»áá¯á·áá±á¬ áááŠážáá±áá¬áá»á¬ážááŒá áºáááºá
áá¯áá¹ááá® K ááᯠá á¬áá±ážáá°á ááá¯ááºá á¬ážááŒá¯áá«áááºá URL (á¥ááá¬): company.tld
Project X ááẠáá»áœááºá¯ááºááá¯á·áááá±á¬áá»ááºáá»á¬ážáá²ááŸáá áºáá¯ááŒá áºááŒá®áž áááºááŸááºáá»á¬ážááŸáá·áºá¡áá¯ááºáá¯ááºáá±á¬á¡áá«ááœáẠáá»áœááºá¯ááºááá¯á·ááẠá¡áá»áááºáá¯ááºáááºáá¬á á±ááẠá¡áá»á¬ážáá¯á¶ážááá¯á¡ááºáá±áá±ážááŒá±á¬ááºáž áááá¯á¶ážáá»á¯ááºááá±á¬á¡áá«ááœáẠáá¯ááºáá±á¬ááºáá±áá«áááºá á€ááá±á¬áá»ááºááœáẠáááºáááºážáá»áẠáá±ážáá¯áá«ááŸááááº- devá á ááºážáááºááŸá¯á á¡ááá·áºááŸáá·áº áá¯ááºáá¯ááºáá±ážá Dev ááŸáá·áº Test ááẠáá»áœááºá¯ááºááá¯á·áááºá០áááºáááºáá±ááŒá®áž áá¯ááºáá¯ááºááŸá¯ááŸáá·áº áá±á¬ááºáááºáááºááœáẠááŸááá±áá«áááºá
ááá±á¬áá»ááºá á¡áá°ážá¡ááºá¹áá«áááºááŸá¬ áááºážááœáẠááá¯ááááºážááœá²áá»á¬ážá¡ááŒá ẠáááŸáááá¯ááºáá±á¬ áá±á¬áºáá»á°ážá¡áá»á¬ážá¡ááŒá¬áž ááŸááááºá
ááá¯ááá¯áááºááŸá¬á áá»áœááºá¯ááºááá¯á·ááœáẠá¡á±á¬ááºáá«áá¯á¶ááŸááááºá
dev
á
ááºážáááº
á
ááº
áá¯ááºáá¯ááºááŸá¯
projectX.dev.company.tld
projectX.test.company.tld
staging.projectX.tld
projectX.tld
module1.projectX.dev.company.tld
module1.projectX.test.company.tld
module1.staging.projectX.tld
module1.projectX.tld
module2.projectX.dev.company.tld
module2.projectX.test.company.tld
module2.staging.projectX.tld
module2.projectX.tld
...
...
...
...
moduleN.projectX.dev.company.tld
moduleN.projectX.test.company.tld
moduleN.staging.projectX.tld
moduleN.projectX.tld
áá¯ááºáá¯ááºááŸá¯á¡ááœááºá áááºáá°áá¬ážáá±á¬ ááááºááºáááºáááºááŸááºááᯠá¡áá¯á¶ážááŒá¯áááºá á€áá±áá¬ááœáẠáá±ážááœááºážáá¯ááºá áá¬áááŸááá«á ááá¯á·áá±á¬áº áááºážááẠsubdomain ááááá¡ááá·áºááá¯áᬠá¡áá»á¯á¶ážáááºáááºá ááá¯á·ááŒá±á¬áá·áºá *.projectX.tld á¡ááœáẠáááºááŸááºááŸááá«áá áááºážááẠstaging.projectX.tld á¡ááœáẠá¡áá¯ááºáá¯ááºáááºááŒá áºáá±á¬áºáááºáž module1.staging.projectX.tld á¡ááœáẠááá¯ááºáá«á áá«áá±ááá·áº áá®ážááŒá¬ážáá áºáá¯áá±á¬á· ááááºáá»ááºáá°ážá
áááºážááẠáá¯áá¹ááá®áá áºáá¯á ááá±á¬áá»ááºáá áºáá¯á ááá°áá¬áá±á«áºááœááºáᬠá¡ááŒá±áá¶áá¬ážáááºá ááŒá®ážáá±á¬á· ááá±á¬áá»ááºáá áºáá¯áááºáá ááŸááááºá
á€ááŒá¿áá¬ááᯠááŒá±ááŸááºážááẠáá°ááá¯ááºážá¡ááœáẠááŒá áºáá±á·ááŒá áºáááŸááá±á¬ á¡ááŒá±á¬ááºážáááºážáá»á¬ážááŸá¬ á€áá²á·ááá¯á· ááŒá áºáááº-
- áááŒá¬áá±ážáá®á
Google ááẠSSL áááºááŸááºáá»á¬ážá ááá¬ážáááºáááºáááºážáá¬áááᯠáá»áŸá±á¬á·áá»ááẠá¡ááá¯ááŒá¯áá²á·áááºá . á¡áá¯á¶ážá á¯á¶áá±á¬ á¡áá»áá¯ážáááºáá»á¬ážááŸáá·áºá - ááá±á¬áá»ááºáá»á¬ážááŸáá·áº áá¯áá¹ááá®áá áºáá¯áá¯á¶ážá á¡ááœááºážááá¯ááºážááá¯á¡ááºáá»ááºáá»á¬ážá¡ááœáẠSSL áá¯ááºáá±ážááŒááºážááŸáá·áº ááááºážááááºážááŒááºážáá¯ááºáááºážá ááºááᯠááœááºáá°áá»á±á¬ááœá±á·á á±áá«áááºá
- DNS ááá¯á¡áá¯á¶ážááŒá¯á ááá¯ááááºážá¡áááºááŒá¯ááŒááºážááŸáá·áº áá±á¬ááºáááºááœá²á¡ááá¯á¡áá»á±á¬ááºáááºáááºážááá¯ážááŒááºážááŒá¿áá¬ááᯠáá áºá áááºáá áºááá¯ááºážááŒá±ááŸááºážáá±ážááá·áº áááºááŸááºááŸááºáááºážáá»á¬ážá ááá¯ááŸá±á¬ááºááááºážáááºážááŸá¯ááŸáá·áº áá¯á¶ážá áœá²áá°áá¯á¶ááŒááºááŸá¯ááŒá¿áá¬ááá¯áááºáž ááŒá±ááŸááºážáá±ážáá«áááºá ááá¯á·ááá¯ááºá áá«ááá¬/ááá¯ááºáá±á¬ááºáá¯áá¹ááá®áá áºáá¯á áá¬áá¬áá±á«áºááŸá CNAME ááẠááŒááºáá¡ááœá²á·á¡á ááºážá¡áááºážá¡ááŒá áºáá áºáá¯ááẠááá¯ááá¯áá¯á¶ááŒááºá áááºáá»ááááºá
- áá±á¬ááºážááŒá®á áá±á¬ááºáá¯á¶ážá á€ááá á¹á ááœáẠ"áááŸáááá¯á·ááẠááá¯áá±á¬ááºážáááº" áá°áá±á¬ á áá¬ážá á¯ááẠááŒá®ážááŒáá·áºá á¯á¶á áœá¬ ááá¯ááºáá®áá«áááºá
SSL áááºáá±á¬ááºááŸá¯áá±ážáá°ááᯠááœá±ážáá»ááºááŒááºážááŸáá·áº ááŒááºáááºááŸá¯á¡ááá·áºáá»á¬áž
á¡ááá²á· SSL áááºááŸááºáá»á¬ážá¡ááœáẠáááŸáááá¯ááºáá±á¬ ááœá±ážáá»ááºá
áá¬áá»á¬ážáá²ááœáẠcloudflare ááŸáá·áº letsencrypt ááᯠááá·áºááœááºážá
ááºážá
á¬ážáá²á·áááºá á€á¡ááœáẠDNS (ááŸáá·áº á¡ááŒá¬ážááá±á¬áá»ááºá¡áá»áá¯á·) ááᯠcloudflare á០áááºáá¶áá¬ážáá«áááºá ááá¯á·áá±á¬áº áá»áœááºá¯ááºááẠáááºážááá¯á·á áááºááŸááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááá·áº áááááºáááºááá¯ááºáá«á ááá¯á·ááŒá±á¬áá·áºá letsencrypt ááá¯á¡áá¯á¶ážááŒá¯áááºáá¯á¶ážááŒááºáá²á·áááºá
áááºá¹áá±á SSL áááºááŸááºááᯠáááºáá®ážáááºá áááºááẠááá¯ááááºážááá¯ááºááá¯ááºááŸá¯ááᯠá¡áááºááŒá¯ááẠááá¯á¡ááºáááºá á€áá¯ááºáááºážá
ááºááœáẠDNS ááŸááºáááºáž (TXT ááá¯á·ááá¯áẠCNAME) á¡áá»áá¯á·ááᯠáááºáá®ážááŒá®áž áááºááŸááºáá¯ááºáá±ážááá·áºá¡áá« áááºážááᯠá
á
áºáá±ážááŒááºážáá«áááºáááºá Linux ááœáẠá¡áá¯á¶ážáááºááŸá¯áá
áºáᯠááŸááááº-
ááá¯ááááºážá¡ááœáẠááŸááºáááºážááᯠáááºáá®ážááŒá®ážááŒá®á áááºááŸááºáá áºáᯠáááºáá®ážááŒááºážááá¯á· áááºááœá¬ážááŒáá«á áá¯á·á
áá»áœááºá¯ááºááá¯á·ááẠáá±á¬ááºáá¯á¶ážáááá¯á¶ážáá»á¯ááºááᯠá áááºáááºá á¬ážáá«áááºá ááŒá±á¬ááááºá wildcard áááºááŸááºáá¯ááºáá±ážááŒááºážá¡ááœáẠdomain ááá¯ááºááá¯ááºááŸá¯ááᯠá¡áááºááŒá¯áááºá¡ááœáẠáááŸáááá¯ááºáá±á¬ááœá±ážáá»ááºá áá¬áá»á¬áž
- DNS ááŸááºáááºážáá»á¬ážááᯠááá¯ááºááá¯ááºáááºáá®ážáá« (á¡ááá¯á¡áá»á±á¬áẠá¡ááºááááºááᯠááá¶á·ááá¯ážááá¯ááºáá«)
- acme-dns áá¬áá¬ááᯠá¡áá¯á¶ážááŒá¯á DNS ááŸááºáááºážáá»á¬ážááᯠáááºáá®ážááŒááºáž (á¡ááŒá±á¬ááºážááá¯ááá¯áááºááŸá¯ááá¯ááºáá«áááºá
áá®ááŸá¬ . - áááºáááá¯ááºááá¯áẠscript ááá¯á¡áá¯á¶ážááŒá¯á DNS ááŸááºáááºážáá»á¬ážáááºáá®ážááŒááºáž (certbot á¡ááœáẠcloudflare ááááºá¡ááºááŸáá·áºáááºáá°áááº)á
ááááá áºáá»ááºááœááºá ááááá¡áá»ááºááẠá¡ááœááºááá·áºáá»á±á¬áºáááºá ááá¯á·áá±á¬áº DNS áááºáá±á¬ááºááŸá¯áá±ážáá°á á€áá¯ááºáá±á¬ááºááá¯ááºá áœááºážááᯠááá¶á·ááá¯ážáá«á á¡áááºáááºážá áá«áá±ááá·áº áá±áá°áá»ááá á¹á ááá¯áááºá áá°ááá¯ááºážá áááºážááá¯á·ááᯠáá±á¬ááºáá¶áá±á¬ááŒá±á¬áá·áº áá±áá¯áá»ááá á¹á ááŸá¬ CNAME ááŸááºáááºážáá»á¬ážááŒá áºáááºá ááá¯á·ááŒá±á¬áá·áºá áá»áœááºá¯ááºááá¯á·ááẠá¡ááŸáẠ2 ááœááºáááºááá·áºááŒá®áž áá»áœááºá¯ááºááá¯á·á ACME-DNS áá¬áá¬ááᯠconfigure áá¯ááºáááºááœá¬ážáá«á
ACME-DNS áá¬áá¬ááŸáá·áº áááºááŸááºáá¯ááºáá±ážááŒááºážáá¯ááºáááºážá ááºááᯠá áá áºááá·áºááœááºážááŒááºážá
á¥ááá¬á¡á¬ážááŒáá·áºá áá»áœááºá¯ááºááẠááá¯ááááºáž 2nd.pp.ua ááᯠáááºáá®ážááŒá®áž áá±á¬ááºááœáẠáááºážááᯠá¡áá¯á¶ážááŒá¯áá«áááºá
acmens.2nd.pp.ua. IN A 35.237.128.147
acme.2nd.pp.ua. IN NS acmens.2nd.pp.ua.
áá®á¡ááá·áºááŸá¬ á¡áááºááŸááºá ááŒá±ááŸááºážááá·áºáááºá acmens.2nd.pp.ua
.
$ ping acmens.2nd.pp.ua
PING acmens.2nd.pp.ua (35.237.128.147) 56(84) bytes of data
áá®ááŸá¬ acme.2nd.pp.ua
áááºážááá¯áá±á¬ááºááœááºáá±ážáá±á¬ DNS áá¬áá¬ááẠááááºáááºáá±ážáá±á¬ááŒá±á¬áá·áº áááºážááẠááŒá±ááŸááºážáááºááá¯ááºáá«á
ááŸááºáááºážáá»á¬ážááᯠáááºáá®ážáá¬ážááŒá®ážá áá»áœááºá¯ááºááá¯á·ááẠACME-DNS áá¬áá¬ááᯠá
áááºáááºááŸááºááŒááºážááŸáá·áº á
áááºááŒááºážáá®ááá¯á· áááºáááºáá¯ááºáá±á¬ááºáá«áááºá áááºážááẠáá»áœááºá¯ááºá ubuntu áá¬áá¬ááœáẠá¡áááºááŸááºáá±áááá·áºáááºá
ááá¯á¡ááºáá±á¬ áááºážááœáŸááºáá»á¬ážááŸáá·áº ááá¯ááºáá»á¬ážááᯠáááºáá®ážáá«-
$ mkdir config
$ mkdir data
$ touch config/config.cfg
áááºá¡ááŒáá¯ááºáá¯á¶áž á
á¬áá¬ážáááºážááŒááºááŸá¯ááŒáá·áº vim ááá¯áá¯á¶ážá ááá°áá¬ááᯠconfig.cfg áá²ááá¯á· áá°ážááá·áºááŒáá«á
áá¯á·
áá¯ááºáá±á¬ááºáá»ááºá¡á±á¬ááºááŒááºáááºá¡ááœááºá á¡ááœá±ááœá±ááŸáá·áº api ááá¹ááá»á¬ážááᯠááŒá¯ááŒááºááẠáá¯á¶áá±á¬ááºáááº-
[general]
listen = "0.0.0.0:53"
protocol = "both"
domain = "acme.2nd.pp.ua"
nsname = "acmens.2nd.pp.ua"
nsadmin = "admin.2nd.pp.ua"
records =
"acme.2nd.pp.ua. A 35.237.128.147",
"acme.2nd.pp.ua. NS acmens.2nd.pp.ua.", ]
...
[api]
...
tls = "letsencrypt"
âŠ
ááá¯á·á¡ááŒáẠááá¹áááŸááá«áá áá»áœááºá¯ááºááá¯á·ááẠáááºááááºáá±á¬ááºááŸá¯áááºážááœáŸááºááœáẠdocker-compose ááá¯ááºááᯠáááºáá®ážáá«áááºá
version: '3.7'
services:
acmedns:
image: joohoi/acme-dns:latest
ports:
- "443:443"
- "53:53"
- "53:53/udp"
- "80:80"
volumes:
- ./config:/etc/acme-dns:ro
- ./data:/var/lib/acme-dns
á¡áááºááá·áºá á¡á²áá«ááᯠáá¯á¶ážááá¯á·ááááºá
$ docker-compose up -d
á€á¡ááá·áºááœáẠá¡áááºááŸááºá á
áááºááŒá±ááŸááºážááá·áºáááºá acme.2nd.pp.ua
ááŒá®ážáá±á¬á· 404 áá±á«áºáá¬áááºá https://acme.2nd.pp.ua
$ ping acme.2nd.pp.ua
PING acme.2nd.pp.ua (35.237.128.147) 56(84) bytes of data.
$ curl https://acme.2nd.pp.ua
404 page not found
ááá±á«áºáááº- docker logs -f <container_name>
áá¶áá±á¬ááºážáá±á¬ááºáá
áœá¬á ááŸááºáááºážáá»á¬ážááẠá¡ááœááºáááºáááœááºáá°áááºá
áááºááŸááºááᯠá áááºáááºáá®ážááá¯ááºáá«ááŒá®á á á®áá¶ááá·áºááœá²áá°á¡ááŒá Ạpowershell ááá¯ááœáá·áºááŒá®áž winacme ááá¯ááœáá·áºáá«á ááœá±ážáá±á¬ááºááœá²ááᯠá áááºáááºá á¬ážáááº
- M- áááºááŸááºá¡áá áºáááºáá®ážáá« (ááœá±ážáá»ááºá áá¬á¡ááŒáá·áºá¡á á¯á¶)
- 2: ááá¯ááºááá¯ááºááá·áºááœááºážááŒááºážá
- 2- [dns-01] acme-dns ááŒáá·áº á¡áááºááŒá¯ááŒááºážááŸááºáááºážáá»á¬ážááᯠáááºáá®ážáá« (
https://github.com/joohoi/acme-dns ) - ACME-DNS áá¬áá¬ááá¯á· ááá·áºááºáá
áºáá¯á¡ááŒá±á¬ááºáž áá±ážáá±á¬á¡áá« á¡ááŒá±ááœáẠáááºáá®ážáá¬ážáá±á¬ áá¬áá¬á URL (https) ááᯠááá·áºáá«á acme-dns áá¬áá¬á URL-
https://acme.2nd.pp.ua
á¡ááœáá·áºááœááºá client ááẠááŸáááŒá®ážáá¬áž DNS server (áá áºááŒáááºáá¯ááºáá¯á¶ážáá¯ááºáááºáž) ááœáẠááá·áºááœááºážáááºááá¯á¡ááºáá±á¬ ááŸááºáááºážáá áºáá¯áá¯ááºáá±ážáááº-
[INFO] Creating new acme-dns registration for domain 1nd.pp.ua
Domain: 1nd.pp.ua
Record: _acme-challenge.1nd.pp.ua
Type: CNAME
Content: c82a88a5-499f-464f-96e4-be7f606a3b47.acme.2nd.pp.ua.
Note: Some DNS control panels add the final dot automatically.
Only one is required.
ááá¯á¡ááºáá±á¬ ááŸááºáááºážááᯠáááºáá®ážááŒá®áž áááºážááᯠááŸááºáááºá áœá¬ áááºáá®ážáá¬ážááŒá±á¬ááºáž áá±áá»á¬á á±áááº-
$ dig CNAME _acme-challenge.1nd.pp.ua +short
c82a88a5-499f-464f-96e4-be7f606a3b47.acme.2nd.pp.ua.
winacme ááœáẠááá¯á¡ááºáá±á¬ááá·áºááœááºážááŸá¯ááᯠáá»áœááºá¯ááºááá¯á·áááºáá®ážáá²á·ááŒá±á¬ááºáž á¡áááºááŒá¯ááŒá®áž áááºááŸááºáá áºáá¯áááºáá®ážááŒááºážáá¯ááºáááºážá ááºááᯠáááºáááºáá¯ááºáá±á¬ááºáá«-
client áá
áºáá¯á¡áá±ááŒáá·áº certbot ááá¯áááºááá¯á·á¡áá¯á¶ážááŒá¯ááááºááᯠáá±á¬áºááŒáá¬ážáá«áááºá
áááºážááẠáááºááŸááºáá áºáá¯áááºáá®ážááŒááºážáá¯ááºáááºážá ááºááᯠááŒá®ážááŒá±á¬ááºá á±áááºá áááºááẠáááºážááᯠáááºáá¬áá¬ááœáẠááá·áºááœááºážááŒá®áž áááºážááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá á¡áááºá áááºááẠáááºááŸááºáá áºáá¯ááᯠáááºáá®ážááá·áºá¡áá« á¡áá»áááºááá¬ážááœá²áá°ááœáẠá¡áá¯ááºáá áºáá¯ááá¯áááºáž áááºáá®ážáá¬ážáá«áá áá±á¬ááºááœáẠáááºááŸáẠáááºáááºážááá¯ážááŒááºáž áá¯ááºáááºážá ááºááẠá¡ááá¯á¡áá»á±á¬áẠááŒá áºáá±á«áºáááºááŒá áºáááºá
source: www.habr.com