diff --git a/.gitea/workflows/deploy-api.yaml b/.gitea/workflows/deploy-api.yaml new file mode 100644 index 0000000..bff3cdb --- /dev/null +++ b/.gitea/workflows/deploy-api.yaml @@ -0,0 +1,42 @@ + +name: Build and Deploy API + +run-name: "${{ gitea.event.head_commit.message }}: Deploy API" + +on: + push: + branches: + - main + paths: + - "api/**" + - ".gitea/workflows/deploy-api.yaml" + +jobs: + build-and-deploy: + runs-on: debian12 + container: + image: git.vxbard.net/homeburger/bard-cpp-builder:1.0 + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + # needs this in order to push to the registry + - name: Validate Registry + run: | + echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login git.vxbard.net \ + -u ${{ secrets.REGISTRY_USERNAME }} \ + --password-stdin + + - name: Build image + run: | + docker build -t git.vxbard.net/homeburger/agologum-api:latest ./api + + - name: Push image + run: | + docker push git.vxbard.net/homeburger/agologum-api:latest + + - name: Deploy container + run: | + docker compose -f ./api/docker-compose.prod.yaml pull agologum-api + docker compose -f ./api/docker-compose.prod.yaml up -d --force-recreate agologum-api diff --git a/.gitea/workflows/deploy-client.yaml b/.gitea/workflows/deploy-client.yaml new file mode 100644 index 0000000..1b435a7 --- /dev/null +++ b/.gitea/workflows/deploy-client.yaml @@ -0,0 +1,42 @@ + +name: Build and Deploy Frontend + +run-name: "${{ gitea.event.head_commit.message }}: Deploy Client" + +on: + push: + branches: + - main + paths: + - "client/**" + - ".gitea/workflows/deploy-client.yaml" + +jobs: + build-and-deploy: + runs-on: debian12 + container: + image: git.vxbard.net/homeburger/bard-cpp-builder:1.0 + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + # needs this in order to push to the registry + - name: Validate Registry + run: | + echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login git.vxbard.net \ + -u ${{ secrets.REGISTRY_USERNAME }} \ + --password-stdin + + - name: Build image + run: | + docker build -t git.vxbard.net/homeburger/agologum-client:latest ./client + + - name: Push + run: | + docker push git.vxbard.net/homeburger/agologum-client:latest + + - name: Deploy + run: | + docker compose -f ./client/docker-compose.prod.yaml pull agologum-client + docker compose -f ./client/docker-compose.prod.yaml up -d --force-recreate agologum-client diff --git a/api/Dockerfile b/api/Dockerfile new file mode 100644 index 0000000..ca64b1e --- /dev/null +++ b/api/Dockerfile @@ -0,0 +1,20 @@ + +# build +FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build +WORKDIR /src + +COPY *.csproj ./ +RUN dotnet restore + +COPY . ./ +RUN dotnet publish -c Release -o /app/publish + +# run +FROM mcr.microsoft.com/dotnet/aspnet:10.0 +WORKDIR /app +ENV ASPNETCORE_URLS=http://+:5000 +COPY --from=build /app/publish ./ + +EXPOSE 5000 + +ENTRYPOINT ["dotnet", "agologum-api.dll"] diff --git a/api/Program.cs b/api/Program.cs index ee9d65d..36d8d30 100644 --- a/api/Program.cs +++ b/api/Program.cs @@ -1,11 +1,27 @@ + +using Microsoft.AspNetCore.HttpOverrides; + var builder = WebApplication.CreateBuilder(args); +// configuration for behind my nginx proxy +builder.Services.Configure(options => +{ + options.ForwardedHeaders = + ForwardedHeaders.XForwardedFor | + ForwardedHeaders.XForwardedProto; + + options.KnownNetworks.Clear(); + options.KnownProxies.Clear(); +}); + // Add services to the container. // Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi builder.Services.AddOpenApi(); var app = builder.Build(); +app.UseForwardedHeaders(); + // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { @@ -14,12 +30,14 @@ if (app.Environment.IsDevelopment()) app.UseHttpsRedirection(); + +// below is a placeholder endpoint var summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; -app.MapGet("/weatherforecast", () => +app.MapGet("api/weatherforecast", () => { var forecast = Enumerable.Range(1, 5).Select(index => new WeatherForecast diff --git a/api/appsettings.json b/api/appsettings.json index 10f68b8..822760b 100644 --- a/api/appsettings.json +++ b/api/appsettings.json @@ -5,5 +5,6 @@ "Microsoft.AspNetCore": "Warning" } }, - "AllowedHosts": "*" + "AllowedHosts": "*", + "https_port": 443 } diff --git a/api/docker-compose.prod.yaml b/api/docker-compose.prod.yaml new file mode 100644 index 0000000..17d2751 --- /dev/null +++ b/api/docker-compose.prod.yaml @@ -0,0 +1,8 @@ + +services: + agologum-api: + image: git.vxbard.net/homeburger/agologum-api:latest + container_name: agologum-api + restart: always + ports: + - "5000:5000" diff --git a/client/Dockerfile b/client/Dockerfile new file mode 100644 index 0000000..94ed182 --- /dev/null +++ b/client/Dockerfile @@ -0,0 +1,20 @@ + +# build vue app +FROM node:current-alpine AS build + +WORKDIR /app +COPY package*.json ./ +RUN npm install +COPY . . +RUN npm run build + +# serve to nginx +FROM nginx:alpine + +COPY --from=build /app/dist /usr/share/nginx/html + +RUN rm /etc/nginx/conf.d/default.conf +COPY nginx.conf /etc/nginx/conf.d/default.conf + +EXPOSE 80 +CMD ["nginx", "-g", "daemon off;"] diff --git a/client/docker-compose.prod.yaml b/client/docker-compose.prod.yaml new file mode 100644 index 0000000..7cf6298 --- /dev/null +++ b/client/docker-compose.prod.yaml @@ -0,0 +1,9 @@ + +services: + agologum-client: + image: git.vxbard.net/homeburger/agologum-client:latest + container_name: agologum-client + restart: always + ports: + - "8080:80" + \ No newline at end of file diff --git a/client/index.html b/client/index.html index 9e5fc8f..47d0385 100644 --- a/client/index.html +++ b/client/index.html @@ -4,7 +4,7 @@ - Vite App + homeburger place
diff --git a/client/nginx.conf b/client/nginx.conf new file mode 100644 index 0000000..d8060ad --- /dev/null +++ b/client/nginx.conf @@ -0,0 +1,12 @@ + +server { + listen 80; + server_name _; + + root /usr/share/nginx/html; + index index.html; + + location / { + try_files $uri $uri/ /index.html; + } +}