지난편에 이어 개발을 본격적으로 시작해 보겠다.
완성된 코드 파일 (Github Repository)
Github Repository #1 set build environment
이번 프로젝트는
Go
,Docker
,docker-compose
를 사용하므로,
본인의 개발/배포 환경에 설치되어 있지 않다면 설치 해야한다.
~/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를 참조하자
반드시 패키지 이름이 "pentag.kr/BuildinAuthVelog"가 아니여도 된다.
대신 import 할 때에 그에 맞춰서 작성하도록 하자
먼저 go mod init
을 실행해 의존성 파일을 만들어주자
go get github.com/gofiber/fiber/v2
를 실행해 Fiber를 의존성에 추가해주자
간단하게 테스트 해볼 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"))
}
프로덕션과 동일한 환경인 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"]
sudo docker build -t buildin-auth-velog .
을 실행해 이미지를 빌드해 에러가 없는지 확인해보자
sudo docker run --name buildin-auth-server-velog -p 3000:3000 buildin-auth-velog:latest
를 실행해 localhost:3000
과 연결된 Docker Container를 실행하자
localhost:3000
에 접속해 Cannot GET /
가 응답으로 온다면 정상적으로 작동하는 것이다
PostgresSQL, Redis, WAS의 환경변수 파일을 1개로 통합하여 관리하고
간단하게 어느 환경이나 배포 가능한 코드를 만들기 위해 docker-compose
를 사용한다.
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 Tunnel
과Portainer
가 작동되고 있는
외부 네트워크를 연결하기 위한 부분이다. 해당 내용은 다음 편에서 다루도록 하겠다.
Cloudflare Argo Tunnel
의 데이터베이스 접근을 막기 위해,
Docker Network를main_net
과back_net
으로 분리했다.
.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_비밀번호
sudo docker-compose up
으로 잘 작동하는지 테스트 해보자다음 편에서는 Cloudflare Argo Tunnel
과 Portainer
연결을 알아보겠다.
다음 편 내용은 필수가 아닌 "선택"이다 만약 자신의 공인IP를 공개할 수 없거나 80포트를 열 수 없는 경우, 포트포워딩 없이 인터넷만 연결되어있다면 docker-compose만으로 어디서든 배포하고 싶다면,
Cloudflare Argo Tunnel
를 고려해 보길 바란다.
그 다음편은 config.go
파일을 통한 .env
파일 연결 및 ORM을 통한 DB, Redis 연결을 소개해보도록 하겠다