• Stars
    star
    744
  • Rank 60,965 (Top 2 %)
  • Language
    TypeScript
  • License
    GNU General Publi...
  • Created almost 4 years ago
  • Updated 9 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

🚀 A Monorepo for My Personal Website and Related Projects

OUORZ-MONO

Front-end code & Docker image that power www.ouorz.com and other related projects

build status license

screenshot-ouorz-com



Main App

Past Iterations


Feature Highlights

  • SSR/SSG/On-demand ISR
  • Command palette
  • Redux + Redux Saga state management
  • Nexment comment system
  • Dynamic table of contents sidebar
  • Personal dashboard
  • Dark mode

Summary of Tech Stacks

Super opinionated, completely overkill.

  • TypeScript
  • Framework
    • React (Next.js)
    • Foundation/Adaptor implementation coming soon
    • Storybook
    • Turborepo
  • Data Fetching
    • swr
      • Infinite Loading
      • Revalidation
      • Suspense
    • fetch (API Routes)
  • State Management
    • Redux Toolkit
    • Redux Saga
  • Styling:
    • styled-components
    • Tailwind CSS
  • Content Management:
    • WordPress (Qiniu - Static file storage)
    • WP REST API (GraphQL implementation coming soon)
    • Tencent Cloud CVM (CentOS/Nginx/MySQL/PHP)
    • Nexment (LeanCloud)
    • Newsletter (Buttondown)
  • Error Logging & Web Vitals Metric
    • Sentry
  • Linters
    • ESLint
    • Prettier
    • CommitLint
  • CI/CD
    • Github Actions
    • Vercel

Project Setup

git clone [email protected]:ttttonyhe/ouorz-mono.git
pnpm install
cd apps/main

Create a .env file with your configuration, see below for a list of environment variables used in this project:

  • LeanCloud:
    • NEXT_PUBLIC_LC_KEY
    • NEXT_PUBLIC_LC_ID
  • Buttondown:
    • NEXT_PUBLIC_BUTTONDOWN_TOKEN
  • Sentry:
    • NEXT_PUBLIC_SENTRY_DSN
    • SENTRY_AUTH_TOKEN
    • SENTRY_PROJECT
    • SENTRY_ORG
  • On-demand ISR:
    • REVALIDATION_REQUEST_TOKEN
pnpm run dev:main


WordPress App

Warning

Running WordPress in a Docker container is extremely slow on lower-spec machines

>=1 GB of RAM without MySQL 8, or >=2 GB of RAM with MySQL 8 is recommended

This project is wrapped up in a Docker container built based on the official WordPress Docker image: wordpress:php8.0-apache.


Static Image

Each build outputs a static Docker image (similar to a typical containerized application) which means updating WordPress itself or adding new themes/plugins requires redeployment.


Persistent Storage

All uploads are stored in an external store (Qiniu, similar to AWS S3), therefore wp-content/uploads can be treated as temporary data.


Custom Themes

main app uses WordPress REST API to fetch data, wordpress app functions as a headless CMS. The theme peg is used to customize the behaviour of the REST API endpoints, therefore peg/functions.php should be the main focus when it comes to the development of wordpress app.


Environment Variables

  • MySQL Database:
    • WORDPRESS_DB_HOST
    • WORDPRESS_DB_NAME
    • WORDPRESS_DB_PASSWORD
    • WORDPRESS_DB_USER
    • WORDPRESS_TABLE_PREFIX
  • Settings:
    • WORDPRESS_DEBUG

Optionally, WORDPRESS_CONFIG_EXTRA can be set to include other configurations:

  • MySQL SSL Connection:
    • define("MYSQL_CLIENT_FLAGS", MYSQLI_CLIENT_SSL);
  • Turn Off PHP Warnings & Notices:
    • ini_set("error_reporting", E_ALL & ~E_NOTICE);
    • ini_set("display_errors","Off")
  • Redis Object Cache:
    • define("WP_REDIS_HOST", "redis_database_host");
    • define("WP_REDIS_PASSWORD", "redis_database_pwd");"
    • define("WP_REDIS_PORT", "redis_database_port")

