본문으로 바로가기

[바미] Go - todos 배포

category 프로그래밍(Web)/Golang 2020. 12. 18. 12:29
728x90
반응형
728x170

우선 기존에 만들었었던 todos 파일을 사용자 계정 폴더에 빼내어 줍니다.

여기에 Go 모듈을 만들어 줍니다.

명령 프롬프트 창을 키고 방금 옮겼던 폴더로 이동 합니다.

그 다음 go mod init changbeomWeb/todos를 입력해 줍니다.

go mod init하면 mod가 initialize하게 되는데 그 때 뒷부분에 만들려는 모듈의 이름을 적어준다. 되도록 겹치지 않게 해줍니다.

이렇게 하면 MOD파일이 생성된 것을 확인할 수 있습니다.

그 후 git init를 사용하여 git을 initialize하게 해줍니다.

그 후 해당 폴더를 열어서 import 부분들을 mod init했던 부분과 맞추어 수정해 줍니다.

app/app_test.go

import (
    "encoding/json"
    "fmt"
    "net/http"
    "net/http/httptest"
    "net/url"
    "os"
    "strconv"
    "testing"

    "changbeomWeb/todos/model" // 여기

    "github.com/stretchr/testify/assert"
)

app/app.go

import (
    "net/http"
    "strconv"
    "strings"

    "changbeomWeb/todos/model" // 여기

    "github.com/gorilla/mux"
    "github.com/gorilla/sessions"
    "github.com/unrolled/render"
    "github.com/urfave/negroni"
)

main.go

import (
    "log"
    "net/http"

    "changbeomWeb/todos/app" // 여기
)

그 다음 

go build -o ./bin/todos.exe -v .

를 사용하여 빌드를 시켜 줍니다.

.은 현재 폴더를 빌드하겠다는 의미이고, v는 메세지가 나오게 하겠다는 의미 입니다.


이 프로젝트에서 사용되는 모듈들을 찾아서 go mod파일에 정의하는 것을 알 수 있습니다.

그리고 빌드는 끝이났고, bin폴더가 생성 되는 것을 확인할 수 있습니다.

그 후 bin\todos.exe를 사용하여 서버를 실행시켜 봅시다!

그 후 heroku에 배포하기 위해 heroku에 로그인을 시켜줍니다.

heroku login

그 다음 로그인이 완료된 상태에서 다음 명령어를 입력 해줍니다.

heroku create

그 후 커밋을 위해 기존 파일에 있던 test.db파일과 bin폴더에 있는 todos.exe 파일들을 지워 줍니다.

그 후 add 시켜 줍니다.

git add .

그 다음 커밋을 시켜 줍니다.

git commit -m "first commit of todos"

이제 커밋이 되었는데, 이 상태에서 heroku server로 push 시켜 줍니다.

git push heroku master

그 다음 현재 돌아가고 있는 프로세스 정보를 확인 해봅시다!

heroku ps

그리고 log를 확인하여 제대로 돌아가고 있는지 확인해 봅시다!

heroku logs --tail

그 다음 접속을 해보죠!

heroku open

그러면 오류가 난 창이 뜨는데 로그를 확인 해보면

그러면 무언가 crashed가 났다고 뜹니다.

어떤게 crashed 났는지 확인해보죠!


먼저 heroku 테스트 코드를 보게 되면

package main

import (
  "log"
  "net/http"
  "os"

  "github.com/gin-gonic/gin"
_ "github.com/heroku/x/hmetrics/onload"
)

func main() {
  port := os.Getenv("PORT")

  if port == "" {
   log.Fatal("$PORT must be set")
  }

  router := gin.New()
  router.Use(gin.Logger())
  router.LoadHTMLGlob("templates/*.tmpl.html")
  router.Static("/static", "static")

  router.GET("/", func(c *gin.Context) {
    c.HTML(http.StatusOK, "index.tmpl.html", nil)
  })

  router.Run(":" + port)
}

여기를 확인하면 포트번호는 임의적으로 설정하는 게 아니라 환경변수에서 설정되어 있는 포트번호를 써야 되는 것을 알 수 있습니다.

수정해 줍시다!

package main

import (
  "log"
  "net/http"
  "os"

  "changbeomWeb/todos/app"
)

