This project is a todo application that uses a microservice architecture.
It was created for learning microservice architecture.
The base minimum configuration is v1.x.x Version Line.
Additional microservices and external WebAPI examples are in v2.x.x Version Line.
| Name | Type | Languages | Environment | OS | Framework | Description | Dependences |
|---|---|---|---|---|---|---|---|
| TodoApi | WebAPI | C# | .NET 6 | alpine | ASP.NET Core 6 WebAPI | CRUD WebAPI For Todo. | TodoDB |
| TodoUI | WebUI | C# | .NET 6 | alpine | ASP.NET Core 6 Blazor Server | WebUI For TodoApp. PWA Support. Dark-Mode Support | TodoApi/BoardApi(/WeaterApi/clientIPAddrApi) |
| TodoEndpoint | External Endpoint | ---- | Nginx | alpine | ---- | Nginx Reverse Proxy/TodoApp Endpoint. | TodoUI |
| TodoDB | DB | ---- | MariaDB | ubuntu | ---- | DB For TodoApi. | ---- |
| TodoDB-Console(BoardDB-Console) (Optional) | DB UI (Optional) | ---- | adminer | alpine | ---- | TodoDB(BoardDB) Optional UI | TodoDB(BoardDB) |
| Name | Type | Languages | Environment | OS | Framework | Description | Dependences |
|---|---|---|---|---|---|---|---|
| WeaterApi | WebAPI | ---- | ---- | ---- | ---- | External WebAPI Sample | ---- |
| BoardApi | WebAPI | TypeScript | Node.js | alpine | NestJS | CRUD WebAPI For Board. Additional Microservices WebAPI Sample | BoardDB |
| BoardDB | DB | ---- | PostgreSQL | alpine | ---- | DB For BoardApi. | ---- |
| clientIPAddrApi | WebAPI | ---- | ---- | ---- | ---- | Get Client IP Address For TodoUI Board using JavaScript Injection. (External WebAPI Sample) | ---- |
| Project Name | TodoApp |
|---|---|
| Project URL | https://github.com/Yutaro-B18016/TodoApp-For-Microservices |
| Services | 4~8 |
| Deploy | Kubernetes/Docker |
| Deploy (Kubernetes) | skaffold |
| Deploy (Docker) | Docker Compose |
| Build Your Own | Available |
| Works Without Change | Available |
| Login | Unavailable |
| Network | Proxy Model |
- Simple structure with few services.
- Flexible inter-container networking with environment variables.
- Do not rely on cloud-merged functions.
- Deployable by following the manual.
- Environment-independent deployment (Kubernetes).
- Deploying with no changes.
- Easy to understand how to add samples and services.
- Can be used as a sample or template.
Requirements
- Docker
- Docker Compose (If you have less than Compose V2, use the
docker-composecommand instead of thedocker composecommand.)
git clone https://github.com/Yutaro-B18016/TodoApp-For-Microservices.git
cd TodoApp-For-Microservices/deploy/compose
docker compose up -d --buildAfter deployment, it can be accessed on localhost:5000.
You can use Adminer on localhost:8080 to access the DB.(The default is tododb for Server, todoapi for user, toadoapi for password, and todoapi for database.)
Requirements
- kubectl (Able to manipulate target Kubernetes)
- Docker
- skaffold
git clone https://github.com/Yutaro-B18016/TodoApp-For-Microservices.git
cd TodoApp-For-Microservices/
SKAFFOLD_DEFAULT_REPO=$DOCKER_REGISTRY skaffold -n $DEPLOY_NAMESPACE run$DOCKER_REGISTRY needs to be changed to your Docker Registry, and $DEPLOY_NAMESPACE to your deploy namespace.
If you use the default namespace, -n $DEPLOY_NAMESPACE is optional.
If you are using a local Docker Registry such as Minikube, SKAFFOLD_DEFAULT_REPO=$DOCKER_REGISTRY is not necessary.
After deployment, it can be accessed on Node IP:31000 using the node port.
The data in the DB is not persistent.
The sample PV uses Node local.(It is not possible to increase the value of replicas in the database.)
The node-name in Todo-SC.yml needs to be changed to your node name.
git clone https://github.com/Yutaro-B18016/TodoApp-For-Microservices.git
cd TodoApp-For-Microservices/deploy/k8s/
kubectl apply -f Todo-NS.yml
sudo mkdir -p /mnt/kubernetes/tododb
sudo chmod 777 /mnt/kubernetes/tododb
sudo mkdir -p /mnt/kubernetes/boarddb
sudo chmod 777 /mnt/kubernetes/boarddb
sudo mkdir -p /mnt/kubernetes/boarddb-data
kubectl apply -f Todo-SC.yml
cd ../../
SKAFFOLD_DEFAULT_REPO=$DOCKER_REGISTRY skaffold -n todoapp run
cd ./deploy/k8s/
kubectl apply -n todoapp -f TodoDB-PVC.yml
kubectl apply -n todoapp -f BoardDB-PVC.ymlThe default Ingress Controller is required.
After deploying the app, do the following.
git clone https://github.com/Yutaro-B18016/TodoApp-For-Microservices.git
cd TodoApp-For-Microservices/deploy/k8s/
kubectl apply -n $DEPLOY_NAMESPACE -f Tododb-Ingress.ymlAfter deployment, it can be accessed by Ingress.
git clone https://github.com/Yutaro-B18016/TodoApp-For-Microservices.git
cd TodoApp-For-Microservices/deploy/k8s/
kubectl apply -n $DEPLOY_NAMESPACE -f Tododb-Console.ymlAfter deployment, it can be accessed on Node IP:31880 using the node port.(The default is tododb or boarddb for Server, todoapi or boardapi for user, toadoapi or boardapi for password, and todoapi or boardapi for database.)
Requirements
- Docker
- Docker Compose
- Visual Studio Code
- Remote - Containers (VSCode Extentions)
- Docker (VSCode Extentions)
Open the TodoApi/TodoUI/BoardApi directory in VSCode.
After opening, select Reopen in Container in the notification at the bottom right.
BoardApi: After opening the DEV Container in VSCode, run yarn install in a terminal.
| Name | OS | Tag | Description | Dependences |
|---|---|---|---|---|
| TodoApi | Debian | bullseye-slim | In order to support Omni Sharp within C# extensions, the development environment must be glibc. | TodoDB |
| TodoUI | Debian | bullseye-slim | In order to support Omni Sharp within C# extensions, the development environment must be glibc. | TodoApi/BoardApi(/WeaterApi/clientIPAddrApi) |
| BoardApi | alpine | lts-alpine | node image | BoardApi |
| ENV | Default Value | Type | Description | Enable/Disable |
|---|---|---|---|---|
| urls | http://*:5000 | Internal Endpoint | TodoApi Endpoint | Enable |
| Provider | MySQL | DB Provider | Select DB Provider InMemory/MySQL/PostgreSQL/SQLServer/SQLite | Enable |
| ConnectionStrings__MySQL | Server=tododb;Database=todoapi;User=todoapi;Password=todoapi; | DB ConnectionStrings | TodoDB Connection Information When The Provider is MySQL | Enable |
| ConnectionStrings__PostgreSQL | Host=tododb;Port=5432;User Id=todoapi;Password=todoapi;Database=todoapi; | DB ConnectionStrings | TodoDB Connection Information The Provider is PostgreSQL | Enable |
| ConnectionStrings__SQLServer | Server=tododb;Database=todoapi;User Id=sa;Password=Xt0d0ap!; | DB ConnectionStrings | TodoDB Connection Information When The Provider is SQLServer | Enable |
| ConnectionStrings__SQLite | Filename=DB/todoapi.db | DB Data storage destination | DB Data storage destination information When The Provider is SQLite. The destination directory must already exist. | Enable |
- /api/todoitems
- /api/todoitems/${id}
- Content-Type: application/json
- json
{
"id": 1, //long Type //Except POST
"name": "Walking", //string nullable Type
"isComplete": true //bool type
}| ENV | Default Value | Type | Description | Enable/Disable |
|---|---|---|---|---|
| urls | http://*:5000 | Internal Endpoint | TodoUI Endpoint | Enable |
| todoapi | http://todoapi:5000/api/todoitems | URL | TodoApi URL | Enable |
| boardapi | http://boardapi:3000/api/boarditems | URL | BoardApi URL | Enable |
- PWA Support (Except offline,
httpsconfiguration required except localhost) - Dark-Mode Support (Depends on device settings)
- / -> TodoApi
- /todo -> TodoApi
- /weather -> External Weather WebAPI
- /board -> BoardApi
| ENV | Default Value | Type | Description | Enable/Disable |
|---|---|---|---|---|
| todoui | http://todoui:5000 | URL | TodoUI URL | Enable |
| todoui_map | / | Mapping | TodoUI Mapping | Enable |
| todoapi | http://todoapi:5000/api/todoitems | URL | TodoApi URL | Disable |
| todoapi_map | /api/todoitems | Mapping | TodoApi Mapping | Disable |
| boardapi | http://boardapi:3000/api/boarditems | URL | BoardApi URL | Disable |
| boardapi_map | /api/boarditems | Mapping | BoardApi Mapping | Disable |
If you want to expose the TodoApi to the External, you will need to change default.conf.template and set the environment variables(todoapi and todoapi_map, boardapi and boardapi_map).
| ENV | Default Value | Type | Description | Enable/Disable |
|---|---|---|---|---|
| MYSQL_ROOT_PASSWORD | todoapi | DB Password | TodoDB Root Password | Enable |
| MYSQL_DATABASE | todoapi | DB Name | TodoDB Name | Enable |
| MYSQL_USER | todoapi | DB USER | TodoDB USER | Enable |
| MYSQL_PASSWORD | todoapi | DB Password | TodoDB Password | Enable |
| ENV | Default Value | Type | Description | Enable/Disable |
|---|---|---|---|---|
| ADMINER_DEFAULT_SERVER | tododb(boarddb) | Internal Endpoint | TodoDB(BoardDB) Endpoint | Enable |
ex) https://www.jma.go.jp/bosai/forecast/data/overview_forecast/130000.json
{
"publishingOffice": "気象庁", //String Type
"reportDatetime": "2021-12-14T16:36:00+09:00", //Date Type
"targetArea": "Area", //String Type
"headlineText": "", //String Type
"text": "String" //String Type
}出典:気象庁ホームページ https://www.jma.go.jp/bosai/forecast/data/overview_forecast/130000.json
| ENV | Default Value | Type | Description | Enable/Disable |
|---|---|---|---|---|
| TYPEORM_CONNECTION | postgres | DB Provider | Select DB Provider postgres/mysql(/mariadb)/sqlite/mssql/oracle/mongodb/sqljs | Enable |
| TYPEORM_HOST | boarddb | DB HostName | BoardDB DNS or IP Address | Enable |
| TYPEORM_USERNAME | boardapi | DB User Name | BoardDB User Name | Enable |
| TYPEORM_PASSWORD | boardapi | DB Password | BoardDB Password | Enable |
| TYPEORM_DATABASE | boardapi | DB Name | BoardDB DB Name/DB Data storage destination information When The Provider is SQLite. | Enable |
| TYPEORM_PORT | 5432 | DB Port Number | BoardDB Port Number | Enable |
| TYPEORM_SYNCHRONIZE | true | DB Migration at Startup | BoardDB Migration at Startup | Enable |
| TYPEORM_LOGGING | false | DB Logging on API | False for Performance | Enable |
| TYPEORM_ENTITIES | dist/**/*.entity.js | Entity JS file | No Need to Change | Enable |
| TYPEORM_MIGRATIONS | dist/migration/**/*.js | DB Migration JS file | No Need to Change | Enable |
- /api/boarditems
- /api/boarditems/${id}
- Content-Type: application/json
- json
{
"id": 1, //long(number) Type //Except POST
"name": "YMD", //string Type
"ip": "192.0.0.1", //string Type
"comment": "Test", //string Type
"date": "2021-12-10T05:34:41.275Z", //DateTimeOffset(Date) Type //Defaults to the date you posted. //Automatic Setting //Cannot be changed by user
"isChange": true //boolean type //Default false //Update true //Automatic Setting //Cannot be changed by user
}| ENV | Default Value | Type | Description | Enable/Disable |
|---|---|---|---|---|
| POSTGRES_USER | boardapi | DB USER | BoardDB USER | Enable |
| POSTGRES_PASSWORD | boardapi | DB Password | BoardDB Password | Enable |
| PGPASSWORD | boardapi | DB Password | BoardDB Root Password | Enable |
| POSTGRES_DB | boardapi | DB Name | BoardDB Name | Enable |
{
"ip": "Your IP", //string Type
"geo-ip": "https://getjsonip.com/#plus", //string Type
"API Help": "https://getjsonip.com/#docs" //string Type
}



