рд╕рдмреИрд▓рд╛рдИ рдирдорд╕реНрдХрд╛рд░ред
рдпрд╕ рд╡рд╕рдиреНрддрдорд╛, рдореИрд▓реЗ рдПрдЙрдЯрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдареЗрд╕ рдЦрд╛рдПрдБ рдЬрд╣рд╛рдБ рдХреЗрд╣реА рдХреЗрдЯрд╛рд╣рд░реВрд▓реЗ реирежрезрек рдХреЛ рдбреЛрдЯрд╛ реи рд╕рд░реНрднрд░рдорд╛ рдХрд╕рд░реА рджреМрдбрдиреЗ рд░ рдЦреЗрд▓реНрдиреЗ рднрдиреЗрд░ рд╕рд┐рдХреЗред рдо рдпреЛ рдЦреЗрд▓рдХреЛ рдареВрд▓реЛ рдкреНрд░рд╢рдВрд╕рдХ рд╣реБрдБ, рд░ рдореЗрд░реЛ рдмрд╛рд▓реНрдпрдХрд╛рд▓рд▓рд╛рдИ рдкреБрди: рдЬрд┐рдЙрдиреЗ рдпреЛ рдЕрдиреМрдареЛ рдЕрд╡рд╕рд░рд▓рд╛рдИ рдо рдкреНрд░рддрд┐рд░реЛрдз рдЧрд░реНрди рд╕рдХрд┐рдиред
рдореИрд▓реЗ рдЧрд╣рд┐рд░рд┐рдПрд░ рдЦреЛрдЬреЗрдБ, рд░ рдерд╛рд╣рд╛ рднрдпреЛ рдХрд┐ рдореИрд▓реЗ рдПрдЙрдЯрд╛ рдбрд┐рд╕реНрдХрд░реНрдб рдмрдЯ рд▓реЗрдЦреЗрдХреЛ рдЫреБ рдЬреБрди рдЦреЗрд▓рдХреЛ рдкреБрд░рд╛рдиреЛ рд╕рдВрд╕реНрдХрд░рдгрдорд╛ рд╕рдорд░реНрдерд┐рдд рдирднрдПрдХреЛ рд▓рдЧрднрдЧ рд╕рдмреИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдЬрд┐рдореНрдореЗрд╡рд╛рд░ рдЫ, рдЕрд░реНрдерд╛рддреН рдореНрдпрд╛рдЪрдореЗрдХрд┐рдВрдЧред
рдмреЛрдЯ-рд╕рдореНрдмрдиреНрдзрд┐рдд рд╕рдмреИ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рд╣реБрдиреБрднрдиреНрджрд╛ рдкрд╣рд┐рд▓реЗ, рд▓рдмреАрд╣рд░реВ рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдиреНрдереНрдпреЛред рд╣рд╛рдореА рд╕рдиреНрджреЗрд╢рдорд╛ резреж рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рд╕рдЩреНрдХрд▓рди рдЧрд░реНрдереНрдпреМрдВ рд░ рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рд╕рд░реНрднрд░ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдереНрдпреМрдВ рд╡рд╛ рд╕реНрдерд╛рдиреАрдп рд▓рдмреА рд╣реЛрд╕реНрдЯ рдЧрд░реНрдереНрдпреМрдВред

