рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдЧреЛрд▓рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ TODO рдПрдкреАрдЖрдИ рдмрдирд╛рдПрдВ

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░! рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕-рдЖрдзрд╛рд░рд┐рдд рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рд▓реЙрдиреНрдЪ рдХреЗ рдЖрдЧреЗ , рд╣рдордиреЗ рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЕрдиреБрд╡рд╛рдж рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ред



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

рд╣рд░ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЕрдЪреНрдЫреА TODO рд╕реВрдЪреА рдкрд╕рдВрдж рд╣реИ, рд╣реИ рдирд╛? рдЕрдиреНрдпрдерд╛ рд╣рдо рд╕реНрд╡рдпрдВ рдХреЛ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?


рд╣рд░ рдбреЗрд╡рд▓рдкрд░ рдПрдХ рдЕрдЪреНрдЫрд╛ TODO рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реИ, рд╣реИ рдирд╛?

рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдШрдЯрдХреЛрдВ рдХреА рд╕реВрдЪреА рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ, рдлрд┐рд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ, Postgresql рдбреЗрдЯрд╛рдмреЗрд╕ рдкреНрд░рджрд╛рди рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдПрдХ рдЖрд╡реЗрджрди рдврд╛рдВрдЪрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдЬреЛ рд╣рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рд╡рд┐рд╡рд░рдг рдкрд░ рдзреНрдпрд╛рди рджрд┐рдП рдмрд┐рдирд╛ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рдЧреЛ рдПрдкреАрдЖрдИ рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред

рд╣рдо рдПрдкреАрдЖрдИ рдореЗрдВ рджреЛ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдмрдирд╛рдПрдВрдЧреЗ - рдПрдХ рдирдпрд╛ TODO рд░рд┐рдХреЙрд░реНрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рджреВрд╕рд░рд╛ рд╕рднреА TODO рд░рд┐рдХреЙрд░реНрдбреЛрдВ рдХреЛ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдПред

рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХрд╛ рд╕рднреА рдХреЛрдб GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред

рдЖрд╡рд╢реНрдпрдХ рдШрдЯрдХреЛрдВ рдХреА рд╕реВрдЪреА:


  • рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдбреЙрдХрд░

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХрдВрдЯреЗрдирд░ рдЫрд╡рд┐рдпреЛрдВ рдореЗрдВ рдХреЛрдб рдЪрд▓рд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдбреЙрдХрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

Docker рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ: https://www.docker.com
рдЕрдкрдиреА Docker рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ Docker Hub рдЦрд╛рддреЗ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ: https://hubhocker.com/

  • рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░


рдЖрдк рд╕реНрдерд╛рдиреАрдп рдпрд╛ рджреВрд░рд╕реНрде рдХреНрд▓рд╕реНрдЯрд░ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреМрди рд╕рд╛ рдмреЗрд╣рддрд░ рд╣реИ? рд╕рд░рд▓реАрдХреГрдд рд╡рд┐рдХрд▓реНрдк, рдЬреИрд╕реЗ k3d, рдХрд┐рд╕реА рднреА рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдбреЙрдХрд░ рдкрд░ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рдХреНрд▓рд╕реНрдЯрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдм рдмрд╣реБрдд рдЕрдзрд┐рдХ рд░реИрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдПрдХ рджреВрд░рд╕реНрде рдХреНрд▓рд╕реНрдЯрд░ рднреА рдПрдХ рдмрд╣реБрдд рд╣реА рдХреБрд╢рд▓ рд╕рдорд╛рдзрд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЖрдкрдХреЗ рд╕рднреА рдбреЙрдХрд░реЛрдВ рдХреА рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рдЕрдкрд▓реЛрдб рдФрд░ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

K3d рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ: https://github.com/rancher/k3d

k3d kubectl (рдпрд╣ Kubernetes рдХреЗ рд▓рд┐рдП CLI рд╣реИ) рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдпрд╣рд╛рдБ рд╕реЗ рдЕрд▓рдЧ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ: https://kubernetes.io/tocs/tools/tools/ install-kubectl

  • Golang


рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдЖрдИрдбреАрдИ рдХреЗ рд╕рд╛рде рдЧреЛрд▓рдВрдЧ рдХреЛ рднреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЧреЛ рдирд┐рд╢реБрд▓реНрдХ рд╣реИ рдФрд░ рдЖрдк рдЗрд╕реЗ рдирд┐рдореНрди рд▓рд┐рдВрдХ рд╕реЗ MacOS, Windows рдпрд╛ Linux рдХреЗ рд▓рд┐рдП рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: https://golang.org/dl

  • рдЖрдИрдбреАрдИ


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

рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ ред

рдПрдХ рдХреНрд▓рд╕реНрдЯрд░ рдмрдирд╛рдПрдБ


рдЖрдкрдХреЛ рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рднреА рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

K3d рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдирдпрд╛ рдХреНрд▓рд╕реНрдЯрд░ рдмрдирд╛рдПрдВ:


k3d create

