A robust, Clean Architecture-based CMS built with modern .NET and PostgreSQL.
Personel Website is a modular web application designed to manage personal portfolios and content with enterprise-grade architectural standards. Built on the principles of Clean Architecture, it ensures a strict separation of concerns, making the system highly maintainable, testable, and scalable.
This project addresses the limitations of rigid, monolithic personal site templates by offering a flexible backend capable of handling complex identity management, dynamic localization, and granular configuration, all wrapped in a professional-grade admin interface.
It is ideal for:
- .NET developers seeking a real-world reference architecture
- Professionals needing a self-hosted, customizable CMS for personal branding
-
Clean Architecture Strict separation into Domain, Application, Infrastructure, and Presentation layers to enforce dependency rules.
-
Role-Based Identity (RBAC) Comprehensive user and role management built on ASP.NET Core Identity.
-
Dynamic Localization Database-driven localization allowing real-time language management without redeployment.
-
Robust Admin Panel Integrated Metronic-based administrative dashboard for managing content, users, and system settings.
-
Modular Design Feature-based organization (e.g., Auth, Language, Configuration) for high extensibility.
-
Docker Ready Fully containerized setup including the application and PostgreSQL database.
- Language: C#
- Framework: .NET (ASP.NET Core)
- Database: PostgreSQL
- ORM: Entity Framework Core (Npgsql)
- Mapping: AutoMapper
- Validation: FluentValidation
- Dependency Injection: Native ASP.NET Core DI
- Rendering Engine: ASP.NET Core MVC (Razor Views)
- Admin Theme: Metronic (HTML5, CSS3, JavaScript)
- UI Libraries: jQuery, Bootstrap, Flatpickr, Select2
- Containerization: Docker, Docker Compose
The solution follows the Clean Architecture (Onion Architecture) pattern:
src/
βββ Core/
β βββ PW.Domain/ # Enterprise logic, Entities, Enums (No dependencies)
β βββ PW.Application/ # Application logic, DTOs, Interfaces (Depends on Domain)
βββ Infrastructure/
β βββ PW.Persistence/ # DbContexts, Repositories, Migrations
β βββ PW.Identity/ # Identity services, Auth context, user logic
β βββ PW.Storage/ # External services (File storage, Email, etc.)
βββ Presentation/
βββ PW.Admin.Web/ # MVC app, Controllers, Views, API endpoints
- Repository & Unit of Work β Abstraction over data access logic
- Orchestrator Pattern β Used in the Web layer to coordinate Controller and Application logic
- Dependency Injection β Extensive use for decoupling and testability
- Docker Desktop
- .NET SDK (version defined in
global.jsonor latest stable)
This option starts both the application and PostgreSQL database automatically.
git clone https://github.com/karabeyogluonur/personel-website.git
cd personel-website
docker-compose up --build- Application: http://localhost:8080
- PostgreSQL: Port
5433
Ensure PostgreSQL is running and update appsettings.json:
"ConnectionStrings": {
"DefaultConnection": "Host=localhost;Port=5432;Database=PersonelWebsiteDB;Username=your_user;Password=your_password"
}cd src/Presentation/PW.Admin.Web
dotnet ef database update --context PWDbContext
dotnet ef database update --context AuthDbContextdotnet run- Default data is seeded during startup (see
IdentityInitialiser.cs). - Navigate to
/Adminto access the dashboard. - Use seeded credentials (if available) or create a user and assign roles manually.
- Manage languages from the Language section in the Admin Panel.
- Add or update translation keys dynamically.
- Localization is handled via a custom
LanguageServicebacked by the database.
Configuration is handled via appsettings.json and environment variables.
| Setting Key | Description | Environment Variable |
|---|---|---|
| ConnectionStrings:DefaultConnection | PostgreSQL connection string | ConnectionStrings__DefaultConnection |
| ASPNETCORE_ENVIRONMENT | Runtime environment | ASPNETCORE_ENVIRONMENT |
Application-wide constants such as Roles, Area Names, and Storage Paths are defined under:
PW.Application/Common/Constants
docker build -t personel-website .
docker run -d -p 80:8080 \
-e ConnectionStrings__DefaultConnection="<PROD_DB_STRING>" \
personel-website
β οΈ Ensure bothPWDbContextandAuthDbContextmigrations are applied in production.
- CMS modules (dynamic pages, blog management)
- Headless CMS support (REST / GraphQL)
- Unit & integration testing (xUnit)
- CI/CD with GitHub Actions
Contributions are welcome.
git checkout -b feature/short-description
git commit -m "feat: add short feature description"
git push origin feature/short-descriptionPlease follow existing architecture rules, naming conventions, and clean code principles.
This project is open-source. Refer to the repository for license details. If no license file is present, standard copyright laws apply.