āĻāĻ•āĻ• āĻĒā§ƒāĻˇā§āĻ āĻž āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻŦāĻŋāĻ¤āĻ°āĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻĄāĻ•āĻžāĻ° āĻšāĻŋāĻ¤ā§āĻ°

āĻāĻ•āĻ•-āĻĒā§ƒāĻˇā§āĻ āĻž āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ (āĻāĻ¸āĻĒāĻŋāĻ) āĻšāĻ˛ āĻ¸ā§āĻŸā§āĻ¯āĻžāĻŸāĻŋāĻ• āĻœāĻžāĻ­āĻžāĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻāĻŦāĻ‚ āĻāĻ‡āĻšāĻŸāĻŋāĻāĻŽāĻāĻ˛ āĻĢāĻžāĻ‡āĻ˛, āĻ¸ā§‡āĻ‡āĻ¸āĻžāĻĨā§‡ āĻ›āĻŦāĻŋ āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻ¸āĻ‚āĻ¸ā§āĻĨāĻžāĻ¨āĻ—ā§āĻ˛āĻŋāĻ° āĻāĻ•āĻŸāĻŋ āĻ¸ā§‡āĻŸāĨ¤ āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻ¤āĻžāĻ°āĻž āĻ—āĻ¤āĻŋāĻļā§€āĻ˛āĻ­āĻžāĻŦā§‡ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻŋāĻ¤ āĻšāĻ¯āĻŧ āĻ¨āĻž, āĻ¤āĻžāĻĻā§‡āĻ° āĻ…āĻ¨āĻ˛āĻžāĻ‡āĻ¨ā§‡ āĻĒā§āĻ°āĻ•āĻžāĻļ āĻ•āĻ°āĻž āĻ–ā§āĻŦ āĻ¸āĻšāĻœāĨ¤ āĻāĻŸāĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻšā§āĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻ• āĻ¸āĻ¸ā§āĻ¤āĻž āĻāĻŦāĻ‚ āĻāĻŽāĻ¨āĻ•āĻŋ āĻŦāĻŋāĻ¨āĻžāĻŽā§‚āĻ˛ā§āĻ¯ā§‡āĻ° āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻž āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡, āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ GitHub āĻĒā§‡āĻœ (āĻāĻŦāĻ‚ āĻ•āĻŋāĻ›ā§āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻŽāĻ¨āĻ•āĻŋ narod.ru āĻĻāĻŋāĻ¯āĻŧā§‡) āĻĻāĻŋāĻ¯āĻŧā§‡ āĻļā§āĻ°ā§ āĻšāĻ¯āĻŧ āĻāĻŦāĻ‚ Amazon S3 āĻāĻ° āĻŽāĻ¤ā§‹ āĻāĻ•āĻŸāĻŋ CDN āĻĻāĻŋāĻ¯āĻŧā§‡ āĻļā§‡āĻˇ āĻšāĻ¯āĻŧāĨ¤ āĻ¯āĻžāĻ‡āĻšā§‹āĻ•, āĻ†āĻŽāĻžāĻ° āĻ…āĻ¨ā§āĻ¯ āĻ•āĻŋāĻ›ā§ āĻĻāĻ°āĻ•āĻžāĻ° āĻ›āĻŋāĻ˛āĨ¤

āĻ†āĻŽāĻžāĻ° āĻāĻ¸āĻĒāĻŋāĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻāĻ•āĻŸāĻŋ āĻĄāĻ•āĻžāĻ° āĻ‡āĻŽā§‡āĻœ āĻĻāĻ°āĻ•āĻžāĻ° āĻ¯āĻžāĻ¤ā§‡ āĻāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻ•ā§āĻŦāĻžāĻ°āĻ¨ā§‡āĻŸāĻ¸ āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ°ā§‡āĻ° āĻ…āĻ‚āĻļ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻŦā§āĻ¯āĻžāĻ•-āĻāĻ¨ā§āĻĄ āĻĄā§‡āĻ­ā§‡āĻ˛āĻĒāĻžāĻ°ā§‡āĻ° āĻŽā§‡āĻļāĻŋāĻ¨ā§‡ āĻ‰āĻ­āĻ¯āĻŧāĻ‡ āĻ¸āĻšāĻœā§‡ āĻšāĻžāĻ˛ā§ āĻ•āĻ°āĻž āĻ¯āĻžāĻ¯āĻŧ āĻ¯āĻžāĻ° āĻ•ā§‹āĻ¨ āĻ§āĻžāĻ°āĻŖāĻž āĻ¨ā§‡āĻ‡ āĻ¯ā§‡ SPA āĻ•āĻŋāĨ¤

āĻ†āĻŽāĻŋ āĻ¨āĻŋāĻœā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤ āĻšāĻŋāĻ¤ā§āĻ°ā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧāĻ¤āĻžāĻ—ā§āĻ˛āĻŋ āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŖ āĻ•āĻ°ā§‡āĻ›āĻŋ:

  • āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°ā§‡āĻ° āĻ¸āĻšāĻœāĻ¤āĻž (āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¸āĻŽāĻžāĻŦā§‡āĻļ āĻ¨āĻ¯āĻŧ);
  • āĻĄāĻŋāĻ¸ā§āĻ• āĻāĻŦāĻ‚ RAM āĻ‰āĻ­āĻ¯āĻŧ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡āĻ‡ āĻ¸āĻ°ā§āĻŦāĻ¨āĻŋāĻŽā§āĻ¨ āĻ†āĻ•āĻžāĻ°;
  • āĻĒāĻ°āĻŋāĻŦā§‡āĻļ āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ āĻ¯āĻžāĻ¤ā§‡ āĻšāĻŋāĻ¤ā§āĻ°āĻŸāĻŋ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻĒāĻ°āĻŋāĻŦā§‡āĻļā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ¯āĻžāĻ¯āĻŧ;
  • āĻĢāĻžāĻ‡āĻ˛ā§‡āĻ° āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻĻāĻ•ā§āĻˇ āĻŦāĻŋāĻ¤āĻ°āĻŖāĨ¤

