DEV Community

Permpoon Chaowanaphunphon
Permpoon Chaowanaphunphon

Posted on

Initial API project with Go

เกริ่นนำ

เนื่องจากช่วงนี้ผมได้มาเริ่มต้นโปรเจค API ด้วย Golang บ่อย
ผมเลยขอบันทึกไว้กันลืม

Stack

1) Golang
2) Go Fiber
3) Gorm
4) PostgreSQL

Steps

1) สร้าง Folder สำหรับที่อยู่ของโปรเจค

$ mkdir demo
$ cd demo
Enter fullscreen mode Exit fullscreen mode

2) สร้าง go mod file

$ go mod init github.com/mossnana/demo
Enter fullscreen mode Exit fullscreen mode

3) สร้าง Folders / Files ที่เก็บ source code

$ mkdir cmd
$ mkdir internal
$ mkdir pkg
Enter fullscreen mode Exit fullscreen mode

** Folder **

  • cmd ไว้วางโฟรเดอร์ที่มีไฟล์ main.go สำหรับโปรแกรมต่าง ๆ เช่น
    • server ตัว run web server
    • migrator ตัว migrate db
  • internal ไว้ใส่ไฟล์ที่เก็บ logic ที่เกี่ยวข้องกับตัว api นี้ ที่มีความเฉพาะตัวของ api นี้
  • pkg ไว้เก็บไฟล์ที่ไว้ต่อกับโปรแกรมนอก เช่น function ต่อ database ๆลๆ

4) สร้าง Folders / Files ที่ไว้ run
Dockerfile

FROM golang:latest
WORKDIR /app
COPY . .

RUN go mod tidy
RUN go get github.com/githubnemo/CompileDaemon
RUN go build -o bin/migrator ./cmd/migrator

CMD CompileDaemon --build="go build -o bin/server ./cmd/server" --command="./bin/server"
Enter fullscreen mode Exit fullscreen mode
  • CompileDaemon ใช้เป็นตัว auto restart เมื่อ code เปลี่ยน

docker-compose.yml

version: "3.5"

services:
  demo_service:
    container_name: demo_service
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ./:/app
    restart: always
    ports:
      - "3000:3000"
    networks:
      - demo_net
    env_file:
      - ./.env

  brij_db:
    container_name: brij_db
    image: postgres:14
    volumes:
      - "demo_db_data:/var/lib/postgresql/data"
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_USER=demo
      - POSTGRES_PASSWORD=demopassword
      - POSTGRES_DB=demo
    networks:
      - demo_net

networks:
  demo_net:
    external: false

volumes:
  demo_db_data:
    external: false
Enter fullscreen mode Exit fullscreen mode

Makefile

build:
    docker-compose up -d --build

start:
    docker-compose up -d

migrate:
    docker exec -it demo_service /app/bin/migrator

stop:
    docker-compose down
Enter fullscreen mode Exit fullscreen mode

Project tree

.
├── cmd/
│   ├── demo/
│   │   └── main.go
│   └── migrator/
│       └── main.go
├── internal/
│   ├── model/
│   │   ├── sale.go
│   │   ├── purchase.go
│   │   └── account.go
│   ├── repository/
│   │   ├── sale.go
│   │   ├── purchase.go
│   │   └── account.go
│   ├── service/
│   │   ├── sale/
│   │   │   ├── v1/
│   │   │   │   ├── create.go
│   │   │   │   ├── read.go
│   │   │   │   ├── update.go
│   │   │   │   └── delete.go
│   │   │   └── v2/
│   │   │       ├── create.go
│   │   │       ├── read.go
│   │   │       ├── update.go
│   │   │       └── delete.go
│   │   └── ...
│   ├── handler/
│   │   └── sale/
│   │       ├── v1/
│   │       │   ├── create.go
│   │       │   ├── read.go
│   │       │   ├── update.go
│   │       │   └── delete.go
│   │       ├── v2/
│   │       │   ├── create.go
│   │       │   ├── read.go
│   │       │   ├── update.go
│   │       │   └── delete.go
│   │       └── ...
│   └── route/
│       ├── sale.go
│       ├── purchase.go
│       └── account.go
├── pkg/
│   ├── auth/
│   │   └── auth.go
│   └── gorm/
│       ├── driver.go
│       └── migrate.go
├── Dockerfile
├── docker-compose.yml
└── Makefile
Enter fullscreen mode Exit fullscreen mode

การ Build

go build -o bin/{{ชื่อแอปใน main}} ./cmd/{{ชื่อแอปใน main}}
Enter fullscreen mode Exit fullscreen mode

Discussion (0)