72 lines
2.4 KiB
Markdown
72 lines
2.4 KiB
Markdown
# n8n deployment
|
|
|
|
This directory runs n8n separately from the news web service. The n8n data
|
|
directory and `.env` stay on the server and must not be committed to Gitea.
|
|
|
|
## First deployment on the server
|
|
|
|
```bash
|
|
cd /projects/daily-news-digest/n8n
|
|
cp .env.example .env
|
|
openssl rand -hex 32
|
|
nano .env
|
|
chmod 600 .env
|
|
mkdir -p data
|
|
sudo chown -R 1000:1000 data
|
|
docker compose up -d
|
|
docker compose ps
|
|
docker compose logs --tail=50 n8n
|
|
```
|
|
|
|
The generated value must be copied to `N8N_ENCRYPTION_KEY` and must not be
|
|
changed later. n8n listens only on the server's loopback address. From a local
|
|
computer, create an SSH tunnel and open `http://127.0.0.1:5678`:
|
|
|
|
```powershell
|
|
ssh -L 5678:127.0.0.1:5678 root@YOUR_SERVER_IP
|
|
```
|
|
|
|
## Updating from Gitea
|
|
|
|
```bash
|
|
cd /projects/daily-news-digest
|
|
git pull
|
|
cd n8n
|
|
docker compose up -d
|
|
```
|
|
|
|
Do not overwrite `n8n/.env` or `n8n/data` during updates.
|
|
|
|
## PostgreSQL credential
|
|
|
|
In n8n, create a PostgreSQL credential for the existing application database.
|
|
Because n8n uses host networking and PostgreSQL is on the same host, use the
|
|
host's local PostgreSQL address (`127.0.0.1`), port `5432`, your database/user/
|
|
password, and disable SSL when the server reports that it does not support SSL.
|
|
|
|
The first workflow in `workflows/01-test-postgres.json` only checks this
|
|
connection. It does not fetch news or send email.
|
|
|
|
## RSS ingestion workflow
|
|
|
|
Run `db/migrations/004_n8n_ingestion.sql` in DBeaver first. It creates the
|
|
idempotent database ingestion function and adds a verified starter set of RSS
|
|
sources. It is safe to run the whole file again.
|
|
|
|
Then import `workflows/02-fetch-news-to-web.json` into n8n and select the same
|
|
PostgreSQL credential on both PostgreSQL nodes. Keep the workflow inactive for
|
|
the first test and click **Execute workflow**. The workflow:
|
|
|
|
- loads every enabled row from `news_sources`;
|
|
- reads RSS feeds and keeps entries from the last 14 days;
|
|
- classifies entries with local keyword rules, without an AI API;
|
|
- upserts articles and publishes today's web report;
|
|
- does not send email.
|
|
|
|
After the manual test succeeds and the web page shows today's report, activate
|
|
the workflow. Its schedule is 07:30 in `Asia/Shanghai`.
|
|
|
|
New RSS sources can be added later with an `INSERT` into `news_sources`; the
|
|
workflow reads that table on every run, so the workflow itself does not need to
|
|
be edited. Set `enabled = FALSE` to pause a source without deleting it.
|