рдореЗрд░реЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╕реНрд╡рднрд╛рд╡рд▓реЗ рддреНрдпрддрд┐ рдзреЗрд░реИ рдореНрдпрд╛рдиреБрдЕрд▓ рдХрд╛рдо рдЧрд░реНрди рд╕рдХреЗрди, рд░ рд░рд╛рддрд╛рд░рд╛рдд рдореИрд▓реЗ рдПрдЙрдЯрд╛ рдмреЛрдЯрдХреЛ рд╕рд░рд▓ рд╕рдВрд╕реНрдХрд░рдг рддрдпрд╛рд░ рдкрд╛рд░реЗрдБ рдЬрд╕рд▓реЗ резреж рдЬрдирд╛ рдкреБрдЧреЗрдкрдЫрд┐ рд╕рд░реНрднрд░ рд╕реНрд╡рддрдГ рд╕реБрд░реБ рдЧрд░реНрдиреЗрдЫред
рдорд▓рд╛рдИ рдкрд╛рдЗрдерди рдорди рдирдкрд░реНрдиреЗ рднрдПрдХреЛрд▓реЗ рдореИрд▓реЗ рддреБрд░реБрдиреНрддреИ nodejs рдорд╛ рд▓реЗрдЦреНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗрдВ, рддрд░ рдо рдпреЛ рд╡рд╛рддрд╛рд╡рд░рдгрдорд╛ рдмрдвреА рд╕рд╣рдЬ рдорд╣рд╕реБрд╕ рдЧрд░реНрдЫреБред
рдпреЛ рдореЗрд░реЛ рдкрд╣рд┐рд▓реЛ рдкрдЯрдХ Discord рдмрдЯ рд▓реЗрдЦреНрджреИ рдЫ, рддрд░ рдпреЛ рд╕рд╛рдБрдЪреНрдЪреИ рд╕рд░рд▓ рднрдпреЛред рдЖрдзрд┐рдХрд╛рд░рд┐рдХ discord.js npm рдореЛрдбреНрдпреБрд▓рд▓реЗ рд╕рдиреНрджреЗрд╢рд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрди, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рд╕рдЩреНрдХрд▓рди рдЧрд░реНрди, рд░ рдердк рдХреБрд░рд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЗрдиреНрдЯрд░рдлреЗрд╕ рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫред
рдЕрд╕реНрд╡реАрдХрд░рдг: рд╕рдмреИ рдХреЛрдб рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ "рд╣рд╛рд▓" рд╣реБрдиреН, рдЬрд╕рдХреЛ рдЕрд░реНрде рддрд┐рдиреАрд╣рд░реВ рд░рд╛рддреА-рд░рд╛рдд рдкреБрдирд░реНрд▓реЗрдЦрдирдХреЛ рдзреЗрд░реИ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рд╣рд░реВрдмрд╛рдЯ рдЧреБрдЬреНрд░рд┐рд╕рдХреЗрдХрд╛ рдЫрдиреНред
рдореНрдпрд╛рдЪрдореЗрдХрд┐рдВрдЧрдХреЛ рдЖрдзрд╛рд░ рднрдиреЗрдХреЛ "рд▓рд╛рдЗрди" рд╣реЛ рдЬрд╕рдорд╛ рдЦреЗрд▓реНрди рдЪрд╛рд╣рдиреЗ рдЦреЗрд▓рд╛рдбреАрд╣рд░реВрд▓рд╛рдИ рд░рд╛рдЦрд┐рдиреНрдЫ рд░ рдЦреЗрд▓ рдЦреЗрд▓реНрди рд╡рд╛ рдЦреЗрд▓ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рдирдЪрд╛рд╣реЗрдХреЛ рдмреЗрд▓рд╛ рд╣рдЯрд╛рдЗрдиреНрдЫред
"рдЦреЗрд▓рд╛рдбреА" рд╕рдВрд╕реНрдерд╛ рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫред рд╕реБрд░реБрдорд╛, рдпреЛ рдХреЗрд╡рд▓ рдПрдХ Discord рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ ID рдерд┐рдпреЛ, рддрд░ рдпреЛрдЬрдирд╛рд╣рд░реВрд▓реЗ рд╡реЗрдмрд╕рд╛рдЗрдЯрдмрд╛рдЯ рд▓рдиреНрдЪрд░/рдЦреЗрд▓ рдЦреЛрдЬреАрдХреЛ рд▓рд╛рдЧрд┐ рдЖрд╣реНрд╡рд╛рди рдЧрд░реНрджрдЫ, рддрд░ рдкрд╣рд┐рд▓реЗ рдХреБрд░рд╛рд╣рд░реВ рдкрд╣рд┐рд▓реЗред
export enum Realm {
DISCORD,
EXTERNAL,
}
export default class QueuePlayer {
constructor(public readonly realm: Realm, public readonly id: string) {}
public is(qp: QueuePlayer): boolean {
return this.realm === qp.realm && this.id === qp.id;
}
static Discord(id: string) {
return new QueuePlayer(Realm.DISCORD, id);
}
static External(id: string) {
return new QueuePlayer(Realm.EXTERNAL, id);
}
}
рдпрд╣рд╛рдБ рдХреНрдпреБ рдЗрдиреНрдЯрд░рдлреЗрд╕ рдЫред "рдЦреЗрд▓рд╛рдбреАрд╣рд░реВ" рдХреЛ рд╕рдЯреНрдЯрд╛, рдпрд╕рд▓реЗ "рд╕рдореВрд╣" рдХреЛ рдЕрдореВрд░реНрддрддрд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫред рдПрдХрд▓ рдЦреЗрд▓рд╛рдбреАрдХреЛ рд▓рд╛рдЧрд┐, рд╕рдореВрд╣рдорд╛ рддреНрдпреЛ рдЦреЗрд▓рд╛рдбреА рд╣реБрдиреНрдЫ, рд░ рд╕рдореВрд╣рдХрд╛ рдЦреЗрд▓рд╛рдбреАрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐, рдпрд╕рд▓реЗ рд╕рдореВрд╣рдХрд╛ рд╕рдмреИ рдЦреЗрд▓рд╛рдбреАрд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫред
export default interface IQueue extends EventEmitter {
inQueue: QueuePlayer[]
put(uid: Party): boolean;
remove(uid: Party): boolean;
removeAll(ids: Party[]): void;
mode: MatchmakingMode
roomSize: number;
clear(): void
}
рдореИрд▓реЗ рд╕рдиреНрджрд░реНрдн рдЖрджрд╛рдирдкреНрд░рджрд╛рди рдЧрд░реНрди рдШрдЯрдирд╛рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗрдВред рдпреЛ рдкреНрд░рдпреЛрдЧрдХрд╛ рдХреЗрд╕рд╣рд░реВ рдЕрдиреБрд░реВрдк рдерд┐рдпреЛ - "резреж-рдЦреЗрд▓рд╛рдбреА рдЦреЗрд▓ рдлреЗрд▓рд╛ рдкрд░реНрдпреЛ" рдШрдЯрдирд╛рд▓рд╛рдИ рдирд┐рдЬреА рд╕рдиреНрджреЗрд╢рд╣рд░реВ рдорд╛рд░реНрдлрдд рдЦреЗрд▓рд╛рдбреАрд╣рд░реВрд▓рд╛рдИ рдЖрд╡рд╢реНрдпрдХ рд╕рдиреНрджреЗрд╢ рдкрдард╛рдЙрди рд░ рдореБрдЦреНрдп рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ - рддрдпрд╛рд░реА рдЬрд╛рдБрдЪ рдЧрд░реНрди, рд╕реБрд░реБрд╡рд╛рддрдХреЛ рд▓рд╛рдЧрд┐ рд▓рдмреА рддрдпрд╛рд░ рдЧрд░реНрди, рд░ рдпрд╕реНрддреИ рдЕрдиреНрдп рдХрд╛рд░реНрдпрд╣рд░реВ рдЧрд░реНрди рдХрд╛рд░реНрдп рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реНред
IOC рдХреЛ рд▓рд╛рдЧрд┐, рдо InversifyJS рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреБред рдпреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╕рдБрдЧ рдореЗрд░реЛ рдЕрдиреБрднрд╡ рд░рдорд╛рдЗрд▓реЛ рдЫред рдпреЛ рдЫрд┐рдЯреЛ рд░ рд╕рдЬрд┐рд▓реЛ рдЫ!
рд╣рд╛рдореНрд░реЛ рд╕рд░реНрднрд░рдорд╛ рдзреЗрд░реИ рд▓рд╛рдЗрдирд╣рд░реВ рдЫрдиреНтАФрд╣рд╛рдореАрд▓реЗ резvрез, рдирд┐рдпрдорд┐рдд/рд╢реНрд░реЗрдгреАрдмрджреНрдз, рд░ рдХреЗрд╣реА рдЕрдиреБрдХреВрд▓рди рдореЛрдбрд╣рд░реВ рдердкреЗрдХрд╛ рдЫреМрдВред рддреНрдпрд╕реИрд▓реЗ рд╣рд╛рдореАрд╕рдБрдЧ рдПрдХрд▓рдЯрди рдХреЛрдард╛ рд╕реЗрд╡рд╛ рдЫ рдЬреБрди рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд░ рдореНрдпрд╛рдЪрдореЗрдХрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдХреЛ рдмреАрдЪрдорд╛ рдмрд╕реНрдЫред
constructor(
@inject(GameServers) private gameServers: GameServers,
@inject(MatchStatsService) private stats: MatchStatsService,
@inject(PartyService) private partyService: PartyService
) {
super();
this.initQueue(MatchmakingMode.RANKED);
this.initQueue(MatchmakingMode.UNRANKED);
this.initQueue(MatchmakingMode.SOLOMID);
this.initQueue(MatchmakingMode.DIRETIDE);
this.initQueue(MatchmakingMode.GREEVILING);
this.partyService.addListener(
"party-update",
(event: PartyUpdatedEvent) => {
this.queues.forEach((q) => {
if (has(q.queue, (t) => t.is(event.party))) {
// if queue has this party, we re-add party
this.leaveQueue(event.qp, q.mode)
this.enterQueue(event.qp, q.mode)
}
});
}
);
this.partyService.addListener(
"party-removed",
(event: PartyUpdatedEvent) => {
this.queues.forEach((q) => {
if (has(q.queue, (t) => t.is(event.party))) {
// if queue has this party, we re-add party
q.remove(event.party)
}
});
}
);
}
(рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рдХрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫрдиреН рднрдиреНрдиреЗ рдХреБрд░рд╛рдХреЛ рдЬрд╛рдирдХрд╛рд░реА рджрд┐рдирдХреЛ рд▓рд╛рдЧрд┐ рдХреЛрдб рдиреВрдбрд▓реНрд╕)
рдпрд╣рд╛рдБ рдо рдкреНрд░рддреНрдпреЗрдХ рд▓рд╛рдЧреВ рдЧрд░рд┐рдПрдХреЛ рдЦреЗрд▓ рдореЛрдбрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдХреНрдпреБ рд╕реБрд░реБ рдЧрд░реНрдЫреБ, рд░ рдХреНрдпреБрд╣рд░реВ рд╕рдорд╛рдпреЛрдЬрди рдЧрд░реНрди рд░ рдХреЗрд╣реА рджреНрд╡рдиреНрджреНрд╡рд╣рд░реВрдмрд╛рдЯ рдмрдЪреНрди "рд╕рдореВрд╣" рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдкрдирд┐ рд╕реБрдиреНрдЫреБред
рдард┐рдХ рдЫ, рд░рд╛рдореНрд░реЛ рднрдпреЛ, рдореИрд▓реЗ рд╡рд┐рд╖рдпрд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рдирднрдПрдХрд╛ рдХреЗрд╣реА рдХреЛрдбрд╣рд░реВ рдЯрд╛рдБрд╕реЗрдХреЛ рдЫреБ, рд░ рдЕрдм рдореНрдпрд╛рдЪрдореЗрдХрд┐рдВрдЧрддрд┐рд░реИ рд▓рд╛рдЧреМрдВред
рдПрдЙрдЯрд╛ рдХреЗрд╕ рд╡рд┐рдЪрд╛рд░ рдЧрд░реМрдВ:
рез) рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдЦреЗрд▓реНрди рдЪрд╛рд╣рдиреНрдЫред
реи) рдЦреЛрдЬ рд╕реБрд░реБ рдЧрд░реНрди, рдпрд╕рд▓реЗ Gateway=Discord рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫ, рдЕрд░реНрдерд╛рддреН, рдпрд╕рд▓реЗ рд╕рдиреНрджреЗрд╢рдорд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗрдЯ рдЧрд░реНрджрдЫ:

