рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рдореИрдВрдиреЗ рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ (рдХреБрдХреАрдХрдЯрд░) рдмрдирд╛рдпрд╛ рдФрд░ рдбреЙрдХрд░/рдбреЙрдХрд░-рдХрдВрдкреЛрдЬрд╝ рдФрд░ рдХреЙрдирди рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ C++ рдореЗрдВ REST API рд╕реЗрд╡рд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рддрд╛рд╡рд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ред
рдЕрдЧрд▓реЗ рд╣реИрдХрдереЙрди рдХреЗ рджреМрд░рд╛рди, рдЬрд┐рд╕рдореЗрдВ рдореИрдВрдиреЗ рдмреИрдХрдПрдВрдб рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рднрд╛рдЧ рд▓рд┐рдпрд╛, рдпрд╣ рд╕рд╡рд╛рд▓ рдЙрдард╛ рдХрд┐ рдЕрдЧрд▓реА рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЕрдм рддрдХ рдЬреЛ рдХреБрдЫ рднреА рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рд╡рд╣ рдореЗрд░реЗ рдФрд░ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ
рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рд╕рд╛рдордиреЗ рдПрдХ рд╣рд╛рдИ-рд▓реЛрдб рд╕реЗрд╡рд╛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдЖрдпрд╛, рдЬрд┐рд╕рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдЗрд╕рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдирд╛ рдФрд░ рдЙрд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдерд╛ред рдФрд░ рдПрдХ рдФрд░ рдзреВрдореНрд░рдкрд╛рди рд╡рд┐рд░рд╛рдо рдХреЗ рдмрд╛рдж, рдПрдХ рдорд┐рддреНрд░ рдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ рдореИрдВ, рдПрдХ C++ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдкреЗрд╢реЗрд╡рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рд╕реЗрд╡рд╛ рдХреЛ рд▓рд┐рдЦреВрдВред рдпрд╣ рддрд░реНрдХ рджреЗрддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рддреЗрдЬрд╝, рдЕрдзрд┐рдХ рдЙрддреНрдкрд╛рджрдХ рд╣реЛрдЧрд╛, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЬреВрд░реА рдЗрд╕ рдмрд╛рдд рд╕реЗ рдкреНрд░рд╕рдиреНрди рд╣реЛрдЧреА рдХрд┐ рд╣рдо рдХреИрд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЯреАрдо рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЬрд┐рд╕ рдкрд░ рдореИрдВрдиреЗ рдЙрддреНрддрд░ рджрд┐рдпрд╛ рдХрд┐ рдореИрдВрдиреЗ C++ рдореЗрдВ рдРрд╕реА рдЪреАрдЬреЗрдВ рдХрднреА рдирд╣реАрдВ рдХреА рд╣реИрдВ рдФрд░ рд╢реЗрд╖ 20+ рдШрдВрдЯреЗ рдЙрдкрдпреБрдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ, рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдФрд░ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реВрдВред рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ рддреЛ, рдореИрдВрдиреЗ рдЪрд┐рдХрди рдирд┐рдХрд╛рд▓ рд▓рд┐рдпрд╛ред рд╣рдордиреЗ рдпрд╣реА рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдФрд░ рдкрд╛рдпрдерди рдореЗрдВ рд╕рдм рдХреБрдЫ рд╢рд╛рдВрддрд┐ рд╕реЗ рдкреВрд░рд╛ рдХрд┐рдпрд╛ред
рдЕрдм, рдордЬрдмреВрд░рди рдЖрддреНрдо-рдЕрд▓рдЧрд╛рд╡ рдХреЗ рджреМрд░рд╛рди, рдореИрдВрдиреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдХрд┐ C++ рдореЗрдВ рд╕реЗрд╡рд╛рдПрдБ рдХреИрд╕реЗ рд▓рд┐рдЦреА рдЬрд╛рдПрдБред рд╕рдмрд╕реЗ рдкрд╣рд▓реА рдЪреАрдЬрд╝ рдЬреЛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдереА рд╡рд╣ рдереА рдПрдХ рдЙрдкрдпреБрдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ред рдореЗрд░реА рдкрд╕рдВрдж рдЧрд┐рд░ рдЧрдИ
conanfile.txt
[рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ]рдкреЛрдХреЛ/1.9.3
libpq/11.5
рдФрд░ рдПрдХ рд╕рд░рд▓ рдХрдорд╛рдВрдб "рдХреЙрдирди рдЗрдВрд╕реНрдЯреЙрд▓" рдХреЗ рд╕рд╛рдеред рдЖрд╡рд╢реНрдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ. рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рдерд╛
CMakeLists.txt
include(build/conanbuildinfo.cmake)
conan_basic_setup()
target_link_libraries(<target_name> ${CONAN_LIBS})
рдЙрд╕рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ PostgreSQL рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рддрд▓рд╛рд╢ рд╢реБрд░реВ рдХрд░ рджреА, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдереА рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдореБрдЭреЗ рдмрд╣реБрдд рдХрдо рдЕрдиреБрднрд╡ рдерд╛, рдФрд░ рдпрд╣ рд╡рд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рднреА рдереА рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реА рдкрд╛рдпрдерди рд╕реЗрд╡рд╛рдПрдВ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддреА рдереАрдВред рдФрд░ рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВрдиреЗ рдХреНрдпрд╛ рд╕реАрдЦрд╛? рдпрд╣ POCO рдореЗрдВ рд╣реИ! рд▓реЗрдХрд┐рди рдХреЙрдирди рдХреЛ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ POCO рдореЗрдВ рд╣реИ рдФрд░ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП; рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдПрдХ рдкреБрд░рд╛рдиреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╣реИ (рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА POCO рдХреЗ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдХреЛ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИ)ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рджреВрд╕рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдвреВрдВрдврдиреА рд╣реЛрдЧреАред
рдФрд░ рдлрд┐рд░ рдореЗрд░реА рдкрд╕рдВрдж рдПрдХ рдХрдо рд▓реЛрдХрдкреНрд░рд┐рдп рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкрд░ рдкрдбрд╝реА
рдЕрдЧрд▓рд╛ рдХрджрдо рдПрдХ рд╕реЗрд╡рд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рд▓рд┐рдЦрдирд╛ рдерд╛ рдЬреЛ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХреЗред
рд╣рдореЗрдВ рдЕрдкрдиреА TemplateServerApp рдХреНрд▓рд╛рд╕ рдХреЛ Poco::Util::ServerApplication рд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдореБрдЦреНрдп рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
TemplateServerApp
#pragma once
#include <string>
#include <vector>
#include <Poco/Util/ServerApplication.h>
class TemplateServerApp : public Poco::Util::ServerApplication
{
protected:
int main(const std::vector<std::string> &);
};
int TemplateServerApp::main(const vector<string> &)
{
HTTPServerParams* pParams = new HTTPServerParams;
pParams->setMaxQueued(100);
pParams->setMaxThreads(16);
HTTPServer s(new TemplateRequestHandlerFactory, ServerSocket(8000), pParams);
s.start();
cerr << "Server started" << endl;
waitForTerminationRequest(); // wait for CTRL-C or kill
cerr << "Shutting down..." << endl;
s.stop();
return Application::EXIT_OK;
}
рдореБрдЦреНрдп рд╡рд┐рдзрд┐ рдореЗрдВ рд╣рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ: рдкреЛрд░реНрдЯ, рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдХрддрд╛рд░ рдХрд╛ рдЖрдХрд╛рд░ред рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдЖрдкрдХреЛ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрдВрдбрд▓рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдПрдХ рдлрд╝реИрдХреНрдЯрд░реА рдмрдирд╛рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
TemplateRequestHandlerFactory
class TemplateRequestHandlerFactory : public HTTPRequestHandlerFactory
{
public:
virtual HTTPRequestHandler* createRequestHandler(const HTTPServerRequest & request)
{
return new TemplateServerAppHandler;
}
};
рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╣рд░ рдмрд╛рд░ рдПрдХ рд╣реА рд╣реИрдВрдбрд▓рд░ рдмрдирд╛рддрд╛ рд╣реИ - TemplateServerAppHandlerред рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо рдЕрдкрдирд╛ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдЯреЗрдореНрдкреНрд▓реЗрдЯрд╕рд░реНрд╡рд░рдРрдкрд╣реИрдВрдбрд▓рд░
class TemplateServerAppHandler : public HTTPRequestHandler
{
public:
void handleRequest(HTTPServerRequest &req, HTTPServerResponse &resp)
{
URI uri(req.getURI());
string method = req.getMethod();
cerr << "URI: " << uri.toString() << endl;
cerr << "Method: " << req.getMethod() << endl;
StringTokenizer tokenizer(uri.getPath(), "/", StringTokenizer::TOK_TRIM);
HTMLForm form(req,req.stream());
if(!method.compare("POST"))
{
cerr << "POST" << endl;
}
else if(!method.compare("PUT"))
{
cerr << "PUT" << endl;
}
else if(!method.compare("DELETE"))
{
cerr << "DELETE" << endl;
}
resp.setStatus(HTTPResponse::HTTP_OK);
resp.setContentType("application/json");
ostream& out = resp.send();
out << "{"hello":"heh"}" << endl;
out.flush();
}
};
рдореИрдВрдиреЗ PostgreSQL рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд▓рд╛рд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рднреА рдмрдирд╛рдпрд╛ред рд╕рд░рд▓ SQL рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреИрд╕реЗ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдирд╛, рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ ExecuteSQL(). рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкреНрд░рд╢реНрдиреЛрдВ рдпрд╛ рдбреЗрдЯрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЧреЗрдЯрдХрдиреЗрдХреНрд╢рди() рдФрд░ libpg API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред (рд╢рд╛рдпрдж рдмрд╛рдж рдореЗрдВ рдореИрдВ рдЗрд╕ рдЕрдиреНрдпрд╛рдп рдХреЛ рд╕реБрдзрд╛рд░реВрдВрдЧрд╛)ред
рдбрд╛рдЯрд╛рдмреЗрд╕
#pragma once
#include <memory>
#include <mutex>
#include <libpq-fe.h>
class Database
{
public:
Database();
std::shared_ptr<PGconn> GetConnection() const;
bool ExecuteSQL(const std::string& sql);
private:
void establish_connection();
void LoadEnvVariables();
std::string m_dbhost;
int m_dbport;
std::string m_dbname;
std::string m_dbuser;
std::string m_dbpass;
std::shared_ptr<PGconn> m_connection;
};
рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░реНрдпрд╛рд╡рд░рдг рд╕реЗ рд▓рд┐рдП рдЧрдП рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ .env рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
.env
DATABASE_NAME=template
DATABASE_USER=user
DATABASE_PASSWORD=password
DATABASE_HOST=postgres
DATABASE_PORT=5432
рдЖрдк рд╕рднреА рдХреЛрдб рдпрд╣рд╛рдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ
рдФрд░ рдЕрдм dockerfile рдФрд░ docker-compose.yml рд▓рд┐рдЦрдиреЗ рдХрд╛ рдЕрдВрддрд┐рдо рдЪрд░рдг рдЖрддрд╛ рд╣реИред рд╕рдЪ рдХрд╣реВрдБ рддреЛ, рдЗрд╕рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп рд▓рдЧрд╛, рдФрд░ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдирд╣реАрдВ рдХрд┐ рдореИрдВ рдПрдХ рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рд╣реВрдБ, рдХреНрдпреЛрдВрдХрд┐ рд╣рд░ рдмрд╛рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рдмрд▓реНрдХрд┐ рдХреЙрдирди рдХреЗ рдиреБрдХрд╕рд╛рди рдХреЗ рдХрд╛рд░рдг рднреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЙрдирди рдХреЛ рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ, рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдФрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рд▓рд┐рдП "рдХреЙрдирди рдЗрдВрд╕реНрдЯреЙрд▓" рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕реЗ -s compiler.libcxx=libstdc++11 рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдХреЛ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рдЪрд░рдг рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рддреНрд░реБрдЯрд┐рдпрд╛рдБ рд╣реЛрдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рд╣реИред рдореИрдВ рдХрдИ рдШрдВрдЯреЛрдВ рд╕реЗ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдореЗрдВ рдлрдВрд╕рд╛ рд╣реБрдЖ рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЛ рдХрдо рд╕рдордп рдореЗрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред
рдЖрдЧреЗ, docker-compose.yml рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдкрдиреЗ рдорд┐рддреНрд░ рдХреА рд╕рд▓рд╛рд╣ рдкрд░, рдореИрдВрдиреЗ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рд╛
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЛ рдорд╣рд╛рди рдФрд░ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА, рд▓реЗрдХрд┐рди C++ рдЬреИрд╕реА рдЕрдирд╛рдбрд╝реА рднрд╛рд╖рд╛ рдореЗрдВ REST API рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЙрдирдХреЗ рдХрдард┐рди рд░рд╛рд╕реНрддреЗ рдкрд░ рдорджрдж рдХрд░реЗрдЧрд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдпрд╣рд╛рдВ рдкрдврд╝рдиреЗ рдХреА рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ
рд╕реНрд░реЛрдд: www.habr.com