Skip to content
Snippets Groups Projects
Commit c8a348a5 authored by nimrod's avatar nimrod
Browse files

First commit. 1 article about setting up Pelican and an about me.

parents
No related branches found
No related tags found
No related merge requests found
output
cache
Makefile 0 → 100644
PY=python
PELICAN=pelican
PELICANOPTS=
BASEDIR=$(CURDIR)
INPUTDIR=$(BASEDIR)/content
OUTPUTDIR=$(BASEDIR)/output
CONFFILE=$(BASEDIR)/pelicanconf.py
PUBLISHCONF=$(BASEDIR)/publishconf.py
FTP_HOST=localhost
FTP_USER=anonymous
FTP_TARGET_DIR=/
SSH_HOST=ns1.shore.co.il
SSH_PORT=22
SSH_USER=nimrod
SSH_TARGET_DIR=/var/www/htdocs/blog
S3_BUCKET=my_s3_bucket
CLOUDFILES_USERNAME=my_rackspace_username
CLOUDFILES_API_KEY=my_rackspace_api_key
CLOUDFILES_CONTAINER=my_cloudfiles_container
DROPBOX_DIR=~/Dropbox/Public/
DEBUG ?= 0
ifeq ($(DEBUG), 1)
PELICANOPTS += -D
endif
help:
@echo 'Makefile for a pelican Web site '
@echo ' '
@echo 'Usage: '
@echo ' make html (re)generate the web site '
@echo ' make clean remove the generated files '
@echo ' make regenerate regenerate files upon modification '
@echo ' make publish generate using production settings '
@echo ' make serve [PORT=8000] serve site at http://localhost:8000'
@echo ' make devserver [PORT=8000] start/restart develop_server.sh '
@echo ' make stopserver stop local server '
@echo ' make ssh_upload upload the web site via SSH '
@echo ' make rsync_upload upload the web site via rsync+ssh '
@echo ' make dropbox_upload upload the web site via Dropbox '
@echo ' make ftp_upload upload the web site via FTP '
@echo ' make s3_upload upload the web site via S3 '
@echo ' make cf_upload upload the web site via Cloud Files'
@echo ' make github upload the web site via gh-pages '
@echo ' '
@echo 'Set the DEBUG variable to 1 to enable debugging, e.g. make DEBUG=1 html'
@echo ' '
html:
$(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS)
clean:
[ ! -d $(OUTPUTDIR) ] || rm -rf $(OUTPUTDIR)
regenerate:
$(PELICAN) -r $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS)
serve:
ifdef PORT
cd $(OUTPUTDIR) && $(PY) -m pelican.server $(PORT)
else
cd $(OUTPUTDIR) && $(PY) -m pelican.server
endif
devserver:
ifdef PORT
$(BASEDIR)/develop_server.sh restart $(PORT)
else
$(BASEDIR)/develop_server.sh restart
endif
stopserver:
kill -9 `cat pelican.pid`
kill -9 `cat srv.pid`
@echo 'Stopped Pelican and SimpleHTTPServer processes running in background.'
publish:
$(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(PUBLISHCONF) $(PELICANOPTS)
ssh_upload: publish
scp -P $(SSH_PORT) -r $(OUTPUTDIR)/* $(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR)
rsync_upload: publish
rsync -e "ssh -p $(SSH_PORT)" -P -rvz --delete $(OUTPUTDIR)/ $(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR) --cvs-exclude
dropbox_upload: publish
cp -r $(OUTPUTDIR)/* $(DROPBOX_DIR)
ftp_upload: publish
lftp ftp://$(FTP_USER)@$(FTP_HOST) -e "mirror -R $(OUTPUTDIR) $(FTP_TARGET_DIR) ; quit"
s3_upload: publish
s3cmd sync $(OUTPUTDIR)/ s3://$(S3_BUCKET) --acl-public --delete-removed
cf_upload: publish
cd $(OUTPUTDIR) && swift -v -A https://auth.api.rackspacecloud.com/v1.0 -U $(CLOUDFILES_USERNAME) -K $(CLOUDFILES_API_KEY) upload -c $(CLOUDFILES_CONTAINER) .
github: publish
ghp-import $(OUTPUTDIR)
git push origin gh-pages
.PHONY: html help clean regenerate serve devserver publish ssh_upload rsync_upload dropbox_upload ftp_upload s3_upload cf_upload github
About me
########
:date: 2014-04-19
:summary: All about Nimrod.
:slug: about-me
Hi.
I'm Nimrod Adar, a Linux and BSD sysadmin and as-needed developer from Haifa, Israel.
This is my blog about what I do and thus it serves 2 purposes. The 1st is to be my personal journal to document the how or why of some problem solving. The 2nd is more outward facing, for it be a resource for others (by no way complete) and for me to publish whenever I need to.
Also, I'm a part-time freelancer so you can contact me at `nimrod@shore.co.il <mailto: nimrod@shore.co.il>`_ or at 052-8713696 (+972-52-871-3696 outside of Israel).
Last thing, my public `GPG public key <https://www.shore.co.il/blog/static/nimrod.gpg>`_
\ No newline at end of file
Blogging with Pelican
########################
:date: 2014-04-19
:slug: How-I-blog-with-Pelican
:author: Nimrod Adar
:summary: How I blog with Pelican
What is Pelican?
----------------
`Pelican <http://blog.getpelican.com/>`_ is a static site generator.
It's written in Python, focusing on blogs, using reStructedText, Jinja2 and Fabric (but you can use Markdown and makefiles and has provisions for normal web pages as well).
It's a pythonic tool that's easy to use and was a breeze to setup.
Installing Pelican
------------------
As Pelican is a static blog/ website generator, all we're doing is in your workstation. All you need to have server-wise is a bog-standard web server (like Apache or Nginx). Everything else is done on your local machine. I installed Pelican from Debian (it's currently available in testing) ::
$ apt-get install python-pelican fabric
Alternatively, you can use pip ::
$ pip install pelican fabric
Create a blog directory and an empty blog ::
$ mkdir blog
$ cd blog
$ pelican-quickstart
Welcome to pelican-quickstart v3.4.0.
This script will help you create a new Pelican-based website.
Please answer the following questions so this script can generate the files
needed by Pelican.
> Where do you want to create your new web site? [.]
> What will be the title of this web site? My Blog
> Who will be the author of this web site? <Insert you name here>
> What will be the default language of this web site? [en]
> Do you want to specify a URL prefix? e.g., http://example.com (Y/n)
> What is your URL prefix? (see above example; no trailing slash) <Insert blog URL without trailing slash>
> Do you want to enable article pagination? (Y/n)
> How many articles per page do you want? [10]
> Do you want to generate a Fabfile/Makefile to automate generation and publishing? (Y/n)
> Do you want an auto-reload & simpleHTTP script to assist with theme and site development? (Y/n)
> Do you want to upload your website using FTP? (y/N)
> Do you want to upload your website using SSH? (y/N) y
> What is the hostname of your SSH server? [localhost] <Insert SSH server address>
> What is the port of your SSH server? [22]
> What is your username on that server? [root] <Insert SSH username>
> Where do you want to put your web site on that server? [/var/www] <Insert full path to your blog's directory>
> Do you want to upload your website using Dropbox? (y/N)
> Do you want to upload your website using S3? (y/N)
> Do you want to upload your website using Rackspace Cloud Files? (y/N)
> Do you want to upload your website using GitHub Pages? (y/N)
Done. Your new project is available at blog
Since Pelican uses OpenSSH, you can use servers defined in your SSH preferences. Now, lets configure the blog to our liking. In the blog directory there are the 2 configuration files: pelicanconf.py for configuring Pelican and publishconf.py for configuration that are only for publishing using Make or Fabric. Pelican also creates standard Makefile and fabfile.py for you. I've made the following modifications to pelicanconf.py: ::
TIMEZONE = 'Asia/Jerusalem'
PATH = "content"
DIRECT_TEMPLATES = ('index', 'archives')
DISPLAY_CATEGORIES_ON_MENU = False
DISPLAY_PAGES_ON_MENU = True
TAGS_SAVE_AS = ''
TAG_SAVE_AS = ''
STATIC_PATH = ['static']
And to publishconf.py: ::
CATEGORY_FEED_ATOM = None
I've set the timezone to mine (so that the time of published articles is correct), add everything under contents/static as static contents to be uploaded to the server, disabled showing of categories of articles and creating feeds for them, disabled saving of articles by tags and set pages (which are simple web pages unlike articles which are blog entries) to show on the menu. Next, themes. Pelican comes with a default theme (the same as used by Pelican's website) but I wanted something more understated so I took at look at `https://github.com/getpelican/pelican-themes <https://github.com/getpelican/pelican-themes>`_ and chose pelican-mockingbird. Cloned it ::
$ git clone https://github.com/wrl/pelican-mockingbird.git
and set the theme to that by adding the following to pelicanconf.py: ::
THEME = "./pelican-mockingbird"
I've also edited base.html and article.html inside of pelican-mockingbird/templates to suite me. Next, let us add a new entry by creating a ReStructedText file inside of contents. The filename is for personal use and not critical. The heading is the article name and you can add the following for Pelican to use: ::
:date: 2014-04-19
:slug: this-will-the-filename
:author: <Insert your name here>
:summary: <Insert summary here>
After we added the content we want to upload it to our web server (I use fabric) ::
$ fab publish
If you don't have keys set for the server it will ask you for your password to the server.
Last thing, you can create pages, create a pages directory inside contents and save the files there. Their format is the same as articles but they'll have a somewhat template applied and they will be shown in the menu. A good example will an 'About Me' page.
That's it, you now have Pelican installed, configured and published to your web site.
\ No newline at end of file
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1
mQENBFK1T/0BCADLC2iWmTQXFncaGjvg1NB2CiUcMujnw8aaNY6pIB2IoXKniwps
REBIQprVCGPKsm9umQp1VQV8X4ijWqgDFRK+w51TBAY3GCDREep1K3ZDUr7jCQXs
u0I8MFHOs6HhjNNI56Up7Kevt6YQ+XqLfrFhl0QpNs8Fx3iWjjmhX5N3dg5qpHss
xvalKGf3HIU3PU/VxQZscxXt0XEdDhYdRzFEMok/9X76uk2zTY8mcHa+1ZVx1vpJ
NFXS1hfHqJVNj/PZmKX9IM4O+a1HUJIm35Rw2mrAl0VqNVxEvzHNZBA2PqAIu+rS
NhFhwnb5t/19/AsmsgVUsgJNs0AMh6iABIh5ABEBAAG0IE5pbXJvZCBBZGFyIDxu
aW1yb2RAc2hvcmUuY28uaWw+iQE/BBMBAgApBQJStU/9AhsvBQkB4UojBwsJCAcD
AgEGFQgCCQoLBBYCAwECHgECF4AACgkQSby+NT/sLXfurQf+JpDDAIqufS8KfS8k
hA26oe+YA92W5xZRIOF/+tr66ZuRUUG6e+y5RAcQI6qENC6697v6ZF5lbqCJ2w7u
vo8reQB17cLMb7PKYScB8najPxHNcWfNHvtSNMCOyUaoNJmjqW7tpWcr6TaD39a/
s3Le0gZjXdaxKcXVzaUKTLKXlwr/7QyD7qxjwEwOmiTFvSjnCQDOCUXxghQv4FMM
HeN6Jqxdzb1Ua8xb74TyGkJOZndzUboLrPL6OlLUekQpQNFpUd6qB2/ZZezlLxfx
27qt/HPkoGmCX5EafRi6RSPnhDbLntca2sO4TDb5vBFBjS2UNYkGynEUb+NKZ84d
HCUeBA==
=zy5T
-----END PGP PUBLIC KEY BLOCK-----
#!/usr/bin/env bash
##
# This section should match your Makefile
##
PY=python
PELICAN=pelican
PELICANOPTS=
BASEDIR=$(pwd)
INPUTDIR=$BASEDIR/content
OUTPUTDIR=$BASEDIR/output
CONFFILE=$BASEDIR/pelicanconf.py
###
# Don't change stuff below here unless you are sure
###
SRV_PID=$BASEDIR/srv.pid
PELICAN_PID=$BASEDIR/pelican.pid
function usage(){
echo "usage: $0 (stop) (start) (restart) [port]"
echo "This starts pelican in debug and reload mode and then launches"
echo "A pelican.server to help site development. It doesn't read"
echo "your pelican options so you edit any paths in your Makefile"
echo "you will need to edit it as well"
exit 3
}
function alive() {
kill -0 $1 >/dev/null 2>&1
}
function shut_down(){
PID=$(cat $SRV_PID)
if [[ $? -eq 0 ]]; then
if alive $PID; then
echo "Killing pelican.server"
kill $PID
else
echo "Stale PID, deleting"
fi
rm $SRV_PID
else
echo "pelican.server PIDFile not found"
fi
PID=$(cat $PELICAN_PID)
if [[ $? -eq 0 ]]; then
if alive $PID; then
echo "Killing Pelican"
kill $PID
else
echo "Stale PID, deleting"
fi
rm $PELICAN_PID
else
echo "Pelican PIDFile not found"
fi
}
function start_up(){
local port=$1
echo "Starting up Pelican and pelican.server"
shift
$PELICAN --debug --autoreload -r $INPUTDIR -o $OUTPUTDIR -s $CONFFILE $PELICANOPTS &
pelican_pid=$!
echo $pelican_pid > $PELICAN_PID
cd $OUTPUTDIR
$PY -m pelican.server $port &
srv_pid=$!
echo $srv_pid > $SRV_PID
cd $BASEDIR
sleep 1
if ! alive $pelican_pid ; then
echo "Pelican didn't start. Is the pelican package installed?"
return 1
elif ! alive $srv_pid ; then
echo "pelican.server didn't start. Is there something else which uses port 8000?"
return 1
fi
echo 'Pelican and pelican.server processes now running in background.'
}
###
# MAIN
###
[[ ($# -eq 0) || ($# -gt 2) ]] && usage
port=''
[[ $# -eq 2 ]] && port=$2
if [[ $1 == "stop" ]]; then
shut_down
elif [[ $1 == "restart" ]]; then
shut_down
start_up $port
elif [[ $1 == "start" ]]; then
if ! start_up $port; then
shut_down
fi
else
usage
fi
from fabric.api import *
import fabric.contrib.project as project
import os
# Local path configuration (can be absolute or relative to fabfile)
env.deploy_path = 'output'
DEPLOY_PATH = env.deploy_path
# Remote server configuration
production = 'nimrod@ns1.shore.co.il:22'
dest_path = '/var/www/htdocs/www.shore.co.il/blog/'
# Rackspace Cloud Files configuration settings
env.cloudfiles_username = 'my_rackspace_username'
env.cloudfiles_api_key = 'my_rackspace_api_key'
env.cloudfiles_container = 'my_cloudfiles_container'
def clean():
if os.path.isdir(DEPLOY_PATH):
local('rm -rf {deploy_path}'.format(**env))
local('mkdir {deploy_path}'.format(**env))
def build():
local('pelican -s pelicanconf.py')
def rebuild():
clean()
build()
def regenerate():
local('pelican -r -s pelicanconf.py')
def serve():
local('cd {deploy_path} && python -m SimpleHTTPServer'.format(**env))
def reserve():
build()
serve()
def preview():
local('pelican -s publishconf.py')
def cf_upload():
rebuild()
local('cd {deploy_path} && '
'swift -v -A https://auth.api.rackspacecloud.com/v1.0 '
'-U {cloudfiles_username} '
'-K {cloudfiles_api_key} '
'upload -c {cloudfiles_container} .'.format(**env))
@hosts(production)
def publish():
local('pelican -s publishconf.py')
project.rsync_project(
remote_dir=dest_path,
exclude=".DS_Store",
local_dir=DEPLOY_PATH.rstrip('/') + '/',
delete=True
)
File added
pelican-mockingbird @ fa46a802
Subproject commit fa46a8024ceb821a8717ed36f7b9d2a6a06d2060
#!/usr/bin/env python
# -*- coding: utf-8 -*- #
from __future__ import unicode_literals
AUTHOR = u'Nimrod Adar'
SITENAME = u'My notes and rumblings'
SITEURL = ''
TIMEZONE = 'Asia/Jerusalem'
DEFAULT_LANG = u'en'
# Feed generation is usually not desired when developing
FEED_ALL_ATOM = None
CATEGORY_FEED_ATOM = None
TRANSLATION_FEED_ATOM = None
# Blogroll
LINKS = ()
# Social widget
#SOCIAL = (('You can add links in your config file', '#'),
# ('Another social link', '#'),)
DEFAULT_PAGINATION = 10
# Uncomment following line if you want document-relative URLs when developing
#RELATIVE_URLS = True
PATH = "content"
DIRECT_TEMPLATES = ('index', 'archives')
#DIRECT_TEMPLATES = ('index')
#DISPLAY_CATEGORIES_ON_MENU = True
DISPLAY_CATEGORIES_ON_MENU = False
DISPLAY_PAGES_ON_MENU = True
#THEME = "./storm"
THEME = "./pelican-mockingbird"
TAGS_SAVE_AS = ''
TAG_SAVE_AS = ''
STATIC_PATHS = ['static']
File added
#!/usr/bin/env python
# -*- coding: utf-8 -*- #
from __future__ import unicode_literals
# This file is only used if you use `make publish` or
# explicitly specify it as your config file.
import os
import sys
sys.path.append(os.curdir)
from pelicanconf import *
SITEURL = 'https://www.shore.co.il/blog'
RELATIVE_URLS = False
FEED_ALL_ATOM = 'feeds/all.atom.xml'
#CATEGORY_FEED_ATOM = 'feeds/%s.atom.xml'
CATEGORY_FEED_ATOM = None
DELETE_OUTPUT_DIRECTORY = True
# Following items are often useful when publishing
#DISQUS_SITENAME = ""
#GOOGLE_ANALYTICS = ""
File added
storm @ 70ba542d
Subproject commit 70ba542d1511c213e453553551d41a52936c1418
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment