Configuration Tutorial for Liuli on Raspberry Pi

This article introduces the configuration and deployment tutorial of Liuli on Raspberry Pi.

Liuli[1] aims to help you build a multi-source, clean, and personalized reading environment in one place. It is still in slow development and iteration, and more friends are welcome to participate. The current applicable scenarios include:

  • Building a pure RSS public account information flow based on Liuli
  • Following updates & reading novels based on Liuli

It is recommended to read the article above to have a general impression. Next, I will introduce how to install Liuli on Raspberry Pi in the following ways:

  • Docker deployment
  • Source code deployment

PS: This project is open source, see github.com/liuli-io/liuli, welcome to give a Star🀟🏻

Install MongoDB [Important]

Since Liuli depends on MongoDB as its database, and enabling MongoDB under Docker on Raspberry Pi is a bit confusing, we will install it directly on the system. Additionally, some friends may not have high configurations and cannot run Docker, so if deploying from source later, it is necessary to install it on the system.

Install MongoDB:

# Upgrade and update
sudo apt update
sudo apt upgrade

# Add the software source in `/etc/apt/sources.list`
wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list

# Install MongoDB
sudo apt-get update
sudo apt-get install -y mongodb-org

# Start
sudo systemctl daemon-reload
sudo systemctl enable mongod
sudo systemctl start mongod
# Check status
sudo systemctl status mongod

# Enter MongoDB
mongo

Create user:

use admin
db.createUser(
    {
        "user": "liuli",
        "pwd": "liuli",
        "roles": [
            "userAdminAnyDatabase",
            "dbAdminAnyDatabase",
            "readWriteAnyDatabase"
        ]
    }
)
exit

Configure operation sudo vim /etc/mongod.conf, change as follows:

# Change bindIp to 0.0.0.0, accessible externally
net:
  port: 27017
  bindIp: 0.0.0.0
# Add login verification
security:
   authorization: enabled

Restart to take effect:

sudo systemctl restart mongod

At this time, log in:

# Note your own ip
sudo mongo --host "192.168.0.2" -u "liuli" -p "liuli"

# View databases
> db.adminCommand({listDatabases: 1})

Docker Deployment

Overall, Docker deployment is still relatively convenient, especially for friends who are not familiar with Python, so this method is placed first.

Install Docker

First, let’s install Docker:

sudo apt-get install apt-transport-https ca-certificates software-properties-common -y

curl -fsSL https://get.docker.com -o get-docker.sh
# If the network speed is slow, you can try: sudo sh get-docker.sh --mirror Aliyun
sudo sh get-docker.sh

# Add key
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/raspbian/gpg | sudo apt-key add -

# Add software source in `/etc/apt/sources.list`
sudo add-apt-repository \
    "deb [arch=armhf] https://mirrors.aliyun.com/docker-ce/linux/raspbian \
    $(lsb_release -cs) \
    stable"

sudo groupadd docker
sudo usermod -aG docker $USER

# Update
sudo apt-get update
sudo apt-get upgrade

# Refresh
newgrp docker

# Start
sudo systemctl enable docker
sudo systemctl start docker

# Test
sudo docker run hello-world

You can consider introducing portainer for management:

sudo mkdir -p /data/docker_data/portainer_data
sudo docker run -d -p 8001:8000 -p 9001:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /data/docker_data/portainer_data:/data portainer/portainer-ce

Docker Deployment

Next is the official deployment:

# Download api and schedule images
sudo docker pull liuliio/api:v0.1.3
sudo docker pull liuliio/schedule:v0.2.4

# Create configuration directory
sudo mkdir -p liuli/liuli_config
sudo touch liuli/pro.env
sudo touch liuli/liuli_config/wechat.json

First, let’s look at the pro.env configuration:

