{"id":459267,"date":"2025-05-12T03:34:53","date_gmt":"2025-05-12T03:34:53","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=459267"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=459267","title":{"rendered":"<span>\u041f\u0438\u0448\u0435\u043c \u0441\u0432\u043e\u0439 pastebin, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0442\u043e\u043b\u044c\u043a\u043e userver<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8e9\/200\/087\/8e920008778d18bdcbc2e7ced2c6741b.png\" width=\"1786\" height=\"1000\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/8e9\/200\/087\/8e920008778d18bdcbc2e7ced2c6741b.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8e9\/200\/087\/8e920008778d18bdcbc2e7ced2c6741b.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0412\u0430\u0441\u0438\u043b\u0438\u0439 \u041a\u0443\u043b\u0438\u043a\u043e\u0432, \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432\u0435\u0434\u0443\u0449\u0438\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u0432\u00a0\u0422\u0435\u0445\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u0415\u043a\u043e\u043c\u0430 \u0438 \u0420\u0430\u0439\u0434\u0442\u0435\u0445\u0430 \u042f\u043d\u0434\u0435\u043a\u0441\u0430 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043f\u044f\u0442\u044c \u043b\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a <a href=\"https:\/\/userver.tech\/\">userver<\/a>. \u042d\u0442\u043e \u0432\u0435\u0431\u2011\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u044b\u0441\u043e\u043a\u043e\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043d\u0430\u00a0\u0421++. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a\u00a0\u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430\u00a0\u043d\u0451\u043c \u0438\u0433\u0440\u0443\u0448\u0435\u0447\u043d\u044b\u0439, \u043d\u043e\u00a0\u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0441\u0435\u0440\u0432\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c pastebin. \u0421\u0435\u0440\u0432\u0438\u0441 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0440\u043e\u043b\u044c \u0431\u044d\u043a\u0435\u043d\u0434\u0430 (\u0438 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430) \u0441\u0430\u0439\u0442\u0430, \u043d\u0430\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u043e\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0443\u044e \u0437\u0430\u043c\u0435\u0442\u043a\u0443 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430\u00a0\u043d\u0435\u0451. \u0422\u0430\u043a\u0436\u0435 \u043d\u0430\u00a0\u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u043a\u0430\u043a\u00a0\u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0430\u00a0userver \u0438 \u043a\u0430\u043a\u043e\u0439 API \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f\u00a0\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0431\u044d\u043a\u0435\u043d\u0434\u0430.<\/p>\n<h3>\u041e\u0431\u0449\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/h3>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c\u0441\u044f \u0441\u00a0\u043e\u0431\u0449\u0435\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439 \u0441\u0430\u0439\u0442\u0430. \u041f\u0443\u0441\u0442\u044c \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 stateless\u2011\u0441\u0435\u0440\u0432\u0438\u0441 upastebin \u0441\u043e \u0441\u0432\u043e\u0435\u0439 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 Postgres. \u0422\u043e\u0442\u00a0\u0436\u0435 upastebin \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u043a\u0443 (HTML, JS, CSS) \u0438\u0437\u00a0\u043f\u0430\u043c\u044f\u0442\u0438. \u0412\u00a0\u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u0441\u00a0\u0442\u044f\u0436\u0451\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u0438\u043a\u043e\u0439 \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0441\u044f\u00a0\u0431\u044b nginx \u0441\u00a0\u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u2011\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u043c, \u043d\u043e\u00a0\u0432\u00a0\u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043e\u0431\u043e\u0439\u0434\u0451\u043c\u0441\u044f \u0431\u0435\u0437\u00a0\u043d\u0438\u0445.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/83a\/73f\/0d8\/83a73f0d8e8c54c1f28c4914c70d88ab.png\" width=\"760\" height=\"248\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/83a\/73f\/0d8\/83a73f0d8e8c54c1f28c4914c70d88ab.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/83a\/73f\/0d8\/83a73f0d8e8c54c1f28c4914c70d88ab.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c\u0441\u044f \u0441\u00a0\u0442\u0435\u043c, \u0447\u0442\u043e\u00a0\u0434\u043e\u043b\u0436\u043d\u043e\u00a0\u0431\u044b\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0432\u00a0upastebin. \u041d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0441\u00a0\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043c\u0435\u0442\u043a\u043e\u0439. \u0427\u0442\u043e\u0431\u044b \u043d\u0435\u00a0\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043d\u0430\u00a0\u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0431\u044d\u043a\u0435\u043d\u0434\u0430, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c \u0435\u0451 \u0432\u00a0\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435. \u0417\u0430\u00a0\u0441\u0447\u0451\u0442 \u044d\u0442\u043e\u0433\u043e \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u043e\u0439 \u0438 \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u0442\u00a0\u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u043a\u00a0\u0437\u0430\u043c\u0435\u0442\u043a\u0435.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0434\u043b\u044f\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0437\u0430\u043c\u0435\u0442\u043a\u0438. \u0418\u0437\u00a0API\u2011\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u043e\u0432 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435: \u0434\u043b\u044f\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0438, \u0434\u043b\u044f\u00a0\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430 \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0438 \u0434\u043b\u044f\u00a0\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0437\u0430\u043c\u0435\u0442\u043e\u043a.<\/p>\n<p>\u0414\u043b\u044f\u00a0\u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0\u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0411\u0414) \u043d\u0443\u0436\u043d\u044b:<\/p>\n<ul>\n<li>\n<p><code>POST \/api\/v1\/posts<\/code>\u00a0\u2014 \u0434\u043b\u044f\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0437\u0430\u043c\u0435\u0442\u043a\u0438;<\/p>\n<\/li>\n<li>\n<p><code>GET \/api\/v1\/posts\/{id}<\/code>\u00a0\u2014 \u0434\u043b\u044f\u00a0\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043c\u0435\u0442\u043a\u0438;<\/p>\n<\/li>\n<li>\n<p><code>GET \/api\/v1\/latest<\/code>\u00a0\u2014 \u0434\u043b\u044f\u00a0\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 N \u0437\u0430\u043c\u0435\u0442\u043e\u043a.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f\u00a0\u043e\u0442\u0434\u0430\u0447\u0438 \u0441\u0442\u0430\u0442\u0438\u043a\u0438:<\/p>\n<ul>\n<li>\n<p><code>\/{id}<\/code>\u00a0\u2014 \u0434\u043b\u044f\u00a0\u043e\u0442\u0434\u0430\u0447\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u00a0\u0437\u0430\u043c\u0435\u0442\u043a\u043e\u0439;<\/p>\n<\/li>\n<li>\n<p><code>\/<\/code>\u00a0\u2014 \u0434\u043b\u044f\u00a0\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0430;<\/p>\n<\/li>\n<li>\n<p><code>\/r\/*<\/code>\u00a0\u2014 \u0434\u043b\u044f\u00a0\u043e\u0442\u0434\u0430\u0447\u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u0438\u043a\u0438 (JS, CSS).<\/p>\n<\/li>\n<\/ul>\n<h3>\u041f\u0440\u0438\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0418\u0442\u0430\u043a, \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0435\u043c \u043a\u00a0\u0440\u0430\u0431\u043e\u0442\u0435. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0447\u0430\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u00a0\u043d\u0443\u043b\u044f, \u0430\u00a0\u043c\u043e\u0436\u0435\u043c \u0432\u0437\u044f\u0442\u044c \u0437\u0430\u00a0\u043e\u0441\u043d\u043e\u0432\u0443 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0438\u0437<a href=\"https:\/\/github.com\/userver-framework?q=template&amp;type=all\"> \u0441\u043f\u0438\u0441\u043a\u0430<\/a>. \u0418 \u043d\u0430\u043c \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442 <a href=\"https:\/\/github.com\/userver-framework\/pg_service_template\">\u043e\u0434\u0438\u043d \u0438\u0437\u00a0\u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432<\/a>. \u041d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 Use this template \u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442. \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e README, \u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439:<\/p>\n<pre><code class=\"cpp\">git clone https:\/\/github.com\/segoon\/upastebin\/ &amp;&amp; cd upastebin<\/code><\/pre>\n<p>\u0414\u043b\u044f\u00a0\u0437\u0430\u043c\u0435\u043d\u044b \u0438\u043c\u0435\u043d\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 <code>pg_service_template<\/code> \u043d\u0430 <code>upastebin<\/code> \u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0438\u043c \u0438\u0437\u00a0README \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">find . -not -path \".\/third_party\/\" -not -path \".git\/\" -not -path '.\/build_*' -type f | xargs sed -i 's\/pg_service_template\/upastebin\/g'<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a\u00a0\u043f\u0440\u043e\u0435\u043a\u0442\u0443 userver. \u0415\u0441\u0442\u044c <a href=\"https:\/\/userver.tech\/d3\/da9\/md_en_2userver_2tutorial_2build.html\">\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432<\/a>, \u043a\u0430\u043a\u00a0\u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c:<\/p>\n<ul>\n<li>\n<p>\u0441\u043a\u0430\u0447\u0430\u0442\u044c deb\u2011\u043f\u0430\u043a\u0435\u0442 \u0441\u00a0GitHub \u0441 <a href=\"https:\/\/github.com\/userver-framework\/userver\/releases\/\">\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0440\u0435\u043b\u0438\u0437\u043e\u043c<\/a> (\u0441\u0435\u0439\u0447\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b \u0434\u043b\u044f\u00a0Ubuntu 22.04);<\/p>\n<\/li>\n<li>\n<p>\u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c userver \u0438 <a href=\"https:\/\/github.com\/userver-framework\/userver\/blob\/develop\/scripts\/build_and_install_all.sh\">\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0435\u0433\u043e<\/a>\u00a0\u043b\u0438\u0431\u043e \u0447\u0435\u0440\u0435\u0437 cmake \u2011install,\u00a0\u043b\u0438\u0431\u043e \u0447\u0435\u0440\u0435\u0437 cpack + dpkg \u2011i;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c userver \u043a\u00a0\u043d\u0430\u0448\u0435\u043c\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u043a\u0430\u043a\u00a0\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a\u00a0\u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0432\u00a0\u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u043c <a href=\"https:\/\/userver.tech\/d3\/da9\/md_en_2userver_2tutorial_2build.html#autotoc_md575\">\u0434\u043e\u043a\u0435\u0440\u2011\u043e\u0431\u0440\u0430\u0437\u0435 Ubuntu 22.04<\/a> \u0441\u00a0\u043f\u0440\u0435\u0434\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c userver.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u00a0\u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u044b\u0431\u0435\u0440\u0435\u043c \u043f\u0443\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438:<\/p>\n<pre><code class=\"cpp\">cd third_party git clone --depth 1 https:\/\/github.com\/userver-framework\/userver.git<\/code><\/pre>\n<p>\u041d\u0435\u00a0\u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <code>third_party\/userver<\/code> \u0432 <code>gitignore<\/code>! \u0415\u0441\u043b\u0438\u00a0\u0431\u044b \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c\u00a0\u0431\u044b\u043b\u043e\u00a0\u0431\u044b \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c userver \u0432\u00a0\u0441\u0432\u043e\u044e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e, \u0430 <code>third_party\/userver<\/code> \u0432\u00a0\u043a\u0430\u0436\u0434\u043e\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0438\u043c\u043b\u0438\u043d\u043a\u0430\u043c\u0438 \u043d\u0430\u00a0\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 userver.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:<\/p>\n<pre><code class=\"cpp\">make build-debug<\/code><\/pre>\n<p>\u042d\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 cmake \u0432\u00a0\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>build_debug<\/code> \u0438 \u0441\u043e\u0431\u0435\u0440\u0451\u0442 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0430 <code>build_debug\/upastebin<\/code>. \u0414\u043b\u044f\u00a0\u0441\u0431\u043e\u0440\u043a\u0438 \u0440\u0435\u043b\u0438\u0437\u0430 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u0435 debug \u043d\u0430\u00a0release.<\/p>\n<p>\u041f\u0440\u043e\u0433\u043d\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b (\u044e\u043d\u0438\u0442\u2011\u0442\u0435\u0441\u0442\u044b <code>gtest<\/code> \u0438 <code>testsuite<\/code>, \u0442.\u00a0\u0435. \u0442\u0435\u0441\u0442\u044b \u0443\u0440\u043e\u0432\u043d\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430) \u043c\u043e\u0436\u043d\u043e \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<pre><code class=\"cpp\">make test-debug<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f\u00a0\u0431\u044b\u0441\u0442\u0440\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0451\u0440\u0433\u0430\u0442\u044c \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u044b \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e curl \u0438\u043b\u0438\u00a0\u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0430\u0439\u0442 \u0432\u00a0\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435, \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:<\/p>\n<pre><code class=\"cpp\">make service-start-debug<\/code><\/pre>\n<p>\u041e\u043d\u0430 \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u0442 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043e\u0442\u00a0\u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0431\u0430\u0437\u0443 Postgres. \u0421\u0435\u0440\u0432\u0438\u0441 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0441\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u043c, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0443\u043a\u0430\u0437\u0430\u043d \u043f\u043e\u0440\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e Postgres\u2011\u0434\u0435\u043c\u043e\u043d\u0430. \u041f\u0440\u0438\u00a0\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u043e\u00a0Ctrl + C \u0441\u0435\u0440\u0432\u0438\u0441, Postgres \u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e \u0438 \u043f\u043e\u0434\u0447\u0438\u0449\u0435\u043d\u043e.<\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u0451\u0440\u0433\u0430\u0442\u044c \u0440\u0443\u0447\u043a\u0443 <code>\/ping<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0436\u0438\u0432\u043e\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e curl:<\/p>\n<pre><code class=\"cpp\">$ curl -vs http:\/\/localhost:8080\/ping *   Trying 127.0.0.1:8080... * Connected to localhost (127.0.0.1) port 8080 (#0) &gt; GET \/ping HTTP\/1.1 &gt; Host: localhost:8080 &gt; User-Agent: curl\/7.81.0 &gt; Accept: *\/* &gt;  * Mark bundle as not supporting multiuse &lt; HTTP\/1.1 200 OK &lt; Date: Wed, 22 Jan 2025 08:54:34 UTC &lt; Content-Type: application\/octet-stream &lt; Server: userver\/2.3-rc (20240801002050; rv:ac9b1cd) &lt; Accept-Encoding: gzip, zstd, identity &lt; X-YaRequestId: 5036899c44a844408d6a8c2520dc3556 &lt; X-YaTraceId: da1003fad6ef4532a714350ff1c2a3a7 &lt; X-YaSpanId: c48dc23f495a3476 &lt; Connection: keep-alive &lt; Content-Length: 0 &lt;  * Connection #0 to host localhost left intact<\/code><\/pre>\n<p>\u041e\u0436\u0438\u0434\u0430\u0435\u043c\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0442\u0430\u0442\u0443\u0441 200, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u0432\u0438\u0434\u0438\u043c \u043d\u0430\u0431\u043e\u0440 \u0445\u0435\u0434\u0435\u0440\u043e\u0432, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0434\u043b\u044f\u00a0\u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0438 \u0442\u0440\u0435\u0439\u0441\u0438\u043d\u0433\u0430 <code>(X-Ya*)<\/code>.<\/p>\n<h3>\u041e\u0442\u0434\u0430\u0447\u0430 \u0441\u0442\u0430\u0442\u0438\u043a\u0438<\/h3>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446\u2011\u0442\u043e \u043d\u0430\u0447\u043d\u0451\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c! \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u043e\u0432, \u0434\u043b\u044f\u00a0\u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0443\u0436\u043d\u044b \u0441\u0435\u043a\u0446\u0438\u044f \u0441\u00a0\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0432\u00a0\u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0435 \u0438 \u043a\u043e\u0434 \u044d\u0442\u043e\u0433\u043e \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430 (.cpp\u2011 \u0438.hpp\u2011\u0444\u0430\u0439\u043b\u044b).<\/p>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441\u00a0\u0440\u0430\u0437\u0434\u0430\u0447\u0438 \u0441\u0442\u0430\u0442\u0438\u043a\u0438. \u041b\u044e\u0431\u043e\u0439 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u0432\u00a0userver \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u0432\u0438\u0434\u0435 \u043a\u043b\u0430\u0441\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d \u043e\u0442 <code>server::handlers::HttpHandlerBase<\/code>. \u0418\u043d\u0441\u0442\u0430\u043d\u0441 \u043a\u043b\u0430\u0441\u0441\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d \u043f\u0440\u0438\u00a0\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432\u00a0\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0441\u0442\u0430\u0440\u0442\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u0430.<\/p>\n<p>\u0412\u00a0\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430\u00a0\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430 \u0438\u0437\u00a0\u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432. \u0414\u043b\u044f\u00a0\u0440\u0430\u0437\u0434\u0430\u0447\u0438 \u0441\u0442\u0430\u0442\u0438\u043a\u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d <a href=\"https:\/\/userver.tech\/da\/dd3\/classcomponents_1_1FsCache.html\">components::FsCache<\/a>, \u0430\u00a0\u0442\u043e\u0447\u043d\u0435\u0435 \u0435\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442 <a href=\"https:\/\/userver.tech\/d7\/d47\/classfs_1_1FsCacheClient.html\">fs::FsCacheClient<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u00a0\u0441\u0442\u0430\u0440\u0442\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0432\u044b\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0432\u00a0\u043f\u0430\u043c\u044f\u0442\u044c \u0438 \u043c\u043e\u0436\u0435\u0442 \u043e\u0447\u0435\u043d\u044c\u00a0\u0431\u044b\u0441\u0442\u0440\u043e \u043e\u0442\u0434\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u043e\u00a0\u0437\u0430\u043f\u0440\u043e\u0441\u0443. \u041f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c FsCacheClient \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u043f\u0435\u0440\u0435\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438, \u0447\u0442\u043e\u00a0\u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u0432\u00a0\u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0444\u0430\u0439\u043b\u043e\u0432 \u0431\u0435\u0437\u00a0\u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 (\u043f\u0440\u0438\u00a0\u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e).<\/p>\n<p>\u0412\u00a0\u043c\u0435\u0442\u043e\u0434\u0435 <code>HandleRequestThrow()<\/code> \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u0434 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 HTTP\u2011\u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0432\u0437\u044f\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0438\u0437\u00a0URL, \u043f\u043e\u00a0\u043d\u0435\u043c\u0443 \u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0432\u00a0FsCacheClient \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430. \u0414\u043b\u044f\u00a0\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u00a0\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u043d\u0430\u043c \u0442\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 Content\u2011Type, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u043f\u043e\u00a0\u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044e \u00ab\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430\u00a0\u2014 \u0442\u0438\u043f \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430\u00bb. \u0415\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u0441\u00a0\u0442\u0430\u043a\u0438\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u043d\u0435\u00a0\u0431\u044b\u043b \u043d\u0430\u0439\u0434\u0435\u043d, \u043c\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043a\u043e\u0434 \u043e\u0448\u0438\u0431\u043a\u0438 404. \u041f\u0440\u0438\u00a0\u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043a\u043e\u0434 \u043e\u0448\u0438\u0431\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0442\u0435\u043b\u043e\u043c \u0434\u043b\u044f\u00a0\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432\u00a0\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435, \u043d\u043e\u00a0\u043c\u044b \u044d\u0442\u043e \u043e\u043f\u0443\u0441\u0442\u0438\u043c \u0434\u043b\u044f\u00a0\u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b.<\/p>\n<p>\u041f\u0438\u0448\u0435\u043c \u0445\u0435\u0434\u0435\u0440:<\/p>\n<details class=\"spoiler\">\n<summary>src\/resources.hpp<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#pragma once  #include &lt;userver\/http\/common_headers.hpp&gt; #include &lt;userver\/server\/handlers\/http_handler_base.hpp&gt; #include &lt;userver\/fs\/fs_cache_client.hpp&gt;   namespace upastebin {  class ResourcesHandler final     : public userver::server::handlers::HttpHandlerBase {  public:   \/\/ \u0418\u043c\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430, \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0432 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0435 \u0438 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432   static constexpr std::string_view kName = \"handler-resources\";    ResourcesHandler(const userver::components::ComponentConfig&amp; config,                    const userver::components::ComponentContext&amp; context);    std::string HandleRequestThrow(       const userver::server::http::HttpRequest&amp; request,       userver::server::request::RequestContext&amp;) const override;   private:   const userver::fs::FsCacheClient&amp; fs_client_; };  }  \/\/ namespace upastebin<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u0438\u0448\u0435\u043c cpp\u2011\u0444\u0430\u0439\u043b:<\/p>\n<details class=\"spoiler\">\n<summary>src\/resources.cpp<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include \"resources.hpp\"  #include &lt;userver\/components\/component_config.hpp&gt; #include &lt;userver\/components\/component_context.hpp&gt; #include &lt;userver\/components\/fs_cache.hpp&gt;  namespace upastebin {  namespace {  std::string_view GetContentType(std::string_view extention) {   if (extention == \".js\")     return \"application\/javascript\";   else if (extention == \".css\")     return \"text\/css\";   else if (extention == \".html\")     return \"text\/html; charset=UTF-8\";   else     return \"application\/octet-stream\"; }  }  \/\/ namespace  ResourcesHandler::ResourcesHandler(     const userver::components::ComponentConfig&amp; config,     const userver::components::ComponentContext&amp; context)     : HttpHandlerBase(config, context),       fs_client_(           context.FindComponent&lt;userver::components::FsCache&gt;(\"resources-cache\")               .GetClient()) {}  std::string ResourcesHandler::HandleRequestThrow(     const userver::server::http::HttpRequest&amp; request,     userver::server::request::RequestContext&amp;) const {   auto subpath = request.GetPathArg(\"subpath\");   \/\/ Note: \u043d\u0435\u0442 \u043d\u0443\u0436\u0434\u044b \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c subpath, \u0442.\u043a. FsCacheClient \u043d\u0435 \u043e\u0442\u0434\u0430\u0441\u0442 \u0444\u0430\u0439\u043b \u043d\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043f\u0443\u0442\u044c    auto file_ptr = fs_client_.TryGetFile(\"\/\" + subpath);   auto&amp; response = request.GetHttpResponse();   if (file_ptr) {     response.SetContentType(GetContentType(file_ptr-&gt;extension));     return file_ptr-&gt;data;   } else {     auto&amp; response = request.GetHttpResponse();     response.SetStatus(userver::server::http::HttpStatus::kNotFound);     return {};   } }  }  \/\/ namespace upastebin<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u00a0\u0441\u0435\u0431\u0435 \u0434\u0432\u0435 \u0432\u0435\u0449\u0438: \u0432\u044b\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0438\u0437\u00a0ComponentConfig \u0442\u0435\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u0432\u00a0\u0441\u0435\u043a\u0446\u0438\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0432\u00a0\u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0435, \u0438 \u043f\u043e\u0438\u0441\u043a \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 ComponentContext. \u0412\u00a0\u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0443\u00a0\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430 \u043d\u0435\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0449\u0435\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 FsCache \u043f\u043e\u00a0\u0442\u0438\u043f\u0443, \u0438\u0437\u00a0\u043d\u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0451\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043f\u043e\u00a0\u0441\u0441\u044b\u043b\u043a\u0435 \u0432\u00a0\u043f\u043e\u043b\u0435 \u043a\u043b\u0430\u0441\u0441\u0430. \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437\u00a0\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0433\u043e\u0442\u043e\u0432 \u043a\u00a0\u0440\u0430\u0431\u043e\u0442\u0435.<\/p>\n<p>\u0412\u00a0HandleRequestThrow \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0451, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0439 HTTP\u2011\u0437\u0430\u043f\u0440\u043e\u0441. \u041a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0435. \u0412\u00a0\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0440\u0443\u0442\u0438\u043d, \u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u041e\u0421. \u0415\u0441\u043b\u0438 \u0432\u00a0\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0435 \u043c\u044b \u0445\u043e\u0434\u0438\u043c \u0432\u00a0\u0431\u0430\u0437\u0443 \u0438\u043b\u0438\u00a0\u0432\u00a0\u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u0442\u043e \u0438\u0437\u2011\u0437\u0430 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u043b\u0433\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432\u00a0\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0441\u043d\u0430. \u042d\u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0435\u00a0\u043e\u0442\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043d\u043e\u00a0\u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0430\u043c\u044f\u0442\u0438. \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0440\u0438\u0441\u043a\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u043c\u043e\u0436\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 (\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>max_requests_in_flight<\/code>) \u0438\u043b\u0438\u00a0RPS (\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>max_requests_per_second<\/code>). \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u044d\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 <a href=\"https:\/\/userver.tech\/d1\/ddc\/classserver_1_1handlers_1_1HandlerBase.html\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 userver<\/a>.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043f\u0443\u0442\u0438 \u0438\u0437 <code>request.GetPathArg()<\/code>. Query\u2011\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u0438\u00a0\u0431\u044b \u0447\u0435\u0440\u0435\u0437 <code>GetArg()<\/code>. \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u00a0\u0444\u0430\u0439\u043b \u0432\u00a0\u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0447\u0435\u0440\u0435\u0437 <code>TryGetFile()<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>shared_ptr<\/code>. \u0415\u0441\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043f\u0443\u0441\u0442\u043e\u0439, \u0442\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <code>HttpResponse<\/code> \u0438\u0437 <code>HttpRequest<\/code> \u0447\u0435\u0440\u0435\u0437 <code>GetHttpResponse()<\/code> \u0438 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0442\u0430\u0442\u0443\u0441 404\u00a0\u0447\u0435\u0440\u0435\u0437 <code>SetStatus()<\/code>. \u0415\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u043d\u0430\u0439\u0434\u0435\u043d, \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430\u00a0\u0435\u0433\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435, \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437\u00a0\u0447\u0435\u0433\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0445\u0435\u0434\u0435\u0440 Content\u2011Type \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u044b\u0437\u043e\u0432\u0430 <code>HttpResponse::SetContentType()<\/code>. \u041d\u0430\u00a0\u044d\u0442\u043e\u043c \u043a\u043e\u0434 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430 \u0433\u043e\u0442\u043e\u0432.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u0439\u043c\u0451\u043c\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u043c. \u0423\u00a0\u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u044f \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0430 \u0432\u00a0yaml\u2011\u0444\u0430\u0439\u043b\u0435 \u0432\u00a0\u0441\u0435\u043a\u0446\u0438\u0438 <code>components_manager.components.&lt;component&gt;<\/code>. \u0414\u043b\u044f\u00a0\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430 \u0442\u0430\u043c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u043f\u0443\u0442\u044c, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0442\u0430\u0441\u043a\u2011\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.<\/p>\n<p>\u0414\u043b\u044f\u00a0\u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0440\u0443\u0447\u0435\u043a \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0442\u0430\u0441\u043a\u2011\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 <code>main-task-processor<\/code>, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u043f\u043e\u00a0\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0412\u00a0\u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0430\u0441\u043a\u2011\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430\u0445 \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0442\u043e\u043a \u041e\u0421 (\u043e\u0431\u044b\u0447\u043d\u043e <code>fs-task-processor<\/code>), \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0434\u0430\u0436\u0435 \u043f\u0440\u0438\u00a0\u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e\u043c \u043e\u0442\u043a\u0430\u0437\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0442\u0430\u0441\u043a\u2011\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432 (\u043e\u0431\u044b\u0447\u043d\u043e <code>stats-task-processor<\/code> \u0434\u043b\u044f\u00a0\u043e\u0442\u0434\u0430\u0447\u0438 \u043c\u0435\u0442\u0440\u0438\u043a).<\/p>\n<details class=\"spoiler\">\n<summary>configs\/static_config.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">            handler-resources:                 path: \/r\/{subpath}                 method: GET                 task_processor: main-task-processor<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041d\u0430\u0448 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u0433\u043e\u0442\u043e\u0432. \u0417\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e \u0432\u00a0\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0432 <code>main()<\/code>:<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441, \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 <code>resources-cache<\/code>. \u041c\u044b \u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u043b\u0438, \u043d\u043e\u00a0\u043d\u0435\u00a0\u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0432\u00a0\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0438 \u0432\u00a0\u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0435. \u0418\u0441\u043f\u0440\u0430\u0432\u0438\u043c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0432 <code>main.cpp<\/code>:<\/p>\n<pre><code class=\"cpp\">component_list.Append&lt;userver::components::FsCache&gt;(\"resources-cache\");<\/code><\/pre>\n<p>\u0418 \u0432\u00a0\u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u043d\u0444\u0438\u0433:<\/p>\n<pre><code class=\"cpp\">        resources-cache:             dir: \/var\/www             update-period: 1m             fs-task-processor: fs-task-processor<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0435\u0440\u0432\u0438\u0441 \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442.<\/p>\n<p>\u041e\u0442\u0434\u0430\u0447\u0430 <code>\/<\/code> \u0438 <code>\/{id}<\/code> \u0431\u0443\u0434\u0435\u0442 \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430. \u0412\u043c\u0435\u0441\u0442\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u0444\u0430\u0439\u043b\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0438\u0437\u00a0\u043a\u0435\u0448\u0430.<\/p>\n<h3>\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0442\u043a\u0438<\/h3>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u0434\u043b\u044f\u00a0\u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0437\u0430\u043c\u0435\u0442\u043a\u0438. \u042d\u0442\u043e \u0431\u0443\u0434\u0443\u0442 \u0444\u0430\u0439\u043b\u044b <code>src\/store.{hpp,cpp}<\/code>. \u0417\u0430\u0432\u0435\u0434\u0451\u043c \u043d\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 <code>StoreHandler<\/code>, \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043e\u0442 <code>server::handlers::HttpHandlerBase<\/code>. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u00a0\u043d\u0435\u0433\u043e \u043f\u043e\u043b\u0435 \u0442\u0438\u043f\u0430 <code>storages::postgres::ClusterPtr<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a\u00a0Postgres.<\/p>\n<p>\u041f\u0438\u0448\u0435\u043c hpp\u2011\u0444\u0430\u0439\u043b:<\/p>\n<details class=\"spoiler\">\n<summary>src\/store.hpp<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#pragma once  #include &lt;userver\/server\/handlers\/http_handler_base.hpp&gt; #include &lt;userver\/storages\/postgres\/postgres_fwd.hpp&gt;  namespace upastebin {  class StoreHandler final : public userver::server::handlers::HttpHandlerBase {  public:   static constexpr std::string_view kName = \"handler-store\";    StoreHandler(const userver::components::ComponentConfig&amp; config,                const userver::components::ComponentContext&amp; context);    std::string HandleRequestThrow(       const userver::server::http::HttpRequest&amp; request,       userver::server::request::RequestContext&amp;) const override;   private:   userver::storages::postgres::ClusterPtr pg_; };  }  \/\/ namespace upastebin<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0417\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438\u043d\u043a\u043b\u0443\u0434\u2011\u0444\u0430\u0439\u043b <code>postgres_fwd.hpp<\/code>, \u0430\u00a0\u043d\u0435 <code>postgres.hpp<\/code>. \u0414\u043b\u044f\u00a0\u043c\u043d\u043e\u0433\u0438\u0445 \u0445\u0435\u0434\u0435\u0440\u043e\u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0431\u043b\u0435\u0433\u0447\u0451\u043d\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 _fwd, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442 \u0442\u0438\u043f\u044b, \u043d\u043e\u00a0\u043d\u0435\u00a0\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0438\u0445. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u0438\u043d\u043a\u043b\u0443\u0434\u0438\u0442\u044c \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u0435\u0435 \u043b\u0451\u0433\u043a\u0438\u0439 \u0445\u0435\u0434\u0435\u0440 \u0438\u0437\u00a0\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0445\u0435\u0434\u0435\u0440\u043e\u0432. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p>\u0412\u00a0\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043a\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 <code>userver::components::Postgres<\/code> \u0438 \u0437\u0430\u0431\u0438\u0440\u0430\u0442\u044c \u0443\u00a0\u043d\u0435\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u00a0\u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0447\u0435\u0440\u0435\u0437 <code>GetCluster()<\/code>. \u0427\u0435\u0440\u0435\u0437 \u044d\u0442\u043e\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a\u00a0\u0411\u0414.<\/p>\n<p>\u0412 <code>HandleRequestThrow()<\/code> \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 <code>id<\/code> \u0434\u043b\u044f\u00a0\u0437\u0430\u043c\u0435\u0442\u043a\u0438\u00a0\u2014 \u0434\u043b\u044f\u00a0\u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u043f\u0443\u0441\u0442\u044c \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 UUID. \u0418\u0437 <code>query<\/code> \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>author<\/code>, \u0438\u0437\u00a0\u0442\u0435\u043b\u0430 \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u043c\u0435\u0442\u043a\u0438, \u0438\u0437 <code>HttpRequest<\/code> \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u043c IP \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u0435\u043b\u0430\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043a\u00a0\u0411\u0414 \u043d\u0430 <code>INSERT<\/code>. \u0412\u00a0\u0442\u0435\u043a\u0441\u0442\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c JSON \u0441\u00a0id \u0437\u0430\u043c\u0435\u0442\u043a\u0438.<\/p>\n<p>\u041f\u0438\u0448\u0435\u043c cpp\u2011\u0444\u0430\u0439\u043b:<\/p>\n<details class=\"spoiler\">\n<summary>src\/store.cpp<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include \"store.hpp\"  #include &lt;userver\/components\/component_context.hpp&gt; #include &lt;userver\/formats\/json\/inline.hpp&gt; #include &lt;userver\/http\/common_headers.hpp&gt; #include &lt;userver\/server\/handlers\/exceptions.hpp&gt; #include &lt;userver\/server\/handlers\/http_handler_base.hpp&gt; #include &lt;userver\/storages\/postgres\/cluster.hpp&gt; #include &lt;userver\/storages\/postgres\/component.hpp&gt; #include &lt;userver\/utils\/boost_uuid4.hpp&gt; #include &lt;userver\/utils\/datetime.hpp&gt;  namespace upastebin {  StoreHandler::StoreHandler(const userver::components::ComponentConfig&amp; config,                            const userver::components::ComponentContext&amp; context)     : HttpHandlerBase(config, context),       pg_(context.FindComponent&lt;userver::components::Postgres&gt;(\"postgres\")               .GetCluster()) {}  std::string StoreHandler::HandleRequestThrow(     const userver::server::http::HttpRequest&amp; request,     userver::server::request::RequestContext&amp;) const {   auto uuid = userver::utils::generators::GenerateBoostUuid();   auto author = request.GetArg(\"author\");   auto ip_source = request.GetRemoteAddress().PrimaryAddressString();   auto text = request.RequestBody();   auto created_at = userver::utils::datetime::Now();    pg_-&gt;Execute(userver::storages::postgres::ClusterHostType::kMaster,                \"INSERT INTO upastebin.texts (uuid, author, ip_source, text, created_at) VALUES \"                \"($1, $2, $3, $4, $5);\",                uuid, author, ip_source, text, created_at);    auto json_response = userver::formats::json::MakeObject(\"uuid\",                                             userver::utils::ToString(uuid));   return ToString(json_response); }  }  \/\/ namespace upastebin<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u043b\u044f\u00a0\u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code>utils::datetime::Now()<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>std::chrono::system_clock::now()<\/code>, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u043c\u043e\u043a\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0432\u00a0\u0442\u0435\u0441\u0442\u0430\u0445. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u00a0\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0442\u0435\u0441\u0442\u043e\u0432 \u0438 \u0441\u0432\u0435\u0440\u043a\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 INSERT. \u0421\u0430\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>Cluster::Execute()<\/code>.<\/p>\n<p><code>Cluster<\/code>\u00a0\u2014 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043a\u00a0\u0411\u0414. \u0417\u0430\u00a0\u043d\u0438\u043c \u0441\u0442\u043e\u0438\u0442 \u043d\u0435\u00a0\u043e\u0434\u043d\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435, \u0430\u00a0\u0446\u0435\u043b\u044b\u0439 \u043f\u0443\u043b. \u0414\u0440\u0430\u0439\u0432\u0435\u0440 Postgres \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0432\u00a0\u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438, \u043f\u0435\u0440\u0435\u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u00a0\u0438\u0445 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0435, \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e <a href=\"https:\/\/userver.tech\/d1\/d92\/classcomponents_1_1Postgres.html\">\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0430<\/a>. \u0412\u00a0\u043a\u0440\u0430\u0439\u043d\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <code>Execute()<\/code> \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u043e\u0442\u043a\u0440\u043e\u0435\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441\u00a0\u0411\u0414.<\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <code>Execute()<\/code>\u00a0\u2014 \u0442\u0438\u043f \u0445\u043e\u0441\u0442\u0430 \u0432\u00a0\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u0411\u0414. \u041c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u043c\u0430\u0441\u0442\u0435\u0440, \u0441\u0438\u043d\u043a \u0441\u043b\u0435\u0439\u0432, \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0441\u043b\u0435\u0439\u0432, \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0439 \u0445\u043e\u0441\u0442. \u0414\u043b\u044f\u00a0\u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u00a0\u0411\u0414 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043c\u0430\u0441\u0442\u0435\u0440.<\/p>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0443 <code>Execute()<\/code>\u00a0\u2014 \u0441\u0430\u043c SQL\u2011\u0437\u0430\u043f\u0440\u043e\u0441. \u0421\u043b\u0435\u0434\u043e\u043c \u0438\u0434\u0443\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u0415\u0441\u043b\u0438 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d, \u0442\u043e <code>Execute() <\/code>\u0432\u0435\u0440\u043d\u0451\u0442 ResultSet \u0441\u00a0\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438. \u0412\u00a0\u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d\u0438 \u043d\u0435\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u0415\u0441\u043b\u0438 SQL\u2011\u0437\u0430\u043f\u0440\u043e\u0441 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u043f\u043e\u00a0\u043e\u0448\u0438\u0431\u043a\u0435 \u043b\u044e\u0431\u043e\u0433\u043e \u0442\u0438\u043f\u0430\u00a0\u2014 \u0441\u0435\u0442\u0435\u0432\u043e\u0439, \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442), \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430)\u00a0\u2014 <code>Execute()<\/code> \u0432\u044b\u043a\u0438\u043d\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435. \u042d\u0442\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043c\u044b \u043d\u0438\u043a\u0430\u043a \u043d\u0435\u00a0\u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c: \u043a\u043e\u0434, \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 HandleRequestThrow(), \u043f\u043e\u00a0\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043b\u043e\u0432\u0438\u0442 \u0432\u0441\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u0434 HTTP\u2011\u043e\u0448\u0438\u0431\u043a\u0438 500, \u0447\u0442\u043e\u00a0\u0434\u043b\u044f\u00a0\u043d\u0430\u0441 \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442. \u0412\u00a0\u043a\u043e\u043d\u0446\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u043c JSON\u2011\u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u00a0\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043f\u043e\u043b\u0435\u043c id \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0435\u0433\u043e \u0438\u0437\u00a0\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430 \u0432\u00a0\u0442\u0435\u043b\u0435 \u043e\u0442\u0432\u0435\u0442\u0430.<\/p>\n<h3>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0442\u043a\u0438<\/h3>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a\u00a0\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0443 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u043f\u043e\u00a0id. \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u00a0\u043e\u0442\u00a0\u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 <code>src\/store.hpp<\/code> \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043c\u0435\u043d\u0435\u043c \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c <code>kName<\/code>. \u0412 <code>HandleRequestThrow()<\/code> \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c <code>id<\/code> \u0438\u0437\u00a0query, \u0441\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 <code>UUID<\/code> \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u043a\u00a0\u0411\u0414. <code>Execute()<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>ResultSet<\/code>, \u0438\u0437\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438 \u0435\u0433\u043e \u043f\u043e\u043b\u0435 \u0441\u00a0\u0438\u043c\u0435\u043d\u0435\u043c <code>text<\/code>. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u044d\u0442\u043e \u043f\u043e\u043b\u0435 \u0432\u00a0\u0432\u0438\u0434\u0435 \u0442\u0435\u043b\u0430 \u043e\u0442\u0432\u0435\u0442\u0430. \u0415\u0441\u043b\u0438 <code>ResultSet<\/code> \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043f\u0443\u0441\u0442\u044b\u043c, \u0442\u043e \u0437\u0430\u043c\u0435\u0442\u043a\u0430 \u0441\u00a0\u0442\u0430\u043a\u0438\u043c <code>id<\/code> \u043d\u0435\u00a0\u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0438 \u043c\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 404.<\/p>\n<details class=\"spoiler\">\n<summary>src\/retrieve_by_uuid.cpp<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include \"retrieve_by_uuid.hpp\"  #include &lt;userver\/components\/component_context.hpp&gt; #include &lt;userver\/storages\/postgres\/cluster.hpp&gt; #include &lt;userver\/storages\/postgres\/component.hpp&gt; #include &lt;userver\/utils\/boost_uuid4.hpp&gt;  namespace upastebin {  RetrieveHandler::RetrieveHandler(     const userver::components::ComponentConfig&amp; config,     const userver::components::ComponentContext&amp; context)     : HttpHandlerBase(config, context),       pg_(context.FindComponent&lt;userver::components::Postgres&gt;(\"postgres\")               .GetCluster()) {}  std::string RetrieveHandler::HandleRequestThrow(     const userver::server::http::HttpRequest&amp; request,     userver::server::request::RequestContext&amp;) const {   auto uuid_str = request.GetPathArg(\"uuid\");   auto uuid = userver::utils::BoostUuidFromString(uuid_str);    auto result = pg_-&gt;Execute(       userver::storages::postgres::ClusterHostType::kSlave,       \"SELECT text FROM upastebin.texts WHERE uuid=($1::TEXT);\", uuid);   if (result.Size() == 0) {     request.GetHttpResponse().SetStatusNotFound();     return {};   }    auto row = result.Front();   auto text = row[\"text\"].As&lt;std::string&gt;();   return text; }  }  \/\/ namespace upastebin<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h3>\u0421\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0437\u0430\u043c\u0435\u0442\u043e\u043a<\/h3>\n<p>\u041d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0435\u0449\u0451 \u043e\u0434\u043d\u0430 \u0440\u0443\u0447\u043a\u0430 \u0434\u043b\u044f\u00a0\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u0431\u043e\u0440\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0437\u0430\u043c\u0435\u0442\u043e\u043a, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0438\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u043d\u0430\u00a0\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435. \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u00a0\u2014 <code>LatestHandler<\/code>. \u0425\u0435\u0434\u0435\u0440 \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u00a0\u0436\u0435, \u043a\u0430\u043a\u00a0\u0438 \u0443\u00a0\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0434\u0432\u0443\u0445. \u0412 <code>HandleRequestThrow()<\/code> \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c SELECT\u2011\u0437\u0430\u043f\u0440\u043e\u0441 \u043a\u00a0Postgres \u0434\u043b\u044f\u00a0\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 N \u0437\u0430\u043c\u0435\u0442\u043e\u043a. <code>Execute()<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u043c \u044d\u0442\u0438 \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0432 <code>ResultSet<\/code>. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u00a0\u043d\u0435\u043c\u0443 \u0438\u0442\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>for-each<\/code>.<\/p>\n<p>\u0421\u0430\u043c\u0438 \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u00a0JSON\u2011\u0444\u043e\u0440\u043c\u0435. \u0420\u0430\u0431\u043e\u0442\u0430 \u0441\u00a0JSON \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0434\u043d\u0438\u043c \u0438\u0437\u00a0\u0434\u0432\u0443\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432. \u0412\u043e\u2011\u043f\u0435\u0440\u0432\u044b\u0445, \u0434\u043b\u044f\u00a0\u0434\u043e\u0441\u0442\u0443\u043f\u0430 read\u2011only \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <code>formats::json::Value<\/code>\u00a0\u2014 \u043b\u0451\u0433\u043a\u0430\u044f \u043e\u0431\u0451\u0440\u0442\u043a\u0430 \u043d\u0430\u0434 \u043d\u043e\u0434\u043e\u0439 \u0434\u0435\u0440\u0435\u0432\u0430 JSON. \u0412\u043e\u2011\u0432\u0442\u043e\u0440\u044b\u0445, \u0434\u043b\u044f\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e JSON value \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0431\u0438\u043b\u0434\u0435\u0440 <code>formats::json::ValueBuilder<\/code>. \u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f\u00a0\u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043a\u0440\u0430\u0435\u0432\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 <code>x[\"foo\"] = y[\"bar\"]<\/code>. \u0422\u0443\u0442 \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043f\u0443\u0442\u0430\u043d\u0438\u0446\u0430: \u044d\u0442\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0435\u0440\u0435\u0432\u0430 \u0438\u043b\u0438\u00a0\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430\u00a0\u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e? \u0427\u0442\u043e\u0431\u044b \u043d\u0435\u00a0\u0432\u043e\u0437\u043d\u0438\u043a\u0430\u043b\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432, \u0442\u0438\u043f\u044b \u043d\u0430\u00a0\u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0440\u0430\u0437\u043d\u0435\u0441\u0435\u043d\u044b. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u0431\u043e\u0440\u043a\u0438 JSON \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 <code>ExtractValue()<\/code> \u0443\u00a0\u0431\u0438\u043b\u0434\u0435\u0440\u0430.<\/p>\n<p>\u041d\u0430\u0448\u0430 \u0440\u0443\u0447\u043a\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 JSON, \u0438\u0437\u2011\u0437\u0430 \u0447\u0435\u0433\u043e \u0435\u0451 \u043c\u043e\u0436\u043d\u043e\u00a0\u0431\u044b\u043b\u043e\u00a0\u0431\u044b \u043e\u0442\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043e\u0442 <code>JsonHandlerBase<\/code>. \u0412\u00a0\u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0436\u043d\u043e\u00a0\u0431\u044b\u043b\u043e\u00a0\u0431\u044b \u043d\u0435\u00a0\u0441\u043e\u0432\u0435\u0440\u0448\u0430\u0442\u044c\u00a0\u043b\u0438\u0448\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u00a0\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 JSON \u0432\u00a0\u0441\u0442\u0440\u043e\u043a\u0443. \u041e\u0434\u043d\u0430\u043a\u043e JSON handler \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 JSON\u2011\u0437\u0430\u043f\u0440\u043e\u0441, \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 JSON\u2011\u043e\u0442\u0432\u0435\u0442, \u0430\u00a0\u043c\u044b\u00a0\u043b\u0438\u0448\u044c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c JSON.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/848\/339\/0ba\/8483390bacf3c997b5fb3fbe9741c6e1.png\" width=\"760\" height=\"516\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/848\/339\/0ba\/8483390bacf3c997b5fb3fbe9741c6e1.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/848\/339\/0ba\/8483390bacf3c997b5fb3fbe9741c6e1.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041a\u043e\u0434 src\/latest.cpp:<\/p>\n<details class=\"spoiler\">\n<summary>src\/latest.cpp<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include \"latest.hpp\"  #include &lt;userver\/components\/component_context.hpp&gt; #include &lt;userver\/formats\/json\/inline.hpp&gt; #include &lt;userver\/formats\/json\/value_builder.hpp&gt; #include &lt;userver\/storages\/postgres\/cluster.hpp&gt; #include &lt;userver\/storages\/postgres\/component.hpp&gt; #include &lt;userver\/utils\/boost_uuid4.hpp&gt;  namespace upastebin {  LatestHandler::LatestHandler(     const userver::components::ComponentConfig&amp; config,     const userver::components::ComponentContext&amp; context)     : HttpHandlerBase(config, context),       pg_(context.FindComponent&lt;userver::components::Postgres&gt;(\"postgres\")               .GetCluster()) {}  std::string LatestHandler::HandleRequestThrow(     const userver::server::http::HttpRequest&amp;,     userver::server::request::RequestContext&amp;) const {   auto result = pg_-&gt;Execute(       userver::storages::postgres::ClusterHostType::kSlave,       \"SELECT author, substring(text for $1::INTEGER) AS text_tr, ip_source \"       \"FROM \"       \"upastebin.texts ORDER BY created_at DESC LIMIT $2::INTEGER;\",       1000, 10);    userver::formats::json::ValueBuilder response(       userver::formats::common::Type::kArray);   for (const auto&amp; item : result) {     userver::formats::json::ValueBuilder response_item;      response_item[\"author\"] = item[\"author\"].As&lt;std::string&gt;();     response_item[\"ip\"] = item[\"ip_source\"].As&lt;std::string&gt;();     response_item[\"text\"] = item[\"text_tr\"].As&lt;std::string&gt;();      response.PushBack(response_item.ExtractValue());   }   return ToString(       userver::formats::json::MakeObject(\"items\", response.ExtractValue())); }  }  \/\/ namespace upastebin<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h3>\u0422\u0435\u0441\u0442\u044b<\/h3>\n<p>\u041c\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0441\u0430\u043c\u044b\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u044b \u0434\u043b\u044f\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0437\u0430\u043c\u0435\u0442\u043e\u043a\u00a0\u2014 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043d\u0430\u00a0\u043d\u0438\u0445 \u0442\u0435\u0441\u0442\u044b!<\/p>\n<p>\u0414\u043b\u044f\u00a0userver \u0442\u0435\u0441\u0442\u044b \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u043d\u0430\u00a0\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435 <a href=\"https:\/\/github.com\/yandex\/yandex-taxi-testsuite\">yandex\u2011taxi\u2011testsuite<\/a>. \u041e\u043d \u043e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430\u00a0pytest \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u0444\u0438\u043a\u0441\u0442\u0443\u0440 \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f\u00a0\u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0\u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438, \u043c\u043e\u043a\u0430\u043c\u0438, \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u00a0\u0442.\u00a0\u0434. \u0414\u043b\u044f\u00a0\u0440\u0430\u0431\u043e\u0442\u044b \u0442\u0435\u0441\u0442\u043e\u0432 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f upastebin \u0432\u00a0\u0437\u0430\u043c\u043e\u043a\u0430\u043d\u043d\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u0434\u043d\u044f\u0442 \u0441\u0432\u043e\u0439 PostgreSQL.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u0435\u0440\u0432\u0438\u0441 \u0432\u00a0testsuite\u2011\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u0435\u043c\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0411\u0414 \u0441\u00a0\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445. \u042d\u0442\u0430 \u0441\u0445\u0435\u043c\u0430 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u0444\u0430\u0439\u043b\u0430\u0445 <code>postgresql\/schemas\/*.sql<\/code>. \u041e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u00a0\u043e\u0434\u043d\u0438 \u0438 \u0442\u0435\u00a0\u0436\u0435 \u0444\u0430\u0439\u043b\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f\u00a0\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0445\u0435\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0432\u00a0\u0442\u0435\u0441\u0442\u0430\u0445, \u0438 \u0432\u00a0\u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0445\u0435\u043c\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u0444\u043e\u0440\u043c\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u00a0\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f, \u043d\u043e\u00a0\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u00a0\u043d\u043e\u0432\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439.<\/p>\n<p>\u041c\u044b \u043e\u0431\u043e\u0439\u0434\u0451\u043c\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u0444\u0430\u0439\u043b\u043e\u043c \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439 <code>db_1.sql<\/code>:<\/p>\n<details class=\"spoiler\">\n<summary>postgresql\/schemas\/db_1.sql<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">DROP SCHEMA IF EXISTS upastebin CASCADE;  CREATE SCHEMA IF NOT EXISTS upastebin;  CREATE TABLE IF NOT EXISTS upastebin.texts (     uuid TEXT PRIMARY KEY,     author TEXT NOT NULL,     ip_source TEXT NOT NULL,     text TEXT NOT NULL,     created_at TIMESTAMPTZ NOT NULL );<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0427\u0442\u043e\u0431\u044b testsuite \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0441\u00a0\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0435\u0439 \u0441\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438, \u0430\u00a0\u043d\u0435 <code>\u0441\u00a0\/var\/www-data<\/code>, \u0435\u043c\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0443\u0442\u044c \u043a\u00a0\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0432\u00a0\u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0435. \u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u00a0\u0444\u0430\u0439\u043b\u0435 <a href=\"http:\/\/conftest.py\">conftest.py<\/a> \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u0443 \u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0451 \u0432\u00a0\u0441\u043f\u0438\u0441\u043e\u043a <code>USERVER_CONFIG_HOOKS<\/code>. \u0412\u00a0\u044d\u0442\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u0430 \u0444\u0438\u043a\u0441\u0442\u0443\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u0435\u043d\u044f\u044e\u0442 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u043d\u0444\u0438\u0433. \u0412\u00a0\u0441\u0430\u043c\u043e\u0439 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u0435 \u043c\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u0435\u043d\u044f\u0435\u0442 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u2011\u043a\u043e\u043d\u0444\u0438\u0433.<\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u043d\u0444\u0438\u0433, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0432\u00a0\u0444\u043e\u0440\u043c\u0435 \u0441\u043b\u043e\u0432\u0430\u0440\u044f. \u0412\u00a0\u043d\u0451\u043c \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b \u0434\u043b\u044f\u00a0testsuite.<\/p>\n<details class=\"spoiler\">\n<summary>tests\/conftest.py<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">USERVER_CONFIG_HOOKS = ['prepare_service_config_resources']  WWW_DATA = pathlib.Path(__file__).parent.parent \/ 'www-data' ... @pytest.fixture(scope='session') def prepare_service_config_resources():     def patch_config(config, config_vars):         components = config['components_manager']['components']         components['resources-cache']['dir'] = str(WWW_DATA)      return patch_config<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u0435\u0441\u043b\u0438 \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0438\u0437\u00a0\u043a\u043e\u0440\u043d\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f <code>make test-debug<\/code>, \u043e\u043d\u0430 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u0435\u0437\u00a0\u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0442\u0443\u0434\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u00a0\u2014 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043e\u0434\u0438\u043d \u0438\u0437\u00a0\u043d\u0438\u0445 \u043f\u043e\u00a0\u043a\u043e\u0441\u0442\u043e\u0447\u043a\u0430\u043c. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a pytest\u2011\u0442\u0435\u0441\u0442\u0430 \u0432\u00a0\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e <code>tests\/<\/code> \u0441\u00a0\u0438\u043c\u0435\u043d\u0435\u043c \u0441\u00a0\u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u043c <code>test_<\/code>:<\/p>\n<details class=\"spoiler\">\n<summary>tests\/test_crud.py<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">... async def test_create_and_retrieve(service_client):     response = await service_client.post(         '\/api\/v1\/posts\/', params={'author': 'foo'}, data=TEXT,     )     assert response.status == 200      json_response = response.json()     assert list(json_response) == ['uuid']     uuid = json_response['uuid']      response = await service_client.get(f'\/api\/v1\/posts\/{uuid}')     assert response.status == 200     assert response.text == TEXT      response = await service_client.get('\/api\/v1\/latest')     assert response.status == 200     assert response.json() == {         'items': [{'author': 'foo', 'ip': '::ffff:127.0.0.1', 'text': TEXT}],     }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u00a0\u0441\u0443\u0442\u0438, \u0442\u0435\u0441\u0442\u00a0\u2014 \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u00a0pytest\u2011\u0442\u0435\u0441\u0442\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c\u0441\u044f \u0441 <code>test_<\/code> \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b\u2011\u0444\u0438\u043a\u0441\u0442\u0443\u0440\u044b. \u0412\u00a0\u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u0435\u0441\u0442\u0443 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u0430 <code>service_client<\/code>, \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a\u00a0\u0441\u0435\u0440\u0432\u0438\u0441\u0443 <code>upastebin<\/code>. \u041c\u044b \u0445\u043e\u0442\u0438\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0435\u0441\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0441\u0442\u0438\u0442 \u0437\u0430\u043c\u0435\u0442\u043a\u0443, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0435\u0451 \u043f\u043e\u00a0\u0430\u0439\u0434\u0438\u0448\u043d\u0438\u043a\u0443, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0435\u0451 \u0432\u00a0\u0441\u043f\u0438\u0441\u043a\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0437\u0430\u043c\u0435\u0442\u043e\u043a.<\/p>\n<p>GET\/POST\u2011\u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>get\/post<\/code> \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u044b <code>service_client<\/code>. \u041f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0442\u0443\u0434\u0430 <code>HTTP path<\/code>, <code>query parameters<\/code> \u0432 <code>params<\/code>, \u0442\u0435\u043b\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 <code>data<\/code>. \u0412\u00a0\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <code>response<\/code>, \u0443\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u043e\u043b\u0435 <code>status<\/code> \u0440\u0430\u0432\u043d\u044f\u0435\u0442\u0441\u044f <code>HTTP status code<\/code>, \u043c\u0435\u0442\u043e\u0434 <code>json<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0438\u043b\u0438\u00a0\u0441\u043f\u0438\u0441\u043e\u043a \u0441\u00a0\u0440\u0430\u0441\u043f\u0430\u0440\u0448\u0435\u043d\u043d\u044b\u043c JSON\u2011\u0442\u0435\u043b\u043e\u043c \u043e\u0442\u0432\u0435\u0442\u0430, \u0430\u00a0\u043f\u043e\u043b\u0435 <code>text<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 plaintext \u0442\u0435\u043b\u0430 \u043e\u0442\u0432\u0435\u0442\u0430.<\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e\u00a0\u0440\u0443\u0447\u043a\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u0442\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 make <code>test-debug<\/code>, \u0442\u043e \u0443\u0432\u0438\u0434\u0438\u043c \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b:<\/p>\n<details class=\"spoiler\">\n<summary>make test-debug<\/summary>\n<div class=\"spoiler__content\">\n<p>1: collecting&#8230; collected 9\u00a0items1:1:..\/tests\/test_<a href=\"http:\/\/crud.py\">crud.py<\/a>::test_404\u00a0PASSED [ 11%]<br \/>1:..\/tests\/test_<a href=\"http:\/\/crud.py\">crud.py<\/a>::test_empty_db PASSED [ 22%]<br \/>1:..\/tests\/test_<a href=\"http:\/\/crud.py\">crud.py<\/a>::test_create_and_retrieve PASSED [ 33%]<br \/>1:..\/tests\/test_<a href=\"http:\/\/resources.py\">resources.py<\/a>::test_found[index.html\u2011text\/html; charset=UTF-8] PASSED [ 44%]<br \/>1:..\/tests\/test_<a href=\"http:\/\/resources.py\">resources.py<\/a>::test_found[index.js\u2011application\/javascript] PASSED [ 55%]<br \/>1:..\/tests\/test_<a href=\"http:\/\/resources.py\">resources.py<\/a>::test_not_found[] PASSED [ 66%]<br \/>1:..\/tests\/test_<a href=\"http:\/\/resources.py\">resources.py<\/a>::test_not_found[.] PASSED [ 77%]<br \/>1:..\/tests\/test_<a href=\"http:\/\/resources.py\">resources.py<\/a>::test_not_found[..] PASSED [ 88%]<br \/>1:..\/tests\/test_<a href=\"http:\/\/resources.py\">resources.py<\/a>::test_not_found[missing.html] PASSED [100%]<br \/>1:<br \/>1: \u2011&#8212;\u2011&#8212;\u2011&#8212;\u2011&#8212;\u2011&#8212;\u2011&#8212;\u2011&#8212;\u2011&#8212;\u2011 Service logs \u2011&#8212;\u2011&#8212;\u2011&#8212;\u2011&#8212;\u2011&#8212;\u2011&#8212;\u2011&#8212;\u2011&#8212;\u2011<br \/>1:\u00a0\u2014 service log file: \/home\/segoon\/projects\/upastebin\/build_debug\/Testing\/Temporary\/service.log\u00a0\u2014<br \/>1: ============================== 9\u00a0passed in 1.68s ===============================<br \/>1\/1\u00a0Test #1: testsuite\u2011upastebin&#8230;&#8230;&#8230;&#8230;.. Passed 1.99\u00a0sec<\/p>\n<\/div>\n<\/details>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0435\u00a0\u0445\u0432\u0430\u0442\u0438\u043b\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u00a0\u0444\u0438\u043a\u0441\u0442\u0443\u0440\u0430\u0445, \u0442\u043e \u0437\u0430\u0433\u043b\u044f\u043d\u0438\u0442\u0435 \u0432 <a href=\"https:\/\/userver.tech\/df\/d07\/md_en_2userver_2functional__testing.html\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e<\/a>. \u0427\u0442\u043e\u0431\u044b \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u044b, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u0439\u0442\u0438 \u0432\u00a0\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e <code>third_party\/userver\/testsuite\/<\/code> \u0434\u043b\u044f\u00a0\u043f\u043e\u0438\u0441\u043a\u0430 userver\u2011\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0445 \u0444\u0438\u043a\u0441\u0442\u0443\u0440 \u0438\u043b\u0438\u00a0\u0432 <code>build_debug\/venv-userver-default\/lib\/python3.10\/site-packages\/testsuite\/<\/code> \u0434\u043b\u044f\u00a0\u043f\u043e\u0438\u0441\u043a\u0430 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0444\u0438\u043a\u0441\u0442\u0443\u0440 (testsuite \u043f\u043e\u00a0\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u0431\u0438\u043b\u0434\u2011\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e). \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u044b \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u044b \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u043e\u043c <a href=\"https:\/\/staff.yandex-team.ru\/pytest.fixture\"><code>@pytest.fixture<\/code><\/a>.<\/p>\n<hr\/>\n<p>\u0418\u0442\u0430\u043a, \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043d\u0430\u00a0userver. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0438\u0437\u00a0\u0442\u044b\u0441\u044f\u0447 \u0438 \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u0442\u044b\u0441\u044f\u0447 \u0441\u0442\u0440\u043e\u043a. \u0415\u0441\u043b\u0438 \u043e\u043d \u0432\u0430\u043c \u043f\u0440\u0438\u0433\u043b\u044f\u043d\u0443\u043b\u0441\u044f \u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0441\u00a0\u043d\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u0437\u0430\u0433\u043b\u044f\u043d\u0438\u0442\u0435 \u043d\u0430 <a href=\"https:\/\/userver.tech\/\">\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 userver<\/a> \u0438 \u0432 <a href=\"https:\/\/t.me\/userver_ru\">\u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c\u2011\u0447\u0430\u0442<\/a> (\u0435\u0441\u0442\u044c \u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 <a href=\"https:\/\/t.me\/userver_en\">\u0447\u0430\u0442 \u043d\u0430\u00a0\u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c<\/a>).<\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/github.com\/segoon\/upastebin\">\u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0441\u00a0GitHub<\/a>.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \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\/894294\/\"> https:\/\/habr.com\/ru\/articles\/894294\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><\/figure>\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0412\u0430\u0441\u0438\u043b\u0438\u0439 \u041a\u0443\u043b\u0438\u043a\u043e\u0432, \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432\u0435\u0434\u0443\u0449\u0438\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u0432\u00a0\u0422\u0435\u0445\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u0415\u043a\u043e\u043c\u0430 \u0438 \u0420\u0430\u0439\u0434\u0442\u0435\u0445\u0430 \u042f\u043d\u0434\u0435\u043a\u0441\u0430 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043f\u044f\u0442\u044c \u043b\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a <a href=\"https:\/\/userver.tech\/\">userver<\/a>. \u042d\u0442\u043e \u0432\u0435\u0431\u2011\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u044b\u0441\u043e\u043a\u043e\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043d\u0430\u00a0\u0421++. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a\u00a0\u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430\u00a0\u043d\u0451\u043c \u0438\u0433\u0440\u0443\u0448\u0435\u0447\u043d\u044b\u0439, \u043d\u043e\u00a0\u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0441\u0435\u0440\u0432\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c pastebin. \u0421\u0435\u0440\u0432\u0438\u0441 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0440\u043e\u043b\u044c \u0431\u044d\u043a\u0435\u043d\u0434\u0430 (\u0438 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430) \u0441\u0430\u0439\u0442\u0430, \u043d\u0430\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u043e\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0443\u044e \u0437\u0430\u043c\u0435\u0442\u043a\u0443 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430\u00a0\u043d\u0435\u0451. \u0422\u0430\u043a\u0436\u0435 \u043d\u0430\u00a0\u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u043a\u0430\u043a\u00a0\u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0430\u00a0userver \u0438 \u043a\u0430\u043a\u043e\u0439 API \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f\u00a0\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0431\u044d\u043a\u0435\u043d\u0434\u0430.<\/p>\n<h3>\u041e\u0431\u0449\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/h3>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c\u0441\u044f \u0441\u00a0\u043e\u0431\u0449\u0435\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439 \u0441\u0430\u0439\u0442\u0430. \u041f\u0443\u0441\u0442\u044c \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 stateless\u2011\u0441\u0435\u0440\u0432\u0438\u0441 upastebin \u0441\u043e \u0441\u0432\u043e\u0435\u0439 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 Postgres. \u0422\u043e\u0442\u00a0\u0436\u0435 upastebin \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u043a\u0443 (HTML, JS, CSS) \u0438\u0437\u00a0\u043f\u0430\u043c\u044f\u0442\u0438. \u0412\u00a0\u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u0441\u00a0\u0442\u044f\u0436\u0451\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u0438\u043a\u043e\u0439 \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0441\u044f\u00a0\u0431\u044b nginx \u0441\u00a0\u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u2011\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u043c, \u043d\u043e\u00a0\u0432\u00a0\u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043e\u0431\u043e\u0439\u0434\u0451\u043c\u0441\u044f \u0431\u0435\u0437\u00a0\u043d\u0438\u0445.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c\u0441\u044f \u0441\u00a0\u0442\u0435\u043c, \u0447\u0442\u043e\u00a0\u0434\u043e\u043b\u0436\u043d\u043e\u00a0\u0431\u044b\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0432\u00a0upastebin. \u041d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0441\u00a0\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043c\u0435\u0442\u043a\u043e\u0439. \u0427\u0442\u043e\u0431\u044b \u043d\u0435\u00a0\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043d\u0430\u00a0\u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0431\u044d\u043a\u0435\u043d\u0434\u0430, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c \u0435\u0451 \u0432\u00a0\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435. \u0417\u0430\u00a0\u0441\u0447\u0451\u0442 \u044d\u0442\u043e\u0433\u043e \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u043e\u0439 \u0438 \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u0442\u00a0\u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u043a\u00a0\u0437\u0430\u043c\u0435\u0442\u043a\u0435.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0434\u043b\u044f\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0437\u0430\u043c\u0435\u0442\u043a\u0438. \u0418\u0437\u00a0API\u2011\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u043e\u0432 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435: \u0434\u043b\u044f\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0438, \u0434\u043b\u044f\u00a0\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430 \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0438 \u0434\u043b\u044f\u00a0\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0437\u0430\u043c\u0435\u0442\u043e\u043a.<\/p>\n<p>\u0414\u043b\u044f\u00a0\u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0\u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0411\u0414) \u043d\u0443\u0436\u043d\u044b:<\/p>\n<ul>\n<li>\n<p><code>POST \/api\/v1\/posts<\/code>\u00a0\u2014 \u0434\u043b\u044f\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0437\u0430\u043c\u0435\u0442\u043a\u0438;<\/p>\n<\/li>\n<li>\n<p><code>GET \/api\/v1\/posts\/{id}<\/code>\u00a0\u2014 \u0434\u043b\u044f\u00a0\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043c\u0435\u0442\u043a\u0438;<\/p>\n<\/li>\n<li>\n<p><code>GET \/api\/v1\/latest<\/code>\u00a0\u2014 \u0434\u043b\u044f\u00a0\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 N \u0437\u0430\u043c\u0435\u0442\u043e\u043a.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f\u00a0\u043e\u0442\u0434\u0430\u0447\u0438 \u0441\u0442\u0430\u0442\u0438\u043a\u0438:<\/p>\n<ul>\n<li>\n<p><code>\/{id}<\/code>\u00a0\u2014 \u0434\u043b\u044f\u00a0\u043e\u0442\u0434\u0430\u0447\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u00a0\u0437\u0430\u043c\u0435\u0442\u043a\u043e\u0439;<\/p>\n<\/li>\n<li>\n<p><code>\/<\/code>\u00a0\u2014 \u0434\u043b\u044f\u00a0\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0430;<\/p>\n<\/li>\n<li>\n<p><code>\/r\/*<\/code>\u00a0\u2014 \u0434\u043b\u044f\u00a0\u043e\u0442\u0434\u0430\u0447\u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u0438\u043a\u0438 (JS, CSS).<\/p>\n<\/li>\n<\/ul>\n<h3>\u041f\u0440\u0438\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0418\u0442\u0430\u043a, \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0435\u043c \u043a\u00a0\u0440\u0430\u0431\u043e\u0442\u0435. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0447\u0430\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u00a0\u043d\u0443\u043b\u044f, \u0430\u00a0\u043c\u043e\u0436\u0435\u043c \u0432\u0437\u044f\u0442\u044c \u0437\u0430\u00a0\u043e\u0441\u043d\u043e\u0432\u0443 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0438\u0437<a href=\"https:\/\/github.com\/userver-framework?q=template&amp;type=all\"> \u0441\u043f\u0438\u0441\u043a\u0430<\/a>. \u0418 \u043d\u0430\u043c \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442 <a href=\"https:\/\/github.com\/userver-framework\/pg_service_template\">\u043e\u0434\u0438\u043d \u0438\u0437\u00a0\u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432<\/a>. \u041d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 Use this template \u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442. \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e README, \u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439:<\/p>\n<pre><code class=\"cpp\">git clone https:\/\/github.com\/segoon\/upastebin\/ &amp;&amp; cd upastebin<\/code><\/pre>\n<p>\u0414\u043b\u044f\u00a0\u0437\u0430\u043c\u0435\u043d\u044b \u0438\u043c\u0435\u043d\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 <code>pg_service_template<\/code> \u043d\u0430 <code>upastebin<\/code> \u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0438\u043c \u0438\u0437\u00a0README \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">find . -not -path \".\/third_party\/\" -not -path \".git\/\" -not -path '.\/build_*' -type f | xargs sed -i 's\/pg_service_template\/upastebin\/g'<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a\u00a0\u043f\u0440\u043e\u0435\u043a\u0442\u0443 userver. \u0415\u0441\u0442\u044c <a href=\"https:\/\/userver.tech\/d3\/da9\/md_en_2userver_2tutorial_2build.html\">\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432<\/a>, \u043a\u0430\u043a\u00a0\u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c:<\/p>\n<ul>\n<li>\n<p>\u0441\u043a\u0430\u0447\u0430\u0442\u044c deb\u2011\u043f\u0430\u043a\u0435\u0442 \u0441\u00a0GitHub \u0441 <a href=\"https:\/\/github.com\/userver-framework\/userver\/releases\/\">\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0440\u0435\u043b\u0438\u0437\u043e\u043c<\/a> (\u0441\u0435\u0439\u0447\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b \u0434\u043b\u044f\u00a0Ubuntu 22.04);<\/p>\n<\/li>\n<li>\n<p>\u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c userver \u0438 <a href=\"https:\/\/github.com\/userver-framework\/userver\/blob\/develop\/scripts\/build_and_install_all.sh\">\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0435\u0433\u043e<\/a>\u00a0\u043b\u0438\u0431\u043e \u0447\u0435\u0440\u0435\u0437 cmake \u2011install,\u00a0\u043b\u0438\u0431\u043e \u0447\u0435\u0440\u0435\u0437 cpack + dpkg \u2011i;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c userver \u043a\u00a0\u043d\u0430\u0448\u0435\u043c\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u043a\u0430\u043a\u00a0\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a\u00a0\u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0432\u00a0\u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u043c <a href=\"https:\/\/userver.tech\/d3\/da9\/md_en_2userver_2tutorial_2build.html#autotoc_md575\">\u0434\u043e\u043a\u0435\u0440\u2011\u043e\u0431\u0440\u0430\u0437\u0435 Ubuntu 22.04<\/a> \u0441\u00a0\u043f\u0440\u0435\u0434\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c userver.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u00a0\u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u044b\u0431\u0435\u0440\u0435\u043c \u043f\u0443\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438:<\/p>\n<pre><code class=\"cpp\">cd third_party git clone --depth 1 https:\/\/github.com\/userver-framework\/userver.git<\/code><\/pre>\n<p>\u041d\u0435\u00a0\u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <code>third_party\/userver<\/code> \u0432 <code>gitignore<\/code>! \u0415\u0441\u043b\u0438\u00a0\u0431\u044b \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c\u00a0\u0431\u044b\u043b\u043e\u00a0\u0431\u044b \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c userver \u0432\u00a0\u0441\u0432\u043e\u044e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e, \u0430 <code>third_party\/userver<\/code> \u0432\u00a0\u043a\u0430\u0436\u0434\u043e\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0438\u043c\u043b\u0438\u043d\u043a\u0430\u043c\u0438 \u043d\u0430\u00a0\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 userver.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:<\/p>\n<pre><code class=\"cpp\">make build-debug<\/code><\/pre>\n<p>\u042d\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 cmake \u0432\u00a0\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>build_debug<\/code> \u0438 \u0441\u043e\u0431\u0435\u0440\u0451\u0442 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0430 <code>build_debug\/upastebin<\/code>. \u0414\u043b\u044f\u00a0\u0441\u0431\u043e\u0440\u043a\u0438 \u0440\u0435\u043b\u0438\u0437\u0430 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u0435 debug \u043d\u0430\u00a0release.<\/p>\n<p>\u041f\u0440\u043e\u0433\u043d\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b (\u044e\u043d\u0438\u0442\u2011\u0442\u0435\u0441\u0442\u044b <code>gtest<\/code> \u0438 <code>testsuite<\/code>, \u0442.\u00a0\u0435. \u0442\u0435\u0441\u0442\u044b \u0443\u0440\u043e\u0432\u043d\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430) \u043c\u043e\u0436\u043d\u043e \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<pre><code class=\"cpp\">make test-debug<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f\u00a0\u0431\u044b\u0441\u0442\u0440\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0451\u0440\u0433\u0430\u0442\u044c \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u044b \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e curl \u0438\u043b\u0438\u00a0\u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0430\u0439\u0442 \u0432\u00a0\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435, \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:<\/p>\n<pre><code class=\"cpp\">make service-start-debug<\/code><\/pre>\n<p>\u041e\u043d\u0430 \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u0442 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043e\u0442\u00a0\u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0431\u0430\u0437\u0443 Postgres. \u0421\u0435\u0440\u0432\u0438\u0441 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0441\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u043c, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0443\u043a\u0430\u0437\u0430\u043d \u043f\u043e\u0440\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e Postgres\u2011\u0434\u0435\u043c\u043e\u043d\u0430. \u041f\u0440\u0438\u00a0\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u043e\u00a0Ctrl + C \u0441\u0435\u0440\u0432\u0438\u0441, Postgres \u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e \u0438 \u043f\u043e\u0434\u0447\u0438\u0449\u0435\u043d\u043e.<\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u0451\u0440\u0433\u0430\u0442\u044c \u0440\u0443\u0447\u043a\u0443 <code>\/ping<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0436\u0438\u0432\u043e\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e curl:<\/p>\n<pre><code class=\"cpp\">$ curl -vs http:\/\/localhost:8080\/ping *   Trying 127.0.0.1:8080... * Connected to localhost (127.0.0.1) port 8080 (#0) &gt; GET \/ping HTTP\/1.1 &gt; Host: localhost:8080 &gt; User-Agent: curl\/7.81.0 &gt; Accept: *\/* &gt;  * Mark bundle as not supporting multiuse &lt; HTTP\/1.1 200 OK &lt; Date: Wed, 22 Jan 2025 08:54:34 UTC &lt; Content-Type: application\/octet-stream &lt; Server: userver\/2.3-rc (20240801002050; rv:ac9b1cd) &lt; Accept-Encoding: gzip, zstd, identity &lt; X-YaRequestId: 5036899c44a844408d6a8c2520dc3556 &lt; X-YaTraceId: da1003fad6ef4532a714350ff1c2a3a7 &lt; X-YaSpanId: c48dc23f495a3476 &lt; Connection: keep-alive &lt; Content-Length: 0 &lt;  * Connection #0 to host localhost left intact<\/code><\/pre>\n<p>\u041e\u0436\u0438\u0434\u0430\u0435\u043c\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0442\u0430\u0442\u0443\u0441 200, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u0432\u0438\u0434\u0438\u043c \u043d\u0430\u0431\u043e\u0440 \u0445\u0435\u0434\u0435\u0440\u043e\u0432, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0434\u043b\u044f\u00a0\u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0438 \u0442\u0440\u0435\u0439\u0441\u0438\u043d\u0433\u0430 <code>(X-Ya*)<\/code>.<\/p>\n<h3>\u041e\u0442\u0434\u0430\u0447\u0430 \u0441\u0442\u0430\u0442\u0438\u043a\u0438<\/h3>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446\u2011\u0442\u043e \u043d\u0430\u0447\u043d\u0451\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c! \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u043e\u0432, \u0434\u043b\u044f\u00a0\u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0443\u0436\u043d\u044b \u0441\u0435\u043a\u0446\u0438\u044f \u0441\u00a0\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0432\u00a0\u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0435 \u0438 \u043a\u043e\u0434 \u044d\u0442\u043e\u0433\u043e \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430 (.cpp\u2011 \u0438.hpp\u2011\u0444\u0430\u0439\u043b\u044b).<\/p>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441\u00a0\u0440\u0430\u0437\u0434\u0430\u0447\u0438 \u0441\u0442\u0430\u0442\u0438\u043a\u0438. \u041b\u044e\u0431\u043e\u0439 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u0432\u00a0userver \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u0432\u0438\u0434\u0435 \u043a\u043b\u0430\u0441\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d \u043e\u0442 <code>server::handlers::HttpHandlerBase<\/code>. \u0418\u043d\u0441\u0442\u0430\u043d\u0441 \u043a\u043b\u0430\u0441\u0441\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d \u043f\u0440\u0438\u00a0\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432\u00a0\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0441\u0442\u0430\u0440\u0442\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u0430.<\/p>\n<p>\u0412\u00a0\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430\u00a0\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430 \u0438\u0437\u00a0\u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432. \u0414\u043b\u044f\u00a0\u0440\u0430\u0437\u0434\u0430\u0447\u0438 \u0441\u0442\u0430\u0442\u0438\u043a\u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d <a href=\"https:\/\/userver.tech\/da\/dd3\/classcomponents_1_1FsCache.html\">components::FsCache<\/a>, \u0430\u00a0\u0442\u043e\u0447\u043d\u0435\u0435 \u0435\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442 <a href=\"https:\/\/userver.tech\/d7\/d47\/classfs_1_1FsCacheClient.html\">fs::FsCacheClient<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u00a0\u0441\u0442\u0430\u0440\u0442\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0432\u044b\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0432\u00a0\u043f\u0430\u043c\u044f\u0442\u044c \u0438 \u043c\u043e\u0436\u0435\u0442 \u043e\u0447\u0435\u043d\u044c\u00a0\u0431\u044b\u0441\u0442\u0440\u043e \u043e\u0442\u0434\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u043e\u00a0\u0437\u0430\u043f\u0440\u043e\u0441\u0443. \u041f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c FsCacheClient \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u043f\u0435\u0440\u0435\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438, \u0447\u0442\u043e\u00a0\u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u0432\u00a0\u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0444\u0430\u0439\u043b\u043e\u0432 \u0431\u0435\u0437\u00a0\u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 (\u043f\u0440\u0438\u00a0\u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e).<\/p>\n<p>\u0412\u00a0\u043c\u0435\u0442\u043e\u0434\u0435 <code>HandleRequestThrow()<\/code> \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u0434 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 HTTP\u2011\u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0432\u0437\u044f\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0438\u0437\u00a0URL, \u043f\u043e\u00a0\u043d\u0435\u043c\u0443 \u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0432\u00a0FsCacheClient \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430. \u0414\u043b\u044f\u00a0\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u00a0\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u043d\u0430\u043c \u0442\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 Content\u2011Type, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u043f\u043e\u00a0\u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044e \u00ab\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430\u00a0\u2014 \u0442\u0438\u043f \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430\u00bb. \u0415\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u0441\u00a0\u0442\u0430\u043a\u0438\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u043d\u0435\u00a0\u0431\u044b\u043b \u043d\u0430\u0439\u0434\u0435\u043d, \u043c\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043a\u043e\u0434 \u043e\u0448\u0438\u0431\u043a\u0438 404. \u041f\u0440\u0438\u00a0\u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043a\u043e\u0434 \u043e\u0448\u0438\u0431\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0442\u0435\u043b\u043e\u043c \u0434\u043b\u044f\u00a0\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432\u00a0\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435, \u043d\u043e\u00a0\u043c\u044b \u044d\u0442\u043e \u043e\u043f\u0443\u0441\u0442\u0438\u043c \u0434\u043b\u044f\u00a0\u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b.<\/p>\n<p>\u041f\u0438\u0448\u0435\u043c \u0445\u0435\u0434\u0435\u0440:<\/p>\n<details class=\"spoiler\">\n<summary>src\/resources.hpp<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#pragma once  #include &lt;userver\/http\/common_headers.hpp&gt; #include &lt;userver\/server\/handlers\/http_handler_base.hpp&gt; #include &lt;userver\/fs\/fs_cache_client.hpp&gt;   namespace upastebin {  class ResourcesHandler final     : public userver::server::handlers::HttpHandlerBase {  public:   \/\/ \u0418\u043c\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430, \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0432 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0435 \u0438 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432   static constexpr std::string_view kName = \"handler-resources\";    ResourcesHandler(const userver::components::ComponentConfig&amp; config,                    const userver::components::ComponentContext&amp; context);    std::string HandleRequestThrow(       const userver::server::http::HttpRequest&amp; request,       userver::server::request::RequestContext&amp;) const override;   private:   const userver::fs::FsCacheClient&amp; fs_client_; };  }  \/\/ namespace upastebin<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u0438\u0448\u0435\u043c cpp\u2011\u0444\u0430\u0439\u043b:<\/p>\n<details class=\"spoiler\">\n<summary>src\/resources.cpp<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include \"resources.hpp\"  #include &lt;userver\/components\/component_config.hpp&gt; #include &lt;userver\/components\/component_context.hpp&gt; #include &lt;userver\/components\/fs_cache.hpp&gt;  namespace upastebin {  namespace {  std::string_view GetContentType(std::string_view extention) {   if (extention == \".js\")     return \"application\/javascript\";   else if (extention == \".css\")     return \"text\/css\";   else if (extention == \".html\")     return \"text\/html; charset=UTF-8\";   else     return \"application\/octet-stream\"; }  }  \/\/ namespace  ResourcesHandler::ResourcesHandler(     const userver::components::ComponentConfig&amp; config,     const userver::components::ComponentContext&amp; context)     : HttpHandlerBase(config, context),       fs_client_(           context.FindComponent&lt;userver::components::FsCache&gt;(\"resources-cache\")               .GetClient()) {}  std::string ResourcesHandler::HandleRequestThrow(     const userver::server::http::HttpRequest&amp; request,     userver::server::request::RequestContext&amp;) const {   auto subpath = request.GetPathArg(\"subpath\");   \/\/ Note: \u043d\u0435\u0442 \u043d\u0443\u0436\u0434\u044b \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c subpath, \u0442.\u043a. FsCacheClient \u043d\u0435 \u043e\u0442\u0434\u0430\u0441\u0442 \u0444\u0430\u0439\u043b \u043d\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043f\u0443\u0442\u044c    auto file_ptr = fs_client_.TryGetFile(\"\/\" + subpath);   auto&amp; response = request.GetHttpResponse();   if (file_ptr) {     response.SetContentType(GetContentType(file_ptr-&gt;extension));     return file_ptr-&gt;data;   } else {     auto&amp; response = request.GetHttpResponse();     response.SetStatus(userver::server::http::HttpStatus::kNotFound);     return {};   } }  }  \/\/ namespace upastebin<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u00a0\u0441\u0435\u0431\u0435 \u0434\u0432\u0435 \u0432\u0435\u0449\u0438: \u0432\u044b\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0438\u0437\u00a0ComponentConfig \u0442\u0435\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u0432\u00a0\u0441\u0435\u043a\u0446\u0438\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0432\u00a0\u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0435, \u0438 \u043f\u043e\u0438\u0441\u043a \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 ComponentContext. \u0412\u00a0\u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0443\u00a0\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430 \u043d\u0435\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0449\u0435\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 FsCache \u043f\u043e\u00a0\u0442\u0438\u043f\u0443, \u0438\u0437\u00a0\u043d\u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0451\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043f\u043e\u00a0\u0441\u0441\u044b\u043b\u043a\u0435 \u0432\u00a0\u043f\u043e\u043b\u0435 \u043a\u043b\u0430\u0441\u0441\u0430. \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437\u00a0\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0433\u043e\u0442\u043e\u0432 \u043a\u00a0\u0440\u0430\u0431\u043e\u0442\u0435.<\/p>\n<p>\u0412\u00a0HandleRequestThrow \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0451, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0439 HTTP\u2011\u0437\u0430\u043f\u0440\u043e\u0441. \u041a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0435. \u0412\u00a0\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0440\u0443\u0442\u0438\u043d, \u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u041e\u0421. \u0415\u0441\u043b\u0438 \u0432\u00a0\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0435 \u043c\u044b \u0445\u043e\u0434\u0438\u043c \u0432\u00a0\u0431\u0430\u0437\u0443 \u0438\u043b\u0438\u00a0\u0432\u00a0\u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u0442\u043e \u0438\u0437\u2011\u0437\u0430 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u043b\u0433\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432\u00a0\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0441\u043d\u0430. \u042d\u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0435\u00a0\u043e\u0442\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043d\u043e\u00a0\u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0430\u043c\u044f\u0442\u0438. \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0440\u0438\u0441\u043a\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u043c\u043e\u0436\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 (\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>max_requests_in_flight<\/code>) \u0438\u043b\u0438\u00a0RPS (\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>max_requests_per_second<\/code>). \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u044d\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 <a href=\"https:\/\/userver.tech\/d1\/ddc\/classserver_1_1handlers_1_1HandlerBase.html\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 userver<\/a>.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043f\u0443\u0442\u0438 \u0438\u0437 <code>reques<\/code><\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-459267","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/459267","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=459267"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/459267\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=459267"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=459267"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=459267"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}