рей) рдпреЛ рдЧреЗрдЯрд╡реЗрд▓реЗ RoomService рдорд╛ рдЬрд╛рдиреНрдЫ рд░ рднрдиреНрдЫ "Discord рдмрд╛рдЯ рдПрдХ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрдпреБрдорд╛ рд╕рд╛рдореЗрд▓ рд╣реБрди рдЪрд╛рд╣рдиреНрдЫ, рдореЛрдб: рдЕрдирд░реИрдВрдХ рдЧрд░рд┐рдПрдХреЛ рдЦреЗрд▓ред"
рек) рд░реБрдорд╕рд░реНрднрд┐рд╕рд▓реЗ рдЧреЗрдЯрд╡реЗ рдЕрдиреБрд░реЛрдз рд╕реНрд╡реАрдХрд╛рд░ рдЧрд░реНрдЫ рд░ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ (рд╡рд╛ рдЕрдЭ рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛, рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдореВрд╣) рд▓рд╛рдИ рдЙрдкрдпреБрдХреНрдд рдХреНрдпреБрдорд╛ рдзрдХреЗрд▓реНрдЫред
рел) рдЦреЗрд▓реНрди рдкрд░реНрдпрд╛рдкреНрдд рдЦреЗрд▓рд╛рдбреАрд╣рд░реВ рдЫрдиреН рдХрд┐ рдЫреИрдирдиреН рднрдиреНрдиреЗ рдХреБрд░рд╛ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдБрджрд╛ рдХреНрдпреБрд▓реЗ рд╣рд░реЗрдХ рдкрдЯрдХ рдЬрд╛рдБрдЪ рдЧрд░реНрдЫред рд╕рдореНрднрд╡ рднрдПрдорд╛, рдпрд╕рд▓реЗ рдПрдЙрдЯрд╛ рдШрдЯрдирд╛ рдЙрддреНрд╕рд░реНрдЬрди рдЧрд░реНрдЫ:
private onRoomFound(players: Party[]) {
this.emit("room-found", {
players,
});
}
рем) рдХреЛрдард╛ рд╕реЗрд╡рд╛рд▓реЗ, рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛, рдпрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдордХреЛ рдкреНрд░рддреНрдпрд╛рд╢рд╛рдорд╛ рдкреНрд░рддреНрдпреЗрдХ рдХрддрд╛рд░рдХреЛ рдХреБрд░рд╛ рдЙрддреНрд╕реБрдХрддрд╛рдкреВрд░реНрд╡рдХ рд╕реБрдиреНрджрдЫред рд╣рд╛рдореА рдкреНрд░рд╡реЗрд╢рджреНрд╡рд╛рд░рдорд╛ рдЦреЗрд▓рд╛рдбреАрд╣рд░реВрдХреЛ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдЫреМрдВ, рддрд┐рдиреАрд╣рд░реВрдмрд╛рдЯ рднрд░реНрдЪреБрдЕрд▓ "рдХреЛрдард╛" рдмрдирд╛рдЙрдБрдЫреМрдВ, рд░ рдЕрд╡рд╢реНрдп рдкрдирд┐, рдХрд╛рд░реНрдпрдХреНрд░рдо рдЬрд╛рд░реА рдЧрд░реНрдЫреМрдВ:
queue.addListener("room-found", (event: RoomFoundEvent) => {
console.log(
`Room found mode: [${mode}]. Time to get free room for these guys`
);
const room = this.getFreeRoom(mode);
room.fill(event.players);
this.onRoomFormed(room);
});
рен) рддреНрдпрд╕реИрд▓реЗ рд╣рд╛рдореА "рд╕рд░реНрд╡реЛрдЪреНрдЪ" рдЕрдзрд┐рдХрд╛рд░ - рд╡рд░реНрдЧрдорд╛ рдкреБрдЧреЗрдХрд╛ рдЫреМрдВ рдмреЛрдЯрдореВрд▓рддрдГ, рдпрд╕рд▓реЗ рдЧреЗрдЯрд╡реЗрд╣рд░реВ (рдо рд░реВрд╕реА рднрд╛рд╖рд╛рдорд╛ рдпреЛ рдХрддрд┐ рд░рдорд╛рдЗрд▓реЛ рд╕реБрдирд┐рдиреНрдЫ рднрдиреЗрд░ рдмреБрдЭреНрди рдкрдирд┐ рд╕рдХреНрджрд┐рди) рд░ рдореНрдпрд╛рдЪрдореЗрдХрд┐рдВрдЧ рд╡реНрдпрд╡рд╕рд╛рдп рддрд░реНрдХ рдмреАрдЪрдХреЛ рд╕рдЮреНрдЪрд╛рд░рд▓рд╛рдИ рд╣реНрдпрд╛рдиреНрдбрд▓ рдЧрд░реНрдЫред рдмреЛрдЯрд▓реЗ рдПрдЙрдЯрд╛ рдШрдЯрдирд╛ рд╕реБрдиреНрдЫ рд░ DiscordGateway рд▓рд╛рдИ рд╕рдмреИ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрд▓рд╛рдИ рддрдпрд╛рд░реА рдЬрд╛рдБрдЪ рдкрдард╛рдЙрди рдирд┐рд░реНрджреЗрд╢рди рджрд┐рдиреНрдЫред

