A privacy-focused and secure CMS made with Python & Django.
DevCase was designed for developers and IT professionals. It is a tool to help you get your own blog and portfolio online quickly and easily.
- Responsive and uniqe design
- Configuration via Django-Admin
- Blog
- Portfolio & Project-Showcase
- Social Media Links/Icons
- About-Me with Skills (optional with downloadable Resume)
- Markdown support with Syntaxhighlight and TOC
- Contact-Form (with captchas)
- RSS
- Search
- Dynamic Pages (Footer)
- Dark Django-Admin Theme
- Settings for Favicon
- Optimized for good SEO
- Dynamic sitemap.xml and robots.txt
- Settings for S3 compatible-storage (optional)
- Commenting System (with captchas)
- Email notification (optional)
- Supports Umami, Plausible analytics (optional)
Demo/Example: rburkhardt.com
- Features
- Table of contents
- Screenshots
- Quick-Start (Docker)
- Local Development
- Settings & Example .env
- Deployment Notes
- Contribution
- Todo/Roadmap
- Acknowledgements
- License
Home
About
Blogpost with image (new version has comments-system)
Blogpost without image (new version has comments-system)
Contact Page (new version has captchas)
Admin Dashboard
Admin - About Config
The fastest and easiest way to test dev-case locally:
git clone git@github.com:rob32/dev-case.git
cd dev-case
docker-compose up -d --build
docker-compose exec web python manage.py migrate
docker-compose exec web python manage.py createsuperuser
Important:
Create a new .env file with the following content (before docker-compose up -d --build
):
DEBUG=True
DATABASE_URL=psql://postgres:postgres@db:5432/postgres
Go to http://127.0.0.1:8000/
and check if all worked.
Development environment with Python (venv) and Node (optional).
Tested with GNU/Linux & Mac:
git clone git@github.com:rob32/dev-case.git
cd dev-case
python3 -m venv venv && source venv/bin/activate
pip install -r requirements-dev.txt
python3 manage.py migrate
pre-commit install
create a .env file with at least the following content:
DEBUG=True
# only if postgres is used, uncomend the next line (example):
# DATABASE_URL=psql://postgres:postgres@db:5432/postgres
Start the Development-Server with python3 manage.py runserver
Go to http://127.0.0.1:8000/
# Install dependecies with:
npm install
# Build "Fronted" manually (uses `rm -rf` for cleaning):
npm run build
Optional: Start Backend-Server and Esbuild in watch-mode at the same time with npm start
.
# Unit/Integration Tests:
python3 manage.py test
# Code Quality with the help of pre-commit
pre-commit run -a -v
A selection of possible settings via environment variables:
SECRET_KEY=insecure-secretkey12345
DEBUG=FALSE
ALLOWED_HOSTS=my-domain-name.com
DATABASE_URL=psql://postgres:postgres@db:5432/postgres
ADMIN_LOCATION=dev-case/
ROBOTS_DISALLOW=/contact/,/private-file.html`
FEED_TITLE="My Feed Title"
FEED_DESCRIPTION="My feed description"
USE_UMAMI_ANALYTICS=True
UMAMI_SCRIPT_URL=https://your-umami-app.com/umami.js
UMAMI_DATA_WEBSITE_ID=2323-3232-2323-3232
WIP
For deployment/production there are two branches at the moment:
- DO’s App Platform: prod-app-platform
- Traditional (VPS, Nginx etc.): main
- Docker-Compose: WIP
For DigitalOcean’s App Platform you can use the "Deploy to DigitalOcean" button below. Please make sure you have a working S3 space/bucket with the required credentials. Guide: How To Create a DigitalOcean Space and API Key
After the build process completes:
Access your app’s console through the Console tab and run the following commands:
python3 manage.py migrate
for the initial database migrationspython3 manage.py createsuperuser
to create an administrative user
As a last step, make the following adjustment in your Space setting:
Your Space -> Settings -> CORS Configurations (Add):
- Add your domain (with wildcard) in "Origin", examples:
*ondigitalocean.app
*example.com
- Allow/Check:
- GET, HEAD
This should solve the problem with the fonts (missing header, Access-Control-Allow-Origin)
Possible settings for production (via environment variables):
SECURE_SSL_REDIRECT=True
SECURE_HSTS_SECONDS=2592000
SECURE_HSTS_INCLUDE_SUBDOMAINS=True
SECURE_HSTS_PRELOAD=True
SESSION_COOKIE_SECURE=True
CSRF_COOKIE_SECURE=True
Make sure that USE_S3_STORAGE
is set to True
.
Possible settings for S3 compatible storage (via environment variables):
USE_S3_STORAGE (default=False)
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_STORAGE_BUCKET_NAME
AWS_S3_REGION_NAME
AWS_S3_ENDPOINT_URL
AWS_S3_CUSTOM_DOMAIN
AWS_LOCATION
AWS_IS_GZIPPED (default=False)
AWS_S3_FILE_OVERWRITE (default=True)
AWS_DEFAULT_ACL (default=public-read)
You can change the location for the admin area using the ADMIN_LOCATION
environment variable. Default is admin/
.
Change DOMAIN NAME and DISPLAY NAME via Admin-Panel (Sites App) to your actual domain name. Default is set to "example.com".
To add Disallow rules, use the ROBOTS_DISALLOW
environment variable. For a valid Sitemap entry change your domain name as described in Sitemap.xml.
Example: ROBOTS_DISALLOW=/contact/,/private-file.html
To receive notifications you can configure the following settings via environment variables:
USE_EMAIL_SMTP (default=False)
EMAIL_NOTIFICATION (default=False)
EMAIL_RECIPIENT (receiver address)
EMAIL_HOST
EMAIL_HOST_USER
EMAIL_HOST_PASSWORD
EMAIL_USE_TLS (default=True)
EMAIL_USE_SSL (default=False)
EMAIL_PORT (default=587)
DEFAULT_FROM_EMAIL
Make sure that USE_EMAIL_SMTP
and EMAIL_NOTIFICATION
is set to True
.
The DEFAULT_FROM_EMAIL
variable needs to have a valid value (example: admin@example.com).
This will notify you when there are new comments or when you receive a message via the contact page.
If you also want to be notified in case of server errors, set the environment variable DJANGO_ADMINS
with your name and email address. Example:
DJANGO_ADMINS=YourName:example@example.com
# or more
DJANGO_ADMINS=NameOne:name-one@example.com,NameTwo:name-two@example.com
Make sure that the USE_UMAMI_ANALYTICS
environment variable is set to True
.
Additionally create a UMAMI_SCRIPT_URL
and UMAMI_DATA_WEBSITE_ID
environment variable with the corresponding values.
Example:
USE_UMAMI_ANALYTICS=True
UMAMI_SCRIPT_URL=https://your-umami-app.com/umami.js
UMAMI_DATA_WEBSITE_ID=2323-3232-2323-3232
Make sure that the USE_PLAUSIBLE_ANALYTICS
environment variable is set to True
.
Additionally create a PLAUSIBLE_SCRIPT_URL
and PLAUSIBLE_DATA_DOMAIN
environment variable with the corresponding values.
Example:
USE_PLAUSIBLE_ANALYTICS=True
PLAUSIBLE_SCRIPT_URL=https://plausible.io/js/script.js
PLAUSIBLE_DATA_DOMAIN=example.com
Contributions, Feedback and Feature-Requests are always welcome. To learn more, see the Contributor Guide
CI for Tests & Code Qualitytweak default securitytweak SEOadd/finish comments for Blogadd captchasrefactor views (queries)- add docker-compose for production
A big thanks to the following great projects:
- django
- django-debug-toolbar
- django-extensions
- django-solo
- django-simple-captcha
- django-environ
- Python-Markdown
- pygments
- esbuild
The project is available under GNU GPLv3 Licence.
If you like the project, please give it a star ⭐