func main() {
  port := os.Getenv("PORT")
  m := app.MakeHandler("./test.db")
  defer m.Close()

  log.Println("Started App")
  err := http.ListenAndServe(":"+port, m)

  if err != nil {
    panic(err)
  }
}

그리고 heroku 테스트 파일 폴더에 procfile에 실행파일 경로가 적혀있는데 이것을 현재 만든 프로젝트에 가져온다.

그 후 procfile를 수정해 줍니다.

web: bin/todos

파일을 수정했기 때문에 명령 프롬프트를 열어 다시 git에 add 해준 뒤 커밋을 하고 push를 서버에 시켜 줍니다.

git add .
git commit -m "use port env var"
git push heroku master

 

 

이 상태에서 다시 한번 실행시켜 봅시다!

heroku open

근데 이 상태에서 구글 로그인을 눌러보면 에러가 납니다.

그 이유는 app/app.go를 보면

var googleOauthConfig = oauth2.Config{
    RedirectURL:  "http://localhost:3000/auth/google/callback",
    ClientID:     os.Getenv("GOOGLE_CLIENT_ID"),
    ClientSecret: os.Getenv("GOOGLE_SECRET_KEY"),
    Scopes:       []string{"https://www.googleapis.com/auth/userinfo.email"},
    Endpoint:     google.Endpoint,
}

여기서 가져오는 ClientID, ClientSecret가 내 컴퓨터의 환경변수에서 가져오는 것인데, 현재 서버가 돌아가는 상태가

내 컴퓨터가 아닌 장치에서 돌아가기 때문에 저런 페이지가 뜬 것 입니다.

그래서 heroku server에도 이것들을 알려 주어야 합니다.

 

heroku config를 통해 설정할 수 있습니다.

지금은 아무것도 설정 되어 있지 않기 때문에 빈 공간 입니다.

그래서 다음과 같이 해주면 됩니다.

  heroku config:set GOOGLE_CLIENT_ID=발급받은 클라이언트 ID

  heroku config:set GOOGLE_SECERT_KEY=발급받은 SECERT KEY

  heroku config:set SESSION_KEY=설정한 SESSION_KEY

새로 오픈하기 전에 수정해야 할 것이 있습니다.

app/signin.go를 보면

var googleOauthConfig = oauth2.Config{
    RedirectURL:  "http://localhost:3000/auth/google/callback",
    ClientID:     os.Getenv("GOOGLE_CLIENT_ID"),
    ClientSecret: os.Getenv("GOOGLE_SECRET_KEY"),
    Scopes:       []string{"https://www.googleapis.com/auth/userinfo.email"},
    Endpoint:     google.Endpoint,
}

RedirectURL가 로그인을 한 다음에 돌아 갈 주소인데, localhost:3000이 아니라 도메인을 가져와서 뒷 주소들을 붙여 주도록 수정했습니다.

var googleOauthConfig = oauth2.Config{
    RedirectURL:  "os.Getenv("DOMAIN_NAME") + /auth/google/callback",
    ClientID:     os.Getenv("GOOGLE_CLIENT_ID"),
    ClientSecret: os.Getenv("GOOGLE_SECRET_KEY"),
    Scopes:       []string{"https://www.googleapis.com/auth/userinfo.email"},
    Endpoint:     google.Endpoint,
}

그 다음 DOMAIN_NAME이라는 환경변수를 설정해 주어야 하는데

heroku apps

를 사용하면 도메인 이름이 나옵니다.

위와 같이 2개가 나왔을 땐 heroku open해서 확인해 주도록 합시다!

저 부분을 복사해서 환경변수에 설정해 봅시다!

heroku config:set DOMAIN_NAME=frozen-meadow-93432.herokuapp.com

그 다음 파일이 변경되었기 때문에 add, commit, push를 다시 진행해 줍니다.

완료 되었으면 다시 heroku open해서 열어 보죠!

 

구글 로그인 버튼을 클릭하면 다시 에러가 뜨는데 등록된 URL이 아니라는 문구가 뜹니다.

그래서 구글 클라우드 플랫폼에 추가를 해주어야 합니다.

변경이 완료 된 다음에 다시 heroku open해서 열어 줍니다.

728x90
반응형
그리드형

댓글을 달아 주세요