āĻ†āĻœ āĻ†āĻŽāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻŦāĻ˛āĻŦ āĻ•āĻŋāĻ­āĻžāĻŦā§‡:

  • āĻ…āĻ¨ā§āĻ¤ā§āĻ° nginx;
  • āĻ‰āĻ¤ā§āĻ¸ āĻĨā§‡āĻ•ā§‡ āĻŦā§āĻ°āĻŸāĻ˛āĻŋ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨;
  • āĻ¸ā§āĻĨāĻŋāĻ¤āĻŋāĻļā§€āĻ˛ āĻĢāĻžāĻ‡āĻ˛āĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻĒāĻ°āĻŋāĻŦā§‡āĻļā§‡āĻ° āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ āĻŦā§āĻāĻ¤ā§‡ āĻļā§‡āĻ–āĻžāĻ¨;
  • āĻāĻŦāĻ‚ āĻ…āĻŦāĻļā§āĻ¯āĻ‡ āĻāĻ‡ āĻ¸āĻŦ āĻĨā§‡āĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻĄāĻ•āĻžāĻ° āĻ‡āĻŽā§‡āĻœ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻāĻ•āĻ¤ā§āĻ°āĻŋāĻ¤ āĻ•āĻ°āĻž āĻ¯āĻžāĻ¯āĻŧāĨ¤

āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŸāĻŋāĻ° āĻ‰āĻĻā§āĻĻā§‡āĻļā§āĻ¯ āĻšāĻ˛ āĻ†āĻŽāĻžāĻ° āĻ…āĻ­āĻŋāĻœā§āĻžāĻ¤āĻž āĻļā§‡āĻ¯āĻŧāĻžāĻ° āĻ•āĻ°āĻž āĻāĻŦāĻ‚ āĻ…āĻ­āĻŋāĻœā§āĻž āĻ¸āĻŽā§āĻĒā§āĻ°āĻĻāĻžāĻ¯āĻŧā§‡āĻ° āĻ¸āĻĻāĻ¸ā§āĻ¯āĻĻā§‡āĻ° āĻ—āĻ āĻ¨āĻŽā§‚āĻ˛āĻ• āĻ¸āĻŽāĻžāĻ˛ā§‹āĻšāĻ¨āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ‰āĻ¸ā§āĻ•ā§‡ āĻĻā§‡āĻ“āĻ¯āĻŧāĻžāĨ¤

āĻ¸āĻŽāĻžāĻŦā§‡āĻļā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ‡āĻŽā§‡āĻœ āĻ¨āĻŋāĻ°ā§āĻŽāĻžāĻŖ

āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āĻ¤ āĻĄāĻ•āĻžāĻ° āĻšāĻŋāĻ¤ā§āĻ°āĻŸāĻŋāĻ•ā§‡ āĻ†āĻ•āĻžāĻ°ā§‡ āĻ›ā§‹āĻŸ āĻ•āĻ°āĻ¤ā§‡, āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻĻā§āĻŸāĻŋ āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻŽā§‡āĻ¨ā§‡ āĻšāĻ˛āĻ¤ā§‡ āĻšāĻŦā§‡: āĻāĻ•āĻŸāĻŋ āĻ¨ā§āĻ¯ā§‚āĻ¨āĻ¤āĻŽ āĻ¸ā§āĻ¤āĻ° āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻ¨ā§āĻ¯ā§‚āĻ¨āĻ¤āĻŽ āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋ āĻšāĻŋāĻ¤ā§āĻ°āĨ¤ āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ›ā§‹āĻŸ āĻŦā§‡āĻ¸ āĻ‡āĻŽā§‡āĻœāĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻāĻ•āĻŸāĻŋ āĻšāĻ˛ āĻ†āĻ˛āĻĒāĻžāĻ‡āĻ¨ āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ āĻ‡āĻŽā§‡āĻœ, āĻ¤āĻžāĻ‡ āĻ†āĻŽāĻŋ āĻāĻŸāĻŋāĻ‡ āĻŦā§‡āĻ›ā§‡ āĻ¨ā§‡āĻŦāĨ¤ āĻ•ā§‡āĻ‰ āĻ•ā§‡āĻ‰ āĻ¯ā§āĻ•ā§āĻ¤āĻŋ āĻĻāĻŋāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻ¯ā§‡ āĻ†āĻ˛ā§āĻĒāĻžāĻ‡āĻ¨ āĻ‰ā§ŽāĻĒāĻžāĻĻāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ‰āĻĒāĻ¯ā§āĻ•ā§āĻ¤ āĻ¨āĻ¯āĻŧ āĻāĻŦāĻ‚ āĻ¤āĻžāĻ°āĻž āĻ¸āĻ āĻŋāĻ• āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻ¤āĻŦā§‡ āĻŦā§āĻ¯āĻ•ā§āĻ¤āĻŋāĻ—āĻ¤āĻ­āĻžāĻŦā§‡, āĻ†āĻŽāĻžāĻ° āĻ•āĻ–āĻ¨ā§‹āĻ‡ āĻ¤āĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•ā§‹āĻ¨ā§‹ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻšāĻ¯āĻŧāĻ¨āĻŋ āĻāĻŦāĻ‚ āĻ¤āĻžāĻ° āĻŦāĻŋāĻ°ā§āĻĻā§āĻ§ā§‡ āĻ•ā§‹āĻ¨ā§‹ āĻ¯ā§āĻ•ā§āĻ¤āĻŋāĻ“ āĻ¨ā§‡āĻ‡āĨ¤

āĻ•āĻŽ āĻ¸ā§āĻ¤āĻ° āĻ†āĻ›ā§‡, āĻ†āĻŽāĻŋ 2 āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧā§‡ āĻ‡āĻŽā§‡āĻœ āĻāĻ•āĻ¤ā§āĻ°āĻŋāĻ¤ āĻšāĻŦā§‡. āĻĒā§āĻ°āĻĨāĻŽāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻ–āĻ¸āĻĄāĻŧāĻž; āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ¸āĻšāĻžāĻ¯āĻŧāĻ• āĻ‡āĻ‰āĻŸāĻŋāĻ˛āĻŋāĻŸāĻŋ āĻāĻŦāĻ‚ āĻ…āĻ¸ā§āĻĨāĻžāĻ¯āĻŧā§€ āĻĢāĻžāĻ‡āĻ˛ āĻāĻ¤ā§‡ āĻĨāĻžāĻ•āĻŦā§‡āĨ¤ āĻāĻŦāĻ‚ āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āĻ¤ āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧā§‡ āĻ†āĻŽāĻŋ āĻ•ā§‡āĻŦāĻ˛ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻŸāĻŋāĻ° āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āĻ¤ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖāĻŸāĻŋ āĻ˛āĻŋāĻ–āĻŦāĨ¤