рео) рдпрджрд┐ рдХрд╕реИрд▓реЗ рей рдорд┐рдиреЗрдЯ рднрд┐рддреНрд░ рдЦреЗрд▓ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдЧрд░реНрдЫ рд╡рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдЧрд░реНрджреИрди рднрдиреЗ, рд╣рд╛рдореА рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд▓рд╛рдЗрдирдорд╛ рдлрд┐рд░реНрддрд╛ рдЧрд░реНрджреИрдиреМрдВред рдмрд╛рдБрдХреА рд╕рдмреИрд▓рд╛рдИ рд▓рд╛рдЗрдирдорд╛ рдлрд┐рд░реНрддрд╛ рдЧрд░рд┐рдиреНрдЫ рд░ рд╣рд╛рдореА рд▓рд╛рдЗрдирдорд╛ рдлреЗрд░рд┐ резреж рдЬрдирд╛ рдирдкреБрдЧреБрдиреНрдЬреЗрд▓ рдкрд░реНрдЦрдиреНрдЫреМрдВред рдпрджрд┐ рд╕рдмреИ рдЦреЗрд▓рд╛рдбреАрд╣рд░реВрд▓реЗ рдЦреЗрд▓ рд╕реНрд╡реАрдХрд╛рд░ рдЧрд░реНрдЫрдиреН рднрдиреЗ, рд░рдорд╛рдЗрд▓реЛ рднрд╛рдЧ рд╕реБрд░реБ рд╣реБрдиреНрдЫред
рд╕рдорд░реНрдкрд┐рдд рд╕рд░реНрднрд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди
рд╣рд╛рдореНрд░рд╛ рдЦреЗрд▓рд╣рд░реВ Windows Server 2012 рдЪрд▓реНрдиреЗ VDS рдорд╛ рд╣реЛрд╕реНрдЯ рдЧрд░рд┐рдПрдХрд╛ рдЫрдиреНред рдпрд╕рд▓реЗ рдзреЗрд░реИ рдирд┐рд╖реНрдХрд░реНрд╖рд╣рд░реВрдорд╛ рдкреБрд░реНтАНрдпрд╛рдЙрдБрдЫ:
- рдпрд╕рдорд╛ рдХреБрдиреИ рдбрдХрд░ рдЫреИрди, рдЬрд╕рд▓реЗ рдорд▓рд╛рдИ рдореБрдЯреБрдореИ рдкреНрд░рд╣рд╛рд░ рдЧрд░реНрдпреЛред
- рд╣рд╛рдореА рднрд╛рдбрд╛рдорд╛ рдмрдЪрдд рдЧрд░реНрдЫреМрдВ
рдХрд╛рдо рднрдиреЗрдХреЛ Linux VPS рдмрд╛рдЯ VDS рдорд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЪрд▓рд╛рдЙрдиреБ рд╣реЛред рдореИрд▓реЗ Flask рдорд╛ рдПрдЙрдЯрд╛ рд╕рд╛рдзрд╛рд░рдг рд╕рд░реНрднрд░ рд▓реЗрдЦреЗрдХреЛ рдерд┐рдПрдБред рдорд▓рд╛рдИ Python рдорди рдкрд░реНрджреИрди, рддрд░ Python рдорд╛ рдпреЛ рд╕рд░реНрднрд░ рд▓реЗрдЦреНрди рдЫрд┐рдЯреЛ рд░ рд╕рдЬрд┐рд▓реЛ рдЫред
рдпрд╕рд▓реЗ рей рдХрд╛рд░реНрдпрд╣рд░реВ рдЧрд░реНрджрдЫ:
- рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдХреЛ рд╕рд╛рде рд╕рд░реНрднрд░ рд╕реБрд░реБ рдЧрд░реНрдиреЗ - рдирдХреНрд╕рд╛ рдЫрдиреМрдЯ рдЧрд░реНрдиреЗ, рдЦреЗрд▓ рд╕реБрд░реБ рдЧрд░реНрди рдЦреЗрд▓рд╛рдбреАрд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛, рд░ рдкреНрд▓рдЧрдЗрдирд╣рд░реВрдХреЛ рд╕реЗрдЯред рдо рдЕрд╣рд┐рд▓реЗ рдкреНрд▓рдЧрдЗрдирд╣рд░реВрдорд╛ рдЬрд╛рдБрджрд┐рди - рддреНрдпреЛ рдПрдХрджрдореИ рдлрд░рдХ рдХрдерд╛ рд╣реЛ, рд░рд╛рддрдорд╛ рдЧреНрдпрд╛рд▓рди рдХрдлреА, рдЖрдБрд╕реБ рд░ рдЪреНрдпрд╛рддрд┐рдПрдХреЛ рдХрдкрд╛рд▓ рд╕рдорд╛рд╡реЗрд╢ рдЫред
- рдЕрд╕рдлрд▓ рдЬрдбрд╛рдирд╣рд░реВрдХреЛ рдЕрд╡рд╕реНрдерд╛рдорд╛ рд╕рд░реНрднрд░ рд░реЛрдХреНрдиреЗ/рдкреБрди: рд╕реБрд░реБ рдЧрд░реНрдиреЗ, рдЬреБрди рд╣рд╛рдореА рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рдорд╛рддреНрд░ рд╣реНрдпрд╛рдиреНрдбрд▓ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВред
рдпреЛ рдпрддрд┐ рд╕рд░рд▓ рдЫ рдХрд┐ рдХреЛрдб рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рд▓рдЧрднрдЧ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЫрдиреНред рд╕реНрдХреНрд░рд┐рдкреНрдЯ резрежреж рд▓рд╛рдЗрди рд▓рд╛рдореЛ рдЫред
рддреНрдпрд╕реИрд▓реЗ, рдЬрдм резреж рдЬрдирд╛ рдорд╛рдирд┐рд╕рд╣рд░реВ рднреЗрд▓рд╛ рд╣реБрдиреНрдЫрдиреН рд░ рдЦреЗрд▓ рд╕реНрд╡реАрдХрд╛рд░ рдЧрд░реНрдЫрдиреН, рд╕рд░реНрднрд░ рд╕реБрд░реБ рд╣реБрдиреНрдЫ рд░ рд╕рдмреИрдЬрдирд╛ рдЦреЗрд▓реНрди рдЙрддреНрд╕реБрдХ рд╣реБрдиреНрдЫрдиреН, рдЦреЗрд▓рдорд╛ рд╕рд╛рдореЗрд▓ рд╣реБрдирдХреЛ рд▓рд╛рдЧрд┐ рдПрдЙрдЯрд╛ рд▓рд┐рдЩреНрдХ рдирд┐рдЬреА рд╕рдиреНрджреЗрд╢рдорд╛ рдЖрдЙрдБрдЫред

