物聯網開發筆記 (十二) Go+PostgreSQL Dockerize
將原先使用 Google 的 Serverless 搭配使用自建的 go server

先前的架構上使用的是 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 要先好好思考規劃一下資料表與類型長度,以免後續效能不彰。