āĻšāĻ˛ā§āĻ¨ āĻ¸āĻšāĻžāĻ¯āĻŧāĻ• āĻšāĻŋāĻ¤ā§āĻ° āĻĻāĻŋāĻ¯āĻŧā§‡ āĻļā§āĻ°ā§ āĻ•āĻ°āĻž āĻ¯āĻžāĻ•āĨ¤

āĻāĻ•āĻŸāĻŋ SPA āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻ•āĻŽā§āĻĒāĻžāĻ‡āĻ˛ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ¤ node.js āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨āĨ¤ āĻ†āĻŽāĻŋ āĻ…āĻĢāĻŋāĻ¸āĻŋāĻ¯āĻŧāĻžāĻ˛ āĻ‡āĻŽā§‡āĻœ āĻ¨ā§‡āĻŦ, āĻ¯āĻž āĻāĻ¨āĻĒāĻŋāĻāĻŽ āĻāĻŦāĻ‚ āĻ‡āĻ¯āĻŧāĻžāĻ°ā§āĻ¨ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœ āĻŽā§āĻ¯āĻžāĻ¨ā§‡āĻœāĻžāĻ°āĻĻā§‡āĻ° āĻ¸āĻžāĻĨā§‡āĻ“ āĻ†āĻ¸ā§‡āĨ¤ āĻ†āĻŽāĻžāĻ° āĻ¨āĻŋāĻœā§‡āĻ° āĻĒāĻ•ā§āĻˇ āĻĨā§‡āĻ•ā§‡, āĻ†āĻŽāĻŋ āĻ¨ā§‹āĻĄ-āĻœāĻŋāĻĒ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻŦ, āĻ¯āĻž āĻ•āĻŋāĻ›ā§ āĻāĻ¨āĻĒāĻŋāĻāĻŽ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻāĻŦāĻ‚ āĻ—ā§āĻ—āĻ˛ā§‡āĻ° āĻŦā§āĻ°āĻŸāĻ˛āĻŋ āĻ•āĻŽā§āĻĒā§āĻ°ā§‡āĻ¸āĻžāĻ°, āĻ¯āĻž āĻĒāĻ°ā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•āĻžāĻœā§‡ āĻ˛āĻžāĻ—āĻŦā§‡āĨ¤

āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻ¸āĻš āĻĄāĻ•āĻžāĻ°āĻĢāĻžāĻ‡āĻ˛.

# БазовŅ‹Đš ОйŅ€Đ°Đˇ
FROM node:12-alpine
LABEL maintainer="Aleksey Maydokin <[email protected]>"
ENV BROTLI_VERSION 1.0.7
# ПаĐēĐĩŅ‚Ņ‹, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŊŅƒĐļĐŊŅ‹, Ņ‡Ņ‚ОйŅ‹ ŅĐžĐąŅ€Đ°Ņ‚ŅŒ иС иŅŅ…ОдĐŊиĐēОв Brotli
RUN apk add --no-cache --virtual .build-deps 
        bash 
        gcc 
        libc-dev 
        make 
        linux-headers 
        cmake 
        curl 
    && mkdir -p /usr/src 
    # ИŅŅ…ОдĐŊиĐēи Brotli ŅĐēĐ°Ņ‡Đ¸Đ˛Đ°ĐĩĐŧ иС ĐžŅ„иŅ†Đ¸Đ°ĐģŅŒĐŊĐžĐŗĐž Ņ€ĐĩĐŋОСиŅ‚ĐžŅ€Đ¸Ņ
    && curl -LSs https://github.com/google/brotli/archive/v$BROTLI_VERSION.tar.gz | tar xzf - -C /usr/src 
    && cd /usr/src/brotli-$BROTLI_VERSION 
    # КоĐŧĐŋиĐģиŅ€ŅƒĐĩĐŧ Brotli
    && ./configure-cmake --disable-debug && make -j$(getconf _NPROCESSORS_ONLN) && make install 
    # ДобавĐģŅĐĩĐŧ node-gyp
    && yarn global add node-gyp 
    # ĐŖйиŅ€Đ°ĐĩĐŧ Са ŅĐžĐąĐžĐš ĐŧŅƒŅĐžŅ€
    && apk del .build-deps && yarn cache clean && rm -rf /usr/src

āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡ āĻāĻ–āĻžāĻ¨ā§‡ āĻ†āĻŽāĻŋ minimalism āĻœāĻ¨ā§āĻ¯ āĻ¯ā§āĻĻā§āĻ§ āĻ•āĻ°āĻ›āĻŋ, āĻ¤āĻžāĻ‡ āĻ‡āĻŽā§‡āĻœ āĻāĻ•āĻŸāĻŋ āĻŦāĻĄāĻŧ āĻĻāĻ˛ āĻĻā§āĻŦāĻžāĻ°āĻž āĻāĻ•āĻ¤ā§āĻ°āĻŋāĻ¤ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ.

āĻ¸āĻŽāĻžāĻĒā§āĻ¤ āĻšāĻŋāĻ¤ā§āĻ° āĻāĻ–āĻžāĻ¨ā§‡ āĻĒāĻžāĻ“āĻ¯āĻŧāĻž āĻ¯āĻžāĻŦā§‡: https://hub.docker.com/r/alexxxnf/spa-builder. āĻ¯āĻĻāĻŋāĻ“ āĻ†āĻŽāĻŋ āĻ…āĻ¨ā§āĻ¯ āĻ˛ā§‹āĻ•ā§‡āĻĻā§‡āĻ° āĻ›āĻŦāĻŋāĻ° āĻ‰āĻĒāĻ° āĻ¨āĻŋāĻ°ā§āĻ­āĻ° āĻ¨āĻž āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¨āĻŋāĻœā§‡āĻ° āĻ¸āĻ‚āĻ—ā§āĻ°āĻš āĻ•āĻ°āĻžāĻ° āĻĒāĻ°āĻžāĻŽāĻ°ā§āĻļ āĻĻāĻŋāĻ‡āĨ¤

