framework switch from 2.1 to 3.1 + introduce postgres #1
11
.drone.yml
11
.drone.yml
@ -7,17 +7,24 @@ platform:
|
||||
os: linux
|
||||
arch: amd64
|
||||
|
||||
trigger:
|
||||
ref:
|
||||
- refs/heads/master
|
||||
- refs/heads/feature-*
|
||||
- refs/pull/*/head
|
||||
- refs/tags/*
|
||||
|
||||
steps:
|
||||
- name: debug
|
||||
pull: always
|
||||
image: mcr.microsoft.com/dotnet/core/sdk:2.1-alpine
|
||||
image: mcr.microsoft.com/dotnet/core/sdk:3.1-alpine
|
||||
commands:
|
||||
- dotnet restore
|
||||
- dotnet build .
|
||||
|
||||
- name: release
|
||||
pull: always
|
||||
image: mcr.microsoft.com/dotnet/core/sdk:2.1-alpine
|
||||
image: mcr.microsoft.com/dotnet/core/sdk:3.1-alpine
|
||||
commands:
|
||||
- dotnet restore
|
||||
- dotnet publish -c Release -o out
|
||||
|
@ -13,10 +13,10 @@ namespace pwt_0x01_ng.Areas.Admin.Controllers
|
||||
[Area("Admin")]
|
||||
public class CarouselController : Controller
|
||||
{
|
||||
IHostingEnvironment hosting_env;
|
||||
IWebHostEnvironment hosting_env;
|
||||
private IList<Carousel> Carousels = Dbfake.Carousels;
|
||||
|
||||
public CarouselController(IHostingEnvironment hosting_env){
|
||||
public CarouselController(IWebHostEnvironment hosting_env){
|
||||
this.hosting_env = hosting_env;
|
||||
}
|
||||
|
||||
|
10
Dockerfile
10
Dockerfile
@ -1,4 +1,8 @@
|
||||
FROM mcr.microsoft.com/dotnet/core/sdk:2.1-alpine
|
||||
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-alpine
|
||||
ENV UID 1000
|
||||
ENV GID 1000
|
||||
ENV UNAME unpriv
|
||||
RUN adduser -D -u ${UID} -g ${GID} -H ${UNAME} -h /src
|
||||
WORKDIR /src
|
||||
|
||||
COPY *.csproj ./
|
||||
@ -7,8 +11,10 @@ RUN dotnet restore
|
||||
COPY . ./
|
||||
RUN dotnet publish -c Release -o bin/out
|
||||
|
||||
FROM mcr.microsoft.com/dotnet/aspnet:2.1
|
||||
FROM mcr.microsoft.com/dotnet/aspnet:3.1
|
||||
WORKDIR /App
|
||||
COPY --from=0 /src/bin/out/ .
|
||||
RUN chown -R ${UID}:${GID} ./
|
||||
USER ${UNAME}
|
||||
ENV ASPNETCORE_ENVIRONMENT=Release
|
||||
ENTRYPOINT ["dotnet", "pwt-0x01-ng.dll"]
|
||||
|
@ -1,4 +1,8 @@
|
||||
FROM mcr.microsoft.com/dotnet/core/sdk:2.1-alpine
|
||||
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-alpine
|
||||
ENV UID 1000
|
||||
ENV GID 1000
|
||||
ENV UNAME unpriv
|
||||
RUN adduser -D -u ${UID} -g ${GID} -H ${UNAME} -h /src
|
||||
WORKDIR /src
|
||||
|
||||
COPY *.csproj ./
|
||||
@ -6,6 +10,8 @@ RUN dotnet restore
|
||||
|
||||
COPY . ./
|
||||
RUN dotnet build -c Debug -o bin/out
|
||||
RUN chown -R ${UID}:${GID} ./ /root/
|
||||
USER ${UNAME}
|
||||
|
||||
ENV ASPNETCORE_ENVIRONMENT=Development
|
||||
|
||||
|
10
Makefile
10
Makefile
@ -35,13 +35,13 @@ dockerbuild:
|
||||
docker build \
|
||||
--build-arg VCS_REF=`git rev-parse --short HEAD` \
|
||||
--build-arg BUILD_DATE=`date -u +"%Y-%m-%dT%H:%M:%SZ"` \
|
||||
-t $(dtag) -f $(dfile) .
|
||||
-t $(dtag) -f $(dfile) --no-cache .
|
||||
|
||||
dockerdevbuild:
|
||||
docker build \
|
||||
--build-arg VCS_REF=`git rev-parse --short HEAD` \
|
||||
--build-arg BUILD_DATE=`date -u +"%Y-%m-%dT%H:%M:%SZ"` \
|
||||
-t $(dtagdev) -f $(dfiledev) .
|
||||
-t $(dtagdev) -f $(dfiledev) --no-cache .
|
||||
|
||||
dockerrun:
|
||||
@echo ======================
|
||||
@ -55,6 +55,12 @@ dockerdevrun:
|
||||
@echo ======================
|
||||
$(dcmdrun) -p $(lportdev):5000 $(dtagdev)
|
||||
|
||||
dcdevrun:
|
||||
@echo ======================
|
||||
@echo local dev port: $(lportdev)
|
||||
@echo ======================
|
||||
docker-compose up --build --remove-orphans
|
||||
|
||||
kaniko:
|
||||
$(krelease)
|
||||
$(kdebug)
|
||||
|
@ -1,14 +1,26 @@
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
|
||||
namespace pwt_0x01_ng.Models
|
||||
{
|
||||
[Table("Carousel")]
|
||||
public class Carousel
|
||||
{
|
||||
[Key]
|
||||
[Required]
|
||||
public int id { get; set; }
|
||||
[Required]
|
||||
public string DataTarget { get; set; }
|
||||
[NotMapped]
|
||||
public IFormFile Image { get; set; }
|
||||
[Required]
|
||||
[StringLength(255)]
|
||||
public string ImageSrc { get; set; }
|
||||
[Required]
|
||||
[StringLength(50)]
|
||||
public string ImageAlt { get; set; }
|
||||
[Required]
|
||||
public string CarouselContent { get; set; }
|
||||
}
|
||||
}
|
||||
|
19
Models/Database/CarouselHelper.cs
Normal file
19
Models/Database/CarouselHelper.cs
Normal file
@ -0,0 +1,19 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace pwt_0x01_ng.Models.Database
|
||||
{
|
||||
public static class CarouselHelper
|
||||
{
|
||||
public static IList<Carousel> GenerateCarousel()
|
||||
{
|
||||
IList<Carousel> carousels = new List<Carousel>()
|
||||
{
|
||||
new Carousel() { DataTarget = "#myCarousel", ImageSrc = "/images/banner1.svg", ImageAlt = "ASP.NET", CarouselContent = "Learn how to build ASP.NET apps that can run anywhere.<a class=\"btn btn-default\" href=\"https://go.microsoft.com/fwlink/?LinkID=525028&clcid=0x409\">Learn More</a>"},
|
||||
new Carousel() { DataTarget = "#myCarousel", ImageSrc = "/images/banner2.svg", ImageAlt = "ASP.NET", CarouselContent = "There are powerful new features in Visual Studio for building modern web apps.<a class=\"btn btn-default\" href=\"https://go.microsoft.com/fwlink/?LinkID=525030&clcid=0x409\">Learn More</a>"},
|
||||
new Carousel() { DataTarget = "#myCarousel", ImageSrc = "/images/banner3.svg", ImageAlt = "ASP.NET", CarouselContent = "Learn how Microsoft's Azure cloud platform allows you to build, deploy, and scale web apps.<a class=\"btn btn-default\" href=\"https://go.microsoft.com/fwlink/?LinkID=525027&clcid=0x409\">Learn More</a>"},
|
||||
new Carousel() { DataTarget = "#myCarousel", ImageSrc = "/images/ms_loves_linux.jpeg", ImageAlt = "msloveslinux", CarouselContent = "ms loves linux"}
|
||||
};
|
||||
return carousels;
|
||||
}
|
||||
}
|
||||
}
|
17
Models/Database/DBContext.cs
Normal file
17
Models/Database/DBContext.cs
Normal file
@ -0,0 +1,17 @@
|
||||
using System;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Npgsql.EntityFrameworkCore;
|
||||
using pwt_0x01_ng.Models;
|
||||
|
||||
namespace pwt0x01ng.Models.Database
|
||||
{
|
||||
public class DBContext : DbContext
|
||||
{
|
||||
public DBContext(DbContextOptions<DBContext> options) : base(options)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public DbSet<Carousel> Carousel { get; set; }
|
||||
}
|
||||
}
|
24
Models/Database/DBInit.cs
Normal file
24
Models/Database/DBInit.cs
Normal file
@ -0,0 +1,24 @@
|
||||
using System;
|
||||
using pwt_0x01_ng.Models.Database;
|
||||
using System.Collections.Generic;
|
||||
using pwt_0x01_ng.Models;
|
||||
|
||||
namespace pwt0x01ng.Models.Database
|
||||
{
|
||||
public static class DBInit
|
||||
{
|
||||
|
||||
public static void Init(DBContext dbContext)
|
||||
{
|
||||
if (dbContext.Database.EnsureCreated())
|
||||
{
|
||||
IList<Carousel> carousels = CarouselHelper.GenerateCarousel();
|
||||
foreach (var c in carousels)
|
||||
{
|
||||
dbContext.Carousel.Add(c);
|
||||
}
|
||||
dbContext.SaveChanges();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,5 +1,4 @@
|
||||
using System.Collections.Generic;
|
||||
using Microsoft.IdentityModel.Tokens;
|
||||
|
||||
namespace pwt_0x01_ng.Models.Dbfake
|
||||
{
|
||||
|
@ -9,9 +9,9 @@ namespace pwt_0x01_ng.Models
|
||||
{
|
||||
public class MegaUpload
|
||||
{
|
||||
IHostingEnvironment hosting_env;
|
||||
IWebHostEnvironment hosting_env;
|
||||
|
||||
public MegaUpload(IHostingEnvironment hosting_env){
|
||||
public MegaUpload(IWebHostEnvironment hosting_env){
|
||||
this.hosting_env = hosting_env;
|
||||
}
|
||||
public async Task<bool> DoMegaUpload(Carousel carousel)
|
||||
|
13
Program.cs
13
Program.cs
@ -6,7 +6,9 @@ using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using pwt0x01ng.Models.Database;
|
||||
|
||||
namespace pwt_0x01_ng
|
||||
{
|
||||
@ -14,7 +16,16 @@ namespace pwt_0x01_ng
|
||||
{
|
||||
public static void Main(string[] args)
|
||||
{
|
||||
CreateWebHostBuilder(args).Build().Run();
|
||||
IWebHost webHost = CreateWebHostBuilder(args).Build();
|
||||
|
||||
using (var scope = webHost.Services.CreateScope())
|
||||
{
|
||||
var serviceProvider = scope.ServiceProvider;
|
||||
var dbctx = serviceProvider.GetRequiredService<DBContext>();
|
||||
DBInit.Init(dbctx);
|
||||
}
|
||||
|
||||
webHost.Run();
|
||||
}
|
||||
|
||||
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
|
||||
|
@ -2,6 +2,8 @@
|
||||
|
||||
this repo holds *sawce* for PWT .netcore mvc project 0x01-ng
|
||||
|
||||
> Note: app-3.1-migration branch
|
||||
|
||||
### how to run this
|
||||
> run the following commands from the solution folder
|
||||
|
||||
|
22
Startup.cs
22
Startup.cs
@ -10,6 +10,8 @@ using Microsoft.AspNetCore.HttpsPolicy;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using pwt0x01ng.Models.Database;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace pwt_0x01_ng
|
||||
{
|
||||
@ -28,20 +30,32 @@ namespace pwt_0x01_ng
|
||||
services.Configure<CookiePolicyOptions>(options =>
|
||||
{
|
||||
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
|
||||
options.CheckConsentNeeded = context => true;
|
||||
options.CheckConsentNeeded = context => false;
|
||||
options.MinimumSameSitePolicy = SameSiteMode.Lax;
|
||||
options.HttpOnly = HttpOnlyPolicy.Always;
|
||||
options.Secure = CookieSecurePolicy.Always;
|
||||
});
|
||||
services.Configure<MvcOptions>(options => {
|
||||
/* necessary due to a switch to 3.1 */
|
||||
options.EnableEndpointRouting = false;
|
||||
});
|
||||
|
||||
|
||||
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
|
||||
var connectionString = Environment.GetEnvironmentVariable("DB_CONNECTION_STRING");
|
||||
services.AddDbContext<DBContext>(options =>
|
||||
options.UseNpgsql(
|
||||
connectionString
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
|
||||
}
|
||||
|
||||
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
|
||||
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
|
||||
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
|
||||
{
|
||||
if (env.IsDevelopment())
|
||||
if (env.EnvironmentName.Equals("Development"))
|
||||
{
|
||||
app.UseDeveloperExceptionPage();
|
||||
}
|
||||
|
@ -1,4 +1,8 @@
|
||||
{
|
||||
"db": {
|
||||
"Postgres": "User ID=postgres;Password=679968312e029a806c1905c40ec331aa199a1eb86bd0b9eb04057933e449bdc9ef8ef292a39b68cafa5689c901a17266;Server=db;Port=5432;Database=pwt;Integrated Security=true;Pooling=true;",
|
||||
"MySQL": "server=db,Database=pwt-0x01-ng;Port=3306;user=root;password=679968312e029a806c1905c40ec331aa199a1eb86bd0b9eb04057933e449bdc9ef8ef292a39b68cafa5689c901a17266;"
|
||||
},
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Debug",
|
||||
|
@ -1,4 +1,8 @@
|
||||
{
|
||||
"db": {
|
||||
"Postgres": "host=db,port=5432;database=pwt;username=postgres;password=679968312e029a806c1905c40ec331aa199a1eb86bd0b9eb04057933e449bdc9ef8ef292a39b68cafa5689c901a17266",
|
||||
"MySQL": "server=db,Database=pwt-0x01-ng;Port=3306;user=root;password=679968312e029a806c1905c40ec331aa199a1eb86bd0b9eb04057933e449bdc9ef8ef292a39b68cafa5689c901a17266;"
|
||||
},
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Warning"
|
||||
|
39
docker-compose.yml
Normal file
39
docker-compose.yml
Normal file
@ -0,0 +1,39 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
netcoreultimateapp-dev:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.dev
|
||||
ports:
|
||||
- 127.0.0.1:8001:5000
|
||||
volumes:
|
||||
- ./:/src
|
||||
environment:
|
||||
ASPNETCORE_ENVIRONMENT: Development
|
||||
DB_CONNECTION_STRING: "User ID=postgres;Password=679968312e029a806c1905c40ec331aa199a1eb86bd0b9eb04057933e449bdc9ef8ef292a39b68cafa5689c901a17266;Server=db;Port=5432;Database=pwt;Integrated Security=true;Pooling=true;"
|
||||
restart: always
|
||||
cap_drop:
|
||||
- NET_ADMIN
|
||||
- SYS_ADMIN
|
||||
depends_on:
|
||||
- db
|
||||
|
||||
db:
|
||||
container_name: 'db'
|
||||
image: postgres:13.1-alpine
|
||||
ports:
|
||||
- 127.0.0.1:5432:5432
|
||||
volumes:
|
||||
- dbdata:/var/lib/postgresql/data
|
||||
environment:
|
||||
POSTGRES_USER: postgres
|
||||
POSTGRES_PASSWORD: 679968312e029a806c1905c40ec331aa199a1eb86bd0b9eb04057933e449bdc9ef8ef292a39b68cafa5689c901a17266
|
||||
POSTGRES_INITDB_ARGS: "--data-checksums"
|
||||
restart: always
|
||||
cap_drop:
|
||||
- NET_ADMIN
|
||||
- SYS_ADMIN
|
||||
|
||||
volumes:
|
||||
dbdata:
|
@ -1,5 +1,5 @@
|
||||
{
|
||||
"sdk": {
|
||||
"version": "2.1.811"
|
||||
"version": "3.1.*"
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netcoreapp2.1</TargetFramework>
|
||||
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
@ -13,13 +13,15 @@
|
||||
<LaunchBrowser>false</LaunchBrowser>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.AspNetCore.App" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.1.2" PrivateAssets="All" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.10" />
|
||||
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="3.1.4" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="Areas\Admin\Data" />
|
||||
<Folder Include="Areas\Admin\Models" />
|
||||
<Folder Include="Models\Database\" />
|
||||
<Folder Include="wwwroot\images\carousels\" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
Reference in New Issue
Block a user