- fail to run if keys.py is missing - try-catch for sync because it's optional w
4.9 KiB
NASG - not another static generator...
Nearly 20 years ago I did my very first website with a thing called Microsoft FrontPage. I loved it. Times changed, and I wrote a CMS in PHP, first with flat files, then with MySQL, then moved on to WordPress.
Now I'm back on a static generator. I love it.
WARNING: this is a personal project, scratching my itches. No warranties. If you want to deploy it on your own, feel free to, but not all the things are documented.
What does it do
- content is structured in folders
- content files are YAML frontmatter + Multimarkdown
- EXIF from images are read via exiftool this is an external dependency
- Markdown is converted with pandoc this is an external dependency
How it works
-
pulls in webmentions from https://webmention.io and stores them in .md files next to the index.md of a post (see later) as:
[unix epoch]-[slugified source url].md
-
pulls in micropub from the queue received by the micropub receiver PHP (see later)
-
finds 'redirect' files:
- anything with a
.url
extension - content is the URL to redirect to
- filename without extension is the slug to redirect from
- for
HTTP 302
- anything with a
-
finds 'gone' files:
- anything with a
.del
extension - filename without extension is the slug deleted
- for
HTTP 410
- anything with a
-
finds content:
- all
index.md
files - corresponding comment
.md
file next to it - the parent directory name is the post slug
- finds all images in the same directory (
.jpg
,.png
,.gif
)- reads EXIF data into a hidden,
.[filename].json
file next to the original file - generates downsized and watermarked images into the
build/post slug
directory - if a
.jpg
if found with the same slug as the parent dir, the post will be a special photo post
- reads EXIF data into a hidden,
- anything else in the same directory will be copies to
build/post slug
- all
-
send webmentions via https://telegraph.p3k.io/
/
├── about.html -> will be copied
├── category-1
│ ├── article-1 -> slug
│ │ └── index.md -> content file
│ │ └── extra-file.mp4 -> will be copied
│ │ └── 1509233601-domaincomentrytitle.md -> comment
│ ├── fancy-photo -> slug of photo post
│ │ └── index.md -> content
│ │ └── fancy-photo.jpg -> to downsize, watermark, get EXIF
Special features
- complete
microformats2
and schema.org markup in templates - has light/dark theme, dark by default, but supports experimental prefers-color-scheme media query
- generates 3 special PHP files:
- search - uses and SQLite DB which is populated by Python on build
- fallback - 404 handler to do redirects/gones, gets populated with an array of both
- micropub - a micropub endpoint that accepts micropub content and puts the incoming payload into a json file, nothing else
Deploy
Requirements
For Debian based distributions, install the packages:
- python3
- python3-pip
- pandoc
sudo apt install python3 python3-pip pandoc
Install pipenv via pip:
sudo pip3 install pipenv
Install the pip dependency packages by using the Pipfile by running:
pipenv install
SSH (optional)
Once the build is done, NASG will attempt to sync the output folder to a remote server. It needs an entry in the ~/.ssh/config
file:
Host liveserver
HostName your.ssh.host
User your.ssh.user
IdentityFile ~/.ssh/your.ssh.identity.file
IdentitiesOnly yes
ServerAliveInterval 30
Note: if you don't have this, there will be no auto upload, but the build will still succeed.
Prepare
Create a local base directory where your contents will be put into. Eg:
~/MyWebsite
Create the following directories within your base directory directory: www
, nasg/templates
, content/home
.
Copy the templates from the templates
directory to the ~/MyWebsite/nasg/templates
directory.
Create a new file within the root directory called keys.py
with the following content:
webmentionio = {
'domain': 'yourdomain.com',
'token': 'token',
'secret': 'secret'
}
telegraph = {
'token': 'token'
}
zapier = {
'zapier': 'secret'
}
Add an index.md
file to the ~/MyWebsite/content/home
directory.
Finally, change the settings.py file, like the base
path and syncserver
etc. to your needs.
Run
Execute within the root folder:
./run
For more info, see: ./run -h
.
Functionalities based on file extensions/names
- entry_name/index.md: main entry (YAML + Multimarkdown)
- entry_name/entry_name.jpg: photo of photo posts, only for photo posts
- entry_name/slufigiedtargeturl.ping: outgoing webmentions
- entry_name/slugifiedsourceurl.md: comments and incoming webmentions
- some_slug.del: deleted slug, shall return 410
- another_slug.url: redirection, contains redirect URL, shall return 301 or 302