nginx

āĻ†āĻĒāĻ¨āĻŋ āĻ¸ā§āĻŸā§āĻ¯āĻžāĻŸāĻŋāĻ• āĻŦāĻŋāĻˇāĻ¯āĻŧāĻŦāĻ¸ā§āĻ¤ā§ āĻŦāĻŋāĻ¤āĻ°āĻŖ āĻ•āĻ°āĻ¤ā§‡ āĻ¯ā§‡ āĻ•ā§‹āĻ¨ā§‹ āĻ“āĻ¯āĻŧā§‡āĻŦ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤ āĻ†āĻŽāĻŋ nginx āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻ¤ā§‡ āĻ…āĻ­ā§āĻ¯āĻ¸ā§āĻ¤, āĻ¤āĻžāĻ‡ āĻ†āĻŽāĻŋ āĻāĻ–āĻ¨ āĻāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŦāĨ¤

Nginx āĻāĻ° āĻāĻ•āĻŸāĻŋ āĻ…āĻĢāĻŋāĻ¸āĻŋāĻ¯āĻŧāĻžāĻ˛ āĻĄāĻ•āĻžāĻ° āĻ‡āĻŽā§‡āĻœ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡, āĻ¤āĻŦā§‡ āĻāĻŸāĻŋāĻ¤ā§‡ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻ¸ā§āĻŸā§āĻ¯āĻžāĻŸāĻŋāĻ• āĻĄāĻŋāĻ¸ā§āĻŸā§āĻ°āĻŋāĻŦāĻŋāĻ‰āĻļāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ¨ā§‡āĻ•āĻ—ā§āĻ˛āĻŋ āĻŽāĻĄāĻŋāĻ‰āĻ˛ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻ•ā§‹āĻ¨āĻŸāĻŋ āĻĄā§‡āĻ˛āĻŋāĻ­āĻžāĻ°āĻŋāĻ¤ā§‡ āĻ…āĻ¨ā§āĻ¤āĻ°ā§āĻ­ā§āĻ•ā§āĻ¤ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ āĻ¤āĻž āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻļā§‡āĻˇ āĻĻāĻ˛ āĻŦāĻž āĻ…āĻĢāĻŋāĻ¸āĻŋāĻ¯āĻŧāĻžāĻ˛ āĻĄāĻ•āĻžāĻ°āĻĢāĻžāĻ‡āĻ˛ā§‡ āĻĻā§‡āĻ–āĻž āĻ¯āĻžāĻŦā§‡āĨ¤

$ āĻĄāĻ•āĻžāĻ° āĻ°āĻžāĻ¨ --rm nginx:1-āĻ†āĻ˛ā§āĻĒāĻžāĻ‡āĻ¨ nginx -V

nginx version: nginx/1.17.9
built by gcc 8.3.0 (Alpine 8.3.0) 
built with OpenSSL 1.1.1d  10 Sep 2019
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --with-perl_modules_path=/usr/lib/perl5/vendor_perl --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-Os -fomit-frame-pointer' --with-ld-opt=-Wl,--as-needed

āĻ†āĻŽāĻŋ āĻĄāĻ•āĻžāĻ°āĻĢāĻžāĻ‡āĻ˛āĻŸāĻŋāĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŦ, āĻ¤āĻŦā§‡ āĻ¸ā§āĻŸā§āĻ¯āĻžāĻŸāĻŋāĻ• āĻ¸āĻžāĻŽāĻ—ā§āĻ°ā§€ āĻŦāĻŋāĻ¤āĻ°āĻŖ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¯āĻž āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻ¤āĻž āĻ†āĻŽāĻŋ āĻāĻ¤ā§‡ āĻ°ā§‡āĻ–ā§‡ āĻĻā§‡āĻŦāĨ¤ āĻ†āĻŽāĻžāĻ° āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ HTTPS āĻāĻ° āĻ‰āĻĒāĻ° āĻ•āĻžāĻœ āĻ•āĻ°āĻ¤ā§‡ āĻ¸āĻ•ā§āĻˇāĻŽ āĻšāĻŦā§‡ āĻ¨āĻž, āĻ…āĻ¨ā§āĻŽā§‹āĻĻāĻ¨ āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ āĻ•āĻ°āĻŦā§‡ āĻ¨āĻž āĻāĻŦāĻ‚ āĻ†āĻ°āĻ“ āĻ…āĻ¨ā§‡āĻ• āĻ•āĻŋāĻ›ā§āĨ¤ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ†āĻŽāĻžāĻ° āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖāĻŸāĻŋ āĻŦā§āĻ°āĻŸāĻ˛āĻŋ āĻ…ā§āĻ¯āĻžāĻ˛āĻ—āĻ°āĻŋāĻĻāĻŽā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻ‚āĻ•ā§āĻšāĻŋāĻ¤ āĻĢāĻžāĻ‡āĻ˛āĻ—ā§āĻ˛āĻŋ āĻŦāĻŋāĻ¤āĻ°āĻŖ āĻ•āĻ°āĻ¤ā§‡ āĻ¸āĻ•ā§āĻˇāĻŽ āĻšāĻŦā§‡, āĻ¯āĻž āĻœāĻŋāĻœāĻŋāĻĒā§‡āĻ° āĻšā§‡āĻ¯āĻŧā§‡ āĻ•āĻŋāĻ›ā§āĻŸāĻž āĻŦā§‡āĻļāĻŋ āĻĻāĻ•ā§āĻˇāĨ¤ āĻ†āĻŽāĻ°āĻž āĻĢāĻžāĻ‡āĻ˛āĻ—ā§āĻ˛āĻŋ āĻāĻ•āĻŦāĻžāĻ° āĻ¸āĻ‚āĻ•ā§āĻšāĻŋāĻ¤ āĻ•āĻ°āĻŦ; āĻ‰āĻĄāĻŧā§‡ āĻ—āĻŋāĻ¯āĻŧā§‡ āĻāĻŸāĻŋ āĻ•āĻ°āĻžāĻ° āĻĻāĻ°āĻ•āĻžāĻ° āĻ¨ā§‡āĻ‡āĨ¤