Kubectl рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рдПрдХ рдирдП рдХреНрд▓рд╕реНрдЯрд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдПрдХ рдХрдВрдкреНрдпреВрдЯрд░ рд╕реЗ рдХрдИ рд╕рдореВрд╣реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рд╣реА рдПрдХ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рдж рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ:

export KUBECONFIG="$(k3d get-kubeconfig --name='k3s-default')"


рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдиреЛрдб рд╣реИред рдпрд╣рд╛рдБ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ Kubernetes 1.17 рд╕реНрдерд╛рдкрд┐рдд рд╣реИ - рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг:

kubectl get node
NAME                     STATUS   ROLES    AGE   VERSION
k3d-k3s-default-server   Ready    master   48s   v1.17.0+k3s.1


рд╣рдо рдЕрдкрдиреЗ TODO рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдЕрдм рд╣рдореЗрдВ рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред Postgresql рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рд╕рдВрдмрдВрдзрдкрд░рдХ рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо Helm рдЪрд╛рд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрд░реНрдХрд╛рдЗрд╡ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ


рдЕрд░реНрдХрдбреЗ рдПрдХ рд╕реАрдПрд▓рдЖрдИ рдЧреЛ рд╣реИ, рдЬреЛ "рдмреНрд░реВ" рдпрд╛ "рдПрдкреНрдЯ-рдЧреЗрдЯ" рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдПред рдпрд╣ рдЖрдкрдХреЗ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдпрд╛ рдЙрддреНрдкрд╛рдж рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реЗрд▓реНрдо, рдХреБрдмреЗрдЯреЗрд▓ рдпрд╛ рд╕реАрдПрд▓рдЖрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

curl -sLS https://dl.get-arkade.dev | sudo sh


рдЕрдм Postgresql рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ

arkade install postgresql
===================================================================== = PostgreSQL has been installed.                                    =
=====================================================================


рдЖрдк рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдЕрдВрджрд░ рдбреЙрдХрдЯрд░ рдЫрд╡рд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Postgresql CLI рдХреИрд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ, рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдЦреЗрдВрдЧреЗред

рдЖрдк рдХрд┐рд╕реА рднреА рд╕рдордп рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ arkade info postgresqlред

рд╣рдо рдЯреЗрдмрд▓ рд▓реЗрдЖрдЙрдЯ рдбрд┐рдЬрд╛рдЗрди рдХрд░реЗрдВрдЧреЗ

CREATE TABLE todo (
 id              INT GENERATED ALWAYS AS IDENTITY,
 description     text NOT NULL,
 created_date    timestamp NOT NULL,
 completed_date  timestamp NOT NULL
);


arkade info postgresqlрдХрдиреЗрдХреНрд╢рди рдЬрд╛рдирдХрд╛рд░реА рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд▓рд╛рдПрдБ ред рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

export POSTGRES_PASSWORD=$(kubectl get secret --namespace default postgresql -o jsonpath="{.data.postgresql-password}" | base64 --decode)
kubectl run postgresql-client --rm --tty -i --restart='Never' --namespace default --image docker.io/bitnami/postgresql:11.6.0-debian-9-r0 --env="PGPASSWORD=$POSTGRES_PASSWORD" --command -- psql --host postgresql -U postgres -d postgres -p 5432


рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдорд╛рдВрдб рдкреНрд░реЙрдореНрдкреНрдЯ рд╣реИ: postgres = #рдЖрдк рдЯреЗрдмрд▓ рдХреЛ рдЕрдВрджрд░ рдХреЙрдкреА рдХрд░рдХреЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ \dtрдЯреЗрдмрд▓ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреМрдбрд╝реЗрдВ :

postgres=# \dt
List of relations
Schema | Name | Type  |  Owner
--------+------+-------+----------
public | todo | table | postgres
(1 row)


рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ


рдЬрд┐рд╕ рддрд░рд╣ PHP рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ LAMP (Linux Apache + Mysql + PHP) рдФрд░ рд░реЗрд▓ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╣рд▓реЗ рд╕реЗ рддреИрдпрд╛рд░ рд╕реНрдЯреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЛ рддреЗрдЬ рдХрд┐рдпрд╛, рдЙрд╕реА рддрд░рд╣ рдХреБрдмреЗрд░рдиреЗрдЯ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
PLONK рд╕реНрдЯреИрдХ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕, рд▓рд┐рдирдХреНрд╕, OpenFaaS, NATS рдФрд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдЦрдбрд╝рд╛ рд╣реИред
  • рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдЖрдкрдХреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдЯреНрд░рд┐рдХреНрд╕, рдСрдЯреЛ-рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдФрд░ рдЕрд╡рд▓реЛрдХрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╢реВрдиреНрдп рдореЗрдВ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рджрд╛рди рдХрд░рдХреЗ рдорд╛рдВрдЧ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдФрд░ рдХрдЯреМрддреА рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрддрд╛ рд╣реИред
  • рд▓рд┐рдирдХреНрд╕, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рд╡рд░реНрдХрд▓реЛрдб рдЪрд▓рд╛рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ, рдорд╛рдирдХ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИред
  • рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, OpenFaaS рдиреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдкреЛрд░реНрдЯреЗрдмрд▓ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдкреНрд░рджрд╛рди рдХрд┐рдП, рд▓реЗрдХрд┐рди рдПрдкреАрдЖрдИ рдФрд░ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлрд╝реНрдЯ рдХреЛ рддреИрдирд╛рдд рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреА рдмрд╣реБрдореБрдЦреА рдкреНрд░рддрд┐рднрд╛ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ HTTP рд╕рд░реНрд╡рд░ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдбреЙрдХрдЯрд░ рдХрдВрдЯреЗрдирд░ рдХреЛ рддреИрдирд╛рдд рдФрд░ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  • NATS рд╕рдВрджреЗрд╢ рдФрд░ рдкрдм / рдЙрдк рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рд╕реАрдПрдирд╕реАрдПрдл рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИред PLONK рд╕реНрдЯреИрдХ рдореЗрдВ, рдпрд╣ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдФрд░ рдХрддрд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
  • рдХреБрдмреЗрд░рдиреЗрдд рд╣рдо рдпрд╣рд╛рдВ рд╣реИрдВред рдпрд╣ рдПрдХ рд╕реНрдХреЗрд▓реЗрдмрд▓, рд╕реНрд╡-рдЪрд┐рдХрд┐рддреНрд╕рд╛ рдФрд░ рдШреЛрд╖рдгрд╛рддреНрдордХ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЕрдЧрд░ рдЖрдкрдХреЛ рдЕрдм рдЗрд╕ рднрд╡реНрдпрддрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдП, рддреЛ OpenFaaS рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ API рд╕рд░рд▓ рд╣реИред


рдЖрд░реНрдХрд╛рдЗрд╡ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ PLONK рд╕реНрдЯреИрдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:

arkade install openfaas