Local Development

docker build --tag ouorz-wordpress .
docker run -p 8080:80 \
-e WORDPRESS_DB_HOST=[dev_database_host] \
-e WORDPRESS_DB_USER=[dev_database_user] \
-e WORDPRESS_DB_PASSWORD=[dev_database_pwd] \
-e WORDPRESS_DB_NAME=[dev_database_name] \
-e WORDPRESS_DEBUG=true \
-e WORDPRESS_CONFIG_EXTRA="define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);" \
-e WORDPRESS_TABLE_PREFIX=[dev_database_prefix] \
ouorz-wordpress


Analytics App

This project is based on Umami

Geolocation Data Access

Follow the instructions here → to sign up for Maxmind GeoLite2, and retrieve a license key


Project Setup

git clone [email protected]:ttttonyhe/ouorz-mono.git
pnpm install
cd apps/analytics

Create a .env file with your configuration, see below for a list of environment variables used in this project:

  • DATABASE_URL
  • HASH_SALT
  • MAXMIND_LICENSE_KEY
pnpm --filter @ouorz/analytics run build-postgresql-client
pnpm run dev:analytics


Twilight Toolkit

A super opinionated front-end toolkit library

twilight-toolkit-storybook

UI

Storybook: https://ui.twilight-toolkit.ouorz.com →

Currently only available in React, Foundation/Adaptor implementation is coming soon.


Utilities

Work in progress



Monorepo

Tooling

Build system: Turborepo with Remote Caching

Monorepo Manager: PNpm


Practices

Running Scripts

  • Use project aliases to run commands in different packages more easily:
    pnpm --filter @ouorz/main run upgrade
  • Use pre-defined Turborepo scripts whenever content awareness (i.e. caching) is needed:
    pnpm run build:main

Managing Dependencies

  • Root package.json should only contain development dependencies

WIP


Statistics

Repobeats analytics image



Development

Gitflow

Not really following this though...

git_branching_workflow


E2E Testing

Test runner: Cypress

Start server:

pnpm run build:main
pnpm run start:main

# or
cd apps/main
pnpm run dev:test

Run tests:

pnpm run test:main

apps/main uses Cypress Dashboard, disable it by changing the configuration file accordingly.



Deployment

apps/wordpress

Build then deploy the Docker image via apps/wordpress/Dockerfile.

Note: by default, the image listens on port 80, rather than the more common 8080


apps/main

This project utilizes a combination of Server-side Rendering (SSR) and (On-demand) Incremental Static Generation (ISG):

pnpm run build:main
pnpm run start:main

apps/analytics

pnpm run build:analytics
pnpm run start:analytics

packages/twilight-ui

To deploy the storybook, export it as a static web app:

pnpm run build:twilight:ui:storybook

Deploy with Fly.io

Configuration file fly.toml can be found under apps/wordpress. Persistent storage should mount to /var/www/html/wp-content.

fly launch

fly secrets set \
WORDPRESS_DB_HOST=[dev_database_host] \
WORDPRESS_DB_USER=[dev_database_user] \
WORDPRESS_DB_PASSWORD=[dev_database_pwd] \
WORDPRESS_DB_NAME=[dev_database_name] \
WORDPRESS_DEBUG=false \
WORDPRESS_TABLE_PREFIX=[dev_database_prefix] \

fly deploy

Optionally, volumes with the same name can be created in multiple Fly.io regions which allows Fly to run one or more instances of the app in multiple regions:

fly volumes create ouorz_wordpress_wp_content --region yyz --size 1 --no-encryption
fly volumes create ouorz_wordpress_wp_content --region fra --size 1 --no-encryption
fly volumes create ouorz_wordpress_wp_content --region hkg --size 1 --no-encryption
fly scale count 3

Optionally, Fly.io offers full-managed Redis databases which can be created using the following commands:

