Add environment variable support to backend

This commit is contained in:
Xnoe 2022-07-11 21:16:40 +01:00
parent 491b9c268b
commit e3c27c6609
Signed by: xnoe
GPG Key ID: 45AC398F44F0DAFE
4 changed files with 74 additions and 7 deletions

View File

@ -8,4 +8,20 @@ The blog has the following functionality
- Editing Posts
- Deleting Posts
Additionally, it tracks the category that posts are in, allowing filtering posts by category.
Additionally, it tracks the category that posts are in, allowing filtering posts by category.
Xnoeblog is intended to be used with Docker, an example compose file is provided within this repository. The backend container can be configured using the following environment variables
- DB_HOST: Hostname of the database
- DB_USER: Database user
- DB_PASS: Database user password
- DB_NAME: Name of database to use
- XNOEBLOG_USER: Default user
- XNOEBLOG_PASS: Default password
All of these values are optional. Xnoeblog backend defaults to creating no user and using the following values for database if no environment variables are provided
- DB_HOST=db
- DB_USER=root
- DB_PASS=password
- DB_NAME=xnoeblog

View File

@ -12,6 +12,7 @@ import Data.ByteString.Lazy.Char8 as L (pack)
import Data.ByteString as B (unpack, ByteString)
import Text.Printf
import System.Random (newStdGen, randomRs)
import System.ReadEnvVar (lookupEnv)
import Crypto.Hash.SHA256 as SHA256
@ -317,7 +318,34 @@ handleWhoami c = do
main :: IO ()
main = do
c <- connectPostgreSQL "host=database user=blog password=root dbname=blog"
dbhostvar <- lookupEnv "DB_HOST"
dbuservar <- lookupEnv "DB_USER"
dbpassvar <- lookupEnv "DB_PASS"
dbnamevar <- lookupEnv "DB_NAME"
uservar <- lookupEnv "XNOEBLOG_USER"
passvar <- lookupEnv "XNOEBLOG_PASS"
let dbhost = case dbhostvar of
Just h -> h
Nothing -> "db"
let dbuser = case dbuservar of
Just u -> u
Nothing -> "root"
let dbpass = case dbpassvar of
Just p -> p
Nothing -> "password"
let dbname = case dbnamevar of
Just d -> d
Nothing -> "xnoeblog"
let user = case uservar of
Just u -> u
Nothing -> ""
let pass = case passvar of
Just p -> p
Nothing -> ""
c <- connectPostgreSQL ("host=" ++ dbhost ++ " user=" ++ dbuser ++ " password=" ++ dbpass ++ " dbname=" ++ dbname)
createPostsTable <- prepare c "CREATE TABLE IF NOT EXISTS posts(postid serial primary key, catid int, title varchar(128), subtext varchar(128), content text);"
createCategoriesTable <- prepare c "CREATE TABLE IF NOT EXISTS categories(catid serial primary key, name varchar(128));"
@ -326,7 +354,23 @@ main = do
execute createCategoriesTable []
execute createUsersTable []
commit c
queryUser <- prepare c "SELECT * from users WHERE username like ?;"
execute queryUser [toSql user]
userExists <- fetchAllRows queryUser
if user /= "" then
case userExists of
[_] -> do return Nothing
[] -> do
let passwordHashBS = SHA256.hash (C.pack pass)
let passwordHash = hexOfBS passwordHashBS
createUser <- prepare c "INSERT INTO users(username, password) VALUES(?, ?);"
execute createUser [toSql user, toSql passwordHash]
commit c
return Nothing
else
do return Nothing
simpleHTTP config $ do
decodeBody (defaultBodyPolicy "/tmp/" 0 4096 4096)
msum [ dir "v1" $ dir "post" $ path $ \pid -> require (getPostContent c pid) $ \post -> ok $ toResponse post

View File

@ -29,6 +29,6 @@ executable backend
-- LANGUAGE extensions used by modules in this package.
-- other-extensions:
build-depends: base ^>=4.14.3.0, happstack-server ^>=7.7.2, HDBC ^>= 2.4.0.4, HDBC-postgresql ^>= 2.3.2.4, json ^>= 0.10, bytestring ^>= 0.10.12.0, cryptohash-sha256 ^>= 0.11.102.1, random ^>= 1.1, mtl ^>= 2.2.2
build-depends: base ^>=4.14.3.0, happstack-server ^>=7.7.2, HDBC ^>= 2.4.0.4, HDBC-postgresql ^>= 2.3.2.4, json ^>= 0.10, bytestring ^>= 0.10.12.0, cryptohash-sha256 ^>= 0.11.102.1, random ^>= 1.1, mtl ^>= 2.2.2, read-env-var ^>= 1.0.0.0
hs-source-dirs: app
default-language: Haskell2010

View File

@ -2,22 +2,29 @@ version: '3.0'
services:
frontend:
restart: unless-stopped
build: ./frontend
image: registry.xnopyt.com/xnoeblog-frontend:latest
backend:
restart: unless-stopped
build: ./backend
image: registry.xnopyt.com/xnoeblog-backend:latest
depends_on:
- database
nginx:
restart: unless-stopped
image: nginx:alpine
ports:
- 80:80
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
database:
db:
restart: unless-stopped
image: postgres
environment:
- POSTGRES_PASSWORD=root
- POSTGRES_USER=blog
- POSTGRES_PASSWORD=password
- POSTGRES_USER=root
- POSTGRES_DB=xnoeblog