рд╕реВрдЪрдирд╛рддреНрдордХ рд╕рдВрджреЗрд╢ рдкрдврд╝реЗрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдБ:

  • Faas-cli рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред
  • рдЕрдкрдирд╛ рдкрд╛рд╕рд╡рд░реНрдб рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
  • OpenFaaS рдЧреЗрдЯрд╡реЗ UI (рдкреЛрд░реНрдЯ 8080 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░реЗрдВ
  • рдФрд░ CLI рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВред


рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рдЖрдк рдПрдХ рд╕реВрдЪрдирд╛рддреНрдордХ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ info openfaasред

рдЕрдкрдиреЗ рдкрд╣рд▓реЗ рдЬрд╛рдУ рдПрдкреАрдЖрдИ рддреИрдирд╛рдд рдХрд░реЗрдВ


PLONK рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧреЛ рдПрдкреАрдЖрдИ рдмрдирд╛рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк Dockerfile рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЯреАрд╕реАрдкреА рдкреЛрд░реНрдЯ, рд╕реНрд╡рд╛рд╕реНрдереНрдп рдЬрд╛рдВрдЪ, HTTP рд╕рд░реНрд╡рд░, рдФрд░ рдЗрд╕реА рддрд░рд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ faas-cli new --lang dockerfile API_NAME, рд▓реЗрдХрд┐рди рдПрдХ рд╕рд░рд▓ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рддрд░реАрдХрд╛ рд╣реИред

рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рдлрдВрдХреНрд╢рди рд╕реНрдЯреЛрд░ рджреНрд╡рд╛рд░рд╛ рдкреЗрд╢ рдХрд┐рдП рдЧрдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ:

faas-cli template store list | grep go
go                       openfaas           Classic Golang template
golang-http              openfaas-incubator Golang HTTP template
golang-middleware        openfaas-incubator Golang Middleware template


рдЪреВрдВрдХрд┐ рд╣рдо рдПрдХ рдкрд╛рд░рдВрдкрд░рд┐рдХ HTTP- рд╕реНрдЯрд╛рдЗрд▓ рдПрдкреАрдЖрдИ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЧреЛрд▓рдВрдЧ-рдорд┐рдбрд▓рд╡реЗрдпрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реЛрдЧрд╛ред

рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдЖрдкрдиреЗ рдЕрдкрдиреЗ рдбреЙрдХрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдбреЙрдХрд░ рд╣рдм рдЦрд╛рддреЗ рдХреЗ рд╕рд╛рде рдкрдВрдЬреАрдХрд░рдг рдХрд┐рдпрд╛ред рдкреНрд░рддреНрдпреЗрдХ Kubernetes рд╡рд░реНрдХрд▓реЛрдб рдХреЛ рддреИрдирд╛рдд рдХрд┐рдП рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ Docker рдЫрд╡рд┐ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╡рд┐рд╢реЗрд╖ рдкреИрдЯрд░реНрди рдЦреАрдВрдЪреЛ:

faas-cli template store pull golang-middleware


рдЧреЛрдХрд╛рдВрдЧ-рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдкрд╛рдбрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдбреЙрдХрдЯрд░ рд╣рдм рдореЗрдВ рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо:

export PREFIX=alexellis2
export LANG=golang-middleware
export API_NAME=todo
faas-cli new --lang $LANG --prefix $PREFIX $API_NAME


рдЖрдкрдХреЛ рджреЛ рдЬреЗрдирд░реЗрдЯ рдХреА рдЧрдИ рдлрд╛рдЗрд▓реЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреА:

  • ./todo.yml - рдЯреЗрдореНрдкрд▓реЗрдЯ рдФрд░ рдирд╛рдо рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ, рддреИрдирд╛рдд рдХрд░рдиреЗ рдФрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ
  • ./todo/handler.go - рдпрд╣рд╛рдВ рдЖрдк рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╛рдЗрд▓ рдпрд╛ рдкреИрдХреЗрдЬ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ


рдЪрд▓реЛ рдХреБрдЫ рд╕рдВрдкрд╛рджрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдХреЛрдб рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред

package function
import (
   "net/http"
   "encoding/json"
)
type Todo struct {
   Description string `json:"description"`
}
func Handle(w http.ResponseWriter, r *http.Request) {
   todos := []Todo{}
   todos = append(todos, Todo{Description: "Run faas-cli up"})
   res, _ := json.Marshal(todos)
   w.WriteHeader(http.StatusOK)
   w.Header().Set("Content-Type", "application/json")
   w.Write([]byte(res))
}


рдпрджрд┐ рдЖрдк рдХреЛрдб рдХреЗ рд╕рдВрдкрд╛рджрди рдФрд░ рдкреНрд░рд╛рд░реВрдкрдг рдХреЗ рд▓рд┐рдП VScode рдФрд░ рдЙрд╕рдХреЗ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдЪрд▓рд╛рдПрдВ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕реНрд╡рд░реВрдкрд┐рдд рд╣реИред

gofmt -w -s ./todo/handler.go


рдЕрдм рдХреЛрдб рдХреЛ рддреИрдирд╛рдд рдХрд░реЗрдВ - рдкрд╣рд▓реЗ рдПрдХ рдирдИ рдЫрд╡рд┐ рдмрдирд╛рдПрдВ, рдЗрд╕реЗ рдбреЙрдХрд░ рд╣рдм рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ рдФрд░ OpenFS рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рддреИрдирд╛рдд рдХрд░реЗрдВ:

Invoke your endpoint when ready:
curl http://127.0.0.1:8080/function/todo
{
"description": "Run faas-cli up"
}


рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдирдП TODO рд░рд┐рдХреЙрд░реНрдб рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ


рдЕрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЕрдкрдиреА TODO рд╕реВрдЪреА рдореЗрдВ рдирдИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ Postgresql рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рдпрд╛ "рдирд┐рд░реНрднрд░рддрд╛" рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред

рд╣рдо рдЗрд╕реЗ рд╡реЗрдВрдбрд┐рдВрдЧ рдпрд╛ рдЧреЛ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рдЧреЛ 1.11 рдореЗрдВ рдкреЗрд╢ рдХрд┐рдП рдЧрдП рдереЗ рдФрд░ рдЧреЛ 1.13 рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЧрдП рдереЗред рдЙрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЛ

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ handler.goрдФрд░ рдЬреЛрдбрд╝реЗрдВ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ Postgresql рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

import (
   "database/sql"
   _ "github.com/lib/pq"
...


рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ рдХреБрдЫ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдмрд╛рдж рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдпрджрд┐ рд╣рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ VSCode рд╕рд╣реЗрдЬреЗ рдЬрд╛рдиреЗ рдкрд░ рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛ред

рдЗрд╕реЗ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЖрдпрд╛рдд рдХреЗ рддрд╣рдд рдЬреЛрдбрд╝реЗрдВ

var db *sql.DB


рдЗрди рдХрдорд╛рдВрдб рдХреЛ рд╣рдореЗрд╢рд╛ рдЙрд╕ todoрдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЪрд▓рд╛рдПрдВ рдЬрд╣рд╛рдВ рдпрд╣ рд╕реНрдерд┐рдд рд╣реИ handler.go, рдФрд░ рд░реВрдЯ рд╕реНрддрд░ c рдкрд░ рдирд╣реАрдВ todo.ymlред

рдирдП рдЧреЛ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ:

cd todo/
ls
handler.go
export GO111MODULE=on
go mod init


рдЕрдм pq рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ:

go get
go mod tidy
cat go.mod
module github.com/alexellis/todo1/todo
go 1.13
require github.com/lib/pq v1.3.0


рдЬреЛ рднреА рдЕрдВрджрд░ рд╣реИ go.mod, рдЙрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВGO_REPLACE.txt

cat go.mod > GO_REPLACE.txt


рдЕрдм рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╕рдореНрдорд┐рд▓рд┐рдд рдХреЛрдб рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдЕрднреА рднреА рдХрд╛рдо рдХрд░рддреА рд╣реИред

faas-cli build -f todo.yml --build-arg GO111MODULE=on


рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдм рд╣рдо --build-argрдЧреЛ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрдЯрд░реНрди рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕ рд╣реИрдВ ред

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

Step 16/29 : RUN go test ./... -cover
---> Running in 9a4017438500
go: downloading github.com/lib/pq v1.3.0
go: extracting github.com/lib/pq v1.3.0
go: finding github.com/lib/pq v1.3.0
?       github.com/alexellis/todo1/todo [no test files]
Removing intermediate container 9a4017438500


Postgresql Access рдХреЗ рд▓рд┐рдП рдЧреЛрдкрдиреАрдпрддрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛


рд╣рдо рдПрдХ рдХрдиреЗрдХреНрд╢рди рдкреВрд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ init (), рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдЪрд▓реЗрдЧреА рдЬрдм рдХрд╛рд░реНрдпрдХреНрд░рдо рд╢реБрд░реВ рд╣реЛрдЧрд╛ред

// init       .   ,     ,   /   /

func init() {
       if _, err := os.Stat("/var/openfaas/secrets/password"); err == nil {
               password, _ := sdk.ReadSecret("password")
               user, _ := sdk.ReadSecret("username")
               host, _ := sdk.ReadSecret("host")
               dbName := os.Getenv("postgres_db")
               port := os.Getenv("postgres_port")
               sslmode := os.Getenv("postgres_sslmode")
               connStr := "postgres://" + user + ":" + password + "@" + host + ":" + port + "/" + dbName + "?sslmode=" + sslmode
var err error
               db, err = sql.Open("postgres", connStr)
               if err != nil {
                       panic(err.Error())
               }
               err = db.Ping()
               if err != nil {
                       panic(err.Error())
               }
       }
}


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рджреЗрдЦрд╛, os.Getenvрдкрд░реНрдпрд╛рд╡рд░рдг рд╕реЗ рдкрдврд╝реА рдЧрдИ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓реА рдЬрд╛рддреА рд╣реИред рдореИрдВ рдЗрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЧреИрд░-рдЧреЛрдкрдиреАрдп рдорд╛рдиреВрдВрдЧрд╛, рд╡реЗ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реЗрдЯ рд╣реИрдВ todo.yред

рдмрд╛рдХреА, рдЬреИрд╕реЗ рдкрд╛рд╕рд╡рд░реНрдб рдФрд░ рд╣реЛрд╕реНрдЯ, рдЬреЛ рдЧреЛрдкрдиреАрдп рд╣реИрдВ, рдХреЛ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рд░рд╣рд╕реНрдпреЛрдВ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ ред

рдЖрдк рдЙрдиреНрд╣реЗрдВ faas-cli secret createрдпрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ kubectl create secret generic -n openfaas-fnред

рд╕реНрдЯреНрд░рд┐рдВрдЧ sdk.ReadSecretOpenFaaS рдХреНрд▓рд╛рдЙрдб SDK рд╕реЗ рдЖрддрд╛ рд╣реИ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдпрд╛рдд рдХреЗ рд╕рд╛рде github.com/openfaas/openfaas-cloud/sdk:ред рдпрд╣ рдбрд┐рд╕реНрдХ рд╕реЗ рдПрдХ рдЧреБрдкреНрдд рдлрд╝рд╛рдЗрд▓ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдореВрд▓реНрдп рдпрд╛ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИред

рд╕реЗ рдЧреБрдкреНрдд рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ arkade info postgresqlред

рдЕрдм рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░реЗрдВ:

export POSTGRES_PASSWORD=$(kubectl get secret --namespace default postgresql -o jsonpath="{.data.postgresql-password}" | base64 --decode)
export USERNAME="postgres"
export PASSWORD=$POSTGRES_PASSWORD
export HOST="postgresql.default"
faas-cli secret create username --from-literal $USERNAME
faas-cli secret create password --from-literal $PASSWORD
faas-cli secret create host --from-literal $HOST


рдЙрдкрд▓рдмреНрдзрддрд╛ рдФрд░ рдЕрдиреБрдкрд╛рд▓рди рдХреЗ рд▓рд┐рдП рд░рд╣рд╕реНрдпреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:

faas-cli secret ls
NAME
username
password
host
# And via kubectl:
kubectl get secret -n openfaas-fn
NAME                  TYPE                                  DATA   AGE
username              Opaque                                1      13s
password              Opaque                                1      13s
host                  Opaque                                1      12s


рд╣рдорд╛рд░реА YAML рдлрд╝рд╛рдЗрд▓ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝реЗрдВ:

secrets:
   - host
   - password
   - username
   environment:
     postgres_db: postgres
     postgres_sslmode: "disable"
     postgres_port: 5432


рдЕрдЧрд▓рд╛, рдЧреЛ рдореЙрдбреНрдпреВрд▓ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ рдФрд░ рдмрд┐рд▓реНрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдПрдБ:

cd todo
go get
go mod tidy
cd ..
faas-cli build -f todo.yml --build-arg GO111MODULE=on
Successfully built d2c609f8f559
Successfully tagged alexellis2/todo:latest
Image: alexellis2/todo:latest built.
[0] < Building todo done in 22.50s.
[0] Worker done.
Total build time: 22.50s


рдЕрд╕реЗрдВрдмрд▓реА рдиреЗ рдЙрдореНрдореАрдж faas-cliрдХреЗ рдореБрддрд╛рдмрд┐рдХ рдХрд╛рдо рдХрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рдЫрд╡рд┐ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЙрд╕реА рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдПрдВ ред рдпрджрд┐ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдФрд░ SQL рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рд╣реА рд╣реИрдВ, рддреЛ рд╣рдо рд▓реЙрдЧ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдирд╣реАрдВ рджреЗрдЦреЗрдВрдЧреЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рд╡реЗ рдЧрд▓рдд рд╣реИрдВ, рддреЛ рд╣рдо рдЗрдирд┐рдЯ () рдореЗрдВ рдкреИрдирд┐рдХ рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред

рд▓реЙрдЧ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:

faas-cli logs todo
2020-03-26T14:10:03Z Forking - ./handler []
2020-03-26T14:10:03Z 2020/03/26 14:10:03 Started logging stderr from function.
2020-03-26T14:10:03Z 2020/03/26 14:10:03 Started logging stdout from function.
2020-03-26T14:10:03Z 2020/03/26 14:10:03 OperationalMode: http
2020-03-26T14:10:03Z 2020/03/26 14:10:03 Timeouts: read: 10s, write: 10s hard: 10s.
2020-03-26T14:10:03Z 2020/03/26 14:10:03 Listening on port: 8080
2020-03-26T14:10:03Z 2020/03/26 14:10:03 Metrics listening on port: 8081
2020-03-26T14:10:03Z 2020/03/26 14:10:03 Writing lock-file to: /tmp/.lock


рдЬрдмрдХрд┐ рд╕рдм рдХреБрдЫ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рдЕрдм рдЖрдЗрдП рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:

echo | faas-cli invoke todo -f todo.yml
2020-03-26T14:11:02Z 2020/03/26 14:11:02 POST / - 200 OK - ContentLength: 35


рдЗрд╕рд▓рд┐рдП, рдЕрдм рд╣рдордиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдлрд▓ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рд╣рдо рдЗрдиреНрд╕рд░реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдЙрд╕рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреИрд╕реЗ рдкрд╛рдПрдВ? рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ db.Ping ()рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдПрдХ рдЖрддрдВрдХ рдлреЗрдВрдХ рджрд┐рдпрд╛ рд╣реЛрддрд╛:

err = db.Ping()
if err != nil {
   panic(err.Error())
}


рдбреЗрдЯрд╛рдмреЗрд╕ / рдПрд╕рдХреНрдпреВрдПрд▓ рдкреИрдХреЗрдЬ рдкрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ ред

рдЗрдиреНрд╕рд░реНрдЯ рдХреЛрдб рд▓рд┐рдЦрдирд╛


рдпрд╣ рдХреЛрдб рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдирдИ рдкрдВрдХреНрддрд┐ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ todoрдФрд░ рд╡рд┐рд╢реЗрд╖ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдорд╛рди рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрдиреЛрдВ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп db.Query рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред LAMP рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ "рдкреБрд░рд╛рдиреЗ рджрд┐рдиреЛрдВ" рдореЗрдВ, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЧрд▓рддреА рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдХрдИ рдкреНрд░рдгрд╛рд▓рд┐рдпрд╛рдВ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛ рдЧрдИрдВ, рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреА рд╕реНрд╡рдЪреНрдЫрддрд╛ рдХреА рдХрдореА рдФрд░ рд╕реАрдзреЗ SQL рдХрдерди рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдХреЗ рдПрдХрддреНрд░реАрдХрд░рдг рдХреА рдХрдореА рдереАред

рдПрдХ рд╡рд░реНрдгрди рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ; drop table todoрдпрд╣ рдмрд╣реБрдд рдордЬреЗрджрд╛рд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЪрд▓рд╛рдиреЗ рдХреЗ db.Queryрд▓рд┐рдП, рддреЛ SQL рдХрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд╛рд░рд┐рдд $1, $2рдкреНрд░рддреНрдпреЗрдХ рдорд╛рди рдХреЗ рд▓рд┐рдП рдЖрджрд┐, рдФрд░ рдлрд┐рд░ рд╣рдо рдкрд░рд┐рдгрд╛рдо рдФрд░ / рдпрд╛ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд╕рдХрддреА рд╣реИред рд╣рдореЗрдВ рдЗрд╕ рдкрд░рд┐рдгрд╛рдо рдХреЛ рднреА рдмрдВрдж рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

func insert(description string) error {
       res, err := db.Query(`insert into todo (id, description, created_date) values (DEFAULT, $1, now());`,
               description)
       if err != nil {
               return err
       }
       defer res.Close()
       return nil
}


рдЕрдм рдЗрд╕реЗ рдХреЛрдб рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВред

func Handle(w http.ResponseWriter, r *http.Request) {
       if r.Method == http.MethodPost && r.URL.Path == "/create" {
               defer r.Body.Close()
               body, _ := ioutil.ReadAll(r.Body)
               if err := insert(string(body)); err != nil {
                       http.Error(w, fmt.Sprintf("unable to insert todo: %s", err.Error()), http.StatusInternalServerError)
               }
       }
}


рдЪрд▓реЛ рдЗрд╕реЗ рддреИрдирд╛рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдЪрд▓рд╛рдПрдВред

echo | faas-cli invoke todo -f todo.yml
curl http://127.0.0.1:8080/function/todo/create --data "faas-cli build"
curl http://127.0.0.1:8080/function/todo/create --data "faas-cli push"
curl http://127.0.0.1:8080/function/todo/create --data "faas-cli deploy"


рдПрдкреАрдЖрдИ рд▓реЙрдЧ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:

faas-cli logs todo
2020-03-26T14:35:29Z 2020/03/26 14:35:29 POST /create - 200 OK - ContentLength: 0


Pgsql рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рддрд╛рд▓рд┐рдХрд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:

export POSTGRES_PASSWORD=$(kubectl get secret --namespace default postgresql -o jsonpath="{.data.postgresql-password}" | base64 --decode)
kubectl run postgresql-client --rm --tty -i --restart='Never' --namespace default --image docker.io/bitnami/postgresql:11.6.0-debian-9-r0 --env="PGPASSWORD=$POSTGRES_PASSWORD" --command -- psql --host postgresql -U postgres -d postgres -p 5432
postgres=# select * from todo;
id |   description   |        created_date        | completed_date
----+-----------------+----------------------------+----------------
1 | faas-cli build  | 2020-03-26 14:36:03.367789 |
2 | faas-cli push   | 2020-03-26 14:36:03.389656 |
3 | faas-cli deploy | 2020-03-26 14:36:03.797881 |


рдмрдзрд╛рдИ рд╣реЛ, рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ TODO API рд╣реИ рдЬреЛ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ curlрдХрд┐рд╕реА рдЕрдиреНрдп HTTP рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдЯреЗрдмрд▓ рдкрд░ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИред

рд░рд┐рдХреЙрд░реНрдб рдЕрдиреБрд░реЛрдз


рдЪрд▓рд┐рдП рдПрдХ рдЯреЗрдмрд▓ рд╕реЗ TODO рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ:

func selectTodos() ([]Todo, error) {
   var error err
   var todos []Todo
   return todos, err
}


рд╣рдо рдЗрд╕ рдЪреБрдирд┐рдВрджрд╛ рд╡рд┐рдзрд┐ рдХрд╛ рдирд╛рдо рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЧреЛрд░реЛрдЗрдЯрд┐рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд░рдХреНрд╖рд┐рдд рдХреАрд╡рд░реНрдб рд╣реИред

рдЕрдм рд╡рд┐рдзрд┐ рдХреЛ рдореБрдЦреНрдп рд╣реИрдВрдбрд▓рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ:

} else if r.Method == http.MethodGet && r.URL.Path == "/list" {
   todos, err := selectTodos()
   if err != nil {
       http.Error(w, fmt.Sprintf("unable to get todos: %s", err.Error()), http.StatusInternalServerError)
   }
   out, _ := json.Marshal(todos)
   w.Header().Set("Content-Type", "application/json")
   w.Write(out)
}


рдЕрдм рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛ рд╕реНрдХреАрдорд╛ рдореЗрдВ рддрд╛рд░реАрдЦреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдХреНрд╖реЗрддреНрд░ рд╣реИрдВ, рдЯреЛрдбреЛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ:

type Todo struct {
   ID int `json:"id"`
   Description   string `json:"description"`
   CreatedDate   *time.Time `json:"created_date"`
   CompletedDate *time.Time `json:"completed_date"`
}


рдЕрдм рд╣рдорд╛рд░реА рд╡рд┐рдзрд┐ рдореЗрдВ selectTodos()рдЕрдиреБрд░реЛрдз рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ :

func selectTodos() ([]Todo, error) {
       rows, getErr := db.Query(`select id, description, created_date, completed_date from todo;`)
   if getErr != nil {
       return []Todo{}, errors.Wrap(getErr, "unable to get from todo table")
   }
   todos := []Todo{}
   defer rows.Close()
   for rows.Next() {
       result := Todo{}
       scanErr := rows.Scan(&result.ID, &result.Description, &result.CreatedDate, &result.CompletedDate)
       if scanErr != nil {
           log.Println("scan err:", scanErr)
       }
       todos = append(todos, result)
   }
   return todos, nil
}


рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рд╣рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдореЗрдВ рджреЗрд░реА рдХрд░рдиреА рд╣реЛрдЧреАред рдкреНрд░рддреНрдпреЗрдХ рдорд╛рди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирдИ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдиреНрдп рд╡рд┐рдзрд┐ред рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрдд рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЯреЛрдбреЛ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╣реИред

рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ:

faas-cli up -f todo.yml --build-arg GO111MODULE=on
curl http://127.0.0.1:8080/function/todo/list


рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рд╣реИ:

[
 {
   "id": 2,
   "description": "faas-cli build",
   "created_date": "2020-03-26T14:36:03.367789Z",
   "completed_date": null
 },
 {
   "id": 3,
   "description": "faas-cli push",
   "created_date": "2020-03-26T14:36:03.389656Z",
   "completed_date": null
 },
 {
   "id": 4,
   "description": "faas-cli deploy",
   "created_date": "2020-03-26T14:36:03.797881Z",
   "completed_date": null
 }
]


рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЬреЛрдбрд╝рдХрд░ рд╕рдВрд░рдЪрдирд╛ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ omitempty:

CompletedDate *time.Time `json:"completed_date,omitempty"`


рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╡рд░реНрдгрди рдХрд░рдирд╛


рд╣рдо рдЕрднреА рддрдХ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реБрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬреЛ рд╣рдордиреЗ рдЕрдм рддрдХ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рд╣реИ рдЙрд╕реЗ рд░реЛрдХрдирд╛ рдФрд░ рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХреНрд╖рдг рд╣реИред рд╣рдо:

  • рд╕реНрдерд╛рдкрд┐рдд рдЧреЛ, рдбреЙрдХрд░, рдХреБрдмреНрд▓реЗрдЯ рдФрд░ VSCode (IDE)
  • рд╣рдорд╛рд░реЗ рд╕реНрдерд╛рдиреАрдп рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдХреБрдмреЗрд░рдиреЗрдЯ рдХреА рддреИрдирд╛рддреА рдХреА
  • рдЖрд░реНрдХрдЧреЗрдб рдФрд░ рд╣реЗрд▓реНрдо 3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреЛрд╕реНрдЯрдЧреНрд░реИрд╕реНрдХрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛
  • Kubernetes рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП OpenFaaS рдФрд░ PLONK рд╕реНрдЯреИрдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛
  • Go рдФрд░ golang-middlewareOpenFaaS рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдереИрддрд┐рдХ REST API рдмрдирд╛рдпрд╛ рдЧрдпрд╛
  • рд╣рдорд╛рд░реЗ TODO рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП "рд╕рдореНрдорд┐рд▓рд┐рдд" рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛
  • рд╣рдорд╛рд░реЗ TODO рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ


рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЕрдм рддрдХ рдмрдирд╛рдП рдЧрдП рдкреВрд░реНрдг рдХреЛрдб рдХрд╛ рдирдореВрдирд╛ рдореЗрд░реЗ GitHub рдЦрд╛рддреЗ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ: alexellis / kubernetes-todo-go-app

рддрдм рд╣рдо рдФрд░ рдЕрдзрд┐рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

  • рдПрдХ рд╕реНрдереИрддрд┐рдХ рд╡рд╛рд╣рдХ рдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЬреЛрдбрд╝рдирд╛
  • TODO рд╕реВрдЪреА рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдФрд░ рдирдП рддрддреНрд╡ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд┐рд░ HTML рдпрд╛ рд░рд┐рдПрдХреНрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╡реЗрдм рдкреЗрдЬ рдмрдирд╛рдПрдБред
  • рдПрдкреАрдЖрдИ рдореЗрдВ рдмрд╣реБ-рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдирд╛


рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫред рд╣рдо PLONK рд╕реНрдЯреИрдХ рдореЗрдВ рднреА рдбреАрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ API рдХреА рдирд┐рдЧрд░рд╛рдиреА рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рдлрд╛рдирд╛ рдбреИрд╢рдмреЛрд░реНрдб рдХреЛ рддреИрдирд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдбреИрд╢рдмреЛрд░реНрдб рдпрд╛ рдореАрдЯреНрд░рд┐рдХ рд╕рд░реНрд╡рд░ (рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЧрдП рдЙрдкрдпреЛрдЧ arkade install) рдХреЗ рд╕рд╛рде рдХрд┐рддрдиреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ ред

Arkade рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВ: https://get-arkade.dev

рдЙрдкрд░реЛрдХреНрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП OpenFaaS рдХрд╛рд░реНрдпрд╢рд╛рд▓рд╛ рдореЗрдВ рднрд╛рдЧ рд▓реЗрдВ : https://github.com/openfaas/workshop/

рдЖрдк
https рдкрд░ рдореЗрд░реЗ рдкреНрд░реАрдорд┐рдпрдо рдЗрдВрд╕рд╛рдЗрдбрд░реНрд╕ рдЕрдкрдбреЗрдЯ рдиреНрдпреВрдЬрд╝рд▓реЗрдЯрд░ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ : / / www.alexellis.io/
рдФрд░ рдореЗрд░реЗ рдЯреНрд╡рд┐рдЯрд░ рдПрд▓реЗрдХреНрд╕ рдПрд▓рд┐рд╕ рдкрд░



рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВ



All Articles