HTTPS + Nginx + TypeScript + React + Express + MySQL の環境レシピ
HTTPS は Nginx に証明書を設定し実現する React は build image を Nginx に volume の共有で認識させる
docker/mysql/Dcokerfile
でapt-get update
が現時点の latest だとエラーになるため以下を追記している。key でエラーになる場合などは適時変更削除すること
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 467B942D3A79BD29
自己署名入り証明書ではなく正規のドメインからサブドメインなどにLet’s Encryptで証明書を発行する場合は取得
./docker/nginx/
配下にcert
ディレクトリを作成し、取得作成したcert.crt
,cert.key
を配置する(cert
は.gitignore
で除外されていることを確認する)
mkdir ./docker/nginx/cert
独自ドメインに Let’ Encrypt にて証明書を取得する場合はcreate-https-localhost-with-letsencryptを参照
その他mkcertを利用し作成する方法もある
docker-compose up --build -d
docker-compose stop
docker-compose rm
docker image rm https-nginx
docker image rm https-express-app
docker image rm https-react-app
docker image rm https-mysql
docker volume rm https-express-app
docker volume rm https-mysql
docker volume rm https-react-app
アプリの起動はnpx ts-node index.ts
で行う
index.ts
import express,{ Request,Response } from 'express'
import mysql from 'mysql2'
import cors from 'cors'
const app = express()
const pool = mysql.createPool({
connectionLimit: 5,
host: 'db',
user: 'appuser',
password: 'mysql',
database: 'test',
})
const promisePool = pool.promise()
app.use(
cors({
// origin -> 作成したサブドメイン、Dcoker react-appコンテナ
origin:['https://localhost.hironomiu.com','http://localhost:3333'],
credentials:true,
optionsSuccessStatus:200,
})
)
app.get('/api/v1/hello', async (req:Request,res:Response) => {
const [rows,fields]:[mysql.RowDataPacket[],any] = await promisePool.query('select 1 as num')
if(rows[0]){
res.json({message:`hello ${rows[0].num}`})
}
})
app.listen(5550,() => {
console.log(`express listen *:5550`)
})
.src/App.tsx
実装後npm run build
を行い./src/build
を作成する。これによりhttps://作成したサブドメイン or https://localhost
にアクセスしNginx
経由で Build した React アプリにアクセスできる。
import {FC ,useEffect,useState} from 'react';
const App:FC = () => {
const [data,setData] = useState({message:"hoge"})
useEffect(()=> {
( async () => {
// fetch先は作成したサブドメインに適時書き換える
const res = await fetch('https://localhost.hironomiu.com/api/v1/hello')
const data = await res.json()
setData(data)
})()
})
return <div>{data.message}</div>;
};
export default App;
./docker/nginx/Dockerfile
-> RUN mkdir ${APP_PATH}
をコメントにしているが作成されない場合はコメントを外す