LiCMS
LiCMS (Lixin Content Management System) is a content management system used for blogging, implemented with Flask.
Requirements
- Python
3.7.6
- Docker
19.03.5
- DataBase depending on deployment method (default in
config.py
, cen be edited as you wish)
- Heroku:
mysql
- Docker:
mysql
- Unix:
mysql
- Test Env:
sqlite
Tech Reviews
- LiCMS is developed in the MVC design pattern.
- LiCMS is an all in one content management solution providing usage and management for posts, comments and users.
- For the front-end, we provide both
RESTful-API
solution and website solution (based on Bootstrap). - For the back-end, we provide a Flask and Docker-based, automatic deployed and self-sustained solution with continuous-integration provided by Jenkins or Travis-CI.
- For database management, I used SQLAlchemy to simplify the complex SQL queries into object operations, which provided me with an object-oriented interface for all of the CRUD operations.
- For continuous integration, I integrated this project with Travis-CI and Jenkins.
- For auto-deploying and self-sustaining, thanks to docker. I achieved these with docker-compose and a self-implemented flask CLI extension.
- For Tow Step Verification or 2FA, it's implemented via
TOTP
(Time-based One-time Password) algorithm. - For unexpected errors, LiCMS will email the
LICMS_ADMIN
configured in.env-licms
. - For enhanced performance, we enabled
gunicorn
multi-threading, it takes (2 * physical_cpus + 1
) CPUs by default, (hyper-therad
is assumed to be enabled).
Platform Compatibility (Front-end)
- iOS
- iPadOS
- macOS
- Linux
- Windows 10
Platform Compatibility (Back-end)
- macOS
- Linux
- Unix
- Heroku
- Docker
Deployment Guide (Docker-Ubuntu)
If you would like to deploy LiCMS via other methods, you could refer to this guide
All Contents in the
<>
should math in each fileExample:
If you replaced<db_host>
withexample.com
in.env-licms
, you should replace<db_host>
withexample.com
every where.
- First thing first, clone this project.
git clone https://github.com/Great-Li-Xin/LiCMS.git
- First thing first, you should compose a dot-env file named
.env-licms
.The template is in the following code block:
DB_USERNAME=<db_username> DB_PASSWORD=<db_password> DB_HOST=<db_host> DB_PORT=<db_port> DB_DATABASE=<db_database> SECRET_KEY=<a_super_strong_key> LICMS_ADMIN=<your@email.com> LICMS_POSTS_PER_PAGE=20 LICMS_USERS_PER_PAGE=50 LICMS_COMMENTS_PER_PAGE=30 LICMS_SLOW_DB_QUERY_TIME=0.5 MAIL_SERVER=smtp.googlemail.com MAIL_PORT=587 MAIL_USE_TLS=true MAIL_USERNAME=<your_separate_gmail_account> MAIL_PASSWORD=<your_separate_gmail_application_password> FLASK_APP=app.py FLASK_CONFIG=docker PREFERRED_URL_SCHEME=https
- Then you will need to compose another dot-env file named
.env-mysql
.The template is in the following code block:
MYSQL_RANDOM_ROOT_PASSWORD=yes MYSQL_DATABASE=<db_database> MYSQL_USER=<db_username> MYSQL_PASSWORD=<db_password>
- After words, replace all the
licms.example.com
with your own host likesome-host.someone.com
. In the Following file:.conf/nginx/app.conf
init_letsencrypt.sh
please replace
<your@email.com>
in this file with the email you replaced<your@email.com>
in.env-licms
with.
- Run the following code to deploy the project.
# install docker-ce for ubuntu ./init_ubuntu_dokcer_ce.sh reboot cd /path/to/LiCMS ./init_letsencrypt.sh ./post_reboot.sh
RESTfil API auth flow
- POST
https://your.host/api/v1/tokens/
with HTTP Basic Auth:Username:<email> Password:<password>
- It will return a JSON body with
token
andexpiration
like this:{ "expiration": 600, "token": "<token>" }
- Before the token expires, you could visit other apis with HTTP Basic Auth via the token you requested.
The token takes the place of
Username
and leavePassword
empty.Username:<token> Password:
Dev Hacks
If you run LiCMS in development
mode, and you would like to fake some users, posts, comments, etc. Do the following.
- First enter
Flask Shell
:flask shell
- Import
fake
formapp_core
:from app_core import fake
- Fake 100 random Users:
fake.users(100)
- Fake 100 random Posts for random Users:
fake.posts(100)
- Fake 100 random Comments for random Posts by random Users:
fake.comments(100)
- Fake 100 random Follows for random Users followed by random Users:
fake.follows(100)
Screen Shots
TODO
- Add an about page
- Add OAuth Sign In (Sign In with twitter/facebook/google)
❤ by Li Xin!
Made with ™ and © 1997-2019 Li Xin. All Rights Reserved. License Agreement