Compare commits
10 Commits
bf39c5f42f
...
main
Author | SHA1 | Date | |
---|---|---|---|
9086f7833d
|
|||
cc5b165822
|
|||
0cf84ffe0e
|
|||
61e98064f6 | |||
f35fbe21c2 | |||
47dfec5e26 | |||
e3056382d3 | |||
a24a726a9b | |||
ccfcd42d1e | |||
592afe4914 |
84
README.md
Normal file
84
README.md
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
# Kasper Hermansen's Blog
|
||||||
|
|
||||||
|
A personal blog built with Zola (static site generator) and deployed using containerized CI/CD with Dagger.
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
- **mise** - Development environment manager
|
||||||
|
- **Rust** - For running Dagger CI
|
||||||
|
- **Docker** - For containerization
|
||||||
|
|
||||||
|
## Development
|
||||||
|
|
||||||
|
### Quick Start
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Install dependencies and start dev server
|
||||||
|
mise run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
This will:
|
||||||
|
- Start Zola dev server on http://localhost:8000
|
||||||
|
- Watch and compile Tailwind CSS changes
|
||||||
|
- Show posts in progress
|
||||||
|
|
||||||
|
### Available Commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mise run dev # Start development server with live reload
|
||||||
|
mise run ci:pr # Run CI build for pull requests
|
||||||
|
mise run ci:main # Run full CI pipeline (build + deploy)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Deployment
|
||||||
|
|
||||||
|
The blog uses a fully automated CI/CD pipeline built with Dagger (Rust SDK).
|
||||||
|
|
||||||
|
### Manual Deployment
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Build and deploy to production
|
||||||
|
(cd ci && cargo build)
|
||||||
|
./ci/target/debug/ci main
|
||||||
|
```
|
||||||
|
|
||||||
|
This will:
|
||||||
|
1. Compile Tailwind CSS styles
|
||||||
|
2. Build static site with Zola
|
||||||
|
3. Package with Caddy web server
|
||||||
|
4. Push Docker image to registry
|
||||||
|
5. Update deployment configuration in git
|
||||||
|
|
||||||
|
### Automated Deployment
|
||||||
|
|
||||||
|
Pushing to `main` branch triggers automatic deployment via CI.
|
||||||
|
|
||||||
|
## Project Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
├── content/posts/ # Blog posts (Markdown with YAML frontmatter)
|
||||||
|
├── templates/ # Zola templates (Tera)
|
||||||
|
├── static/ # Static assets
|
||||||
|
├── styles/ # Tailwind CSS source
|
||||||
|
├── ci/ # Dagger CI/CD pipeline (Rust)
|
||||||
|
├── deployment/ # Caddy server configuration
|
||||||
|
├── config.toml # Zola configuration
|
||||||
|
└── mise.toml # Development tasks
|
||||||
|
```
|
||||||
|
|
||||||
|
## Adding Content
|
||||||
|
|
||||||
|
Create a new post in `content/posts/`:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
+++
|
||||||
|
title = "Your Post Title"
|
||||||
|
description = "Brief description"
|
||||||
|
date = 2025-01-01
|
||||||
|
draft = false
|
||||||
|
[taxonomies]
|
||||||
|
tags = ["rust", "development"]
|
||||||
|
+++
|
||||||
|
|
||||||
|
Your content here...
|
||||||
|
```
|
@@ -25,7 +25,7 @@ impl BlogComponent {
|
|||||||
.up_opts(
|
.up_opts(
|
||||||
ServiceUpOptsBuilder::default()
|
ServiceUpOptsBuilder::default()
|
||||||
.ports(vec![PortForward {
|
.ports(vec![PortForward {
|
||||||
backend: 8000,
|
backend: 80,
|
||||||
frontend: 8000,
|
frontend: 8000,
|
||||||
protocol: dagger_sdk::NetworkProtocol::Tcp,
|
protocol: dagger_sdk::NetworkProtocol::Tcp,
|
||||||
}])
|
}])
|
||||||
@@ -114,7 +114,7 @@ async fn build(client: dagger_sdk::Query) -> eyre::Result<(i64, Container)> {
|
|||||||
let dep_image = client
|
let dep_image = client
|
||||||
.container()
|
.container()
|
||||||
.from(CADDY_IMAGE)
|
.from(CADDY_IMAGE)
|
||||||
.with_directory("/usr/share/caddy", dist_dir)
|
.with_directory("/srv", dist_dir)
|
||||||
.with_file("/etc/caddy/Caddyfile", caddy_file);
|
.with_file("/etc/caddy/Caddyfile", caddy_file);
|
||||||
|
|
||||||
Ok((tag, dep_image))
|
Ok((tag, dep_image))
|
||||||
|
@@ -1,9 +1,13 @@
|
|||||||
{
|
{
|
||||||
debug
|
debug
|
||||||
|
log default {
|
||||||
|
output stdout
|
||||||
|
level DEBUG
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
http://blog.kasperhermansen.com {
|
:80 {
|
||||||
root * /usr/share/caddy
|
root * /srv
|
||||||
file_server
|
file_server
|
||||||
encode gzip
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -12,7 +12,8 @@
|
|||||||
|
|
||||||
{{ post_macros::styles() }}
|
{{ post_macros::styles() }}
|
||||||
|
|
||||||
<script defer data-domain="blog.kasperhermansen.com" src="https://plausible.front.kjuulh.io/js/script.js"></script>
|
<script defer data-domain="blog.kasperhermansen.com" src="https://plausible.front.kjuulh.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js"></script>
|
||||||
|
<script>window.plausible = window.plausible || function() { (window.plausible.q = window.plausible.q || []).push(arguments) }</script>
|
||||||
|
|
||||||
<meta name="description" content="Kasper Hermansen's blog is a hub of insights on platform engineering. ">
|
<meta name="description" content="Kasper Hermansen's blog is a hub of insights on platform engineering. ">
|
||||||
<meta name="keywords" content="Kasper Hermansen, kjuulh, blog, technology, platform engineering, cloud native">
|
<meta name="keywords" content="Kasper Hermansen, kjuulh, blog, technology, platform engineering, cloud native">
|
||||||
|
@@ -36,5 +36,5 @@
|
|||||||
{% endmacro list_posts %}
|
{% endmacro list_posts %}
|
||||||
|
|
||||||
{% macro styles() %}
|
{% macro styles() %}
|
||||||
<link rel="stylesheet" href="{{ get_url(path="styles/styles.css") | safe }}" />
|
<link rel="stylesheet" href="{{ get_url(path="/styles/styles.css") | safe }}" />
|
||||||
{% endmacro styles %}
|
{% endmacro styles %}
|
||||||
|
Reference in New Issue
Block a user