, ,

物聯網開發筆記 (十二) Go+PostgreSQL Dockerize

將原先使用 Google 的 Serverless 搭配使用自建的 go server

物聯網開發筆記 (十二) Go+PostgreSQL Dockerize
Image Source : https://www.mitrais.com/news-updates/how-to-dockerize-a-restful-api-with-golang-and-postgres/

先前的架構上使用的是 Google Cloud Server 搭配 Firebase Firestore 來儲存裝置的資料,因為想規避 Google 設定的付費門檻,在設計上就不是那麼的靈活與方便,很多東西就不敢上傳至 db 儲存。

所以後續我想針對這一部分進行改良,將 Firebase 單純用於 App 身份驗證即可,由於本身就有機器在跑 docker,這一次我也打算建 docker 來運作 server、db。

目前架構上採用

  • Go lang - 作為 api server 與 database 溝通用
  • PostgreSQL - 資料庫系統
  • pgadmin4 - 類似於 phpmyadmin 的 GUI

Docker Compose

多個 docker 的部署上,肯定是要使用 compose 來協助才方便了

version: '3.9'

services:

  app:
    container_name: ${APP_CONTAINER_NAME}
    environment:
      - POSTGRES_USER=${DB_USER}
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      - POSTGRES_DB=${DB_DATABASE}
      - DATABASE_HOST=db
      - DATABASE_PORT=${DB_PORT}
    tty: true
    build:
      context: .
      dockerfile: ./build/dockerfiles/app/Dockerfile
    ports:
      - ${APP_PORT}:8080
    depends_on:
      - db
    restart: always
    networks:
      - aiot_network

  db:
    container_name: ${DB_HOST}
    build:
      context: .
      dockerfile: ./build/dockerfiles/db/Dockerfile
    ports:
      - ${DB_PORT}:5432
    environment:
      - POSTGRES_DB=${DB_DATABASE}
      - POSTGRES_USER=${DB_USER}
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      - TZ=GMT+8
    volumes:
      - ./database/data:/var/lib/postgresql/data
      - ./database/init:/docker-entrypoint-initdb.d
    restart: always 
    networks:
      - aiot_network

  pgadmin:
    container_name: ${DB_HOST}-admin
    image: dpage/pgadmin4:8.4
    environment:
      - PGADMIN_DEFAULT_EMAIL=${DBADMIN_EMAIL}
      - PGADMIN_DEFAULT_PASSWORD=${DBADMIN_PASSWORD}
    ports:
      - ${DBADMIN_PORT}:80
    restart: always
    networks:
      - aiot_network

networks:
  aiot_network:
    driver: bridge

Build Image

Go lang

# Use the official Go image as the base image
FROM golang:1.22.1-alpine3.19

ENV TZ=Asia/Taipei

RUN mkdir -p /app

WORKDIR /app

COPY ././app/ .

RUN go mod download \
&& go build -o main .

EXPOSE 8080

CMD ["./main"]

PostgreSQL

FROM postgres:16.2

RUN localedef -i zh_TW -c -f UTF-8 -A /usr/share/locale/locale.alias zh_TW.UTF-8

ENV LANG zh_TW.utf8


目前這樣空的環境已經運行起來,目前要先開始規劃資料表,因為 Firestore 是 json 形式的資料庫,之前可以隨意新增資料,改用 PostgreSQL 要先好好思考規劃一下資料表與類型長度,以免後續效能不彰。