рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд░реНрд╡рд░ рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХрд╛ рд╡рд┐рдХрд╛рд╕ (рднрд╛рдЧ 2 - рд╕рд░реНрд╡рд░ рдФрд░ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ)

рдЫрд╡рд┐ рдирдорд╕реНрдХрд╛рд░, рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдФрд░ рдХреНрд▓рд╛рдЙрдб рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдУрдкрдирд╢рд┐рдлреНрдЯ рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд░рдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд░реНрд╡рд░ рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХрд╛ рд╡рд┐рдХрд╛рд╕ (рднрд╛рдЧ 1 - рдЧреНрд░рд╛рд╣рдХ)

рд╕рд░реНрд╡рд░ рд╕реНрд╡реИрдЧрд░-рдиреЛрдб-рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдиреЛрдбрдЬреЗрд╕ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдСрдЯреЛ-рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рд▓рд╛рдн рджреЗрддрд╛ рд╣реИред рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рднрд╛рдЧ рдХреЗ рд╕рдорд░реНрдерди рдореЗрдВ, рд╕рд░реНрд╡рд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдХреБрдЫ рдЬрд╛рдВрдЪ рдФрд░ рдЕрдиреБрдХреВрд▓рди рдЬрд╛рдирдмреВрдЭрдХрд░ рдЫреЛрдбрд╝ рджрд┐рдП рдЧрдП рдереЗ рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджрд┐рдП рдЧрдП рдереЗред

рд╕рд░реНрд╡рд░ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИред рдореБрдЦреНрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд╕рднреА рдореЙрдбреНрдпреВрд▓ рдЖрд░рдВрднрд┐рдХ рд╣реИрдВред

var express = require("express"), swagger = require("./swagger"), orm = require('./orm'), auth = require('./auth'), config = require('./config'), static_files = require('./static'); var app = express(); app.use(express.bodyParser()); auth.init(app); orm.init(app); swagger(app); static_files(app); app.listen(config.listen, config.ipaddr); 

рдореБрдЦреНрдп рдореЙрдбреНрдпреВрд▓ред рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ http рд╣реЗрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдирд╛рдо рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рддреНрд░ рдореЗрдордХреЗрдб рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдореИрдЪ рд╣реИ api_key -> user_idред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рддреНрдпрд╛рдкрди рдХреЛрдбред

 var client = new memcache.Client(cfg.memcache.port, cfg.memcache.host); ... app.use(function(req, res, next){ client.get( req.headers[cfg.header.toLowerCase()], function(error, result){ if(result){ req.user = result; } next(); } ); req.memcache = client; }); 

рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдиреЛрдб- orm2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ package.json рдореЗрдВ рдХреЗрд╡рд▓ рдЙрд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдЖрдзрд╛рд░ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдФрд░ рдореЙрдбрд▓ рд╡рд┐рд╡рд░рдг рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдгред

 app.use(orm.express(config.db, { define: function (db, models) { db.define("users", { id : Number, email : String, password : String, twitter : Number, facebook : Number, google : Number, linkedin : String }, { validations: { email: [ orm.enforce.unique("Email already taken!"), orm.enforce.unique({ ignoreCase: true }), orm.enforce.notEmptyString() ], password: orm.enforce.notEmptyString() }, id: "id", autoFetch: false } ); var Conferences = db.define("conferences", { id : Number, title : String, description : String, datetime : Date, place : String, location : String, site : String, logo : String, facebook : String, twitter : String, telephone : String, cost : String, file : String },{ id: "id", autoFetch: false } ); var Decisions = db.define("decisions", { id : Number, decision : ['go', 'not go', 'favorite'], user : Number, conference_id : Number },{ id: "id", cache: false, autoFetch: false } ); Decisions.hasOne('conference', Conferences, {reverse: 'decision'}); } })); 

рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдФрд░ рдореЗрд░реЗ VPS рдкрд░, nginx рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрдЯреИрдЯрд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди PaS рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЦреБрдж рдиреЛрдбрдЬ рднреА рд╕реНрдЯреЗрдЯрд┐рдХреНрд╕ рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╣реИрдВрдбрд▓рд░ рдмрдирд╛рдпрд╛ред рджрд╕реНрддрд╛рд╡реЗрдЬ рдФрд░ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рд╕реНрд╡рдпрдВ рджреЗрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

 var static_handler = express.static(__dirname + '/../static/'); app.get(/^\/static(\/.*)?$/, function(req, res, next) { if (req.url === '/static') { // express static barfs on root url w/o trailing slash res.writeHead(302, { 'Location' : req.url + '/' }); res.end(); return; } req.url = req.url.substr('/static'.length); return static_handler(req, res, next); }); var main_handler = express.static(__dirname + '/../client/www/'); app.get(/^\/(.*)$/, function(req, res, next) { if(req.url == '/cordova.js'){ return res.send(''); } if(!req.url){ req.url = 'index.html'; } return main_handler(req, res, next); }); 

рдХреЙрд░реНрдбреЛрд╡рд╛.рдЬреЗрдПрд╕ рдлрд╛рдЗрд▓ рдлреЛрдирдЧреИрдк рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рд╣реИ, рдЗрд╕рдореЗрдВ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдФрд░ рдЕрдиреНрдп рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдПрдХ рд╕реНрдЯрдм рдмрд╕ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ OS рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЕрдм рдЖрдкрдХреЛ рд╕рд░реНрд╡рд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

 app.use(function(req, res, next) { res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); res.header('Access-Control-Allow-Headers', cfg.header+', Content-Type'); res.header('Access-Control-Expose-Headers', cfg.header+', Content-Type'); if (req.method == 'OPTIONS') { res.send(200); } else { next(); } }); swagger.setAppHandler(app); swagger.addModels(models); controllers.init(swagger); swagger.configure(cfg.basePath, "0.1"); // Serve up swagger ui at /docs via static route var docs_handler = express.static(__dirname + '/../documentation/swagger/'); app.get(/^\/docs(\/.*)?$/, function(req, res, next) { if (req.url === '/docs') { // express static barfs on root url w/o trailing slash res.writeHead(302, { 'Location' : req.url + '/' }); res.end(); return; } // take off leading /docs so that connect locates file correctly req.url = req.url.substr('/docs'.length); return docs_handler(req, res, next); }); 

рддрд╛рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рдЖрдк рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВ, рдХреНрд░реЙрд╕-рдСрд░рд┐рдЬрдирд▓ рд░рд┐рд╕реЛрд░реНрд╕ рд╢реЗрдпрд░рд┐рдВрдЧ рд╣реЗрдбрд░ рджрд┐рдП рдЧрдП рд╣реИрдВред рдлрд┐рд░ рд╕реНрд╡рд╛рдЧ рдЖрд░рдВрднреАрдХрд░рдгред рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ

 swagger.addModels(models); controllers.init(swagger); 

рдпреЗ рдореЙрдбрд▓ рдЬреЛ рджрд┐рдП рдЧрдП рд╣реИрдВ, рдпрд╣ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, ViewModel рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВ рдФрд░ ors.s.s. рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдореЙрдбрд▓ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдореЗрдВред рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╣реИрдВрдбрд▓рд░ рдкрдВрдЬреАрдХреГрдд рд╣реИрдВред рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред

 swagger.addGET(conferences.get); swagger.addGET(conferences.list); swagger.addPOST(conferences.decision); swagger.addDELETE(conferences.reject); 

рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреИрд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИред рдореИрдВ рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╕рдореНрдореЗрд▓рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦреВрдВрдЧрд╛ред

 var get = { 'spec': { "description" : "Get conference by id", "path" : "/conferences.{format}/{id}", "notes" : "Get conference", "summary" : "Get conference", "method": "GET", "responseClass" : "Conference", "nickname" : "conference" }, 'action': function (req,res) { if (!req.params.id) { throw swagger.errors.invalid('id'); } var id = parseInt(req.params.id); req.db.models.conferences.get(id, function(err, conference){ if(err){ res.send(500, JSON.stringify({code: 500, header: 'Internal Server Error', message: JSON.stringify(err)})); }else{ if(conference){ if(conference.file){ conference.file = '/static/' + conference.file; } if(req.user){ conference.getDecision({user: req.user}, function(err, decision){ if(err){ res.send(500, JSON.stringify(err)); }else{ conference.decision = decision.pop(); res.send(200, JSON.stringify(conference)); } }); }else{ res.send(200, JSON.stringify(conference)); } }else{ throw swagger.errors.notFound('conference'); } } }); } }; 

"рдХрд▓реНрдкрдирд╛" рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ "рдкрде" рд╣реИ, рдЕрд░реНрдерд╛рдд, рд╡рд╣ рдпреВрдЖрд░рдПрд▓ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рд╣реИрдВрдбрд▓рд░ рдХрд╣реЗрдЧрд╛ред рдореБрдЦреНрдп рд╣рд┐рд╕реНрд╕рд╛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╣реИред рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд╡реЗрд░реА рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИред рдмреНрд░реЗрдб рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдмрдврд╝рдиреЗ рдкрд░ рдХреМрди рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛, рдореИрдВ рддреБрд░рдВрдд рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдиреЛрдб-рдУрдЖрд░рдПрдо 2 рдЖрдкрдХреЛ рдЕрдиреБрд░реЛрдз рдФрд░ рд╣реИрдВрдбрд▓рд░ рджреЛрдиреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдлрд╛рдЗрд▓реЗрдВ рд╕рдореНрдореЗрд▓рди рд╕реЗ рдЬреБрдбрд╝реА рд╣реЛрддреА рд╣реИрдВ, рддреЛ рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХ рд░рд╛рд╕реНрддрд╛ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧ рдЗрди рд╣реИ, рддреЛ рд╕рдореНрдореЗрд▓рди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЙрд╕рдХрд╛ рдирд┐рд░реНрдгрдп рдорд╛рдВрдЧрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ http рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ REST рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдмреЗрд╣рддрд░ рдФрд░ рдЕрдзрд┐рдХ рд╕рд╣реА рдХреНрдпрд╛ рд╣реИ: рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рдкрд╛рд╕ рдПрдХ-рдПрдХ рдореЙрдбрд▓ рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдВ рдпрд╛ рдЖрдИрдбреА рд▓реМрдЯрд╛рдПрдВ, рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рджреВрд╕рд░рд╛ рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВред

рдЗрд╕ рдкрд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрд╡реИрдЧрд░-рдиреЛрдб-рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХ рд╕рдорд╛рдкреНрдд рд░реВрдк рд▓реЗрдиреЗ рд▓рдЧреА, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдЗрд╕реЗ рдХрд╣рд╛рдВ рд░рдЦрд╛ рдЬрд╛рдПред рдкрд╣рд▓реЗ рддреЛ рд╡рд╣ рдореЗрд░реЗ VPS рдкрд░ рд░рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ рд▓рдЧрд╛рддрд╛рд░ рд╡рд╣рд╛рдБ рд╕рдм рдХреБрдЫ рд▓реАрд▓ рд░рд╣рд╛ рд╣реВрдБ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ PaS рдкрд░ рд░рдЦрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред рдХреНрдпреЛрдВрдХрд┐ рдмрд╛рджрд▓ рдлреИрд╢рдиреЗрдмрд▓ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдордЬрд╝реЗрджрд╛рд░ рднреАред рд╡реИрд╕реЗ, рдХрдИ рдХреНрд▓рд╛рдЙрдб рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХрдВрдкрдирд┐рдпрд╛рдВ рдореБрдлреНрдд рдЦрд╛рддреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддреА рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рдмрд┐рдирд╛ рд╕рдордп рд╕реАрдорд╛ рдХреЗред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдПрдХ рджрд░реНрдЬрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреА рдореЗрдЬрдмрд╛рдиреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдУрдкрдирд╢рд┐рдлреНрдЯ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВ рдЦреБрдж рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЙрдирд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реВрдВ рдФрд░ рдЕрдиреНрдп рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рд╕реЗрд╡рд╛рдУрдВ рдкрд░ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдмрд╣реБрдд рд╕рдорд╛рди рд╣реЛрдВрдЧреА (рдпрд╣ рдиреАрдЪреЗ рдзрдХреНрдХрд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИ)ред рдореИрдВрдиреЗ рдЧрд▓рддреА рд╕реЗ рдЗрд╕ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХреЛ рдЪреБрдирд╛ред

рддреЛ, рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдлрд┐рд░ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдПрдВ, рдЙрдирдХреЗ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЗрд╕рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖рдХрд░ рдореИрдВ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреБрдЫ рдмрд╛рддреЛрдВ рдХреА рдУрд░ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрджрд┐ рдЖрдк рдХреНрд▓рд╛рдЙрдб рдореЗрдВ рдХрд┐рд╕реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рд╣реЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдпрд╣ рддреБрд░рдВрдд рдЪреБрдирдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдХрд╣рд╛рдВ рдФрд░ рдХреИрд╕реЗ рддреЗрдЬ рдХрд░реЗрдВред рдЗрд╕ рддрд░рд╣ рдЖрдкрдХреЛ рддреИрдирд╛рддреА рд╕реЗ рдкрд╣рд▓реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ server.js рдореЗрдВ рдореБрдЦреНрдп рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕реНрдЯреЗрдЯрд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдПрдХ рдмрд╛рд╣рд░реА рдореЗрдордХрд╛рдЯреЗрдб рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдореИрдВрдиреЗ рдХреНрд▓рд╛рдЗрдВрдЯ / www рдХреЛ рд╕рд░реНрд╡рд░ / www рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдФрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рд╡рд╣рд╛рдВ рдХреЗ рд╕рдореНрдореЗрд▓рдиреЛрдВ рдФрд░ рд╕реНрд╡реИрдЧрд░ рд╕реЗ рдЬреЛрдбрд╝рд╛ред рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдирдпрд╛ static.js рджрд┐рдЦрддрд╛ рд╣реИред

 var static_handler = express.static(__dirname + '/www/static/'); app.get(/^\/static(\/.*)?$/, function(req, res, next) { if (req.url === '/static') { // express static barfs on root url w/o trailing slash res.writeHead(302, { 'Location' : req.url + '/' }); res.end(); return; } // take off leading /docs so that connect locates file correctly req.url = req.url.substr('/docs'.length); return static_handler(req, res, next); }); var main_handler = express.static(__dirname + '/www/'); app.get(/^\/(.*)$/, function(req, res, next) { if(req.url == '/cordova.js'){ return res.send(''); } if(!req.url){ req.url = 'index.html'; } return main_handler(req, res, next); }); 

рджреВрд╕рд░реЗ, SQL / no-SQL рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд░реБрдЪрд┐ рд▓реЗрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рдбреЗрдЯрд╛рдмреЗрд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдХреБрдЫ рдореЗрдВ, Openhift, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреВрд░реЗ рд╕реНрд▓реЙрдЯ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рдХрдо рд╣реЛрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдПрдХ рдЕрдиреНрдп garantiadata.com рд╕реЗрд╡рд╛ рдХреЛ рдореЗрдордХрд╛рд╕реНрдЯ рдХрд┐рдпрд╛ , рдЬрд╣рд╛рдБ рдореИрдВрдиреЗ рдПрдХ рдЯреНрд░рд╛рдпрд▓ рдЕрдХрд╛рдЙрдВрдЯ рднреА рдмрдирд╛рдпрд╛ред рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА 2 рд╕реНрд▓реЙрдЯ рд╣реИрдВ, рдХрд▓, рдиреЛрдб рдХрд╛ рджреВрд╕рд░рд╛ рдЙрджрд╛рд╣рд░рдг рднреА рд╢реБрд░реВ рд╣реБрдЖ, рдЬрд┐рд╕рдиреЗ рдореБрдЭреЗ рдкреНрд░рд╕рдиреНрди рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рдерд╛ рдХрд┐ рдСрдЯреЛ-рд╕реНрдХреЗрд▓рд┐рдВрдЧ рд╕рдлрд▓ рд╣реЛрдЧреАред
рдФрд░ рд╣рд╛рдБ, рддреИрдирд╛рддреА рд╣реАред

 git add --all; git commit -m 'commit'; git push origin master 

рдореВрд▓ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛, рдЬреЛ рдХрд┐ рдУрдкрдирд╢рд┐рдлреНрдЯ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреЗрдЬ рдкрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реЛрд╕реНрдЯ / рдкреЛрд░реНрдЯ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВред

 exports.listen = process.env.OPENSHIFT_NODEJS_PORT || 8080; exports.ipaddr = process.env.OPENSHIFT_NODEJS_IP || "127.0.0.1"; 

рд╕реНрдерд┐рддрд┐ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ , рдЧрд┐рдЯ рдкреБрд╢ рдХреЗ рд╕рд╛рде рдЖрдкрдХреЛ рдПрдХ рд▓реЙрдЧ рдорд┐рд▓рддрд╛ рд╣реИред рдЖрдк ssh рд╕реЗ рднреА рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ tail_all рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
Ssh рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдЖрдк рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рднреА рдЬреБрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

 echo $OPENSHIFT_POSTGRESQL_DB_URL 

рдпрд╣ рд╕рдм, рдмрд╛рджрд▓ рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ, рд╣рд░ рдХреЛрдИ рдЦреБрд╢ рд╣реИред рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдореБрдЭреЗ рдЖрд▓реЛрдЪрдирд╛ рдФрд░ рд╕реБрдЭрд╛рд╡ рдкрд░ рдЦреБрд╢реА рд╣реБрдИред

Source: https://habr.com/ru/post/In200356/


All Articles