PYTHONPATH=${PYTHONPATH}:${PWD}
LL_M_USER="liuli"
LL_M_PASS="liuli"
# Your externally accessible ip
LL_M_HOST="192.168.0.2"
LL_M_PORT="27017"
LL_M_DB="admin"
LL_M_OP_DB="liuli"
LL_FLASK_DEBUG=0
LL_HOST="0.0.0.0"
LL_HTTP_PORT=8765
LL_DOMAIN=""
LL_WORKERS=1
# The above configurations do not need to be changed, the following need to be configured individually
# Whether to send notifications to DingTalk
LL_D_TOKEN=""
# Whether to send notifications to WeChat
LL_WECOM_ID=""
LL_WECOM_AGENT_ID="-1"
LL_WECOM_SECRET=""
# Create a repository liuli_backup on your github
# You can also leave it blank, which means no backup to github
LL_GITHUB_TOKEN=""
LL_GITHUB_REPO="{your_github_name}/liuli_backup"
LL_GITHUB_DOMAIN="https://{your_github_name}.github.io/liuli_backup/"

Please refer to the following documents for specific parameter configuration, it’s very simple:

  • Dispatcher Configuration[2]: DingTalk WeChat configuration tutorial
  • Backup Configuration[3]: GitHub backup configuration tutorial
  • Parameter Description[4]: Detailed introduction of each parameter

After configuring, please write the above content to sudo vim liuli/pro.env.

Next, directly configure the public account related, directly use Liuli official configuration sudo vim liuli/liuli_config/wechat.json:

{
    "name": "wechat",
    "author": "liuli_team",
    "doc_source": "liuli_wechat",
    "collector": {
        "wechat": {
            "wechat_list": [
                "Small Crowd News"
            ],
            "delta_time": 5,
            "spider_type": "sg_ruia",
            "spider_type_des": "When the image is schedule:playwright_*, spider_type can be filled in sg_playwright"
        }
    },
    "processor": {
        "before_collect": [],
        "after_collect": [{
            "func": "ad_marker",
            "cos_value": 0.6
        }, {
            "func": "to_rss",
            "doc_source_list": ["liuli_wechat"],
            "link_source": "github"

        }]
    },
    "sender": {
        "sender_list": ["wecom"],
        "query_days": 7,
        "delta_time": 3
    },
    "backup": {
        "backup_list": ["mongodb"],
        "query_days": 7,
        "delta_time": 3,
        "init_config": {},
        "after_get_content": [{
            "func": "str_replace",
            "before_str": "data-src=\"",
            "after_str": "src=\"https://images.weserv.nl/?url="
        }]
    },
    "schedule": {
        "period_list": [
            "00:10",
            "12:10",
            "21:10"
        ]
    }
}

At this time, the folder directory is as follows:

(base) ➜  cd liuli
(base) ➜  liuli tree -L 2
.
β”œβ”€β”€ liuli_config
β”‚   └── wechat.json
└── pro.env

Configuration is complete, and now you can start:

# Start API
sudo docker run -d -it --restart=always -p 8765:8765 -v $PWD/pro.env:/data/code/pro.env --name liuli_api liuliio/api:v0.1.3
# Start schedule
sudo docker run -d -it --restart=always -v $PWD/pro.env:/data/code/pro.env -v $PWD/liuli_config:/data/code/liuli_config --name liuli_schedule liuliio/schedule:v0.2.4

Successful logs are as follows:

Configuration Tutorial for Liuli on Raspberry Pi

pi_liuli_logs

At this time, you can verify by accessing the following interface:

  • Get the public account rss address: http://0.0.0.0:8765/rss/liuli_wechat/Small Crowd News/
  • View the articles backed up from the target public account: http://0.0.0.0:8765/backup/liuli_wechat/Public Account Name/Article Name

At this point, you can subscribe to and view the articles of the target public account.

Note ⚠️: Fill in the IP based on the IP of the service you deployed.

The public account rss address effect:

Configuration Tutorial for Liuli on Raspberry Pi

pi_wechat

The target public account backup article:

Configuration Tutorial for Liuli on Raspberry Pi

