team-azb / knowtfolio

Own Your Knowledge. Create Your Knowtfolio.
5 stars 1 forks source link

各ディレクトリごとに散らばった.envを統合する #201

Open reibomaru opened 1 year ago

reibomaru commented 1 year ago

.envが肥大化してきて、共通の項目も増えたので統合しよう

shugo256 commented 1 year ago

182 と一緒にやることで、Makefileで.envを自動生成できそう

shugo256 commented 1 year ago

現状使ってる環境変数一覧: https://github.com/team-azb/knowtfolio/blob/34e4217316012aa471079c610df3e86f9654f6b2/blockchain/.env.example#L1-L3 https://github.com/team-azb/knowtfolio/blob/34e4217316012aa471079c610df3e86f9654f6b2/client/.env.example#L1-L7 https://github.com/team-azb/knowtfolio/blob/34e4217316012aa471079c610df3e86f9654f6b2/server/.env.example#L1-L13

shugo256 commented 1 year ago

環境変数まとめ

✅はそのディレクトリの.envで使われているかどうか

AWS関連

命名規則:AWS_{サービス名}_{中身の名前} key blockchain client server
AWS_IAM_ADMIN_ACCESS_KEY_ID
AWS_IAM_ADMIN_SECRET_ACCESS_KEY
AWS_COGNITO_USER_POOL_ID
AWS_COGNITO_CLIENT_ID
AWS_COGNITO_IDENTITY_POOL_ID
AWS_S3_CLIENT_BUCKET_NAME
AWS_S3_ARTICLE_RESOURCES_BUCKET_NAME
AWS_S3_NFTS_BUCKET_NAME
AWS_CLOUD_FRONT_DISTRIBUTION_ID
AWS_REGION

これらはすべてterraform outputを使って生成すれば良さそう このためには、terraform_user.awsのクレデンシャルたちがあらかじめ必要

その他

命名規則:

DB_URIについては、gorm形式のものとなってしまっているので、DB_USER_NAMEDB_PASSWORDなどに細かく分割した方が良さそう( #210 に関連)

ETH_*_NETWORK_URIは、alchemyのapikeyを含むので、公開できない 現時点では、MUMBAIPOLYGONの代わりにdevとprodとしてもよいが、今後複数ネットワークをサポートする場合を見据えてネットワーク名ごとに分ける方式をとってみる

これらはユーザ入力に頼るか、aws secrets managerに保存するかになりそう github actions上ではsecretsに登録する必要あり

公開して良いもの

key blockchain client server
ETH_CHAIN_ID
ETH_CONTRACT_ADDRESS

ETH_CONTRACT_ADDRESSについては、contractのデプロイ時に確定するので、blockchain/scripts/deploy.tsでアドレスをなんらかの形で保存しておくのが良さそう(このファイルはignoreしないでgit管理した方がいいと思われる) 参考:https://ethereum.stackexchange.com/questions/119967/how-to-get-the-address-of-an-already-deployed-contract-in-hardhats-network

shugo256 commented 1 year ago

実装案

プロジェクトルートにenvironmentsディレクトリを用意し、ここに.awsのcredentialと、↑で生成される各種.envファイルたちをまとめる

knowtfolio/
├─ blockchain/
├─ client/
├─ infrastructure/
├─ server/
├─ environment/
│  ├─ .aws/
│  ├─ .gitignore
│  ├─ aws.env [AWS_*]
│  ├─ eth.env [ETH_*, ETHERSCAN_API_KEY (, MUMBAI_URL)]
│  ├─ db.env [DB_*]
│  ├─ misc_apis.env [TINY_MCE_API_KEY]

各種.envファイルについては、Makefileで生成するようにする docker-compose.ymlでは、これらの中から必要なものだけを選択すれば良い

services:
  client:
    env_file:
      - ./environment/aws.env
      - ./environment/misc_apis.env # for tiny-mce

.awsinfrastructureから移動するが、これはconfig.tfを書き換えるだけで対応可能

shugo256 commented 1 year ago

表を見ると、envの内容はサービス(blockchain, client, server)間でほとんど重複していないので、データソースごとのjson?か何かを生成後に、サービスごとの.envにまとめるのはありかもしれない

shugo256 commented 1 year ago

公開できない変数の格納にaws secrets managerの使用を検討していたが、調べた結果、これとは別のaws system manager パラメータストアが内容ほぼ変わらず無料(secrets managerは無料枠なし)なので、こっちでええやんとなっている 参考:https://qiita.com/tomoya_oka/items/a3dd44879eea0d1e3ef5