{"id":501859,"date":"2026-11-05T21:59:17","date_gmt":"2026-11-05T18:59:17","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=501859"},"modified":"2026-11-05T21:59:17","modified_gmt":"2026-11-05T18:59:17","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=501859","title":{"rendered":"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u0438\u0437 Mailcow \u0441\u0441\u044b\u043b\u043a\u043e\u0439: Pingvin Share X, \u043d\u0435\u043c\u043d\u043e\u0433\u043e PHP \u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u0432 SOGo"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/5d\/02\/3c\/5d023cfef582c00eb7cbe91a7a3ec885.png\" width=\"1560\" height=\"880\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/5d\/02\/3c\/5d023cfef582c00eb7cbe91a7a3ec885.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/5d\/02\/3c\/5d023cfef582c00eb7cbe91a7a3ec885.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>Mailcow \u0443 \u043d\u0430\u0441 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0447\u0442\u043e\u0432\u044b\u0445 \u0434\u043e\u043c\u0435\u043d\u043e\u0432 \u0441\u0442\u0430\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0442\u0440\u0451\u0445. \u0421\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0438 \u043f\u0438\u0448\u0443\u0442 \u0438 \u0441 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430, \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043d\u0430\u0448\u0438\u043c\u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u0433\u0435\u043d\u0442\u0430\u043c\u0438, \u0438 \u0441 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e, \u0434\u043b\u044f \u043c\u0435\u0436\u0434\u0443\u043d\u0430\u0440\u043e\u0434\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u043a\u0438.<\/p>\n<p>\u0414\u0435\u0440\u0436\u0430\u0442\u044c \u043f\u043e\u0447\u0442\u0443 \u0443 \u0442\u043e\u0433\u043e \u0436\u0435 \u042f\u043d\u0434\u0435\u043a\u0441\u0430 \u0438\u043b\u0438 Mail.ru \u043f\u043e \u0434\u0435\u043d\u044c\u0433\u0430\u043c \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e, \u043d\u043e \u0437\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u0432\u0435\u0440\u0445 \u0442\u0430\u0440\u0438\u0444\u0430, \u0431\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u043d\u0435 \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c, \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u043f\u043b\u0430\u0447\u0438\u0432\u0430\u0442\u044c. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c AD, \u0434\u0430\u0442\u044c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0443 \u0437\u0430\u0439\u0442\u0438 \u0432 \u0447\u0443\u0436\u043e\u0439 \u044f\u0449\u0438\u043a, \u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0435 \u043a\u043e\u043f\u0438\u0438 \u043f\u0438\u0441\u0435\u043c: \u0432\u0441\u0451 \u044d\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0430\u0440\u0438\u0444 \u0438 \u0434\u043e\u0440\u043e\u0436\u0435. \u0417\u0430\u0442\u043e \u0442\u0430\u043a\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043d\u0430\u0431\u0438\u0442\u044b \u0444\u0438\u0448\u043a\u0430\u043c\u0438: \u043e\u0431\u043b\u0430\u043a\u043e, \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440, \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0432 \u043f\u043e\u0447\u0442\u0435, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u043b\u0435\u043f\u0438\u0442\u044c \u0447\u0443\u0442\u044c \u043b\u0438 \u043d\u0435 CRM \u0434\u043b\u044f \u0431\u0435\u0434\u043d\u044b\u0445.<\/p>\n<p>\u0410 \u0442\u0443\u0442 \u0435\u0449\u0451 \u043f\u0440\u0438\u043b\u0451\u0442 \u043f\u043e \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u0443 \u042f\u043d\u0434\u0435\u043a\u0441\u0430, \u0438 \u0447\u0430\u0441\u0442\u044c \u043f\u0438\u0441\u0435\u043c \u043f\u043e\u0442\u0435\u0440\u044f\u043b\u0430\u0441\u044c \u0431\u0435\u0437 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0421 \u044d\u0442\u043e\u0433\u043e \u0438 \u043d\u0430\u0447\u0430\u043b\u0441\u044f \u043f\u0435\u0440\u0435\u0435\u0437\u0434 \u043d\u0430 \u0441\u0432\u043e\u0439 \u043f\u043e\u0447\u0442\u043e\u0432\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440. \u041f\u0435\u0440\u0432\u043e\u0439 \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b\u0430 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0447\u0442\u0430, \u043a \u043d\u0435\u0439 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0438 AD, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u0432\u043e\u0434\u0438\u0442\u044c \u044f\u0449\u0438\u043a\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0438 \u043d\u0435 \u0432\u043e\u0437\u0438\u0442\u044c\u0441\u044f \u0441 \u043f\u0430\u0440\u043e\u043b\u044f\u043c\u0438. \u041a\u043e\u0433\u0434\u0430 IP \u043f\u0440\u043e\u0433\u0440\u0435\u043b\u0441\u044f \u0432 \u0430\u043d\u0442\u0438\u0441\u043f\u0430\u043c-\u0431\u0430\u0437\u0430\u0445 \u0438 \u0443 \u043d\u0435\u0433\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0440\u0435\u043f\u0443\u0442\u0430\u0446\u0438\u044f, \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u043b\u0438 \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0434\u043e\u043c\u0435\u043d\u044b.<\/p>\n<p>\u0418 \u0432\u043e\u0442 \u0442\u0443\u0442 \u043d\u0430\u0447\u0430\u043b\u0438\u0441\u044c \u0441\u0442\u0435\u043d\u0430\u043d\u0438\u044f \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432, \u043f\u0440\u0438\u0432\u044b\u043a\u0448\u0438\u0445 \u043a \u042f\u043d\u0434\u0435\u043a\u0441\u0443, Mail.ru \u0438 Gmail. \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 SOGo \u00ab\u043d\u0435 \u0442\u0430\u043a\u043e\u0439\u00bb, \u00ab\u0441\u0442\u0440\u0451\u043c\u043d\u044b\u0439\u00bb. \u0413\u0434\u0435 \u043c\u043e\u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u044b, \u0443 \u043c\u0435\u043d\u044f \u043f\u0440\u043e\u043f\u0430\u043b\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u044c, \u0430 \u0435\u0449\u0451 \u043f\u0438\u0441\u044c\u043c\u0430 \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u044f \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044e \u0442\u0443\u0434\u0430 \u0444\u0430\u0439\u043b\u044b. \u042f \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b, \u0430 \u0442\u0430\u043c \u044d\u043a\u0441\u0435\u043b\u044c \u043d\u0430 90 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442. \u0423\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u043b\u0438\u043c\u0438\u0442\u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043d\u0435 \u0441\u043f\u0430\u0441\u043b\u043e: \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u0438\u0441\u044c\u043c\u0430 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438. \u041f\u043e\u043f\u044b\u0442\u043a\u0438 \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f, \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u043e \u00ab\u0430 \u0432\u043e\u0442 \u0440\u0430\u043d\u044c\u0448\u0435 \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e\u00bb.<\/p>\n<p>\u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f, \u043a\u0430\u043a \u043b\u044e\u0434\u0438 \u0440\u0435\u0448\u0430\u044e\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u0437 \u043f\u043e\u0447\u0442\u044b. \u041d\u0430\u0445\u043e\u0434\u0438\u043b \u0441\u0442\u0430\u0442\u044c\u044e, \u0433\u0434\u0435 \u043a \u043f\u043e\u0447\u0442\u0435 \u043f\u0440\u0438\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u043b\u0438 Nextcloud, \u043d\u043e \u043c\u043d\u0435 \u044d\u0442\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u043c. \u0411\u043e\u043b\u044c\u0448\u0435 \u0438\u043c\u043f\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043b \u043f\u043e\u0434\u0445\u043e\u0434 \u0441 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u0444\u0430\u0439\u043b\u043e\u0432, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0435\u0441\u0442\u044c \u0441\u0440\u043e\u043a \u0436\u0438\u0437\u043d\u0438. \u0417\u0430\u043e\u0434\u043d\u043e \u043e\u043d \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0433\u043e \u0430\u0440\u0445\u0438\u0432\u0430 \u043f\u0438\u0441\u0435\u043c: \u0442\u044f\u0436\u0451\u043b\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043e\u0441\u0435\u0434\u0430\u044e\u0442 \u0432 \u044f\u0449\u0438\u043a\u0430\u0445.<\/p>\n<p>\u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u0442\u0430\u043a\u0438\u0435:<\/p>\n<ul>\n<li>\n<p>\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u043c\u043e\u0436\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u0448\u0451\u043b \u0432 \u043f\u043e\u0447\u0442\u0443, \u0438 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043b\u043e\u0433\u0438\u043d\u043e\u0432 \u0438 \u043f\u0430\u0440\u043e\u043b\u0435\u0439 \u2014 \u0438\u043d\u0430\u0447\u0435 \u0438\u043c \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f;<\/p>\n<\/li>\n<li>\n<p>\u0441\u043a\u0430\u0447\u0430\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u043b\u044e\u0431\u043e\u0439, \u0443 \u043a\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0430, \u0431\u0435\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0442\u044c \u043a\u043e\u0434 \u0441\u0430\u043c\u043e\u0433\u043e Mailcow, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u043e\u044f\u0442\u044c\u0441\u044f <code>update.sh<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u0432\u0441\u0451 \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0444\u0430\u0439\u043b\u0430\u0445 \u0438 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0431\u0435\u0437 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u0448\u0430\u043c\u0430\u043d\u0441\u0442\u0432\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0442\u043e, \u043a \u0447\u0435\u043c\u0443 \u043f\u0440\u0438\u0448\u043b\u0438 \u0432 \u0438\u0442\u043e\u0433\u0435. \u041f\u043e \u0434\u043e\u0440\u043e\u0433\u0435 \u0431\u044b\u043b\u0438 \u0438 \u043e\u0448\u0438\u0431\u043a\u0438: \u0447\u0430\u0441\u0442\u044c \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u043f\u0440\u0438 \u0440\u0443\u0447\u043d\u043e\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u0447\u0430\u0441\u0442\u044c \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u043b\u0430 \u0438\u0437 \u043e\u0442\u0437\u044b\u0432\u043e\u0432 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432. \u0420\u0430\u0441\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u0443\u044e \u043d\u0435 \u0431\u0443\u0434\u0443, \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u0442\u043e, \u043d\u0430 \u0447\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u0442\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c.<\/p>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 Pingvin Share X<\/h3>\n<p>\u041d\u0430 \u0440\u043e\u043b\u044c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u043d\u0443\u0436\u0435\u043d \u0431\u044b\u043b \u043b\u0451\u0433\u043a\u0438\u0439 self-hosted \u0444\u0430\u0439\u043b\u043e\u043e\u0431\u043c\u0435\u043d\u043d\u0438\u043a \u0441\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u0438 \u0441\u0440\u043e\u043a\u043e\u043c \u0436\u0438\u0437\u043d\u0438. \u0412\u044b\u0431\u043e\u0440 \u043f\u0430\u043b \u043d\u0430 Pingvin Share: \u043e\u0434\u0438\u043d \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f, \u0441\u0440\u043e\u043a \u0436\u0438\u0437\u043d\u0438 \u0441\u0441\u044b\u043b\u043e\u043a, \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0447\u0430\u0441\u0442\u044f\u043c\u0438.<\/p>\n<p>\u0421 \u043d\u0438\u043c \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441: \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 Pingvin Share \u0430\u0432\u0442\u043e\u0440 \u0437\u0430\u0430\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043b \u043b\u0435\u0442\u043e\u043c 2025 \u0433\u043e\u0434\u0430 \u0438 \u0441\u0430\u043c \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442 \u0444\u043e\u0440\u043a Pingvin Share X. \u0424\u043e\u0440\u043a \u0436\u0438\u0432\u043e\u0439, \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0440\u0435\u043b\u0438\u0437\u044b \u0441 \u043f\u0430\u0442\u0447\u0430\u043c\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438, \u043d\u043e \u0434\u0435\u0440\u0436\u0438\u0442 \u0435\u0433\u043e \u043e\u0434\u0438\u043d \u0447\u0435\u043b\u043e\u0432\u0435\u043a. \u0412\u0435\u0440\u0441\u0438\u044f \u043e\u0431\u0440\u0430\u0437\u0430 \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0430 (<code>v2.1.0<\/code>), \u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0441\u0442\u043e\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0447\u0442\u0435\u043d\u0438\u044f \u0440\u0435\u043b\u0438\u0437-\u043d\u043e\u0443\u0442\u043e\u0432: Gateway \u043e\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 API Pingvin, \u0430 \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f.<\/p>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e Pingvin \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e \u043f\u043e\u0447\u0442\u043e\u0432\u044b\u0435 \u044f\u0449\u0438\u043a\u0438. \u0417\u0430\u0432\u043e\u0434\u0438\u0442\u044c \u0432 \u043d\u0451\u043c \u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430 \u0438\u043b\u0438 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c OIDC \u0441 Keycloak \u0440\u0430\u0434\u0438 \u043e\u0434\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0445\u0435\u043c\u0430 \u0442\u0430\u043a\u0430\u044f:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/89\/3e\/81\/893e81b7212a6c449c7a34678fca4e32.png\" alt=\"\" title=\"\" width=\"1672\" height=\"941\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/89\/3e\/81\/893e81b7212a6c449c7a34678fca4e32.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/89\/3e\/81\/893e81b7212a6c449c7a34678fca4e32.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<ul>\n<li>\n<p><strong>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0445\u043e\u0434\u0430<\/strong> \u2014 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 PHP-\u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0447\u0438\u0442\u0430\u0435\u0442 \u0441\u0435\u0441\u0441\u0438\u044e Mailcow \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 Nginx \u00ab\u0441\u0432\u043e\u0439\u00bb \u0438\u043b\u0438 \u00ab\u0447\u0443\u0436\u043e\u0439\u00bb.<\/p>\n<\/li>\n<li>\n<p><strong>Gateway<\/strong> \u2014 \u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0430 Python (Starlette), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0444\u0430\u0439\u043b \u043e\u0442 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430 \u0438 \u043e\u0442\u0434\u0430\u0451\u0442 \u0435\u0433\u043e \u0432 Pingvin \u043e\u0442 \u0438\u043c\u0435\u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u0439 \u0443\u0447\u0451\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438. \u0417\u0430\u043e\u0434\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u043b\u0438\u043c\u0438\u0442\u044b \u0438 \u0432\u0435\u0434\u0451\u0442 \u0436\u0443\u0440\u043d\u0430\u043b \u00ab\u043a\u0442\u043e \u0447\u0442\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u00bb.<\/p>\n<\/li>\n<li>\n<p><strong>Pingvin<\/strong> \u0445\u0440\u0430\u043d\u0438\u0442 \u0444\u0430\u0439\u043b\u044b \u0438 \u043e\u0442\u0434\u0430\u0451\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f. \u0421\u043d\u0430\u0440\u0443\u0436\u0438 \u0443 \u043d\u0435\u0433\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>Gateway \u0438 Pingvin \u0436\u0438\u0432\u0443\u0442 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c <code>docker-compose.yml<\/code> \u0440\u044f\u0434\u043e\u043c \u0441 Mailcow \u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u044b \u0441 \u0435\u0433\u043e Nginx \u043e\u0431\u0449\u0435\u0439 Docker-\u0441\u0435\u0442\u044c\u044e. Mailcow \u043f\u0440\u043e \u043d\u0438\u0445 \u0437\u043d\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u2014 \u0438\u043c\u044f \u0441\u0435\u0442\u0438 \u0432 <code>docker-compose.override.yml<\/code>:<\/p>\n<pre><code class=\"yaml\">services:  nginx-mailcow:    networks:      mailshare:networks:  mailshare:    external: true<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 \u0437\u0430\u0441\u0443\u043d\u0443\u0442\u044c \u0432\u0441\u0451 \u0432 override \u0441\u0430\u043c\u043e\u0433\u043e Mailcow? \u0422\u043e\u0433\u0434\u0430 <code>update.sh<\/code> \u0438 <code>docker compose down<\/code> \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \u043f\u043e\u0447\u0442\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0442\u0440\u043e\u0433\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u043e\u043e\u0431\u043c\u0435\u043d\u043d\u0438\u043a, \u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0444\u0430\u0439\u043b\u043e\u043e\u0431\u043c\u0435\u043d\u043d\u0438\u043a\u0435 \u043c\u0435\u0448\u0430\u0435\u0442 \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u043e\u0447\u0442\u0435. \u041f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u0435\u0435.<\/p>\n<h3>\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0435\u0437 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043b\u043e\u0433\u0438\u043d\u0430<\/h3>\n<p>\u0418\u0434\u0435\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f: \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0436\u0438\u0432\u0451\u0442 \u043d\u0430 \u0442\u043e\u043c \u0436\u0435 \u0430\u0434\u0440\u0435\u0441\u0435, \u0447\u0442\u043e \u0438 \u043f\u043e\u0447\u0442\u0430 (<code>\/mailshare\/<\/code>), \u0430 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c Nginx \u0447\u0435\u0440\u0435\u0437 <code>auth_request<\/code> \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0443 PHP, \u0435\u0441\u0442\u044c \u043b\u0438 \u0443 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u0436\u0438\u0432\u0430\u044f \u0441\u0435\u0441\u0441\u0438\u044f Mailcow. \u041a\u0443\u043a\u0430 \u043d\u0430 \u0442\u043e\u043c \u0436\u0435 \u0434\u043e\u043c\u0435\u043d\u0435, \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0435\u0451 \u0438 \u0442\u0430\u043a \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442. \u0412\u0442\u043e\u0440\u043e\u0433\u043e \u043b\u043e\u0433\u0438\u043d\u0430 \u043d\u0435\u0442.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0434\u0432\u0430 \u043c\u043e\u043c\u0435\u043d\u0442\u0430.<\/p>\n<p><strong>\u041f\u0435\u0440\u0432\u043e\u0435:<\/strong> \u043a\u0443\u043a\u0430 <code>MCSESSID<\/code> \u0435\u0441\u0442\u044c \u0443 \u0432\u0441\u0435\u0445, \u0434\u0430\u0436\u0435 \u0443 \u0430\u043d\u043e\u043d\u0438\u043c\u0430. Mailcow \u0437\u0430\u0432\u043e\u0434\u0438\u0442 PHP-\u0441\u0435\u0441\u0441\u0438\u044e \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0432\u0445\u043e\u0434\u0430. \u0417\u043d\u0430\u0447\u0438\u0442, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0430\u0434\u043e \u043d\u0435 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u0443\u043a\u0438, \u0430 \u0442\u043e, \u0447\u0442\u043e \u043b\u0435\u0436\u0438\u0442 \u0432 \u0441\u0435\u0441\u0441\u0438\u0438.<\/p>\n<p><strong>\u0412\u0442\u043e\u0440\u043e\u0435:<\/strong> \u0448\u0442\u0430\u0442\u043d\u044b\u0439 <code>prerequisites.inc.php<\/code> \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442. \u042d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0435\u0441\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 Mailcow: \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a Redis \u0438 MySQL, \u0441\u0442\u0443\u0447\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 <code>dockerapi<\/code> (\u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 500, \u0435\u0441\u043b\u0438 \u0442\u043e\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d), \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u0445\u0435\u043c\u0443 \u0411\u0414, \u043c\u0438\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 CSS \u0438 JS. \u0410 <code>auth_request<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0444\u0430\u0439\u043b\u0430: \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043d\u0430 300 \u041c\u0411 \u043a\u0443\u0441\u043a\u0430\u043c\u0438 \u043f\u043e 10 \u041c\u0411 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0442\u0440\u0438\u0434\u0446\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0445 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 Mailcow.<\/p>\n<p>\u041d\u0443\u0436\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u043e\u0433\u0438\u043a\u0430 \u0438\u0437 <code>sessions.inc.php<\/code>, \u0438 \u0442\u043e \u043d\u0435 \u0446\u0435\u043b\u0438\u043a\u043e\u043c: \u043e\u043d \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0441\u0435\u0441\u0441\u0438\u044e \u0430\u043d\u043e\u043d\u0438\u043c\u0443, \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 <code>LAST_ACTIVITY<\/code> \u0438 \u0432\u0434\u043e\u0431\u0430\u0432\u043e\u043a \u0443\u043c\u0435\u0435\u0442 \u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443 <code>X-API-Key<\/code> \u0441 \u043f\u0440\u0430\u0432\u0430\u043c\u0438 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0432\u043e\u044f, \u0438 \u0441\u0435\u0441\u0441\u0438\u044e \u043e\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0442\u0430\u0435\u0442:<\/p>\n<pre><code class=\"php\">&lt;?phprequire_once __DIR__ . '\/inc\/vars.inc.php';if (file_exists(__DIR__ . '\/inc\/vars.local.inc.php')) {  include_once __DIR__ . '\/inc\/vars.local.inc.php';}function deny() { http_response_code(401); exit; }\/\/ ID \u0441\u0435\u0441\u0441\u0438\u0438 \u0431\u0435\u0440\u0451\u043c \u0438\u0437 \u043a\u0443\u043a\u0438 \u0441\u0430\u043c\u0438, \u0447\u0442\u043e\u0431\u044b \u0430\u043d\u043e\u043d\u0438\u043c\u0443 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u043b\u0430\u0441\u044c \u043d\u043e\u0432\u0430\u044f$sid = $_COOKIE[$SESSION_NAME] ?? '';if (!preg_match('\/^[A-Za-z0-9,-]{22,256}$\/', $sid)) deny();ini_set('session.use_cookies', 0);session_name($SESSION_NAME);session_id($sid);if (!@session_start(['read_and_close' =&gt; true])) deny();$s = $_SESSION;if (empty($s['mailcow_cc_username']))         deny(); \/\/ \u043d\u0435 \u0432\u043e\u0448\u0451\u043bif (($s['mailcow_cc_role'] ?? '') !== 'user') deny(); \/\/ \u043d\u0435 \u043f\u043e\u0447\u0442\u043e\u0432\u044b\u0439 \u044f\u0449\u0438\u043aif (isset($s['dual-login']))                  deny(); \/\/ \u0430\u0434\u043c\u0438\u043d \u043f\u043e\u0434 \u0447\u0443\u0436\u0438\u043c \u044f\u0449\u0438\u043a\u043e\u043cif (!empty($s['mailcow_cc_api']))             deny(); \/\/ \u0432\u0445\u043e\u0434 \u043f\u043e API-\u043a\u043b\u044e\u0447\u0443if (($s['SESS_REMOTE_UA'] ?? null) !== ($_SERVER['HTTP_USER_AGENT'] ?? '')) deny();if (time() - ($s['LAST_ACTIVITY'] ?? 0) &gt; $SESSION_LIFETIME) deny();header('X-Mailshare-User: ' . $s['mailcow_cc_username']);http_response_code(204);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 <code>SESS_REMOTE_UA<\/code> \u0438 <code>LAST_ACTIVITY<\/code> \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0442 \u0442\u043e, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0430\u043c Mailcow, \u0438\u043d\u0430\u0447\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0439\u0442\u0438 \u0441 \u0443\u0436\u0435 \u043f\u0440\u043e\u0442\u0443\u0445\u0448\u0435\u0439 \u0441\u0435\u0441\u0441\u0438\u0435\u0439. \u0425\u043e\u0440\u043e\u0448\u0430\u044f \u043d\u043e\u0432\u043e\u0441\u0442\u044c: \u0440\u0430\u0431\u043e\u0442\u0430 \u0432 SOGo \u0441\u0435\u0441\u0441\u0438\u044e \u043f\u0440\u043e\u0434\u043b\u0435\u0432\u0430\u0435\u0442 \u0441\u0430\u043c\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b SOGo \u0438\u0434\u0443\u0442 \u0447\u0435\u0440\u0435\u0437 <code>auth_request \/sogo-auth-verify<\/code>, \u0442\u043e \u0435\u0441\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0442 \u0436\u0435 PHP. \u0410 \u0432 \u0441\u0432\u0435\u0436\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u0444\u043e\u0440\u043c\u0430 \u0432\u0445\u043e\u0434\u0430 SOGo \u0438 \u0432\u043e\u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0444\u043e\u0440\u043c\u0443 Mailcow, \u0442\u0430\u043a \u0447\u0442\u043e \u0441\u0435\u0441\u0441\u0438\u044f \u0435\u0441\u0442\u044c \u0443 \u0432\u0441\u0435\u0445.<\/p>\n<p>\u041a\u0443\u0441\u043e\u043a Nginx (\u043a\u043b\u0430\u0434\u0451\u0442\u0441\u044f \u0432 <code>data\/conf\/nginx\/site.mailshare.custom<\/code>, Mailcow \u0441\u0430\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0442\u0430\u043a\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u0432\u043d\u0443\u0442\u0440\u044c \u0441\u0430\u0439\u0442\u0430 \u043f\u043e\u0447\u0442\u044b):<\/p>\n<pre><code class=\"nginx\">location = \/mailshare-auth {    internal;    fastcgi_pass php-fpm-mailcow:9002;    include fastcgi_params;    fastcgi_param SCRIPT_FILENAME \/web\/mailshare-auth.php;    fastcgi_pass_request_body off;    fastcgi_param CONTENT_LENGTH \"\";}location ^~ \/mailshare\/api\/ {    auth_request \/mailshare-auth;    auth_request_set $mailshare_user $upstream_http_x_mailshare_user;    resolver 127.0.0.11 valid=30s;    set $gw http:\/\/mailshare-gateway:8000;    proxy_pass $gw;    proxy_set_header X-Mailshare-User $mailshare_user;  # \u0437\u0430\u0442\u0438\u0440\u0430\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u043b\u043a\u0443 \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430    client_max_body_size 12m;    proxy_request_buffering off;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0415\u0449\u0451 \u0434\u0432\u0435 \u0432\u0435\u0449\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0434\u043e \u0443\u0447\u0435\u0441\u0442\u044c.<\/p>\n<ul>\n<li>\n<p><strong>\u041f\u043e\u0440\u0442 PHP-FPM.<\/strong> \u0412 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u0445 Mailcow \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0438 <code>9001<\/code>, \u0438 <code>9002<\/code>. \u041d\u0443\u0436\u0435\u043d <code>9002<\/code> \u2014 \u043f\u0443\u043b \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u0441 \u0442\u0435\u043c\u0438 \u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u0441\u0435\u0441\u0441\u0438\u0439. \u041f\u0440\u043e\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u043a\u043e\u043d\u0444\u0438\u0433: <\/p>\n<p>docker compose exec nginx-mailcow grep -n -B6 fastcgi_pass \/etc\/nginx\/nginx.conf<\/p>\n<\/li>\n<li>\n<p><code><strong>return<\/strong><\/code><strong> \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0440\u0430\u043d\u044c\u0448\u0435 <\/strong><code><strong>auth_request<\/strong><\/code><strong>.<\/strong> <code>return<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0444\u0430\u0437\u0435 rewrite, \u0434\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 location \u0441 <code>return<\/code> \u043e\u0442\u0432\u0435\u0442\u0438\u0442 \u043a\u043e\u043c\u0443 \u0443\u0433\u043e\u0434\u043d\u043e, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0430\u043d\u043e\u043d\u0438\u043c\u0430. \u0412\u0441\u0451, \u0447\u0442\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439, \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432 FastCGI.<\/p>\n<\/li>\n<\/ul>\n<h3>Gateway \u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 API Pingvin<\/h3>\n<p>\u0423 Pingvin \u043d\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e API \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u0436\u0435 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u0442\u0430\u0440\u044b\u0439 \u0438 \u043d\u0430\u0434\u0451\u0436\u043d\u044b\u0439: \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0447\u0435\u0440\u0435\u0437 SSH-\u0442\u0443\u043d\u043d\u0435\u043b\u044c, F12 \u2192 Network, \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u043d\u0430 \u043f\u0430\u0440\u0443 \u0441\u043e\u0442\u0435\u043d \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442 \u0438 \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0443\u0445\u043e\u0434\u0438\u0442. \u0412 \u0432\u0435\u0440\u0441\u0438\u0438 2.1.0 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code>POST \/api\/auth\/signIn                          \u2192 \u043a\u0443\u043a\u0430 access_token (JWT \u043d\u0430 15 \u043c\u0438\u043d\u0443\u0442)POST \/api\/shares                               {\"id\", \"expiration\": \"180-days\", \"size\", ...}POST \/api\/shares\/&lt;id&gt;\/files\/upload-init        {\"id\": &lt;uuid \u0444\u0430\u0439\u043b\u0430&gt;, \"name\", \"totalChunks\"}POST \/api\/shares\/&lt;id&gt;\/files?id=..&amp;name=..&amp;chunkIndex=N&amp;totalChunks=M   (\u0441\u044b\u0440\u044b\u0435 \u0431\u0430\u0439\u0442\u044b)POST \/api\/shares\/&lt;id&gt;\/complete                 \u2192 202, \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0428\u0430\u0433\u0430 <code>upload-init<\/code> \u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f\u0445 \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043d\u0435\u0442, \u043e\u043d \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439. \u0422\u0430\u043a \u0447\u0442\u043e \u0441\u0432\u0435\u0440\u044f\u0439\u0442\u0435\u0441\u044c \u0441 \u0442\u0440\u0430\u0444\u0438\u043a\u043e\u043c \u0441\u0432\u043e\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438, \u0430 \u043d\u0435 \u0441\u043e \u0441\u0442\u0430\u0440\u044b\u043c\u0438 \u0433\u0430\u0439\u0434\u0430\u043c\u0438.<\/p>\n<p>Gateway \u2014 \u044d\u0442\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0442\u0435\u043d \u0441\u0442\u0440\u043e\u043a \u043d\u0430 Starlette \u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0430 \u0441 \u0434\u0440\u0430\u0433-\u043d-\u0434\u0440\u043e\u043f\u043e\u043c. \u0411\u0440\u0430\u0443\u0437\u0435\u0440 \u0440\u0435\u0436\u0435\u0442 \u0444\u0430\u0439\u043b \u043d\u0430 \u0447\u0430\u0441\u0442\u0438 \u0438 \u0448\u043b\u0451\u0442 \u0438\u0445 \u0432 Gateway, Gateway \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430 \u0438 \u043b\u0438\u043c\u0438\u0442\u044b \u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0447\u0430\u0441\u0442\u0438 \u0432 Pingvin. \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043e\u043d \u0431\u0435\u0440\u0451\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b Nginx, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0440\u0442\u043e\u0432 \u043d\u0430\u0440\u0443\u0436\u0443 \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442. \u0412\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u044e\u0449\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441 <code>Origin<\/code> \u043f\u043e\u0447\u0442\u043e\u0432\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430, \u0447\u0442\u043e\u0431\u044b \u0447\u0443\u0436\u043e\u0439 \u0441\u0430\u0439\u0442 \u043d\u0435 \u043c\u043e\u0433 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043e\u0442 \u0438\u043c\u0435\u043d\u0438 \u0432\u043e\u0448\u0435\u0434\u0448\u0435\u0433\u043e \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430.<\/p>\n<p>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 API, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0434\u043e \u0443\u0447\u0435\u0441\u0442\u044c.<\/p>\n<p><strong>\u0420\u0430\u0437\u043c\u0435\u0440 \u0447\u0430\u0441\u0442\u0438 \u2014 \u043d\u0435 \u0432\u0430\u0448\u0435 \u0434\u0435\u043b\u043e.<\/strong> Pingvin \u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u0442 \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438, \u043e\u043d \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u0435\u0433\u043e \u0438\u0437 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0443\u0436\u0435 \u043f\u0440\u0438\u043d\u044f\u0442\u043e\u0433\u043e \u0438 \u0441\u0432\u043e\u0435\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 <code>share.chunkSize<\/code>. \u0420\u0435\u0437\u0430\u0442\u044c \u043d\u0430\u0434\u043e \u0440\u043e\u0432\u043d\u043e \u0442\u0430\u043a, \u043a\u0430\u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0432 Pingvin (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 10 000 000 \u0431\u0430\u0439\u0442), \u0438\u043d\u0430\u0447\u0435 \u0432\u0442\u043e\u0440\u0430\u044f \u0436\u0435 \u0447\u0430\u0441\u0442\u044c \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u00ab\u043d\u0435 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443\u00bb. Gateway \u0447\u0438\u0442\u0430\u0435\u0442 \u0435\u0451 \u0438\u0437 <code>GET \/api\/configs<\/code>. \u0417\u0430\u0442\u043e \u043d\u0430 \u0447\u0430\u0441\u0442\u044c \u043d\u0435 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443 Pingvin \u0447\u0435\u0441\u0442\u043d\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 <code>400<\/code> \u0441 \u043f\u043e\u043b\u0435\u043c <code>expectedChunkIndex<\/code>, \u0438 \u043d\u0430 \u044d\u0442\u043e\u043c \u043b\u0435\u0433\u043a\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u043a\u0430\u0447\u043a\u0443 \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u0440\u044b\u0432\u0430 \u0441\u0432\u044f\u0437\u0438.<\/p>\n<p><strong>403 \u0432\u043c\u0435\u0441\u0442\u043e 401.<\/strong> \u0422\u043e\u043a\u0435\u043d \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u0439 \u0443\u0447\u0451\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0436\u0438\u0432\u0451\u0442 15 \u043c\u0438\u043d\u0443\u0442. \u041a\u043e\u0433\u0434\u0430 \u043e\u043d \u0438\u0441\u0442\u0435\u043a\u0430\u0435\u0442, Pingvin \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 share \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0435 \u00ab401, \u0432\u043e\u0439\u0434\u0438\u0442\u0435 \u0437\u0430\u043d\u043e\u0432\u043e\u00bb, \u0430 \u00ab403, \u043d\u0435\u043b\u044c\u0437\u044f\u00bb.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 Gateway \u0447\u0438\u0442\u0430\u0435\u0442 <code>exp<\/code> \u0438\u0437 JWT \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0442\u043e\u043a\u0435\u043d \u0437\u0430 \u043c\u0438\u043d\u0443\u0442\u0443 \u0434\u043e \u043a\u043e\u043d\u0446\u0430, \u0430 \u043d\u0430 401 \u0438 403 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0432\u0445\u043e\u0434\u0438\u0442 \u0437\u0430\u043d\u043e\u0432\u043e \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441. \u0415\u0441\u043b\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u0442\u0435 \u0447\u0442\u043e-\u0442\u043e \u0441 \u0442\u043e\u043a\u0435\u043d\u0430\u043c\u0438, \u0433\u043e\u043d\u044f\u0439\u0442\u0435 \u0434\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0436\u0438\u0432\u0451\u0442 \u0442\u043e\u043a\u0435\u043d.<\/p>\n<p><strong>Secure-\u043a\u0443\u043a\u0430 \u043f\u043e HTTP.<\/strong> \u0415\u0441\u043b\u0438 \u0432 Pingvin \u0443\u043a\u0430\u0437\u0430\u043d HTTPS-\u0430\u0434\u0440\u0435\u0441, \u043a\u0443\u043a\u0430 <code>access_token<\/code> \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0441 \u0444\u043b\u0430\u0433\u043e\u043c <code>Secure<\/code>, \u0438 HTTP-\u043a\u043b\u0438\u0435\u043d\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 Docker-\u0441\u0435\u0442\u0438 \u0435\u0451 \u0447\u0435\u0441\u0442\u043d\u043e \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 Gateway \u0432\u044b\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u043e\u043a\u0435\u043d \u0438\u0437 <code>Set-Cookie<\/code> \u0441\u0430\u043c \u0438 \u043a\u043b\u0430\u0434\u0451\u0442 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a <code>Cookie<\/code> \u0440\u0443\u043a\u0430\u043c\u0438.<\/p>\n<p>\u0418 \u0435\u0449\u0451 \u043e\u0434\u043d\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435: \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434 Pingvin \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u0434\u044b \u0441\u0441\u044b\u043b\u043e\u043a \u0434\u043b\u0438\u043d\u043e\u0439 8\u201310 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432. \u0414\u043b\u044f \u0441\u0441\u044b\u043b\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0445\u043e\u0434\u044f\u0442 \u043d\u0430\u0440\u0443\u0436\u0443 \u0438 \u0436\u0438\u0432\u0443\u0442 \u043f\u043e\u043b\u0433\u043e\u0434\u0430, \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u043b\u043e\u0432\u0430\u0442\u043e, \u0442\u0430\u043a \u0447\u0442\u043e Gateway \u0441\u043e\u0437\u0434\u0430\u0451\u0442 share \u0441\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c ID \u0438\u0437 20 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u2014 API \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442.<\/p>\n<h3>\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0435 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435: \u0431\u0435\u043b\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 Nginx<\/h3>\n<p>\u0421\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0436\u0438\u0432\u0451\u0442 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u0438\u043c\u0435\u043d\u0438 (\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, <code>files.example.com<\/code>), \u043d\u043e \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0442\u043e\u0442 \u0436\u0435 Nginx \u0438\u0437 Mailcow: \u043a\u043e\u043d\u0444\u0438\u0433 \u043a\u043b\u0430\u0434\u0451\u0442\u0441\u044f \u0432 <code>data\/conf\/nginx\/*.conf<\/code>, \u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0430\u043c Mailcow \u2014 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043c\u044f \u0432 <code>ADDITIONAL_SAN<\/code> \u0432 <code>mailcow.conf<\/code>. \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043d\u0443\u0436\u043d\u043e \u0438 \u0434\u043b\u044f \u0440\u0435\u043f\u0443\u0442\u0430\u0446\u0438\u0438: \u0435\u0441\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u043a\u043e\u0433\u0434\u0430-\u043d\u0438\u0431\u0443\u0434\u044c \u0440\u0430\u0437\u0434\u0430\u0441\u0442 \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0440\u0432\u0438\u0441 \u0447\u0442\u043e-\u0442\u043e \u043d\u0435\u0445\u043e\u0440\u043e\u0448\u0435\u0435, \u0432 \u0431\u043b\u043e\u043a-\u043b\u0438\u0441\u0442 \u043f\u043e\u043f\u0430\u0434\u0451\u0442 \u043d\u0435 \u043f\u043e\u0447\u0442\u043e\u0432\u044b\u0439 \u0434\u043e\u043c\u0435\u043d.<\/p>\n<p>\u041d\u0430\u0440\u0443\u0436\u0443 \u043e\u0442\u043a\u0440\u044b\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f. \u0421\u043f\u0438\u0441\u043e\u043a \u044f \u0441\u043d\u043e\u0432\u0430 \u0441\u043d\u044f\u043b \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0432 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u043c \u043e\u043a\u043d\u0435, \u0430 \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 404:<\/p>\n<pre><code class=\"nginx\">location ~ ^\/(s|share)\/[A-Za-z0-9_-]+\/?$                  { limit_except GET  { deny all; } proxy_pass $pingvin; }location \/_next\/                                          { limit_except GET  { deny all; } proxy_pass $pingvin; }location ~ ^\/api\/shares\/[A-Za-z0-9_-]+$                   { limit_except GET  { deny all; } proxy_pass $pingvin; }location ~ ^\/api\/shares\/[A-Za-z0-9_-]+\/metaData$          { limit_except GET  { deny all; } proxy_pass $pingvin; }location ~ ^\/api\/shares\/[A-Za-z0-9_-]+\/token$             { limit_except POST { deny all; } proxy_pass $pingvin; }location ~ ^\/api\/shares\/[A-Za-z0-9_-]+\/files\/[A-Za-z0-9-]+$ {    limit_except GET { deny all; }    proxy_buffering off;   # \u043d\u0435 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442\u044b \u043d\u0430 \u0434\u0438\u0441\u043a Nginx    limit_rate 10m;        # \u0447\u0442\u043e\u0431\u044b \u043e\u0434\u043d\u043e \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0441\u044a\u0435\u043b\u043e \u0432\u0435\u0441\u044c \u043a\u0430\u043d\u0430\u043b \u043f\u043e\u0447\u0442\u044b    proxy_pass $pingvin;}location = \/sw.js { return 404; }location \/ { return 404; }  # \u0432\u0445\u043e\u0434, \u0430\u0434\u043c\u0438\u043d\u043a\u0430, \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u2014 \u043c\u0438\u043c\u043e<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 <code>resolver 127.0.0.11<\/code> \u0438 <code>set $pingvin http:\/\/mailshare-pingvin:3000<\/code> \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 server-\u0431\u043b\u043e\u043a\u0430. \u0415\u0441\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043c\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043f\u0440\u044f\u043c\u043e \u0432 <code>proxy_pass<\/code>, Nginx \u0440\u0435\u0437\u043e\u043b\u0432\u0438\u0442 \u0435\u0433\u043e \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435, \u0438 \u0441\u0442\u043e\u0438\u0442 Pingvin \u0443\u043f\u0430\u0441\u0442\u044c \u2014 \u043d\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u0442\u0441\u044f \u0432\u0435\u0441\u044c <code>nginx-mailcow<\/code>, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u043e\u0447\u0442\u044b. \u0421 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u0430 \u0436\u0438\u0432\u0451\u0442, \u0430 \u0441\u0430\u0439\u0442 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u0434\u0430\u0451\u0442 502.<\/p>\n<p>\u0414\u0432\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u044d\u0442\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u043d\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b.<\/p>\n<p><code><strong>metaData<\/strong><\/code><strong>.<\/strong> \u0411\u0435\u0437 \u043d\u0435\u0433\u043e \u0444\u0430\u0439\u043b\u044b \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f, \u0430 \u00ab\u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0432\u0441\u0451\u00bb \u0430\u0440\u0445\u0438\u0432\u043e\u043c \u0432\u0435\u0447\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u00ab\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0433\u043e\u0442\u043e\u0432\u0438\u0442\u0441\u044f. \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043d\u0443\u0442\u00bb. \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0447\u0435\u0440\u0435\u0437 <code>metaData<\/code> \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442, \u0433\u043e\u0442\u043e\u0432 \u043b\u0438 \u0430\u0440\u0445\u0438\u0432, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 404 \u0438 \u0441\u0447\u0438\u0442\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0435 \u0433\u043e\u0442\u043e\u0432. \u041e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435\u0442.<\/p>\n<p><code><strong>sw.js<\/strong><\/code><strong>.<\/strong> \u042d\u0442\u043e service worker \u0438\u0437 PWA \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430 Pingvin. \u041e\u043d \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c <code>workbox-*.js<\/code> \u0438 \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043d\u0430\u0440\u0443\u0436\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u044b, \u0438 \u0441\u044b\u043f\u043b\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c. \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u043e\u043d \u043d\u0435 \u043d\u0443\u0436\u0435\u043d, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0442\u0434\u0430\u0451\u043c \u044f\u0432\u043d\u044b\u0439 404: \u0443\u0432\u0438\u0434\u0435\u0432 \u0435\u0433\u043e, \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0441\u0430\u043c \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0443\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0432\u043e\u0440\u043a\u0435\u0440.<\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u043b\u0438\u0448\u043d\u0435\u0433\u043e \u043d\u0430\u0440\u0443\u0436\u0443 \u043d\u0435 \u0442\u043e\u0440\u0447\u0438\u0442:<\/p>\n<pre><code class=\"bash\">curl -s -o \/dev\/null -w \"%{http_code}\\n\" -X POST https:\/\/files.example.com\/api\/auth\/signIn   # 404curl -s -o \/dev\/null -w \"%{http_code}\\n\" -X POST https:\/\/files.example.com\/api\/shares        # 404<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>\u041a\u043d\u043e\u043f\u043a\u0430 \u0432 SOGo \u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0432 \u043f\u0438\u0441\u044c\u043c\u043e<\/h3>\n<p>\u0421\u0435\u0440\u0432\u0438\u0441, \u0434\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u0438\u0434\u0442\u0438 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443, \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0438 \u0437\u0430\u0431\u0443\u0434\u0443\u0442 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0434\u0435\u043b\u044e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0430 \u043f\u0440\u044f\u043c\u043e \u0432 \u043e\u043a\u043d\u0435 \u043f\u0438\u0441\u044c\u043c\u0430, \u0440\u044f\u0434\u043e\u043c \u0441\u043e \u0441\u043a\u0440\u0435\u043f\u043a\u043e\u0439.<\/p>\n<p>\u0423 Mailcow \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0448\u0442\u0430\u0442\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431: \u0444\u0430\u0439\u043b <code>data\/conf\/sogo\/custom-sogo.js<\/code> \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 SOGo \u0447\u0435\u0440\u0435\u0437 <code>SOGoUIAdditionalJSFiles<\/code>, \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0435\u0433\u043e \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u044e\u0442. \u0412 \u043d\u0451\u043c \u044f \u0438 \u0434\u0435\u0440\u0436\u0443 \u0441\u0432\u043e\u0439 \u0431\u043b\u043e\u043a \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438-\u043c\u0435\u0442\u043a\u0430\u043c\u0438:<\/p>\n<pre><code>\/\/ ---- Mailshare: \u043a\u043d\u043e\u043f\u043a\u0430 \u00ab\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u0441\u0441\u044b\u043b\u043a\u043e\u0439\u00bb ----(function () { ... })();\/\/ ---- \u043a\u043e\u043d\u0435\u0446 \u0431\u043b\u043e\u043a\u0430 Mailshare ----<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041a\u043d\u043e\u043f\u043a\u0443 \u044f \u043d\u0435 \u0432\u0448\u0438\u0432\u0430\u044e \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u044b SOGo, \u0430 \u0438\u0449\u0443 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435. <code>MutationObserver<\/code> \u0441\u043b\u0435\u0434\u0438\u0442 \u0437\u0430 DOM, \u0438 \u043a\u043e\u0433\u0434\u0430 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u043a\u043d\u043e \u043f\u0438\u0441\u044c\u043c\u0430 (<code>md-dialog<\/code> \u0438\u043b\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0441 <code>#\/new<\/code>, <code>#\/reply<\/code> \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435), \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0441\u043e \u0437\u043d\u0430\u0447\u043a\u043e\u043c \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0441\u0442\u0430\u0432\u0438\u0442 \u0440\u044f\u0434\u043e\u043c \u0441\u0432\u043e\u044e, \u0441 <code>cloud_upload<\/code>.<\/p>\n<h4>\u041a\u0443\u0434\u0430 \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0431\u043b\u043e\u043a \u0438 \u043a\u0430\u043a\u0443\u044e \u0438\u043a\u043e\u043d\u043a\u0443 \u0438\u0441\u043a\u0430\u0442\u044c<\/h4>\n<p>\u0411\u043b\u043e\u043a \u0441\u0442\u043e\u0438\u0442 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 <code>custom-sogo.js<\/code>. \u0412 \u0448\u0442\u0430\u0442\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 Mailcow \u0435\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 <code>CKEDITOR.addCss(...)<\/code>, \u0430 \u0432 SOGo 5.12 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <code>CKEDITOR<\/code> \u0443\u0436\u0435 \u043d\u0435\u0442: \u0441\u0442\u0440\u043e\u043a\u0430 \u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u0438 \u0432\u0441\u0451, \u0447\u0442\u043e \u043d\u0438\u0436\u0435, \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442. \u0421\u0432\u043e\u0439 \u043a\u043e\u0434 \u043e\u0431\u0451\u0440\u043d\u0443\u0442 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0441\u0430\u043c \u043d\u0438\u043a\u043e\u0433\u043e \u043d\u0435 \u0440\u043e\u043d\u044f\u043b.<\/p>\n<p>\u0421\u043a\u0440\u0435\u043f\u043a\u0430 \u0432 \u043e\u043a\u043d\u0435 \u043f\u0438\u0441\u044c\u043c\u0430 SOGo 5.12 \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u043e\u0439 <code>file_upload<\/code>, \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u044d\u0442\u043e <code>attach_file<\/code>. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c <code>attach_file<\/code> \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0438 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u043f\u0438\u0441\u0435\u043c \u043a\u0430\u043a \u043f\u0440\u0438\u0437\u043d\u0430\u043a \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043a\u0440\u0438\u043f\u0442 \u0438\u0449\u0435\u0442 \u043e\u0431\u0430 \u0438\u043c\u0435\u043d\u0438 \u0438 \u0431\u0435\u0440\u0451\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 <code>button<\/code>.<\/p>\n<h4>\u041e\u043a\u043d\u043e \u043f\u043e\u0432\u0435\u0440\u0445 \u043f\u0438\u0441\u044c\u043c\u0430, \u0430 \u043d\u0435 \u043d\u043e\u0432\u0430\u044f \u0432\u043a\u043b\u0430\u0434\u043a\u0430<\/h4>\n<p>\u041a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0435 \u0432 \u043d\u043e\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0435, \u0430 \u0432 iframe \u043f\u043e\u0432\u0435\u0440\u0445 \u0442\u043e\u0433\u043e \u043f\u0438\u0441\u044c\u043c\u0430, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0435\u0451 \u043d\u0430\u0436\u0430\u043b\u0438. \u0423 \u043b\u044e\u0434\u0435\u0439 \u0431\u044b\u0432\u0430\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a\u043e\u0432, \u0438 \u0441 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0443 \u043b\u0435\u0433\u043a\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0435 \u0432 \u0442\u043e \u043f\u0438\u0441\u044c\u043c\u043e. \u0421\u043a\u0440\u0438\u043f\u0442 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442, \u043a\u0430\u043a\u043e\u0435 \u043e\u043a\u043d\u043e \u0431\u044b\u043b\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c.<\/p>\n<p>\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0436\u0438\u0432\u0451\u0442 \u043d\u0430 \u0442\u043e\u043c \u0436\u0435 \u0434\u043e\u043c\u0435\u043d\u0435, \u0447\u0442\u043e \u0438 \u043f\u043e\u0447\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 iframe \u0438 SOGo \u043e\u0431\u0449\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>postMessage<\/code> \u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 <code>origin<\/code> \u0438 <code>source<\/code>:<\/p>\n<ul>\n<li>\n<p>iframe \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 <code>mailshare:state<\/code> (\u0438\u0434\u0451\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438\u043b\u0438 \u043d\u0435\u0442), \u0447\u0442\u043e\u0431\u044b \u043a\u0440\u0435\u0441\u0442\u0438\u043a \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u043b \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u00ab\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u043f\u0438\u0441\u044c\u043c\u043e\u00bb \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 <code>mailshare:insert<\/code> \u0441 HTML-\u0431\u043b\u043e\u043a\u043e\u043c, \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u043c PDF \u043a\u0430\u043a \u043e\u0431\u044a\u0435\u043a\u0442 <code>File<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0443\u0445\u043e\u0434\u0438\u0442 <code>mailshare:inserted<\/code> \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c.<\/p>\n<\/li>\n<\/ul>\n<h4>\u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0432 CKEditor 5<\/h4>\n<p>\u0412 SOGo 5.12 \u0441\u0442\u043e\u0438\u0442 CKEditor 5, \u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043f\u0440\u043e \u0447\u0435\u0442\u0432\u0451\u0440\u0442\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0438 <code>CKEDITOR.instances<\/code>. \u041f\u044f\u0442\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 DOM-\u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430:<\/p>\n<pre><code class=\"javascript\">var ed = ctx.querySelector('.ck-editor__editable').ckeditorInstance;var frag = ed.data.toModel(ed.data.processor.toView(html));ed.model.insertContent(frag, position);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u044f\u0432\u043d\u043e, \u0430 \u043d\u0435 \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0438\u0437 \u043a\u0443\u0440\u0441\u043e\u0440\u0430. \u0418\u043d\u0430\u0447\u0435 \u0431\u043b\u043e\u043a \u0437\u0430\u043c\u0435\u043d\u0438\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442, \u0430 \u0432\u0442\u043e\u0440\u0430\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0432\u0441\u0442\u0430\u043d\u0435\u0442 \u043d\u0430 \u043c\u0435\u0441\u0442\u043e \u043f\u0435\u0440\u0432\u043e\u0439. \u0411\u043b\u043e\u043a \u0438\u0434\u0451\u0442 \u0432 \u043a\u043e\u043d\u0435\u0446 \u043f\u0438\u0441\u044c\u043c\u0430, \u0430 \u0432 \u043e\u0442\u0432\u0435\u0442\u0435 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0441\u044b\u043b\u043a\u0435 \u043f\u0435\u0440\u0435\u0434 \u0446\u0438\u0442\u0430\u0442\u043e\u0439. \u0426\u0438\u0442\u0430\u0442\u0430 \u0432 \u043c\u043e\u0434\u0435\u043b\u0438 CKEditor 5 \u044d\u0442\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442 <code>blockQuote<\/code>, \u0430 \u043d\u0430\u0434 \u043d\u0438\u043c \u043e\u0431\u044b\u0447\u043d\u043e \u0430\u0431\u0437\u0430\u0446 \u0432\u0438\u0434\u0430 \u00ab12 \u043c\u0430\u0440\u0442\u0430 \u0418\u0432\u0430\u043d \u041f\u0435\u0442\u0440\u043e\u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043b(\u0430):\u00bb. \u0415\u0441\u043b\u0438 \u0430\u0431\u0437\u0430\u0446 \u043f\u0435\u0440\u0435\u0434 \u0446\u0438\u0442\u0430\u0442\u043e\u0439 \u043a\u043e\u043d\u0447\u0430\u0435\u0442\u0441\u044f \u0434\u0432\u043e\u0435\u0442\u043e\u0447\u0438\u0435\u043c, \u0431\u043b\u043e\u043a \u0432\u0441\u0442\u0430\u0451\u0442 \u043f\u0435\u0440\u0435\u0434 \u043d\u0438\u043c.<\/p>\n<p>\u0414\u043b\u044f CKEditor 4 \u0438 \u0434\u043b\u044f \u043f\u0438\u0441\u0435\u043c \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0442\u0435\u043a\u0441\u0442\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0437\u0430\u043f\u0430\u0441\u043d\u044b\u0435 \u043f\u0443\u0442\u0438: <code>setData<\/code> \u0438 \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u0435 \u0432 <code>textarea<\/code>.<\/p>\n<h4>\u0410\u0431\u0437\u0430\u0446\u044b, \u0430 \u043d\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u0430<\/h4>\n<p>\u0411\u043b\u043e\u043a \u0441\u043e \u0441\u0441\u044b\u043b\u043a\u043e\u0439 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0430\u0431\u0437\u0430\u0446\u0435\u0432 \u0441 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430\u043c\u0438 \u0441\u0442\u0440\u043e\u043a: \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a, \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u0439\u043b\u043e\u0432 \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043c\u0438, \u0441\u0441\u044b\u043b\u043a\u0430 \u00ab\u0421\u043a\u0430\u0447\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b\u00bb \u0438 \u0434\u0430\u0442\u0430, \u0434\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u0435\u0435, \u043d\u043e \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u0435\u0451 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u044c, \u0430 \u0430\u0431\u0437\u0430\u0446\u044b \u043f\u0440\u0430\u0432\u044f\u0442\u0441\u044f \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442.<\/p>\n<h4>\u0417\u0430\u0447\u0435\u043c PDF-\u0432\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/h4>\n<p>\u041f\u0438\u0441\u044c\u043c\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e \u0441\u0441\u044b\u043b\u043a\u043e\u0439 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0443 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u043a\u0430\u043a \u043f\u0438\u0441\u044c\u043c\u043e \u0431\u0435\u0437 \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u0439: \u0441\u043a\u0440\u0435\u043f\u043a\u0438 \u043d\u0435\u0442, \u0438 \u0441\u0441\u044b\u043b\u043a\u0443 \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 Gateway \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 PDF (reportlab, \u0448\u0440\u0438\u0444\u0442 DejaVu, \u0447\u0442\u043e\u0431\u044b \u043a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u0430 \u043d\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u0430\u0441\u044c \u0432 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u044b) \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u043a\u043d\u043e\u043f\u043a\u043e\u0439-\u0441\u0441\u044b\u043b\u043a\u043e\u0439, \u0430 \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u0435\u0442 \u0435\u0433\u043e \u043a \u043f\u0438\u0441\u044c\u043c\u0443.<\/p>\n<p>\u041f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u0442\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b \u0431\u044b \u0447\u0435\u043b\u043e\u0432\u0435\u043a. \u0423 SOGo \u0435\u0441\u0442\u044c <code>input[type=file]<\/code> \u0441 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u043c <code>nv-file-select<\/code> (\u044d\u0442\u043e angular-file-upload), \u0438 \u043e\u043d \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u0435\u0442 \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 <code>change<\/code>:<\/p>\n<pre><code class=\"javascript\">var dt = new DataTransfer();dt.items.add(file);input.files = dt.files;input.dispatchEvent(new Event('change', { bubbles: true }));<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u0430\u0440\u0443 \u0441\u0435\u043a\u0443\u043d\u0434 \u0436\u0434\u0451\u0442, \u043f\u043e\u043a\u0430 \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0432 \u043e\u043a\u043d\u0435 \u043f\u0438\u0441\u044c\u043c\u0430, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430 \u0441\u0447\u0438\u0442\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u0441\u0451 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442, \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u00ab\u0421\u043a\u0430\u0447\u0430\u0442\u044c PDF\u00bb, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u0438\u0442\u044c \u0435\u0433\u043e \u0440\u0443\u043a\u0430\u043c\u0438.<\/p>\n<p>PDF \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>download-files.pdf<\/code>: \u043b\u0430\u0442\u0438\u043d\u0438\u0446\u0430 \u043d\u0430\u0434\u0451\u0436\u043d\u0435\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043e\u0447\u0442\u043e\u0432\u044b\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u0445. \u0418\u043c\u044f \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0432 <code>.env<\/code>.<\/p>\n<h3>\u0427\u0442\u043e\u0431\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f Mailcow \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u043b\u043e\u043c\u0430\u043b\u0438<\/h3>\n<p>\u0412\u0441\u0435 \u043c\u043e\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 Mailcow \u0436\u0438\u0432\u0443\u0442 \u0432 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0444\u0430\u0439\u043b\u0430\u0445, \u0438 \u0442\u0440\u0438 \u0438\u0437 \u043d\u0438\u0445 Mailcow \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th data-colwidth=\"406\" width=\"406\">\n<p>\u0424\u0430\u0439\u043b<\/p>\n<\/th>\n<th>\n<p>\u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td data-colwidth=\"406\" width=\"406\">\n<p align=\"left\"><code>data\/conf\/nginx\/site.mailshare.custom<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>\/mailshare\/<\/code> \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0430\u0439\u0442\u0430 \u043f\u043e\u0447\u0442\u044b<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"406\" width=\"406\">\n<p align=\"left\"><code>data\/conf\/nginx\/mailshare-files.conf<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u0430\u0439\u0442 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"406\" width=\"406\">\n<p align=\"left\"><code>data\/web\/mailshare-auth.php<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0435\u0441\u0441\u0438\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"406\" width=\"406\">\n<p align=\"left\"><code>data\/conf\/sogo\/custom-sogo.js<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043a\u043d\u043e\u043f\u043a\u0430, \u0441\u0432\u043e\u0439 \u0431\u043b\u043e\u043a \u0432\u043d\u0443\u0442\u0440\u0438 \u0448\u0442\u0430\u0442\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0421 \u043f\u0435\u0440\u0432\u044b\u043c\u0438 \u0442\u0440\u0435\u043c\u044f \u0432\u0441\u0451 \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e. \u0410 \u0432\u043e\u0442 <code>custom-sogo.js<\/code> \u043f\u0440\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 Mailcow \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0435\u0445\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u043c, \u0438 \u0431\u043b\u043e\u043a \u0438\u0441\u0447\u0435\u0437\u043d\u0435\u0442. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u044d\u0442\u043e \u0440\u0443\u043a\u0430\u043c\u0438 \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e <code>update.sh<\/code> \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043b\u0435\u0436\u0430\u0442 \u044d\u0442\u0430\u043b\u043e\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0432\u0441\u0435\u0445 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0441\u043a\u0440\u0438\u043f\u0442 <code>check-mailcow.sh<\/code>. \u041e\u043d:<\/p>\n<ul>\n<li>\n<p>\u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u0444\u0430\u0439\u043b \u0441 \u044d\u0442\u0430\u043b\u043e\u043d\u043e\u043c \u0447\u0435\u0440\u0435\u0437 <code>cmp<\/code> \u0438 \u043a\u043b\u0430\u0434\u0451\u0442 \u044d\u0442\u0430\u043b\u043e\u043d, \u0435\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u043f\u0440\u043e\u043f\u0430\u043b \u0438\u043b\u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f;<\/p>\n<\/li>\n<li>\n<p>\u0432 <code>custom-sogo.js<\/code> \u0438\u0449\u0435\u0442 \u0431\u043b\u043e\u043a \u043f\u043e \u043c\u0435\u0442\u043a\u0430\u043c \u0438 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0433\u043e, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0435\u0442; \u0435\u0441\u043b\u0438 \u043c\u0435\u0442\u043e\u043a \u043d\u0435\u0442, \u0441\u0442\u0430\u0432\u0438\u0442 \u0431\u043b\u043e\u043a \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u0444\u0430\u0439\u043b\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0435\u0441\u043b\u0438 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0430 \u043c\u0435\u0442\u043a\u0430 \u0438\u0437 \u0434\u0432\u0443\u0445, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u0438 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439: \u043b\u0443\u0447\u0448\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0440\u0443\u043a\u0430\u043c\u0438, \u0447\u0435\u043c \u0438\u0441\u043f\u043e\u0440\u0442\u0438\u0442\u044c \u0444\u0430\u0439\u043b;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u043e\u043c\u0435\u043d \u0438\u0437 <code>.env<\/code> \u0432 \u0448\u0430\u0431\u043b\u043e\u043d \u0441\u0430\u0439\u0442\u0430 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 <code>nginx-mailcow<\/code> \u0438\u043b\u0438 <code>sogo-mailcow<\/code>, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u043b.<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u0435\u0442\u043a\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0441 <code>\/\/<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 <code>sed<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c <code>|<\/code>, \u0430 \u043d\u0435 <code>\/<\/code>. \u041c\u0435\u0442\u043a\u0430 \u0438\u0449\u0435\u0442\u0441\u044f \u0431\u0435\u0437 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u043a \u043d\u0430\u0447\u0430\u043b\u0443 \u0441\u0442\u0440\u043e\u043a\u0438: \u0432 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b.<\/p>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u044b\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 cron \u0440\u0430\u0437 \u0432 \u0441\u0443\u0442\u043a\u0438 \u0438 \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f:<\/p>\n<pre><code>17 4 * * * cd \/opt\/mailshare &amp;&amp; .\/check-mailcow.sh &gt;&gt; \/var\/log\/mailshare-check.log 2&gt;&amp;1<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041e\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0441\u0430\u043c\u043e\u043c SOGo \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0435 \u0441\u043f\u0430\u0441\u0451\u0442: \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440, \u0434\u0440\u0443\u0433\u0438\u0435 \u0438\u043c\u0435\u043d\u0430 \u0438\u043a\u043e\u043d\u043e\u043a, \u0434\u0440\u0443\u0433\u043e\u0435 \u043f\u043e\u043b\u0435 \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041d\u0430 \u0442\u0430\u043a\u043e\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u0432 \u0431\u043b\u043e\u043a\u0435 \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>mailshareDiag()<\/code>. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0435 \u043e\u043a\u043d\u043e \u043f\u0438\u0441\u044c\u043c\u0430, \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u043d\u0430\u0431\u0438\u0440\u0430\u0435\u0442\u0435 <code>mailshareDiag()<\/code> \u0438 \u0432\u0438\u0434\u0438\u0442\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u0443: \u043d\u0430\u0439\u0434\u0435\u043d \u043b\u0438 \u0434\u0438\u0430\u043b\u043e\u0433 \u043f\u0438\u0441\u044c\u043c\u0430, \u043a\u0430\u043a\u043e\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0435\u0439 \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0435\u0441\u0442\u044c \u043b\u0438 \u0441\u0440\u0435\u0434\u0438 \u043d\u0438\u0445 <code>nv-file-select<\/code>, \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430. \u041f\u043e\u0441\u043b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f SOGo \u0441\u0442\u043e\u0438\u0442 \u043f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0435\u0451.<\/p>\n<h3>\u0426\u0438\u0444\u0440\u044b, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0438 \u0447\u0442\u043e \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u043e<\/h3>\n<p>\u0422\u0435\u043a\u0443\u0449\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0443 \u043d\u0430\u0441 \u0442\u0430\u043a\u0438\u0435:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th data-colwidth=\"394\" width=\"394\">\n<p>\u0427\u0442\u043e<\/p>\n<\/th>\n<th>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td data-colwidth=\"394\" width=\"394\">\n<p align=\"left\">\u041e\u0434\u043d\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430, \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0432\u043c\u0435\u0441\u0442\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">300 \u041c\u0411<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"394\" width=\"394\">\n<p align=\"left\">\u0424\u0430\u0439\u043b\u043e\u0432 \u0432 \u043e\u0434\u043d\u043e\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u043e 100<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"394\" width=\"394\">\n<p align=\"left\">\u0421\u0440\u043e\u043a \u0441\u0441\u044b\u043b\u043a\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">180 \u0434\u043d\u0435\u0439<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"394\" width=\"394\">\n<p align=\"left\">\u041f\u043e\u0441\u043b\u0435 \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u044b \u043b\u0435\u0436\u0430\u0442 \u0435\u0449\u0451<\/p>\n<\/td>\n<td>\n<p align=\"left\">30 \u0434\u043d\u0435\u0439, \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439 \u00ab\u043e\u0439, \u043c\u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043d\u0430\u0434\u043e\u00bb<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"394\" width=\"394\">\n<p align=\"left\">\u041d\u0430 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430 \u0432 \u0441\u0443\u0442\u043a\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">10 \u0413\u0411<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"394\" width=\"394\">\n<p align=\"left\">\u041e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u0442\u043f\u0440\u0430\u0432\u043e\u043a \u0443 \u043e\u0434\u043d\u043e\u0433\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">3<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>300 \u041c\u0411 \u0432\u0437\u044f\u043b\u0438\u0441\u044c \u043d\u0435 \u0441 \u043f\u043e\u0442\u043e\u043b\u043a\u0430. \u041f\u043e\u0447\u0442\u0438 \u0432\u0441\u0451, \u0447\u0442\u043e \u043b\u044e\u0434\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442, \u044d\u0442\u043e \u0441\u043a\u0430\u043d\u044b, \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0438 \u0432\u0438\u0434\u0435\u043e \u0441 \u0441\u043e\u0432\u0435\u0449\u0430\u043d\u0438\u0439, \u0438 \u0432 300 \u041c\u0411 \u044d\u0442\u043e \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f. \u0410 \u0435\u0441\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b \u0431\u043e\u043b\u044c\u0448\u0435, \u044d\u0442\u043e \u043f\u043e\u0432\u043e\u0434 \u0441\u043f\u0440\u043e\u0441\u0438\u0442\u044c, \u0442\u043e\u0447\u043d\u043e \u043b\u0438 \u044d\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0438\u0434\u0442\u0438 \u043f\u043e \u043f\u043e\u0447\u0442\u0435.<\/p>\n<p>\u041e\u0434\u043d\u0430 \u0432\u0435\u0449\u044c, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u043e\u0438\u0442 \u0437\u043d\u0430\u0442\u044c \u0437\u0430\u0440\u0430\u043d\u0435\u0435: \u0435\u0441\u043b\u0438 \u0432 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0430\u0439\u043b\u043e\u0432, Pingvin \u0432 \u0444\u043e\u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 zip \u0434\u043b\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u00ab\u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0432\u0441\u0451\u00bb \u0438 \u0445\u0440\u0430\u043d\u0438\u0442 \u0435\u0433\u043e \u0440\u044f\u0434\u043e\u043c. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043c\u043d\u043e\u0433\u043e\u0444\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u043f\u043e\u0447\u0442\u0438 \u0432\u0434\u0432\u043e\u0435 \u0431\u043e\u043b\u044c\u0448\u0435. \u0421\u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u043c\u0435\u0441\u0442\u043e \u0441 \u044d\u0442\u0438\u043c \u0437\u0430\u043f\u0430\u0441\u043e\u043c.<\/p>\n<p>\u0412\u0441\u0435 \u044d\u0442\u0438 \u0446\u0438\u0444\u0440\u044b \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u0432 <code>.env<\/code>, \u0438 \u043e\u0434\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>MAX_SHARE_BYTES<\/code> \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0438 \u0432 Gateway, \u0438 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433 Pingvin. \u0415\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u043b\u0438\u043c\u0438\u0442\u044b \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 Gateway \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0444\u0430\u0439\u043b, \u0430 Pingvin \u043e\u0442\u043a\u043b\u043e\u043d\u044f\u0435\u0442 \u0435\u0433\u043e \u0441 \u043d\u0435\u0432\u043d\u044f\u0442\u043d\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u043e\u0439. \u0421\u0430\u043c \u043a\u043e\u043d\u0444\u0438\u0433 Pingvin \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0437 <code>.env<\/code> \u043f\u0440\u044f\u043c\u043e \u0432 <code>docker-compose.yml<\/code> \u0447\u0435\u0440\u0435\u0437 <code>configs: content:<\/code> (\u043d\u0443\u0436\u0435\u043d Docker Compose 2.23 \u0438\u043b\u0438 \u043d\u043e\u0432\u0435\u0435), \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 Pingvin \u0440\u0443\u043a\u0430\u043c\u0438 \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u044e\u0442\u0441\u044f \u0432\u043e\u043e\u0431\u0449\u0435.<\/p>\n<p>\u0427\u0442\u043e \u043f\u043e\u043a\u0430 \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u043e:<\/p>\n<ul>\n<li>\n<p><strong>S3.<\/strong> Pingvin \u0443\u043c\u0435\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0432 S3, \u043d\u043e \u0432 v2 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0444\u0430\u0439\u043b\u044b \u0445\u043e\u0434\u044f\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043c\u0435\u0436\u0434\u0443 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c \u0438 \u0431\u0430\u043a\u0435\u0442\u043e\u043c \u043f\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c \u0441\u0441\u044b\u043b\u043a\u0430\u043c. \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0447\u0430\u0441\u0442\u044f\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 Gateway \u0438 \u0431\u0435\u043b\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 Nginx \u0442\u043e\u0433\u0434\u0430 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0441\u043e\u0432\u0441\u0435\u043c \u0438\u043d\u0430\u0447\u0435, \u0438 \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430. \u041f\u043e\u043a\u0430 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u0410\u043d\u0442\u0438\u0432\u0438\u0440\u0443\u0441.<\/strong> \u0425\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0435 \u0447\u0435\u0440\u0435\u0437 ClamAV, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 Mailcow \u0438 \u0442\u0430\u043a \u0435\u0441\u0442\u044c. \u041d\u0435 \u0434\u043e\u0448\u043b\u0438 \u0440\u0443\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u0441\u0430\u043c\u0438\u043c \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u043c.<\/strong> \u0415\u0441\u043b\u0438 \u0441\u0441\u044b\u043b\u043a\u0430 \u0443\u0448\u043b\u0430 \u043d\u0435 \u0442\u043e\u043c\u0443 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443, \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0430\u0434\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0443, \u0438 \u043e\u043d \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0432 \u0430\u0434\u043c\u0438\u043d\u043a\u0435 Pingvin.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u043e\u0447\u0442\u043e\u0432\u044b\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u044b.<\/strong> \u041a\u043d\u043e\u043f\u043a\u0430 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0432\u0435\u0431-\u043f\u043e\u0447\u0442\u0435. \u0422\u0435\u043c, \u043a\u0442\u043e \u0441\u0438\u0434\u0438\u0442 \u0432 Outlook \u0438\u043b\u0438 Thunderbird, \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u044c <code>\/mailshare\/<\/code> \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 (\u0432\u043e\u0439\u0434\u044f \u0432 \u043f\u043e\u0447\u0442\u0443), \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u043b\u043e\u043a \u0438 \u0441\u043a\u0430\u0447\u0430\u0442\u044c PDF. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u043e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443: \u0443 \u043d\u0430\u0441 \u043e\u043a\u043e\u043b\u043e 50 \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u0438 \u0441\u0435\u0440\u0432\u0438\u0441 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u0435\u0442. Gateway \u043e\u0434\u043d\u043e\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043d\u044b\u0439, \u0447\u0430\u0441\u0442\u0438 \u0444\u0430\u0439\u043b\u043e\u0432 \u043e\u043d \u043d\u0435 \u0434\u0435\u0440\u0436\u0438\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0430 \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u0441\u044b\u043b\u0430\u0435\u0442 \u0432 Pingvin. \u0423\u0437\u043a\u043e\u0435 \u043c\u0435\u0441\u0442\u043e, \u0435\u0441\u043b\u0438 \u043e\u043d\u043e \u0431\u0443\u0434\u0435\u0442, \u044d\u0442\u043e \u043a\u0430\u043d\u0430\u043b \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e <code>limit_rate<\/code>, \u0447\u0442\u043e\u0431\u044b \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0444\u0430\u0439\u043b \u043d\u0435 \u043c\u0435\u0448\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u0435 \u043f\u043e\u0447\u0442\u044b.<\/p>\n<h3>\u0412\u043c\u0435\u0441\u0442\u043e \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0442\u043e, \u0447\u0442\u043e \u0445\u043e\u0442\u0435\u043b\u0438 \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430: \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a \u043f\u0438\u0448\u0435\u0442 \u043f\u0438\u0441\u044c\u043c\u043e \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e, \u0436\u043c\u0451\u0442 \u043e\u0431\u043b\u0430\u043a\u043e \u0440\u044f\u0434\u043e\u043c \u0441\u043e \u0441\u043a\u0440\u0435\u043f\u043a\u043e\u0439, \u043a\u0438\u0434\u0430\u0435\u0442 \u0444\u0430\u0439\u043b\u044b, \u0438 \u0447\u0435\u0440\u0435\u0437 \u043c\u0438\u043d\u0443\u0442\u0443 \u0432 \u043f\u0438\u0441\u044c\u043c\u0435 \u0435\u0441\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0430 \u0438 PDF-\u0432\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u043d\u043e\u0432\u044b\u0445 \u043b\u043e\u0433\u0438\u043d\u043e\u0432, \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u043e\u0431\u043b\u0430\u043a\u043e\u0432 \u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u00ab\u0430 \u043a\u0443\u0434\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u00bb. Mailcow \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0448\u0442\u0430\u0442\u043d\u044b\u043c, \u0430 \u0432\u0441\u0451 \u0441\u0432\u043e\u0451 \u043b\u0435\u0436\u0438\u0442 \u0432 \u043e\u0434\u043d\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439.<\/p>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0434\u043e\u043b\u0433\u043e\u0435 \u0432\u043e \u0432\u0441\u0435\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0431\u044b\u043b\u043e \u043d\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434, \u0430 \u0432\u044b\u044f\u0441\u043d\u0438\u0442\u044c, \u043a\u0430\u043a \u0432\u0435\u0434\u0443\u0442 \u0441\u0435\u0431\u044f \u0447\u0443\u0436\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b: \u0447\u0442\u043e Pingvin \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u043f\u0440\u043e\u0441\u0440\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d, \u043f\u043e\u0447\u0435\u043c\u0443 SOGo \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043c\u043e\u0439 \u0441\u043a\u0440\u0438\u043f\u0442, \u0433\u0434\u0435 \u0432 CKEditor 5 \u043a\u043e\u043d\u0435\u0446 \u043f\u0438\u0441\u044c\u043c\u0430. \u0415\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u0442\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c, \u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u043f\u043e\u0434 \u0440\u0443\u043a\u043e\u0439 F12 \u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 Network, \u043e\u043d\u0438 \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u044f\u0442 \u0432\u0430\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0447\u0435\u043c \u043b\u044e\u0431\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f.<\/p>\n<p>\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0430\u043c\u0438, Gateway, \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439 \u0434\u043b\u044f \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432: [\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 GitHub].<\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043a\u0430\u043a \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0440\u0435\u0448\u0430\u044e\u0442 \u0443 \u0432\u0430\u0441. Nextcloud \u0440\u044f\u0434\u043e\u043c \u0441 \u043f\u043e\u0447\u0442\u043e\u0439, \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b\u043e\u043e\u0431\u043c\u0435\u043d\u043d\u0438\u043a, \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0434\u043d\u044f\u043b\u0438 \u043b\u0438\u043c\u0438\u0442 \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0434\u043e 50 \u041c\u0411 \u0438 \u0441\u043c\u0438\u0440\u0438\u043b\u0438\u0441\u044c? \u0420\u0430\u0441\u0441\u043a\u0430\u0436\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1104186\/\">https:\/\/habr.com\/ru\/articles\/1104186\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mailcow \u0443 \u043d\u0430\u0441 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0447\u0442\u043e\u0432\u044b\u0445 \u0434\u043e\u043c\u0435\u043d\u043e\u0432 \u0441\u0442\u0430\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0442\u0440\u0451\u0445. \u0421\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0438 \u043f\u0438\u0448\u0443\u0442 \u0438 \u0441 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430, \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043d\u0430\u0448\u0438\u043c\u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u0433\u0435\u043d\u0442\u0430\u043c\u0438, \u0438 \u0441 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e, \u0434\u043b\u044f \u043c\u0435\u0436\u0434\u0443\u043d\u0430\u0440\u043e\u0434\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u043a\u0438.\u0414\u0435\u0440\u0436\u0430\u0442\u044c \u043f\u043e\u0447\u0442\u0443 \u0443 \u0442\u043e\u0433\u043e \u0436\u0435 \u042f\u043d\u0434\u0435\u043a\u0441\u0430 \u0438\u043b\u0438 Mail.ru \u043f\u043e \u0434\u0435\u043d\u044c\u0433\u0430\u043c \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e, \u043d\u043e \u0437\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u0432\u0435\u0440\u0445 \u0442\u0430\u0440\u0438\u0444\u0430, \u0431\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u043d\u0435 \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c, \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u043f\u043b\u0430\u0447\u0438\u0432\u0430\u0442\u044c. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c AD, \u0434\u0430\u0442\u044c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0443 \u0437\u0430\u0439\u0442\u0438 \u0432 \u0447\u0443\u0436\u043e\u0439 \u044f\u0449\u0438\u043a, \u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0435 \u043a\u043e\u043f\u0438\u0438 \u043f\u0438\u0441\u0435\u043c: \u0432\u0441\u0451 \u044d\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0430\u0440\u0438\u0444 \u0438 \u0434\u043e\u0440\u043e\u0436\u0435. \u0417\u0430\u0442\u043e \u0442\u0430\u043a\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043d\u0430\u0431\u0438\u0442\u044b \u0444\u0438\u0448\u043a\u0430\u043c\u0438: \u043e\u0431\u043b\u0430\u043a\u043e, \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440, \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0432 \u043f\u043e\u0447\u0442\u0435, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u043b\u0435\u043f\u0438\u0442\u044c \u0447\u0443\u0442\u044c \u043b\u0438 \u043d\u0435 CRM \u0434\u043b\u044f \u0431\u0435\u0434\u043d\u044b\u0445.\u0410 \u0442\u0443\u0442 \u0435\u0449\u0451 \u043f\u0440\u0438\u043b\u0451\u0442 \u043f\u043e \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u0443 \u042f\u043d\u0434\u0435\u043a\u0441\u0430, \u0438 \u0447\u0430\u0441\u0442\u044c \u043f\u0438\u0441\u0435\u043c \u043f\u043e\u0442\u0435\u0440\u044f\u043b\u0430\u0441\u044c \u0431\u0435\u0437 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f.\u0421 \u044d\u0442\u043e\u0433\u043e \u0438 \u043d\u0430\u0447\u0430\u043b\u0441\u044f \u043f\u0435\u0440\u0435\u0435\u0437\u0434 \u043d\u0430 \u0441\u0432\u043e\u0439 \u043f\u043e\u0447\u0442\u043e\u0432\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440. \u041f\u0435\u0440\u0432\u043e\u0439 \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b\u0430 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0447\u0442\u0430, \u043a \u043d\u0435\u0439 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0438 AD, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u0432\u043e\u0434\u0438\u0442\u044c \u044f\u0449\u0438\u043a\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0438 \u043d\u0435 \u0432\u043e\u0437\u0438\u0442\u044c\u0441\u044f \u0441 \u043f\u0430\u0440\u043e\u043b\u044f\u043c\u0438. \u041a\u043e\u0433\u0434\u0430 IP \u043f\u0440\u043e\u0433\u0440\u0435\u043b\u0441\u044f \u0432 \u0430\u043d\u0442\u0438\u0441\u043f\u0430\u043c-\u0431\u0430\u0437\u0430\u0445 \u0438 \u0443 \u043d\u0435\u0433\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0440\u0435\u043f\u0443\u0442\u0430\u0446\u0438\u044f, \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u043b\u0438 \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0434\u043e\u043c\u0435\u043d\u044b.\u0418 \u0432\u043e\u0442 \u0442\u0443\u0442 \u043d\u0430\u0447\u0430\u043b\u0438\u0441\u044c \u0441\u0442\u0435\u043d\u0430\u043d\u0438\u044f \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432, \u043f\u0440\u0438\u0432\u044b\u043a\u0448\u0438\u0445 \u043a \u042f\u043d\u0434\u0435\u043a\u0441\u0443, Mail.ru \u0438 Gmail. \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 SOGo \u00ab\u043d\u0435 \u0442\u0430\u043a\u043e\u0439\u00bb, \u00ab\u0441\u0442\u0440\u0451\u043c\u043d\u044b\u0439\u00bb. \u0413\u0434\u0435 \u043c\u043e\u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u044b, \u0443 \u043c\u0435\u043d\u044f \u043f\u0440\u043e\u043f\u0430\u043b\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u044c, \u0430 \u0435\u0449\u0451 \u043f\u0438\u0441\u044c\u043c\u0430 \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u044f \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044e \u0442\u0443\u0434\u0430 \u0444\u0430\u0439\u043b\u044b. \u042f \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b, \u0430 \u0442\u0430\u043c \u044d\u043a\u0441\u0435\u043b\u044c \u043d\u0430 90 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442. \u0423\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u043b\u0438\u043c\u0438\u0442\u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043d\u0435 \u0441\u043f\u0430\u0441\u043b\u043e: \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u0438\u0441\u044c\u043c\u0430 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438. \u041f\u043e\u043f\u044b\u0442\u043a\u0438 \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f, \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u043e \u00ab\u0430 \u0432\u043e\u0442 \u0440\u0430\u043d\u044c\u0448\u0435 \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e\u00bb.\u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f, \u043a\u0430\u043a \u043b\u044e\u0434\u0438 \u0440\u0435\u0448\u0430\u044e\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u0437 \u043f\u043e\u0447\u0442\u044b. \u041d\u0430\u0445\u043e\u0434\u0438\u043b \u0441\u0442\u0430\u0442\u044c\u044e, \u0433\u0434\u0435 \u043a \u043f\u043e\u0447\u0442\u0435 \u043f\u0440\u0438\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u043b\u0438 Nextcloud, \u043d\u043e \u043c\u043d\u0435 \u044d\u0442\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u043c. \u0411\u043e\u043b\u044c\u0448\u0435 \u0438\u043c\u043f\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043b \u043f\u043e\u0434\u0445\u043e\u0434 \u0441 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u0444\u0430\u0439\u043b\u043e\u0432, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0435\u0441\u0442\u044c \u0441\u0440\u043e\u043a \u0436\u0438\u0437\u043d\u0438. \u0417\u0430\u043e\u0434\u043d\u043e \u043e\u043d \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0433\u043e \u0430\u0440\u0445\u0438\u0432\u0430 \u043f\u0438\u0441\u0435\u043c: \u0442\u044f\u0436\u0451\u043b\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043e\u0441\u0435\u0434\u0430\u044e\u0442 \u0432 \u044f\u0449\u0438\u043a\u0430\u0445.\u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u0442\u0430\u043a\u0438\u0435:\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u043c\u043e\u0436\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u0448\u0451\u043b \u0432 \u043f\u043e\u0447\u0442\u0443, \u0438 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043b\u043e\u0433\u0438\u043d\u043e\u0432 \u0438 \u043f\u0430\u0440\u043e\u043b\u0435\u0439 \u2014 \u0438\u043d\u0430\u0447\u0435 \u0438\u043c \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f;\u0441\u043a\u0430\u0447\u0430\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u043b\u044e\u0431\u043e\u0439, \u0443 \u043a\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0430, \u0431\u0435\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438;\u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0442\u044c \u043a\u043e\u0434 \u0441\u0430\u043c\u043e\u0433\u043e Mailcow, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u043e\u044f\u0442\u044c\u0441\u044f update.sh;\u0432\u0441\u0451 \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0444\u0430\u0439\u043b\u0430\u0445 \u0438 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0431\u0435\u0437 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u0448\u0430\u043c\u0430\u043d\u0441\u0442\u0432\u0430.\u0414\u0430\u043b\u044c\u0448\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0442\u043e, \u043a \u0447\u0435\u043c\u0443 \u043f\u0440\u0438\u0448\u043b\u0438 \u0432 \u0438\u0442\u043e\u0433\u0435. \u041f\u043e \u0434\u043e\u0440\u043e\u0433\u0435 \u0431\u044b\u043b\u0438 \u0438 \u043e\u0448\u0438\u0431\u043a\u0438: \u0447\u0430\u0441\u0442\u044c \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u043f\u0440\u0438 \u0440\u0443\u0447\u043d\u043e\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u0447\u0430\u0441\u0442\u044c \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u043b\u0430 \u0438\u0437 \u043e\u0442\u0437\u044b\u0432\u043e\u0432 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432. \u0420\u0430\u0441\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u0443\u044e \u043d\u0435 \u0431\u0443\u0434\u0443, \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u0442\u043e, \u043d\u0430 \u0447\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u0442\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c.\u041f\u043e\u0447\u0435\u043c\u0443 Pingvin Share X\u041d\u0430 \u0440\u043e\u043b\u044c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u043d\u0443\u0436\u0435\u043d \u0431\u044b\u043b \u043b\u0451\u0433\u043a\u0438\u0439 self-hosted \u0444\u0430\u0439\u043b\u043e\u043e\u0431\u043c\u0435\u043d\u043d\u0438\u043a \u0441\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u0438 \u0441\u0440\u043e\u043a\u043e\u043c \u0436\u0438\u0437\u043d\u0438. \u0412\u044b\u0431\u043e\u0440 \u043f\u0430\u043b \u043d\u0430 Pingvin Share: \u043e\u0434\u0438\u043d \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f, \u0441\u0440\u043e\u043a \u0436\u0438\u0437\u043d\u0438 \u0441\u0441\u044b\u043b\u043e\u043a, \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0447\u0430\u0441\u0442\u044f\u043c\u0438.\u0421 \u043d\u0438\u043c \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441: \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 Pingvin Share \u0430\u0432\u0442\u043e\u0440 \u0437\u0430\u0430\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043b \u043b\u0435\u0442\u043e\u043c 2025 \u0433\u043e\u0434\u0430 \u0438 \u0441\u0430\u043c \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442 \u0444\u043e\u0440\u043a Pingvin Share X. \u0424\u043e\u0440\u043a \u0436\u0438\u0432\u043e\u0439, \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0440\u0435\u043b\u0438\u0437\u044b \u0441 \u043f\u0430\u0442\u0447\u0430\u043c\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438, \u043d\u043e \u0434\u0435\u0440\u0436\u0438\u0442 \u0435\u0433\u043e \u043e\u0434\u0438\u043d \u0447\u0435\u043b\u043e\u0432\u0435\u043a. \u0412\u0435\u0440\u0441\u0438\u044f \u043e\u0431\u0440\u0430\u0437\u0430 \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0430 (v2.1.0), \u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0441\u0442\u043e\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0447\u0442\u0435\u043d\u0438\u044f \u0440\u0435\u043b\u0438\u0437-\u043d\u043e\u0443\u0442\u043e\u0432: Gateway \u043e\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 API Pingvin, \u0430 \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f.\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e Pingvin \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e \u043f\u043e\u0447\u0442\u043e\u0432\u044b\u0435 \u044f\u0449\u0438\u043a\u0438. \u0417\u0430\u0432\u043e\u0434\u0438\u0442\u044c \u0432 \u043d\u0451\u043c \u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430 \u0438\u043b\u0438 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c OIDC \u0441 Keycloak \u0440\u0430\u0434\u0438 \u043e\u0434\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0445\u0435\u043c\u0430 \u0442\u0430\u043a\u0430\u044f:\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u2014 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 PHP-\u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0447\u0438\u0442\u0430\u0435\u0442 \u0441\u0435\u0441\u0441\u0438\u044e Mailcow \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 Nginx \u00ab\u0441\u0432\u043e\u0439\u00bb \u0438\u043b\u0438 \u00ab\u0447\u0443\u0436\u043e\u0439\u00bb.Gateway \u2014 \u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0430 Python (Starlette), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0444\u0430\u0439\u043b \u043e\u0442 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430 \u0438 \u043e\u0442\u0434\u0430\u0451\u0442 \u0435\u0433\u043e \u0432 Pingvin \u043e\u0442 \u0438\u043c\u0435\u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u0439 \u0443\u0447\u0451\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438. \u0417\u0430\u043e\u0434\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u043b\u0438\u043c\u0438\u0442\u044b \u0438 \u0432\u0435\u0434\u0451\u0442 \u0436\u0443\u0440\u043d\u0430\u043b \u00ab\u043a\u0442\u043e \u0447\u0442\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u00bb.Pingvin \u0445\u0440\u0430\u043d\u0438\u0442 \u0444\u0430\u0439\u043b\u044b \u0438 \u043e\u0442\u0434\u0430\u0451\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f. \u0421\u043d\u0430\u0440\u0443\u0436\u0438 \u0443 \u043d\u0435\u0433\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435.Gateway \u0438 Pingvin \u0436\u0438\u0432\u0443\u0442 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c docker-compose.yml \u0440\u044f\u0434\u043e\u043c \u0441 Mailcow \u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u044b \u0441 \u0435\u0433\u043e Nginx \u043e\u0431\u0449\u0435\u0439 Docker-\u0441\u0435\u0442\u044c\u044e. Mailcow \u043f\u0440\u043e \u043d\u0438\u0445 \u0437\u043d\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u2014 \u0438\u043c\u044f \u0441\u0435\u0442\u0438 \u0432 docker-compose.override.yml:services:  nginx-mailcow:    networks:      mailshare:networks:  mailshare:    external: true\u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 \u0437\u0430\u0441\u0443\u043d\u0443\u0442\u044c \u0432\u0441\u0451 \u0432 override \u0441\u0430\u043c\u043e\u0433\u043e Mailcow? \u0422\u043e\u0433\u0434\u0430 update.sh \u0438 docker compose down \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \u043f\u043e\u0447\u0442\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0442\u0440\u043e\u0433\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u043e\u043e\u0431\u043c\u0435\u043d\u043d\u0438\u043a, \u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0444\u0430\u0439\u043b\u043e\u043e\u0431\u043c\u0435\u043d\u043d\u0438\u043a\u0435 \u043c\u0435\u0448\u0430\u0435\u0442 \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u043e\u0447\u0442\u0435. \u041f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u0435\u0435.\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0435\u0437 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043b\u043e\u0433\u0438\u043d\u0430\u0418\u0434\u0435\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f: \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0436\u0438\u0432\u0451\u0442 \u043d\u0430 \u0442\u043e\u043c \u0436\u0435 \u0430\u0434\u0440\u0435\u0441\u0435, \u0447\u0442\u043e \u0438 \u043f\u043e\u0447\u0442\u0430 (\/mailshare\/), \u0430 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c Nginx \u0447\u0435\u0440\u0435\u0437 auth_request \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0443 PHP, \u0435\u0441\u0442\u044c \u043b\u0438 \u0443 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u0436\u0438\u0432\u0430\u044f \u0441\u0435\u0441\u0441\u0438\u044f Mailcow. \u041a\u0443\u043a\u0430 \u043d\u0430 \u0442\u043e\u043c \u0436\u0435 \u0434\u043e\u043c\u0435\u043d\u0435, \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0435\u0451 \u0438 \u0442\u0430\u043a \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442. \u0412\u0442\u043e\u0440\u043e\u0433\u043e \u043b\u043e\u0433\u0438\u043d\u0430 \u043d\u0435\u0442.\u0417\u0434\u0435\u0441\u044c \u0434\u0432\u0430 \u043c\u043e\u043c\u0435\u043d\u0442\u0430.\u041f\u0435\u0440\u0432\u043e\u0435: \u043a\u0443\u043a\u0430 MCSESSID \u0435\u0441\u0442\u044c \u0443 \u0432\u0441\u0435\u0445, \u0434\u0430\u0436\u0435 \u0443 \u0430\u043d\u043e\u043d\u0438\u043c\u0430. Mailcow \u0437\u0430\u0432\u043e\u0434\u0438\u0442 PHP-\u0441\u0435\u0441\u0441\u0438\u044e \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0432\u0445\u043e\u0434\u0430. \u0417\u043d\u0430\u0447\u0438\u0442, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0430\u0434\u043e \u043d\u0435 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u0443\u043a\u0438, \u0430 \u0442\u043e, \u0447\u0442\u043e \u043b\u0435\u0436\u0438\u0442 \u0432 \u0441\u0435\u0441\u0441\u0438\u0438.\u0412\u0442\u043e\u0440\u043e\u0435: \u0448\u0442\u0430\u0442\u043d\u044b\u0439 prerequisites.inc.php \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442. \u042d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0435\u0441\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 Mailcow: \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a Redis \u0438 MySQL, \u0441\u0442\u0443\u0447\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 dockerapi (\u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 500, \u0435\u0441\u043b\u0438 \u0442\u043e\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d), \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u0445\u0435\u043c\u0443 \u0411\u0414, \u043c\u0438\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 CSS \u0438 JS. \u0410 auth_request \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0444\u0430\u0439\u043b\u0430: \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043d\u0430 300 \u041c\u0411 \u043a\u0443\u0441\u043a\u0430\u043c\u0438 \u043f\u043e 10 \u041c\u0411 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0442\u0440\u0438\u0434\u0446\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0445 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 Mailcow.\u041d\u0443\u0436\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u043e\u0433\u0438\u043a\u0430 \u0438\u0437 sessions.inc.php, \u0438 \u0442\u043e \u043d\u0435 \u0446\u0435\u043b\u0438\u043a\u043e\u043c: \u043e\u043d \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0441\u0435\u0441\u0441\u0438\u044e \u0430\u043d\u043e\u043d\u0438\u043c\u0443, \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 LAST_ACTIVITY \u0438 \u0432\u0434\u043e\u0431\u0430\u0432\u043e\u043a \u0443\u043c\u0435\u0435\u0442 \u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443 X-API-Key \u0441 \u043f\u0440\u0430\u0432\u0430\u043c\u0438 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0432\u043e\u044f, \u0438 \u0441\u0435\u0441\u0441\u0438\u044e \u043e\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0442\u0430\u0435\u0442:&lt;?phprequire_once __DIR__ . &#8216;\/inc\/vars.inc.php&#8217;;if (file_exists(__DIR__ . &#8216;\/inc\/vars.local.inc.php&#8217;)) {  include_once __DIR__ . &#8216;\/inc\/vars.local.inc.php&#8217;;}function deny() { http_response_code(401); exit; }\/\/ ID \u0441\u0435\u0441\u0441\u0438\u0438 \u0431\u0435\u0440\u0451\u043c \u0438\u0437 \u043a\u0443\u043a\u0438 \u0441\u0430\u043c\u0438, \u0447\u0442\u043e\u0431\u044b \u0430\u043d\u043e\u043d\u0438\u043c\u0443 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u043b\u0430\u0441\u044c \u043d\u043e\u0432\u0430\u044f$sid = $_COOKIE[$SESSION_NAME] ?? &#187;;if (!preg_match(&#8216;\/^[A-Za-z0-9,-]{22,256}$\/&#8217;, $sid)) deny();ini_set(&#8216;session.use_cookies&#8217;, 0);session_name($SESSION_NAME);session_id($sid);if (!@session_start([&#8216;read_and_close&#8217; =&gt; true])) deny();$s = $_SESSION;if (empty($s[&#8216;mailcow_cc_username&#8217;]))         deny(); \/\/ \u043d\u0435 \u0432\u043e\u0448\u0451\u043bif (($s[&#8216;mailcow_cc_role&#8217;] ?? &#187;) !== &#8216;user&#8217;) deny(); \/\/ \u043d\u0435 \u043f\u043e\u0447\u0442\u043e\u0432\u044b\u0439 \u044f\u0449\u0438\u043aif (isset($s[&#8216;dual-login&#8217;]))                  deny(); \/\/ \u0430\u0434\u043c\u0438\u043d \u043f\u043e\u0434 \u0447\u0443\u0436\u0438\u043c \u044f\u0449\u0438\u043a\u043e\u043cif (!empty($s[&#8216;mailcow_cc_api&#8217;]))             deny(); \/\/ \u0432\u0445\u043e\u0434 \u043f\u043e API-\u043a\u043b\u044e\u0447\u0443if (($s[&#8216;SESS_REMOTE_UA&#8217;] ?? null) !== ($_SERVER[&#8216;HTTP_USER_AGENT&#8217;] ?? &#187;)) deny();if (time() &#8212; ($s[&#8216;LAST_ACTIVITY&#8217;] ?? 0) &gt; $SESSION_LIFETIME) deny();header(&#8216;X-Mailshare-User: &#8216; . $s[&#8216;mailcow_cc_username&#8217;]);http_response_code(204);\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 SESS_REMOTE_UA \u0438 LAST_ACTIVITY \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0442 \u0442\u043e, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0430\u043c Mailcow, \u0438\u043d\u0430\u0447\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0439\u0442\u0438 \u0441 \u0443\u0436\u0435 \u043f\u0440\u043e\u0442\u0443\u0445\u0448\u0435\u0439 \u0441\u0435\u0441\u0441\u0438\u0435\u0439. \u0425\u043e\u0440\u043e\u0448\u0430\u044f \u043d\u043e\u0432\u043e\u0441\u0442\u044c: \u0440\u0430\u0431\u043e\u0442\u0430 \u0432 SOGo \u0441\u0435\u0441\u0441\u0438\u044e \u043f\u0440\u043e\u0434\u043b\u0435\u0432\u0430\u0435\u0442 \u0441\u0430\u043c\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b SOGo \u0438\u0434\u0443\u0442 \u0447\u0435\u0440\u0435\u0437 auth_request \/sogo-auth-verify, \u0442\u043e \u0435\u0441\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0442 \u0436\u0435 PHP. \u0410 \u0432 \u0441\u0432\u0435\u0436\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u0444\u043e\u0440\u043c\u0430 \u0432\u0445\u043e\u0434\u0430 SOGo \u0438 \u0432\u043e\u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0444\u043e\u0440\u043c\u0443 Mailcow, \u0442\u0430\u043a \u0447\u0442\u043e \u0441\u0435\u0441\u0441\u0438\u044f \u0435\u0441\u0442\u044c \u0443 \u0432\u0441\u0435\u0445.\u041a\u0443\u0441\u043e\u043a Nginx (\u043a\u043b\u0430\u0434\u0451\u0442\u0441\u044f \u0432 data\/conf\/nginx\/site.mailshare.custom, Mailcow \u0441\u0430\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0442\u0430\u043a\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u0432\u043d\u0443\u0442\u0440\u044c \u0441\u0430\u0439\u0442\u0430 \u043f\u043e\u0447\u0442\u044b):location = \/mailshare-auth {    internal;    fastcgi_pass php-fpm-mailcow:9002;    include fastcgi_params;    fastcgi_param SCRIPT_FILENAME \/web\/mailshare-auth.php;    fastcgi_pass_request_body off;    fastcgi_param CONTENT_LENGTH &#171;&#187;;}location ^~ \/mailshare\/api\/ {    auth_request \/mailshare-auth;    auth_request_set $mailshare_user $upstream_http_x_mailshare_user;    resolver 127.0.0.11 valid=30s;    set $gw http:\/\/mailshare-gateway:8000;    proxy_pass $gw;    proxy_set_header X-Mailshare-User $mailshare_user;  # \u0437\u0430\u0442\u0438\u0440\u0430\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u043b\u043a\u0443 \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430    client_max_body_size 12m;    proxy_request_buffering off;}\u0415\u0449\u0451 \u0434\u0432\u0435 \u0432\u0435\u0449\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0434\u043e \u0443\u0447\u0435\u0441\u0442\u044c.\u041f\u043e\u0440\u0442 PHP-FPM. \u0412 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u0445 Mailcow \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0438 9001, \u0438 9002. \u041d\u0443\u0436\u0435\u043d 9002 \u2014 \u043f\u0443\u043b \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u0441 \u0442\u0435\u043c\u0438 \u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u0441\u0435\u0441\u0441\u0438\u0439. \u041f\u0440\u043e\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u043a\u043e\u043d\u0444\u0438\u0433: docker compose exec nginx-mailcow grep -n -B6 fastcgi_pass \/etc\/nginx\/nginx.confreturn \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0440\u0430\u043d\u044c\u0448\u0435 auth_request. return \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0444\u0430\u0437\u0435 rewrite, \u0434\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 location \u0441 return \u043e\u0442\u0432\u0435\u0442\u0438\u0442 \u043a\u043e\u043c\u0443 \u0443\u0433\u043e\u0434\u043d\u043e, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0430\u043d\u043e\u043d\u0438\u043c\u0430. \u0412\u0441\u0451, \u0447\u0442\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439, \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432 FastCGI.Gateway \u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 API Pingvin\u0423 Pingvin \u043d\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e API \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u0436\u0435 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u0442\u0430\u0440\u044b\u0439 \u0438 \u043d\u0430\u0434\u0451\u0436\u043d\u044b\u0439: \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0447\u0435\u0440\u0435\u0437 SSH-\u0442\u0443\u043d\u043d\u0435\u043b\u044c, F12 \u2192 Network, \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u043d\u0430 \u043f\u0430\u0440\u0443 \u0441\u043e\u0442\u0435\u043d \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442 \u0438 \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0443\u0445\u043e\u0434\u0438\u0442. \u0412 \u0432\u0435\u0440\u0441\u0438\u0438 2.1.0 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:POST \/api\/auth\/signIn                          \u2192 \u043a\u0443\u043a\u0430 access_token (JWT \u043d\u0430 15 \u043c\u0438\u043d\u0443\u0442)POST \/api\/shares                               {&#171;id&#187;, &#171;expiration&#187;: &#171;180-days&#187;, &#171;size&#187;, &#8230;}POST \/api\/shares\/&lt;id&gt;\/files\/upload-init        {&#171;id&#187;: &lt;uuid \u0444\u0430\u0439\u043b\u0430&gt;, &#171;name&#187;, &#171;totalChunks&#187;}POST \/api\/shares\/&lt;id&gt;\/files?id=..&amp;name=..&amp;chunkIndex=N&amp;totalChunks=M   (\u0441\u044b\u0440\u044b\u0435 \u0431\u0430\u0439\u0442\u044b)POST \/api\/shares\/&lt;id&gt;\/complete                 \u2192 202, \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c\u0428\u0430\u0433\u0430 upload-init \u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f\u0445 \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043d\u0435\u0442, \u043e\u043d \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439. \u0422\u0430\u043a \u0447\u0442\u043e \u0441\u0432\u0435\u0440\u044f\u0439\u0442\u0435\u0441\u044c \u0441 \u0442\u0440\u0430\u0444\u0438\u043a\u043e\u043c \u0441\u0432\u043e\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438, \u0430 \u043d\u0435 \u0441\u043e \u0441\u0442\u0430\u0440\u044b\u043c\u0438 \u0433\u0430\u0439\u0434\u0430\u043c\u0438.Gateway \u2014 \u044d\u0442\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0442\u0435\u043d \u0441\u0442\u0440\u043e\u043a \u043d\u0430 Starlette \u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0430 \u0441 \u0434\u0440\u0430\u0433-\u043d-\u0434\u0440\u043e\u043f\u043e\u043c. \u0411\u0440\u0430\u0443\u0437\u0435\u0440 \u0440\u0435\u0436\u0435\u0442 \u0444\u0430\u0439\u043b \u043d\u0430 \u0447\u0430\u0441\u0442\u0438 \u0438 \u0448\u043b\u0451\u0442 \u0438\u0445 \u0432 Gateway, Gateway \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430 \u0438 \u043b\u0438\u043c\u0438\u0442\u044b \u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0447\u0430\u0441\u0442\u0438 \u0432 Pingvin. \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043e\u043d \u0431\u0435\u0440\u0451\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b Nginx, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0440\u0442\u043e\u0432 \u043d\u0430\u0440\u0443\u0436\u0443 \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442. \u0412\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u044e\u0449\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441 Origin \u043f\u043e\u0447\u0442\u043e\u0432\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430, \u0447\u0442\u043e\u0431\u044b \u0447\u0443\u0436\u043e\u0439 \u0441\u0430\u0439\u0442 \u043d\u0435 \u043c\u043e\u0433 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043e\u0442 \u0438\u043c\u0435\u043d\u0438 \u0432\u043e\u0448\u0435\u0434\u0448\u0435\u0433\u043e \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430.\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 API, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0434\u043e \u0443\u0447\u0435\u0441\u0442\u044c.\u0420\u0430\u0437\u043c\u0435\u0440 \u0447\u0430\u0441\u0442\u0438 \u2014 \u043d\u0435 \u0432\u0430\u0448\u0435 \u0434\u0435\u043b\u043e. Pingvin \u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u0442 \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438, \u043e\u043d \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u0435\u0433\u043e \u0438\u0437 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0443\u0436\u0435 \u043f\u0440\u0438\u043d\u044f\u0442\u043e\u0433\u043e \u0438 \u0441\u0432\u043e\u0435\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 share.chunkSize. \u0420\u0435\u0437\u0430\u0442\u044c \u043d\u0430\u0434\u043e \u0440\u043e\u0432\u043d\u043e \u0442\u0430\u043a, \u043a\u0430\u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0432 Pingvin (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 10 000 000 \u0431\u0430\u0439\u0442), \u0438\u043d\u0430\u0447\u0435 \u0432\u0442\u043e\u0440\u0430\u044f \u0436\u0435 \u0447\u0430\u0441\u0442\u044c \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u00ab\u043d\u0435 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443\u00bb. Gateway \u0447\u0438\u0442\u0430\u0435\u0442 \u0435\u0451 \u0438\u0437 GET \/api\/configs. \u0417\u0430\u0442\u043e \u043d\u0430 \u0447\u0430\u0441\u0442\u044c \u043d\u0435 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443 Pingvin \u0447\u0435\u0441\u0442\u043d\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 400 \u0441 \u043f\u043e\u043b\u0435\u043c expectedChunkIndex, \u0438 \u043d\u0430 \u044d\u0442\u043e\u043c \u043b\u0435\u0433\u043a\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u043a\u0430\u0447\u043a\u0443 \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u0440\u044b\u0432\u0430 \u0441\u0432\u044f\u0437\u0438.403 \u0432\u043c\u0435\u0441\u0442\u043e 401. \u0422\u043e\u043a\u0435\u043d \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u0439 \u0443\u0447\u0451\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0436\u0438\u0432\u0451\u0442 15 \u043c\u0438\u043d\u0443\u0442. \u041a\u043e\u0433\u0434\u0430 \u043e\u043d \u0438\u0441\u0442\u0435\u043a\u0430\u0435\u0442, Pingvin \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 share \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0435 \u00ab401, \u0432\u043e\u0439\u0434\u0438\u0442\u0435 \u0437\u0430\u043d\u043e\u0432\u043e\u00bb, \u0430 \u00ab403, \u043d\u0435\u043b\u044c\u0437\u044f\u00bb.\u041f\u043e\u044d\u0442\u043e\u043c\u0443 Gateway \u0447\u0438\u0442\u0430\u0435\u0442 exp \u0438\u0437 JWT \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0442\u043e\u043a\u0435\u043d \u0437\u0430 \u043c\u0438\u043d\u0443\u0442\u0443 \u0434\u043e \u043a\u043e\u043d\u0446\u0430, \u0430 \u043d\u0430 401 \u0438 403 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0432\u0445\u043e\u0434\u0438\u0442 \u0437\u0430\u043d\u043e\u0432\u043e \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441. \u0415\u0441\u043b\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u0442\u0435 \u0447\u0442\u043e-\u0442\u043e \u0441 \u0442\u043e\u043a\u0435\u043d\u0430\u043c\u0438,&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-501859","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/501859","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=501859"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/501859\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=501859"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=501859"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=501859"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}