pi-wechat-html

If you need WeChat message prompts, please visit: Dispatcher Configuration | DingTalk WeChat Configuration Tutorial[5]

Configuration Tutorial for Liuli on Raspberry Pi

Source Code Deployment

If you are looking at the source code deployment directly, please read the Docker Deployment section first, copy the following files:

  • wechat.json
  • pro.env

First, download the source code:

git clone https://github.com/liuli-io/liuli.git

# Remove the following lines in Pipfile
# black = "*"
# isort = "*"
# pylint = "*"
# pytest = "*"
# pandas = "*"
# numpy = "*"
# pypinyin = "*"
# playwright = "*"

# Ensure you have a python3.7+ environment
pip install pipenv
pipenv install --python {your_python3.7_path} --skip-lock --dev

# Configuration
# Copy the contents of pro.env above
vim pro.env
# Delete all contents of the liuli_config folder
# Copy wechat.json to liuli_config/wechat.json

# Start API
bash ./start.sh api pro
# Start schedule
bash ./start.sh schedule pro

View logs:

((liuli) ) (base) ➜  liuli git:(main) βœ— bash ./start.sh api pro
Start api(pro) serve: PIPENV_DOTENV_LOCATION=./pro.env pipenv run gunicorn -c src/config/gunicorn.py src.api.http_app:app
Loading .env environment variables...
[2022-04-28 15:00:50 +0800] [29074] [INFO] Starting gunicorn 20.1.0
[2022-04-28 15:00:50 +0800] [29074] [INFO] Listening at: http://0.0.0.0:8765 (29074)
[2022-04-28 15:00:50 +0800] [29074] [INFO] Using worker: gevent
[2022-04-28 15:00:50 +0800] [29079] [INFO] Booting worker with pid: 29079
[2022:04:28 15:00:54] INFO  Liuli API server(v0.1.3) started successfully :)
...

Instructions

The above process refers to the following materials:

  • Install & Configure MongoDB on the Raspberry Pi[6]
  • How to install Conda and Docker on your Raspberry Pi[7]
  • Docker Entry to Practice – Raspberry Pi[8]
  • Docker Official Documentation Install Docker Engine[9]

Hello to friends who see this, I tried the new feature of WeChat Quick Private Message, I don’t know what it is, everyone can help me try it out.

If you have any questions during use, feel free to join the group for discussion:

Configuration Tutorial for Liuli on Raspberry Pi

wechat-liuli

Reference Materials

[1]

Liuli: https://github.com/liuli-io/liuli

[2]

Dispatcher Configuration: https://github.com/liuli-io/liuli/blob/main/docs/03.%E5%88%86%E5%8F%91%E5%99%A8%E9%85%8D%E7%BD%AE.md

[3]

Backup Configuration: https://github.com/liuli-io/liuli/blob/main/docs/04.%E5%A4%87%E4%BB%BD%E5%99%A8%E9%85%8D%E7%BD%AE.md

[4]

Parameter Description: https://github.com/liuli-io/liuli/blob/main/docs/02.%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F.md

[5]

Dispatcher Configuration | DingTalk WeChat Configuration Tutorial: https://github.com/liuli-io/liuli/blob/main/docs/03.%E5%88%86%E5%8F%91%E5%99%A8%E9%85%8D%E7%BD%AE.md

[6]

Install & Configure MongoDB on the Raspberry Pi: https://www.mongodb.com/developer/how-to/mongodb-on-raspberry-pi/

[7]

How to install Conda and Docker on your Raspberry Pi: https://www.anegron.site/2020/06/18/how-to-install-conda-and-docker-on-your-raspberry-pi/

[8]

Docker Entry to Practice – Raspberry Pi: https://yeasy.gitbook.io/docker_practice/install/raspberry-pi

[9]

Docker Official Documentation Install Docker Engine: https://docs.docker.com/engine/install/

Configuration Tutorial for Liuli on Raspberry Pi

Leave a Comment

×