Go로 인증서버 만들기 #1 개발환경 구축

펜타곤·2023년 3월 19일
2
post-thumbnail

지난편에 이어 개발을 본격적으로 시작해 보겠다.

완성된 코드 파일 (Github Repository)
Github Repository #1 set build environment



0. 필요한 것

이번 프로젝트는 Go, Docker, docker-compose를 사용하므로,
본인의 개발/배포 환경에 설치되어 있지 않다면 설치 해야한다.



1. 구상한 디렉터리 구조

~/main
 - docker-compose.yml

$GOPATH/src
 L pentag.kr/BuildinAuthVelog  
   L configs
     - config.go
   L controllers
     - auth.ctrl.go
     - info.ctrl.go
   L database
     - connect.go
     - database.go
   L middlewares
     - authorization.go
   L models
     - user.go
   L routers
     - auth.router.go
     - info.router.go
     - initialize.go
   L utils
     - email.go
     - hash.go
     - jwt.go
     - validation.go
   - main.go             -
   - go.mod              |
   - go.sum              |  (이 포스트에서 작업할 부분)
   - docker-compose.yml  |
   - Dockerfile          |
   - .env                -
 

내 도메인인 pentag.kr과 운영할 서비스인 Buildin Auth 기준으로 패키지 이름을 정했다.

이 포스트에서 작업할 디렉터리를 $GOPATH/src에 생성하자

$GOPATH 가 무엇인지 모른다면 아래의 velog를 참조하자

GOROOT와 GOPATH에 대한 글

반드시 패키지 이름이 "pentag.kr/BuildinAuthVelog"가 아니여도 된다.
대신 import 할 때에 그에 맞춰서 작성하도록 하자



2. 개발 환경에서 작동하기 위한 구성 (1)

  1. 먼저 go mod init 을 실행해 의존성 파일을 만들어주자

  2. go get github.com/gofiber/fiber/v2 를 실행해 Fiber를 의존성에 추가해주자

  3. 간단하게 테스트 해볼 main.go 파일을 만들어보자

// pentag.kr/BuildinAuthVelog/main.go

package main

import (
	"log"

	"github.com/gofiber/fiber/v2"
)

func main() {
	app := fiber.New()

	log.Fatal(app.Listen(":" + "3000"))
}
  1. 프로덕션과 동일한 환경인 Docker에서
    main.go 파일을 빌드하고 실행하려면 Dockerfile을 작성해야 한다.

    만약 본인의 패키지 이름이 다르다면,
    "pentag.kr/BuildinAuthVelog"를 본인 패키지 이름으로 변경하여 작성해야 합니다.

    # pentag.kr/BuildinAuthVelog/Dockerfile
    
    FROM golang:1.20.2-alpine AS builder
    
    ENV GOPATH=/go/src
    WORKDIR /go/src/pentag.kr/BuildinAuthVelog
    
    COPY ["./go.sum", "./go.mod", "/go/src/pentag.kr/BuildinAuthVelog/"]
    RUN go mod download
    
    COPY ./ ./
    RUN go build -o main .
    
    FROM scratch
    
    COPY --from=builder ["/go/src/pentag.kr/BuildinAuthVelog/main", "/"]
    
    ENTRYPOINT ["/main"]
  2. sudo docker build -t buildin-auth-velog . 을 실행해 이미지를 빌드해 에러가 없는지 확인해보자

  3. sudo docker run --name buildin-auth-server-velog -p 3000:3000 buildin-auth-velog:latest 를 실행해 localhost:3000과 연결된 Docker Container를 실행하자

  4. localhost:3000에 접속해 Cannot GET /가 응답으로 온다면 정상적으로 작동하는 것이다



3. 개발 환경에서 작동하기 위한 구성 (2)

PostgresSQL, Redis, WAS의 환경변수 파일을 1개로 통합하여 관리하고
간단하게 어느 환경이나 배포 가능한 코드를 만들기 위해 docker-compose를 사용한다.

  1. docker-compose.yml 파일을 작성하자
version: "3.7"

networks:
  main_net:
    # name: main_main_net
    # external: true
    driver: bridge
  back_net:
    driver: bridge

services:
  buildin-auth:
    container_name: buildin-auth
    image: buildin-auth:latest
    networks:
      - main_net
      - back_net
    env_file:
      - .env
    ports:
      - ${WAS_PORT}:${WAS_PORT}
    depends_on:
      - postgres
    restart: always
  postgres:
    container_name: ${POSTGRES_HOST}
    image: postgres:alpine
    volumes:
      - ./postgres:/var/lib/postgresql/data
    ports:
      - 5432:5432
    env_file: .env
    environment:
      TZ: Asia/Seoul
    restart: always
    networks:
      - back_net
  redis:
    image: redis:alpine
    container_name: ${REDIS_HOST}
    command: redis-server --requirepass ${REDIS_PASSWORD} --port ${REDIS_PORT}
    labels:
      - "name=redis"
      - "mode=standalone"
    volumes:
      - ./redis/data:/data
      - ./redis/conf/redis.conf:/usr/local/conf/redis.conf
    ports:
      - 6379:6379
    env_file:
      - .env
    networks:
      - back_net

위 "networks"의 주석처리 된 부분은 Cloudflare Argo TunnelPortainer가 작동되고 있는
외부 네트워크를 연결하기 위한 부분이다. 해당 내용은 다음 편에서 다루도록 하겠다.

Cloudflare Argo Tunnel의 데이터베이스 접근을 막기 위해,
Docker Network를 main_netback_net 으로 분리했다.

  1. .env 파일을 작성하자
# WAS

WAS_HOST=0.0.0.0
WAS_PORT=3000

# DB

POSTGRES_HOST=PostgreSQL_호스트명
POSTGRES_PORT=PostgreSQL_포트
POSTGRES_USER=PostgreSQL_유저명
POSTGRES_PASSWORD=PostgreSQL_비밀번호
POSTGRES_DB=PostgreSQL_DB명

# REDIS

REDIS_HOST=Redis_호스트명
REDIS_PORT=Redis_포트
REDIS_PASSWORD=Redis_비밀번호
  1. sudo docker-compose up 으로 잘 작동하는지 테스트 해보자
    로그가 정상적으로 나온다면 성공이다.

4. 마무리

다음 편에서는 Cloudflare Argo TunnelPortainer 연결을 알아보겠다.

다음 편 내용은 필수가 아닌 "선택"이다 만약 자신의 공인IP를 공개할 수 없거나 80포트를 열 수 없는 경우, 포트포워딩 없이 인터넷만 연결되어있다면 docker-compose만으로 어디서든 배포하고 싶다면,
Cloudflare Argo Tunnel를 고려해 보길 바란다.

그 다음편은 config.go 파일을 통한 .env 파일 연결 및 ORM을 통한 DB, Redis 연결을 소개해보도록 하겠다

profile
모난 예비 개발자 펜타곤

0개의 댓글