āĻāĻŸāĻŋ āĻ¸ā§‡āĻ‡ āĻĄāĻ•āĻžāĻ°āĻĢāĻžāĻ‡āĻ˛ āĻ¯āĻž āĻ†āĻŽāĻŋ āĻļā§‡āĻˇ āĻ•āĻ°ā§‡āĻ›āĻŋāĨ¤ āĻ°āĻžāĻļāĻŋāĻ¯āĻŧāĻžāĻ¨ āĻ­āĻžāĻˇāĻžāĻ¯āĻŧ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯āĻ—ā§āĻ˛āĻŋ āĻ†āĻŽāĻžāĻ°, āĻ‡āĻ‚āĻ°ā§‡āĻœāĻŋāĻ¤ā§‡ - āĻŽā§‚āĻ˛ āĻĨā§‡āĻ•ā§‡āĨ¤

Dockerfile

# БазовŅ‹Đš ОйŅ€Đ°Đˇ ŅĐŊОва Alpine
FROM alpine:3.9
LABEL maintainer="Aleksey Maydokin <[email protected]>"
ENV NGINX_VERSION 1.16.0
ENV NGX_BROTLI_VERSION 0.1.2
ENV BROTLI_VERSION 1.0.7
RUN set -x 
    && addgroup -S nginx 
    && adduser -D -S -h /var/cache/nginx -s /sbin/nologin -G nginx nginx 
# ĐŖŅŅ‚Đ°ĐŊавĐģиваĐĩĐŧ ĐŋĐ°ĐēĐĩŅ‚Ņ‹, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŊŅƒĐļĐŊŅ‹ Ņ‡Ņ‚ОйŅ‹ ŅĐžĐąŅ€Đ°Ņ‚ŅŒ nginx и ĐŧОдŅƒĐģŅŒ ngx_brotli Đē ĐŊĐĩĐŧŅƒ
    && apk add --no-cache --virtual .build-deps 
            gcc 
            libc-dev 
            make 
            linux-headers 
            curl 
    && mkdir -p /usr/src 
# ĐĄĐēĐ°Ņ‡Đ¸Đ˛Đ°ĐĩĐŧ иŅŅ…ОдĐŊиĐēи
    && curl -LSs https://nginx.org/download/nginx-$NGINX_VERSION.tar.gz | tar xzf - -C /usr/src 
    && curl -LSs https://github.com/eustas/ngx_brotli/archive/v$NGX_BROTLI_VERSION.tar.gz | tar xzf - -C /usr/src 
    && curl -LSs https://github.com/google/brotli/archive/v$BROTLI_VERSION.tar.gz | tar xzf - -C /usr/src 
    && rm -rf /usr/src/ngx_brotli-$NGX_BROTLI_VERSION/deps/brotli/ 
    && ln -s /usr/src/brotli-$BROTLI_VERSION /usr/src/ngx_brotli-$NGX_BROTLI_VERSION/deps/brotli 
    && cd /usr/src/nginx-$NGINX_VERSION 
    && CNF="
            --prefix=/etc/nginx 
            --sbin-path=/usr/sbin/nginx 
            --modules-path=/usr/lib/nginx/modules 
            --conf-path=/etc/nginx/nginx.conf 
            --error-log-path=/var/log/nginx/error.log 
            --http-log-path=/var/log/nginx/access.log 
            --pid-path=/var/run/nginx.pid 
            --lock-path=/var/run/nginx.lock 
            --http-client-body-temp-path=/var/cache/nginx/client_temp 
            --http-proxy-temp-path=/var/cache/nginx/proxy_temp 
            --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp 
            --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp 
            --http-scgi-temp-path=/var/cache/nginx/scgi_temp 
            --user=nginx 
            --group=nginx 
            --without-http_ssi_module 
            --without-http_userid_module 
            --without-http_access_module 
            --without-http_auth_basic_module 
            --without-http_mirror_module 
            --without-http_autoindex_module 
            --without-http_geo_module 
            --without-http_split_clients_module 
            --without-http_referer_module 
            --without-http_rewrite_module 
            --without-http_proxy_module 
            --without-http_fastcgi_module 
            --without-http_uwsgi_module 
            --without-http_scgi_module 
            --without-http_grpc_module 
            --without-http_memcached_module 
            --without-http_limit_conn_module 
            --without-http_limit_req_module 
            --without-http_empty_gif_module 
            --without-http_browser_module 
            --without-http_upstream_hash_module 
            --without-http_upstream_ip_hash_module 
            --without-http_upstream_least_conn_module 
            --without-http_upstream_keepalive_module 
            --without-http_upstream_zone_module 
            --without-http_gzip_module 
            --with-http_gzip_static_module 
            --with-threads 
            --with-compat 
            --with-file-aio 
            --add-dynamic-module=/usr/src/ngx_brotli-$NGX_BROTLI_VERSION 
    " 
# ХОйиŅ€Đ°ĐĩĐŧ
    && ./configure $CNF 
    && make -j$(getconf _NPROCESSORS_ONLN) 
    && make install 
    && rm -rf /usr/src/ 
# ĐŖĐ´Đ°ĐģŅĐĩĐŧ диĐŊĐ°ĐŧиŅ‡ĐĩŅĐēиК brotli ĐŧОдŅƒĐģŅŒ, ĐžŅŅ‚авĐģŅŅ Ņ‚ĐžĐģŅŒĐēĐž ŅŅ‚Đ°Ņ‚иŅ‡ĐĩŅĐēиК
    && rm /usr/lib/nginx/modules/ngx_http_brotli_filter_module.so 
    && sed -i '$ d' /etc/apk/repositories 