fly redis create

Traffic is automatically routed through a private IPv6 address restricted to your Fly organization.


Deploy with Vercel / Netlify

Make sure to set root directory path to apps/<project-name>, then update build command to the following:

cd ../.. && pnpm run build:<project-name>

Deploy with Vercel

Deploy with Netlify


Enabling diff-based deployment is highly recommended:

git diff --quiet HEAD^ HEAD ./

License

GPL-3.0

FOSSA Status

More Repositories

1

tony

An Elegant WordPress Theme Powered by ✌️Vue.js 2
PHP
568
star
2

oblog

A MDX 🔽 based Blog Engine
JavaScript
140
star
3

eugrade

All-in-one 🏫 Learning Management System
JavaScript
116
star
4

snapaper

📰 Past Papers Sharing Platform Based On Vue.js & GCE Guide | CAIE 试卷分享与下载平台
PHP
90
star
5

olog

📔 Online Note-Taking Experience | 即时灵感笔记记录平台
PHP
80
star
6

Zeo_UC

A Powerful WordPress 👶User Center 👶 | Under development
PHP
66
star
7

nexment

A Feature-rich, Framework-agnostic Serverless Comment Library
TypeScript
32
star
8

ouorz-legacy

基于 King 主题使用 Vue.js 重构的WordPress个人博客主题
CSS
31
star
9

antony-nuxt

👏 Codes that Power ouorz.com | A Tiny Little Nuxt.js + WP REST API App 博客前端
Vue
21
star
10

antony

An Elegant Blog SPA Base on 🙅‍♂️Vue.js + WP REST API | WordPress 主题 Tony 前后端分离版本
Vue
18
star
11

odoc

Next.js based Static 📓 Documentation Site Generator
TypeScript
17
star
12

virus_notificator_vue

A COVID-19 Virus Stats Tracking and Notification Platform | 新型冠状病毒疫情数据 📩订阅平台
Vue
12
star
13

nexment-vue

Nexment for Vue, a serverless comment library
Vue
10
star
14

half-ucenter

Half User Center WordPress Plugin (Under Development)
PHP
7
star
15

NeteaseMusic

A Quick Download Extension Based on ✌️Vue.js & AntD
HTML
6
star
16

virus_notificator_node

Node.js Back-End of a COVID-19 Virus Stats Tracking and Notification Platform | 一个新型冠状病毒疫情数据订阅平台后端
JavaScript
4
star
17

aliwe_pay

An Elegant 📱 Alipay & Wechat Pay Payment Gateway
PHP
4
star
18

devDiary

Tony's Development Diary
TypeScript
3
star
19

query

An Optimized Version of Anhui Polytechnic University Query System
PHP
3
star
20

prettypiazza

A Browser Extension for Beautifying Piazza Classes Website UI
CSS
2
star
21

kukfm

已知未知播客 Known Unknowns Podcast
TypeScript
2
star
22

algorithm_learning

算法学习之路(先用Php写一遍十大经典)
PHP
2
star
23

farewell-zeo

Farewell ZEO.IM
HTML
1
star
24

.github

1
star
25

dotfiles

An opinionated dotfile collection
JavaScript
1
star
26

odraw_2021

Just a copy of ODraw
TypeScript
1
star
27

nexment-demo

TypeScript
1
star
28

odraw

A straws drawing platform
TypeScript
1
star
29

ttttonyhe

A ✨special ✨ repository
1
star
30

create-odoc-site

A CLI tool that helps you quickly setup an ODoc site
JavaScript
1
star
31

snapod-docs

Snapod User Manual
TypeScript
1
star
32

HoHar

#️⃣ The New HoHar Based on Vue.js & Element UI
PHP
1
star
33

IGEM_CDHSU

A Simple HTML Page for the 2018 IGEM Team CDHSU_China's Project
HTML
1
star
34

Zera_Conference

A Simple HTML Page for Z-era Internet Conference
JavaScript
1
star
35

odraw-server

JavaScript
1
star