рд▓рд┐рдЩреНрдХрдорд╛ рдХреНрд▓рд┐рдХ рдЧрд░реНрдирд╛рд▓реЗ рдЦреЗрд▓рд╛рдбреАрд▓рд╛рдИ рдЦреЗрд▓ рд╕рд░реНрднрд░рдорд╛ рдЬреЛрдбрд┐рдиреНрдЫ, рд░ рддреНрдпрд╕рдкрдЫрд┐ рд╕рдмреИ рдХреБрд░рд╛ рд╕рд╣рдЬ рд░реВрдкрдорд╛ рд╣реБрдиреНрдЫред рд▓рдЧрднрдЧ реирел рдорд┐рдиреЗрдЯ рдкрдЫрд┐, рдЦреЗрд▓рд╛рдбреАрд╣рд░реВ рднрдПрдХреЛ рднрд░реНрдЪреБрдЕрд▓ "рдХреЛрдард╛" рдЦрд╛рд▓реА рд╣реБрдиреНрдЫред
рдпреЛ рд▓реЗрдЦрдХреЛ рдЕрд╕рд╣рдЬрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдо рдЕрдЧреНрд░рд┐рдо рдорд╛рдлреА рдЪрд╛рд╣рдиреНрдЫреБред рдореИрд▓реЗ рдпрд╣рд╛рдБ рдзреЗрд░реИ рд╕рдордпрджреЗрдЦрд┐ рд▓реЗрдЦреЗрдХреЛ рдЫреИрди, рд░ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЦрдгреНрдбрд╣рд░реВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдЧрд░реНрди рдзреЗрд░реИ рдХреЛрдбрд╣рд░реВ рдЫрдиреНред рдореВрд▓рддрдГ, рдпреЛ рдХреЗрд╡рд▓ рдмрдХрд╡рд╛рд╕рдХреЛ рдЧреБрдЪреНрдЫрд╛ рд╣реЛред
рдпрджрд┐ рдореИрд▓реЗ рд╡рд┐рд╖рдпрдорд╛ рд░реБрдЪрд┐ рджреЗрдЦреЗрдБ рднрдиреЗ, рджреЛрд╕реНрд░реЛ рднрд╛рдЧ рд╣реБрдиреЗрдЫ - рдпрд╕рдорд╛ srcds (рд╕реНрд░реЛрдд рд╕рдорд░реНрдкрд┐рдд рд╕рд░реНрднрд░) рдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд▓рдЧрдЗрдирд╣рд░реВрд╕рдБрдЧрдХреЛ рдореЗрд░реЛ рд╕рдВрдШрд░реНрд╖, рд░ рд╕рдореНрднрд╡рддрдГ, рдореВрд▓реНрдпрд╛рдЩреНрдХрди рдкреНрд░рдгрд╛рд▓реА рд░ рдЦреЗрд▓ рддрдереНрдпрд╛рдЩреНрдХ рднрдПрдХреЛ рд╕рд╛рдЗрдЯ, рдорд┐рдиреА-рдбреЛрдЯрд╛рдмрдл рд╕рдорд╛рд╡реЗрд╢ рд╣реБрдиреЗрдЫред
рдХреЗрд╣реА рд▓рд┐рдЩреНрдХрд╣рд░реВ:
рд╕реНрд░реЛрдд: www.habr.com