# Bring in gettext so we can get `envsubst`, then throw
# the rest away. To do this, we need to install `gettext`
# then move `envsubst` out of the way so `gettext` can
# be deleted completely, then move `envsubst` back.
    && apk add --no-cache --virtual .gettext gettext 
    && mv /usr/bin/envsubst /tmp/ 
    && runDeps="$( 
        scanelf --needed --nobanner /usr/sbin/nginx /usr/lib/nginx/modules/*.so /tmp/envsubst 
            | awk '{ gsub(/,/, "nso:", $2); print "so:" $2 }' 
            | sort -u 
            | xargs -r apk info --installed 
            | sort -u 
    )" 
    && apk add --no-cache $runDeps 
    && apk del .build-deps 
    && apk del .gettext 
    && mv /tmp/envsubst /usr/local/bin/ 
# Bring in tzdata so users could set the timezones through the environment
# variables
    && apk add --no-cache tzdata 
# forward request and error logs to docker log collector
    && ln -sf /dev/stdout /var/log/nginx/access.log 
    && ln -sf /dev/stderr /var/log/nginx/error.log
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
STOPSIGNAL SIGTERM
CMD ["nginx", "-g", "daemon off;"]

āĻ†āĻŽāĻŋ āĻ…āĻŦāĻŋāĻ˛āĻŽā§āĻŦā§‡ nginx.conf āĻ āĻŋāĻ• āĻ•āĻ°āĻŦ āĻ¯āĻžāĻ¤ā§‡ āĻœāĻŋāĻœāĻŋāĻĒ āĻāĻŦāĻ‚ āĻŦā§āĻ°ā§‹āĻŸāĻ˛āĻŋ āĻĄāĻŋāĻĢāĻ˛ā§āĻŸāĻ°ā§‚āĻĒā§‡ āĻ¸āĻ•ā§āĻ°āĻŋāĻ¯āĻŧ āĻĨāĻžāĻ•ā§‡āĨ¤ āĻ†āĻŽāĻŋ āĻ•ā§āĻ¯āĻžāĻļāĻŋāĻ‚ āĻšā§‡āĻĄāĻžāĻ°āĻ“ āĻ…āĻ¨ā§āĻ¤āĻ°ā§āĻ­ā§āĻ•ā§āĻ¤ āĻ•āĻ°āĻŦ, āĻ•āĻžāĻ°āĻŖ āĻ†āĻŽāĻ°āĻž āĻ•āĻ–āĻ¨āĻ‡ āĻ¸ā§āĻŸā§āĻ¯āĻžāĻŸāĻŋāĻ• āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻŦ āĻ¨āĻžāĨ¤ āĻāĻŦāĻ‚ āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āĻ¤ āĻ¸ā§āĻĒāĻ°ā§āĻļ āĻ¸āĻŽāĻ¸ā§āĻ¤ 404 āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ index.html āĻ āĻĒā§āĻ¨āĻƒāĻ¨āĻŋāĻ°ā§āĻĻā§‡āĻļ āĻ•āĻ°āĻž āĻšāĻŦā§‡, āĻāĻŸāĻŋ SPA-āĻ¤ā§‡ āĻ¨ā§‡āĻ­āĻŋāĻ—ā§‡āĻļāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧāĨ¤

nginx.conf

user nginx;
worker_processes  1;
error_log /var/log/nginx/error.log warn;
pid       /var/run/nginx.pid;
load_module /usr/lib/nginx/modules/ngx_http_brotli_static_module.so;
events {
    worker_connections 1024;
}
http {
    include      mime.types;
    default_type application/octet-stream;
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
    access_log /var/log/nginx/access.log main;
    sendfile on;
    keepalive_timeout 65;
    gzip_static   on;
    brotli_static on;
    server {
        listen      80;
        server_name localhost;
        charset utf-8;
        location / {
            root html;
            try_files $uri /index.html;
            etag on;
            expires max;
            add_header Cache-Control public;
            location = /index.html {
                expires 0;
                add_header Cache-Control "no-cache, public, must-revalidate, proxy-revalidate";
            }
        }
    }
}

āĻ†āĻĒāĻ¨āĻŋ āĻāĻ–āĻžāĻ¨ā§‡ āĻ¸āĻŽāĻžāĻĒā§āĻ¤ āĻ‡āĻŽā§‡āĻœ āĻĄāĻžāĻ‰āĻ¨āĻ˛ā§‹āĻĄ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨: https://hub.docker.com/r/alexxxnf/nginx-spa. āĻāĻŸāĻŋ 10,5 MB āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤ āĻ¨ā§‡āĻ¯āĻŧāĨ¤ āĻ†āĻ¸āĻ˛ nginx 19,7 MB āĻ—ā§āĻ°āĻšāĻŖ āĻ•āĻ°ā§‡āĻ›ā§‡āĨ¤ āĻ†āĻŽāĻžāĻ° āĻ–ā§‡āĻ˛āĻžāĻ§ā§āĻ˛āĻžāĻ° āĻ†āĻ—ā§āĻ°āĻš āĻ¸āĻ¨ā§āĻ¤ā§āĻˇā§āĻŸāĨ¤

āĻĒāĻ°āĻŋāĻŦā§‡āĻļā§‡āĻ° āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ āĻŦā§‹āĻāĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸ā§āĻŸā§āĻ¯āĻžāĻŸāĻŋāĻ•ā§āĻ¸ āĻļā§‡āĻ–āĻžāĻ¨ā§‹

āĻ•ā§‡āĻ¨ SPA-āĻ¤ā§‡ āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡? āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻ•ā§‹āĻ¨ RESTful API āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ āĻ¤āĻž āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯āĨ¤ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ¤, āĻ•āĻžāĻ™ā§āĻ–āĻŋāĻ¤ āĻĒāĻ°āĻŋāĻŦā§‡āĻļā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ āĻŦāĻŋāĻ˛ā§āĻĄ āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧā§‡ āĻāĻ¸āĻĒāĻŋāĻāĻ¤ā§‡ āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ°āĻŋāĻ¤ āĻšāĻ¯āĻŧāĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻ•āĻŋāĻ›ā§ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ¨ āĻ¤āĻŦā§‡ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻŸāĻŋ āĻĒā§āĻ¨āĻ°ā§āĻ¨āĻŋāĻ°ā§āĻŽāĻžāĻŖ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ āĻ†āĻŽāĻŋ āĻāĻŸāĻž āĻšāĻžāĻ‡ āĻ¨āĻž. āĻ†āĻŽāĻŋ āĻšāĻžāĻ‡ āĻ¸āĻŋāĻ†āĻ‡ āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧā§‡ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻŸāĻŋ āĻāĻ•āĻŦāĻžāĻ° āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻšā§‹āĻ• āĻāĻŦāĻ‚ āĻĒāĻ°āĻŋāĻŦā§‡āĻļā§‡āĻ° āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ¸āĻŋāĻĄāĻŋ āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧā§‡ āĻ¯āĻ¤āĻŸāĻž āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻ¤āĻ¤āĻŸāĻž āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻž āĻšā§‹āĻ•āĨ¤

āĻ…āĻŦāĻļā§āĻ¯āĻ‡, āĻ¸ā§āĻŸā§āĻ¯āĻžāĻŸāĻŋāĻ• āĻĢāĻžāĻ‡āĻ˛āĻ—ā§āĻ˛āĻŋ āĻ¨āĻŋāĻœā§‡āĻ°āĻžāĻ‡ āĻ•ā§‹āĻ¨āĻ“ āĻĒāĻ°āĻŋāĻŦā§‡āĻļā§‡āĻ° āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ āĻŦā§‹āĻā§‡ āĻ¨āĻžāĨ¤ āĻ…āĻ¤āĻāĻŦ, āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻ•ā§ŒāĻļāĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āĻ¤ āĻšāĻŋāĻ¤ā§āĻ°ā§‡, āĻ†āĻŽāĻŋ nginx āĻšāĻžāĻ˛ā§ āĻ•āĻ°āĻŦ āĻ¨āĻž, āĻ¤āĻŦā§‡ āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻļā§‡āĻˇ āĻļā§‡āĻ˛ āĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻ¯āĻž āĻĒāĻ°āĻŋāĻŦā§‡āĻļā§‡āĻ° āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛āĻ—ā§āĻ˛āĻŋ āĻĒāĻĄāĻŧāĻŦā§‡, āĻ¸ā§āĻŸā§āĻ¯āĻžāĻŸāĻŋāĻ• āĻĢāĻžāĻ‡āĻ˛āĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻ˛āĻŋāĻ–āĻŦā§‡, āĻ¸ā§‡āĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ¸āĻ‚āĻ•ā§āĻšāĻŋāĻ¤ āĻ•āĻ°āĻŦā§‡ āĻāĻŦāĻ‚ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ¤āĻžāĻ°āĻĒāĻ°ā§‡ nginx-āĻ āĻ¨āĻŋāĻ¯āĻŧāĻ¨ā§āĻ¤ā§āĻ°āĻŖ āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ° āĻ•āĻ°āĻŦā§‡āĨ¤

āĻāĻ‡ āĻ‰āĻĻā§āĻĻā§‡āĻļā§āĻ¯ā§‡, āĻĄāĻ•āĻžāĻ°āĻĢāĻžāĻ‡āĻ˛ ENTRYPOINT āĻĒā§āĻ¯āĻžāĻ°āĻžāĻŽāĻŋāĻŸāĻžāĻ° āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡āĨ¤ āĻ†āĻ¸ā§āĻ¨ āĻ¤āĻžāĻ•ā§‡ āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤ āĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸāĻŸāĻŋ āĻĻāĻŋāĻ‡ (āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻ•ā§ŒāĻŖāĻŋāĻ• āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡):

docker-entrypoint.sh

#!/bin/sh
set -e
FLAG_FILE="/configured"
TARGET_DIR="/etc/nginx/html"
replace_vars () {
  ENV_VARS='$(awk 'BEGIN{for(v in ENVIRON) print "

quot;v}')'
# В Angular иŅ‰ĐĩĐŧ ĐŋĐģĐĩĐšŅŅ…ĐžĐģĐ´ĐĩŅ€Ņ‹ в main-Ņ„Đ°ĐšĐģĐ°Ņ…
for f in "$TARGET_DIR"/main*.js; do
# envsubst СаĐŧĐĩĐŊŅĐĩŅ‚ в Ņ„Đ°ĐšĐģĐ°Ņ… ĐŋĐģĐĩĐšŅŅ…ĐžĐģĐ´ĐĩŅ€Ņ‹ ĐŊĐ° СĐŊĐ°Ņ‡ĐĩĐŊиŅ иС ĐŋĐĩŅ€ĐĩĐŧĐĩĐŊĐŊŅ‹Ņ… ĐžĐēŅ€ŅƒĐļĐĩĐŊиŅ
echo "$(envsubst "$ENV_VARS" < "$f")" > "$f"
done
}
compress () {
for i in $(find "$TARGET_DIR" | grep -E ".css$|.html$|.js$|.svg$|.txt$|.ttf


quot;); do
# ИŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧ ĐŧĐ°ĐēŅĐ¸ĐŧĐ°ĐģŅŒĐŊŅƒŅŽ ŅŅ‚ĐĩĐŋĐĩĐŊŅŒ ŅĐļĐ°Ņ‚иŅ
gzip -9kf "$i" && brotli -fZ "$i"
done
}
if [ "$1" = 'nginx' ]; then
# ФĐģĐ°Đŗ ĐŊŅƒĐļĐĩĐŊ, Ņ‡Ņ‚ОйŅ‹ вŅ‹ĐŋĐžĐģĐŊиŅ‚ŅŒ ŅĐēŅ€Đ¸ĐŋŅ‚ Ņ‚ĐžĐģŅŒĐēĐž ĐŋŅ€Đ¸ ŅĐ°ĐŧĐžĐŧ ĐŋĐĩŅ€Đ˛ĐžĐŧ СаĐŋŅƒŅĐēĐĩ
if [ ! -e "$FLAG_FILE" ]; then
echo "Running init script"
echo "Replacing env vars"
replace_vars
echo "Compressing files"
compress
touch $FLAG_FILE
echo "Done"
fi
fi
exec "$@"

āĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻ¤āĻžāĻ° āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ āĻāĻ‡ āĻĢāĻ°ā§āĻŽā§‡āĻ° js āĻĢāĻžāĻ‡āĻ˛āĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻšāĻŦā§‡: ${API_URL}.

āĻāĻŸāĻŋ āĻ˛āĻ•ā§āĻˇāĻŖā§€āĻ¯āĻŧ āĻ¯ā§‡ āĻŦā§‡āĻļāĻŋāĻ°āĻ­āĻžāĻ— āĻ†āĻ§ā§āĻ¨āĻŋāĻ• āĻāĻ¸āĻĒāĻŋāĻāĻ—ā§āĻ˛āĻŋ āĻ¨āĻŋāĻ°ā§āĻŽāĻžāĻŖā§‡āĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ¤āĻžāĻĻā§‡āĻ° āĻĢāĻžāĻ‡āĻ˛āĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻšā§āĻ¯āĻžāĻļ āĻ¯ā§āĻ•ā§āĻ¤ āĻ•āĻ°ā§‡āĨ¤ āĻāĻŸāĻŋ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧ āĻ¯āĻžāĻ¤ā§‡ āĻŦā§āĻ°āĻžāĻ‰āĻœāĻžāĻ°āĻŸāĻŋ āĻĻā§€āĻ°ā§āĻ˜ āĻ¸āĻŽāĻ¯āĻŧā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻĢāĻžāĻ‡āĻ˛āĻŸāĻŋ āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻā§‡ āĻ•ā§āĻ¯āĻžāĻļā§‡ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻ¯āĻĻāĻŋ āĻĢāĻžāĻ‡āĻ˛āĻŸāĻŋ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻšāĻ¯āĻŧ, āĻ¤āĻŦā§‡ āĻāĻ° āĻšā§āĻ¯āĻžāĻļ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻšāĻŦā§‡, āĻ¯āĻž āĻŦā§āĻ°āĻžāĻ‰āĻœāĻžāĻ°āĻŸāĻŋāĻ•ā§‡ āĻ†āĻŦāĻžāĻ° āĻĢāĻžāĻ‡āĻ˛āĻŸāĻŋ āĻĄāĻžāĻ‰āĻ¨āĻ˛ā§‹āĻĄ āĻ•āĻ°āĻ¤ā§‡ āĻŦāĻžāĻ§ā§āĻ¯ āĻ•āĻ°āĻŦā§‡āĨ¤

āĻĻā§āĻ°ā§āĻ­āĻžāĻ—ā§āĻ¯āĻŦāĻļāĻ¤, āĻ†āĻŽāĻžāĻ° āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ¤ā§‡, āĻāĻ¨āĻ­āĻžāĻ¯āĻŧāĻ°āĻ¨āĻŽā§‡āĻ¨ā§āĻŸ āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻž āĻĢāĻžāĻ‡āĻ˛ āĻšā§āĻ¯āĻžāĻļā§‡āĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ā§‡āĻ° āĻĻāĻŋāĻ•ā§‡ āĻĒāĻ°āĻŋāĻšāĻžāĻ˛āĻŋāĻ¤ āĻ•āĻ°ā§‡ āĻ¨āĻž, āĻ¯āĻžāĻ° āĻŽāĻžāĻ¨ā§‡ āĻŦā§āĻ°āĻžāĻ‰āĻœāĻžāĻ° āĻ•ā§āĻ¯āĻžāĻļā§‡ āĻ…āĻ¨ā§āĻ¯ āĻ•ā§‹āĻ¨ā§‹ āĻ‰āĻĒāĻžāĻ¯āĻŧā§‡ āĻ…āĻŦā§ˆāĻ§ āĻšāĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ āĻ†āĻŽāĻžāĻ° āĻāĻ‡ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻ¨ā§‡āĻ‡ āĻ•āĻžāĻ°āĻŖ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻĒāĻ°āĻŋāĻŦā§‡āĻļā§‡ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤

āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āĻ¤ āĻšāĻŋāĻ¤ā§āĻ° āĻāĻ•āĻ¸āĻžāĻĨā§‡ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻŖ

āĻ…āĻŦāĻļā§‡āĻˇā§‡.

Dockerfile

# ПĐĩŅ€Đ˛Ņ‹Đš йаСОвŅ‹Đš ОйŅ€Đ°Đˇ Đ´ĐģŅ ŅĐąĐžŅ€Đēи
FROM alexxxnf/spa-builder as builder
# ЧŅ‚ОйŅ‹ ŅŅ„Ņ„ĐēŅ‚ивĐŊĐĩĐĩ иŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐēŅŅˆ Docker-Đ°, ŅĐŊĐ°Ņ‡Đ°ĐģĐ° ŅƒŅŅ‚Đ°ĐŊавĐģиваĐĩĐŧ Ņ‚ĐžĐģŅŒĐēĐž СавиŅĐ¸ĐŧĐžŅŅ‚и
COPY ./package.json ./package-lock.json /app/
RUN cd /app && npm ci --no-audit
# ПоŅ‚ĐžĐŧ ŅĐžĐąĐ¸Ņ€Đ°ĐĩĐŧ ŅĐ°ĐŧĐž ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ
COPY . /app
RUN cd /app && npm run build -- --prod --configuration=docker

# ВŅ‚ĐžŅ€ĐžĐš йаСОвŅ‹Đš ОйŅ€Đ°Đˇ Đ´ĐģŅ Ņ€Đ°ĐˇĐ´Đ°Ņ‡Đ¸
FROM alexxxnf/nginx-spa
# ЗабиŅ€Đ°ĐĩĐŧ иС ĐŋĐĩŅ€Đ˛ĐžĐŗĐž ОйŅ€Đ°ĐˇĐ° ŅĐŊĐ°Ņ‡Đ°ĐģĐ° ĐēĐžĐŧĐŋŅ€ĐĩŅŅĐžŅ€
COPY --from=builder /usr/local/bin/brotli /usr/local/bin
# ПоŅ‚ĐžĐŧ дОйавĐģŅĐĩĐŧ Ņ‡ŅƒĐ´Đž-ŅĐēŅ€Đ¸ĐŋŅ‚
COPY ./docker/docker-entrypoint.sh /docker-entrypoint.sh
# И в ĐēĐžĐŊŅ†Đĩ СайиŅ€Đ°ĐĩĐŧ ŅĐ°ĐŧĐž ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ
COPY --from=builder /app/dist/app /etc/nginx/html/
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["nginx", "-g", "daemon off;"]

āĻāĻ–āĻ¨ āĻĢāĻ˛āĻ¸ā§āĻŦāĻ°ā§‚āĻĒ āĻšāĻŋāĻ¤ā§āĻ°āĻŸāĻŋ āĻ¯ā§‡ āĻ•ā§‹āĻ¨āĻ“ āĻœāĻžāĻ¯āĻŧāĻ—āĻžāĻ¯āĻŧ āĻāĻ•āĻ¤ā§āĻ°āĻŋāĻ¤ āĻāĻŦāĻ‚ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

āĻ‰āĻ¤ā§āĻ¸: www.habr.com