Compare commits
17 Commits
WEBDEV-0.1
...
b96a40e6ed
| Author | SHA1 | Date | |
|---|---|---|---|
| b96a40e6ed | |||
| 8dd5a798d9 | |||
| 1ddad9171e | |||
| 0d5192c156 | |||
| c9689fd114 | |||
| 7ad384fb63 | |||
| f6578860ab | |||
| cf8abed1e2 | |||
| 15f5e43e34 | |||
| 6634891de6 | |||
| 98fc970653 | |||
| f71211c0b9 | |||
| 19fab91db9 | |||
| 8b9a837062 | |||
| be1344e9e5 | |||
| fc51e2eda9 | |||
| 456b8ef75b |
2
.gitignore
vendored
2
.gitignore
vendored
@ -248,3 +248,5 @@ yarn-debug.log*
|
|||||||
yarn-error.log*
|
yarn-error.log*
|
||||||
.env
|
.env
|
||||||
Logs/*
|
Logs/*
|
||||||
|
docker-compose.yml
|
||||||
|
*exclude*
|
||||||
12
.woodpecker/.api_build.yaml
Normal file
12
.woodpecker/.api_build.yaml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
when:
|
||||||
|
- event: [push, pull_request, tag]
|
||||||
|
ref: [refs/tags/APIDEV-*, refs/tags/API-*, refs/heads/api/*]
|
||||||
|
steps:
|
||||||
|
- name: (YABA.API) Build and run tests
|
||||||
|
when:
|
||||||
|
- event: [push, pull_request, tag]
|
||||||
|
branch: [api/*]
|
||||||
|
image: mcr.microsoft.com/dotnet/sdk:6.0
|
||||||
|
commands:
|
||||||
|
- dotnet build ./API
|
||||||
|
- dotnet test ./API
|
||||||
34
.woodpecker/.api_uploadimage.yaml
Normal file
34
.woodpecker/.api_uploadimage.yaml
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
when:
|
||||||
|
- event: tag
|
||||||
|
ref: [refs/tags/APIDEV-*, refs/tags/API-*]
|
||||||
|
steps:
|
||||||
|
- name: (YABA.API) Determining Docker image version number (dev)
|
||||||
|
when:
|
||||||
|
- ref: refs/tags/APIDEV-*
|
||||||
|
image: alpine:latest
|
||||||
|
commands:
|
||||||
|
- rm -f tags.txt
|
||||||
|
- echo ${CI_COMMIT_TAG} | sed -e "s/^APIDEV-//" >> tags.txt
|
||||||
|
- echo "latest-dev" >> tags.txt
|
||||||
|
- name: (YABA.API) Determining Docker image version number (prod)
|
||||||
|
image: alpine:latest
|
||||||
|
when:
|
||||||
|
- ref: refs/tags/API-*
|
||||||
|
commands:
|
||||||
|
- rm -f tags.txt
|
||||||
|
- echo ${CI_COMMIT_TAG} | sed -e "s/^API-//" >> tags.txt
|
||||||
|
- echo "latest" >> tags.txt
|
||||||
|
- name: (YABA.API) Package and Upload Docker Image
|
||||||
|
image: woodpeckerci/plugin-docker-buildx
|
||||||
|
settings:
|
||||||
|
repo: gitea.iwanaga.moe/cjtibule/yaba/api
|
||||||
|
context: ./API
|
||||||
|
dockerfile: ./API/YABA.API/Dockerfile
|
||||||
|
tags_file: tags.txt
|
||||||
|
username:
|
||||||
|
from_secret: gitea_yaba_registry_username
|
||||||
|
password:
|
||||||
|
from_secret: gitea_yaba_registry_password
|
||||||
|
registry: gitea.iwanaga.moe
|
||||||
|
depends_on:
|
||||||
|
- api_build
|
||||||
34
.woodpecker/.web_uploadimage.yaml
Normal file
34
.woodpecker/.web_uploadimage.yaml
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
when:
|
||||||
|
- event: tag
|
||||||
|
ref: [refs/tags/WEBDEV-*, refs/tags/WEB-*]
|
||||||
|
steps:
|
||||||
|
- name: (YABA.Web) Determining Docker image version number (dev)
|
||||||
|
when:
|
||||||
|
- ref: refs/tags/WEBDEV-*
|
||||||
|
image: alpine:latest
|
||||||
|
commands:
|
||||||
|
- rm -f tags.txt
|
||||||
|
- echo ${CI_COMMIT_TAG} | sed -e "s/^WEBDEV-//" >> tags.txt
|
||||||
|
- echo "latest-dev" >> tags.txt
|
||||||
|
- name: (YABA.Web) Determining Docker image version number (prod)
|
||||||
|
when:
|
||||||
|
- ref: refs/tags/WEB-*
|
||||||
|
image: alpine:latest
|
||||||
|
commands:
|
||||||
|
- rm -f tags.txt
|
||||||
|
- echo ${CI_COMMIT_TAG} | sed -e "s/^WEB-//" >> tags.txt
|
||||||
|
- echo "latest" >> tags.txt
|
||||||
|
- name: (YABA.Web) Package and Upload Docker Image
|
||||||
|
image: woodpeckerci/plugin-docker-buildx
|
||||||
|
settings:
|
||||||
|
repo: gitea.iwanaga.moe/cjtibule/yaba/web
|
||||||
|
context: ./Web
|
||||||
|
dockerfile: ./Web/Dockerfile
|
||||||
|
secrets: [DEV_AUTH0_AUDIENCE, DEV_AUTH0_CLIENT_ID, DEV_AUTH0_DOMAIN, DEV1_API_URL, DEV1_CALLBACK]
|
||||||
|
tags_file: tags.txt
|
||||||
|
username:
|
||||||
|
from_secret: gitea_yaba_registry_username
|
||||||
|
password:
|
||||||
|
from_secret: gitea_yaba_registry_password
|
||||||
|
registry: gitea.iwanaga.moe
|
||||||
|
build_args: [${DEV_AUTH0_AUDIENCE}, ${DEV_AUTH0_CLIENT_ID}, ${DEV_AUTH0_DOMAIN}, ${DEV1_API_URL}, ${DEV1_CALLBACK}]
|
||||||
63
API/Readme.md
Normal file
63
API/Readme.md
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
# YABA: Yet Another Bookmark App
|
||||||
|
|
||||||
|
## YABA.API - Developer Guide
|
||||||
|
|
||||||
|
### Running Migrations
|
||||||
|
When running migrations, .NET seems to be ignoring dependency injection settings. In order to get around this, be sure to add the connection string to the command like. For example, when adding the migration:
|
||||||
|
|
||||||
|
```
|
||||||
|
dotnet ef migrations add InitialMigration -p YABA.Data -s YABA.API --context YABABaseContext -- {CONNECTION_STRING_HERE}
|
||||||
|
```
|
||||||
|
|
||||||
|
When removing last migration:
|
||||||
|
```
|
||||||
|
dotnet ef migrations remove InitialMigration -p YABA.Data -s YABA.API --context YABABaseContext -- {CONNECTION_STRING_HERE}
|
||||||
|
```
|
||||||
|
|
||||||
|
When applying migrations:
|
||||||
|
```
|
||||||
|
dotnet ef database update -p YABA.Data -s YABA.API -c YABABaseContext -- { CONNECTION_STRING_HERE }
|
||||||
|
```
|
||||||
|
|
||||||
|
As per the documentation [on MSDN](https://learn.microsoft.com/en-ca/ef/core/cli/dbcontext-creation?tabs=dotnet-core-cli#from-application-services):
|
||||||
|
> The -- token directs dotnet ef to treat everything that follows as an argument and not try to parse them as options. Any extra arguments not used by dotnet ef are forwarded to the app.
|
||||||
|
|
||||||
|
### Managing secrets
|
||||||
|
|
||||||
|
Best practice dictates that sensitive values should never be committed to source control. To manage secrets locally, this project utilize the [secrets manager](https://learn.microsoft.com/en-us/aspnet/core/security/app-secrets?view=aspnetcore-7.0&tabs=windows).
|
||||||
|
|
||||||
|
To initialize a secrets manager:
|
||||||
|
```
|
||||||
|
dotnet user-secrets init --project YABA.API
|
||||||
|
```
|
||||||
|
|
||||||
|
To set (or override) the value of a secret using a provided key:
|
||||||
|
```
|
||||||
|
dotnet user-secrets set "Key" "Value" --project YABA.API
|
||||||
|
```
|
||||||
|
```
|
||||||
|
dotnet user-secrets set "Object:Property" "Value" --project YABA.API
|
||||||
|
```
|
||||||
|
|
||||||
|
To list all secets:
|
||||||
|
```
|
||||||
|
dotnet user-secrets list --project YABA.API
|
||||||
|
```
|
||||||
|
|
||||||
|
### Docker
|
||||||
|
|
||||||
|
To build a dockerized version of the API project:
|
||||||
|
|
||||||
|
```
|
||||||
|
docker build { API_PROJECT_ROOT_SOURCE } -f { API_PROJECT_DOCKERFILE_PATH } -t { imagename:tag }
|
||||||
|
```
|
||||||
|
|
||||||
|
In order to run a container using the image built above, keep the following things in mind:
|
||||||
|
- It might be necessary to map container port 80 to another
|
||||||
|
- In the absence of a linked user secrets, secrets will have to be passed in to the container as environment variables, prefixed with `ASPNETCORE_`
|
||||||
|
|
||||||
|
```
|
||||||
|
docker run -d -p { HOST_PC_PORT_HERE }:80 --env ASPNETCORE_Object__Property=Value --name { CONTAINER_NAME } {imagename:tag}
|
||||||
|
```
|
||||||
|
|
||||||
|
Environment variables that are explicitly listed in `YABA.API\Dockerfile` will have to be properly set for proper operation of the application
|
||||||
36
API/YABA.API/Dockerfile
Normal file
36
API/YABA.API/Dockerfile
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
|
||||||
|
|
||||||
|
FROM mcr.microsoft.com/dotnet/aspnet:6.0-alpine AS base
|
||||||
|
WORKDIR /app
|
||||||
|
EXPOSE 80
|
||||||
|
EXPOSE 443
|
||||||
|
|
||||||
|
# Set environment variables
|
||||||
|
ENV ASPNETCORE_Environment=Development
|
||||||
|
ENV ASPNETCORE_Authentication__Auth0__ClientId=
|
||||||
|
ENV ASPNETCORE_Authentication__Auth0__ClientSecret=
|
||||||
|
ENV ASPNETCORE_Authentication__Auth0__Domain=
|
||||||
|
ENV ASPNETCORE_Authentication__Auth0__Identifier=
|
||||||
|
ENV ASPNETCORE_ConnectionStrings__YABAReadOnlyDbConnectionString=
|
||||||
|
ENV ASPNETCORE_ConnectionStrings__YABAReadWriteDbConnectionString=
|
||||||
|
ENV ASPNETCORE_WebClient__Url=
|
||||||
|
|
||||||
|
FROM mcr.microsoft.com/dotnet/sdk:6.0-alpine AS build
|
||||||
|
WORKDIR /src
|
||||||
|
COPY ["YABA.API/YABA.API.csproj", "YABA.API/"]
|
||||||
|
COPY ["YABA.Common/YABA.Common.csproj", "YABA.Common/"]
|
||||||
|
COPY ["YABA.Data/YABA.Data.csproj", "YABA.Data/"]
|
||||||
|
COPY ["YABA.Models/YABA.Models.csproj", "YABA.Models/"]
|
||||||
|
COPY ["YABA.Service/YABA.Service.csproj", "YABA.Service/"]
|
||||||
|
RUN dotnet restore "YABA.API/YABA.API.csproj"
|
||||||
|
COPY . .
|
||||||
|
WORKDIR "/src/YABA.API"
|
||||||
|
RUN dotnet build "YABA.API.csproj" -c Release -o /app/build
|
||||||
|
|
||||||
|
FROM build AS publish
|
||||||
|
RUN dotnet publish "YABA.API.csproj" -c Release -o /app/publish /p:UseAppHost=false
|
||||||
|
|
||||||
|
FROM base AS final
|
||||||
|
WORKDIR /app
|
||||||
|
COPY --from=publish /app/publish .
|
||||||
|
ENTRYPOINT ["dotnet", "YABA.API.dll"]
|
||||||
@ -16,6 +16,8 @@ using Serilog;
|
|||||||
using Microsoft.AspNetCore.HttpOverrides;
|
using Microsoft.AspNetCore.HttpOverrides;
|
||||||
|
|
||||||
var builder = WebApplication.CreateBuilder(args);
|
var builder = WebApplication.CreateBuilder(args);
|
||||||
|
builder.Configuration.AddEnvironmentVariables();
|
||||||
|
|
||||||
var configuration = builder.Configuration;
|
var configuration = builder.Configuration;
|
||||||
|
|
||||||
// Add services to the container.
|
// Add services to the container.
|
||||||
@ -118,13 +120,8 @@ app.MapControllers();
|
|||||||
app.UseMiddleware<AddCustomClaimsMiddleware>();
|
app.UseMiddleware<AddCustomClaimsMiddleware>();
|
||||||
app.UseMiddleware<AddCustomLoggingPropertiesMiddleware>();
|
app.UseMiddleware<AddCustomLoggingPropertiesMiddleware>();
|
||||||
|
|
||||||
app.UseCors(x => x
|
|
||||||
.AllowAnyOrigin()
|
|
||||||
.AllowAnyMethod()
|
|
||||||
.AllowAnyHeader());
|
|
||||||
|
|
||||||
var webClientUrl = configuration.GetSection("WebClient").GetValue<string>("Url");
|
var webClientUrl = configuration.GetSection("WebClient").GetValue<string>("Url");
|
||||||
app.UseCors(x => x.AllowAnyHeader().AllowAnyMethod().WithOrigins(webClientUrl));
|
app.UseCors(x => x.WithOrigins(webClientUrl).AllowAnyMethod().AllowAnyHeader());
|
||||||
app.MapHealthChecks("/Pulse");
|
app.MapHealthChecks("/Pulse");
|
||||||
|
|
||||||
app.Run();
|
app.Run();
|
||||||
@ -41,6 +41,6 @@
|
|||||||
"Enrich": ["FromLogContext", "WithMachineName", "WithProcessId", "WithThreadId"]
|
"Enrich": ["FromLogContext", "WithMachineName", "WithProcessId", "WithThreadId"]
|
||||||
},
|
},
|
||||||
"WebClient": {
|
"WebClient": {
|
||||||
"Url": "https://localhost:3000"
|
"Url": "http://localhost:3000"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
24
Readme.md
24
Readme.md
@ -1,23 +1,7 @@
|
|||||||
# YABA: Yet Another Bookmark App
|
# YABA: Yet Another Bookmark App
|
||||||
|
|
||||||
## Developer Guides
|
## Developer Guide
|
||||||
|
|
||||||
### Running Migrations
|
The application is divided into two parts. Refer to the Readme on the root of the following sections for more information:
|
||||||
When running migrations, .NET seems to be ignoring dependency injection settings. In order to get around this, be sure to add the connection string to the command like. For example, when adding the migration:
|
- API: [Readme](API/Readme.md)
|
||||||
|
- Web: [Readme](Web/Readme.md)
|
||||||
```
|
|
||||||
dotnet ef migrations add InitialMigration -p YABA.Data -s YABA.API --context YABABaseContext -- {CONNECTION_STRING_HERE}
|
|
||||||
```
|
|
||||||
|
|
||||||
When removing last migration:
|
|
||||||
```
|
|
||||||
dotnet ef migrations remove InitialMigration -p YABA.Data -s YABA.API --context YABABaseContext -- {CONNECTION_STRING_HERE}
|
|
||||||
```
|
|
||||||
|
|
||||||
When applying migrations:
|
|
||||||
```
|
|
||||||
dotnet ef database update -p YABA.Data -s YABA.API -c YABABaseContext -- { CONNECTION_STRING_HERE }
|
|
||||||
```
|
|
||||||
|
|
||||||
As per the documentation [on MSDN](https://learn.microsoft.com/en-ca/ef/core/cli/dbcontext-creation?tabs=dotnet-core-cli#from-application-services):
|
|
||||||
> The -- token directs dotnet ef to treat everything that follows as an argument and not try to parse them as options. Any extra arguments not used by dotnet ef are forwarded to the app.
|
|
||||||
1
Web/.dockerignore
Normal file
1
Web/.dockerignore
Normal file
@ -0,0 +1 @@
|
|||||||
|
node_modules/
|
||||||
22
Web/Dockerfile
Normal file
22
Web/Dockerfile
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
FROM node:17-alpine as builder
|
||||||
|
|
||||||
|
# Set the environment variables
|
||||||
|
ARG REACT_APP_API_BASE_URL
|
||||||
|
ARG REACT_APP_AUTH0_DOMAIN
|
||||||
|
ARG REACT_APP_AUTH0_CLIENT_ID
|
||||||
|
ARG REACT_APP_AUTH0_CALLBACK_URL
|
||||||
|
ARG REACT_APP_AUTH0_AUDIENCE
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
COPY package.json .
|
||||||
|
RUN npm install
|
||||||
|
COPY . .
|
||||||
|
RUN npm run build
|
||||||
|
|
||||||
|
FROM nginx:mainline-alpine
|
||||||
|
WORKDIR /usr/share/nginx/html
|
||||||
|
RUN rm -rf ./*
|
||||||
|
COPY --from=builder /app/build .
|
||||||
|
COPY nginx.conf /etc/nginx/conf.d/default.conf
|
||||||
|
EXPOSE 80
|
||||||
|
ENTRYPOINT ["nginx", "-g", "daemon off;"]
|
||||||
@ -68,3 +68,17 @@ This section has moved here: [https://facebook.github.io/create-react-app/docs/d
|
|||||||
### `npm run build` fails to minify
|
### `npm run build` fails to minify
|
||||||
|
|
||||||
This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify)
|
This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify)
|
||||||
|
|
||||||
|
---
|
||||||
|
## Docker
|
||||||
|
|
||||||
|
To build a dockerized version of the Web project:
|
||||||
|
|
||||||
|
```
|
||||||
|
docker build { WEB_PROJECT_ROOT_SOURCE } -f { WEB_PROJECT_DOCKERFILE_PATH } -t { imagename:tag }
|
||||||
|
```
|
||||||
|
|
||||||
|
In order to run a container using the image built above, keep the following things in mind:
|
||||||
|
- It might be necessary to map container port 80 to another
|
||||||
|
- Environment variables actively used by the web app can be overriden when starting uip a container. They are prefixed with: `REACT_APP`
|
||||||
|
- Environment variables that are explicitly listed in `Web\Dockerfile` will have to be properly set for proper operation of the application
|
||||||
8
Web/nginx.conf
Normal file
8
Web/nginx.conf
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
root /usr/share/nginx/html;
|
||||||
|
index index.html;
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.html;
|
||||||
|
}
|
||||||
|
}
|
||||||
30717
Web/package-lock.json
generated
Normal file
30717
Web/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
@ -2,6 +2,7 @@
|
|||||||
"name": "yaba-web",
|
"name": "yaba-web",
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
|
"homepage": ".",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@auth0/auth0-react": "^2.0.0",
|
"@auth0/auth0-react": "^2.0.0",
|
||||||
"@testing-library/jest-dom": "^5.16.5",
|
"@testing-library/jest-dom": "^5.16.5",
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user