From a64756b29ecb12eeb0b3bdc1765af1c497b37d99 Mon Sep 17 00:00:00 2001 From: Vincent Zhong Date: Fri, 15 Nov 2024 02:48:42 +0800 Subject: [PATCH] add "how to deploy docusaurus site" artical. --- README.md | 42 +------- docs/docusaurus/_category_.json | 8 ++ docs/docusaurus/deploy.md | 113 +++++++++++++++++++++ docs/docusaurus/dns.md | 6 ++ docs/docusaurus/install.mdx | 27 +++++ docs/docusaurus/intro.md | 18 ++++ docs/intro.md | 2 +- docs/tutorial-basics/markdown-features.mdx | 8 +- docusaurus.config.js | 39 +++---- src/pages/index.js | 5 +- src/pages/intro.md | 1 + src/pages/my-react-page.md | 11 ++ static/img/docusaurus.png | Bin 5142 -> 0 bytes static/img/favicon.ico | Bin 3626 -> 209762 bytes static/img/french-fries.png | Bin 0 -> 8434 bytes static/img/logo.svg | 30 +++++- 16 files changed, 245 insertions(+), 65 deletions(-) create mode 100644 docs/docusaurus/_category_.json create mode 100644 docs/docusaurus/deploy.md create mode 100644 docs/docusaurus/dns.md create mode 100644 docs/docusaurus/install.mdx create mode 100644 docs/docusaurus/intro.md create mode 100644 src/pages/intro.md create mode 100644 src/pages/my-react-page.md delete mode 100644 static/img/docusaurus.png create mode 100644 static/img/french-fries.png diff --git a/README.md b/README.md index 0c6c2c2..e1ff6d8 100644 --- a/README.md +++ b/README.md @@ -1,41 +1,3 @@ -# Website +# fpac(fries port academy of sciencs website) -This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator. - -### Installation - -``` -$ yarn -``` - -### Local Development - -``` -$ yarn start -``` - -This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. - -### Build - -``` -$ yarn build -``` - -This command generates static content into the `build` directory and can be served using any static contents hosting service. - -### Deployment - -Using SSH: - -``` -$ USE_SSH=true yarn deploy -``` - -Not using SSH: - -``` -$ GIT_USER= yarn deploy -``` - -If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. +this project is a website, which is deploy to `www.friesport.ac.cn`. I hope you can learn something from it. diff --git a/docs/docusaurus/_category_.json b/docs/docusaurus/_category_.json new file mode 100644 index 0000000..61f6b23 --- /dev/null +++ b/docs/docusaurus/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Docusaurus部署教程", + "position": 1, + "link": { + "type": "generated-index", + "description": "自己部署一个Docusurus站点" + } +} diff --git a/docs/docusaurus/deploy.md b/docs/docusaurus/deploy.md new file mode 100644 index 0000000..e907e17 --- /dev/null +++ b/docs/docusaurus/deploy.md @@ -0,0 +1,113 @@ +--- +sidebar_position: 3 +--- + +# 部署 + +有多种方式部署,最简单的就是直接在服务器上部署,只需要执行下述命令 +```bash +npm run build +npm run serve +``` +最后映射3000端口至公网即可。可以配合cloudflare tunnel或者内网隧穿等方式实现。 + +但是我手边没有能够24小时稳定连接网络的设备,因此我选择托管到免费的github pages。理论上可以部署到任何提供对象存储或者提供静态网站托管的服务商。 + +## 部署到github pages +每个仓库的网站会托管到指定域名,对于薯条港的fpac仓库来说,这个域名是[`friesport.github.io/fpac`](https://friesport.github.io/fpac)。github会从根目录的`.github/workflows`文件夹读取action配置。从官网抄作业,在这个文件夹下创建action配置文件。注意,官网使用的是yarn,这里我替换为npm,如果需要yarn包管理器的请摘抄官网的。 +```yaml title=".github\workflows\deploy.yml" +name: Deploy to GitHub Pages + +on: + push: + branches: + - main + # Review gh actions docs if you want to further define triggers, paths, etc + # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#on + +jobs: + build: + name: Build Docusaurus + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: actions/setup-node@v4 + with: + node-version: 18 + cache: npm + + - name: Install dependencies + run: npm ci + - name: Build website + run: npm run build + + - name: Upload Build Artifact + uses: actions/upload-pages-artifact@v3 + with: + path: build + + deploy: + name: Deploy to GitHub Pages + needs: build + + # Grant GITHUB_TOKEN the permissions required to make a Pages deployment + permissions: + pages: write # to deploy to Pages + id-token: write # to verify the deployment originates from an appropriate source + + # Deploy to the github-pages environment + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + + runs-on: ubuntu-latest + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 +``` +另外官网还提供了一份test-deploy的文件,不确定有没有用,反正我也修改了。 +```yaml title=".github\workflows\test-deploy.yml" +name: Test deployment + +on: + pull_request: + branches: + - main + # Review gh actions docs if you want to further define triggers, paths, etc + # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#on + +jobs: + test-deploy: + name: Test deployment + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: actions/setup-node@v4 + with: + node-version: 18 + cache: npm + + - name: Install dependencies + run: npm ci + - name: Test build website + run: npm run build +``` + +在github新建仓库,在本地根目录初始化git仓库,在git中关联远程和本地仓库。然后提交代码并推送。 + + + +创建一个新分支gh-pages,创建后在仓库的pages中设置推送到gh-pages。 + +可能需要修改环境保护规则,使main分支能读写github-pages环境。 + +耐心等待action完成任务。 + +## 参考文档 +[Docusurus部署](https://docusaurus.io/zh-CN/docs/deployment) + diff --git a/docs/docusaurus/dns.md b/docs/docusaurus/dns.md new file mode 100644 index 0000000..2f8e3be --- /dev/null +++ b/docs/docusaurus/dns.md @@ -0,0 +1,6 @@ +--- +sidebar_position: 4 +--- + +# 自定义域名 +施工中 \ No newline at end of file diff --git a/docs/docusaurus/install.mdx b/docs/docusaurus/install.mdx new file mode 100644 index 0000000..820c752 --- /dev/null +++ b/docs/docusaurus/install.mdx @@ -0,0 +1,27 @@ +--- +sidebar_position: 2 +--- + +# Docusurus安装 + +## 先决条件 +- 已安装node.js +- (可选)魔法上网 + +## 步骤 +在终端运行命令,你需要将`fpac`改为你自己的项目名。 +```bash +npx create-docusaurus@latest fpac classic +``` +我的命令使用经典模板,且没有使用typescript,如果你需要启用typescript,请在后面加上参数`--typescript`。其他包管理请参见参考文档。 + +进入文件夹安装依赖后可以尝试启动服务,如果成功,应该可以在[`http://localhost:3000`](http://localhost:3000)访问。 +```bash +cd fpac +npm install +npm run start +``` + + +## 参考文档 +[Docusurus安装流程](https://docusaurus.io/zh-CN/docs/installation) \ No newline at end of file diff --git a/docs/docusaurus/intro.md b/docs/docusaurus/intro.md new file mode 100644 index 0000000..e842f77 --- /dev/null +++ b/docs/docusaurus/intro.md @@ -0,0 +1,18 @@ +--- +sidebar_position: 1 +--- + +# Docusurus介绍 + +建站方面当之无愧第一人气的是使用PHP开发的WordPress。WordPress作为一个历史悠久的CMS(内容管理系统)拥有海量的插件以及几乎所有疑难杂症的解决方式。但是WordPress的页面是动态页面,对于我的需求而言太过复杂。因此需要寻找一个更简单直接的解决方案来制作我的网站。 + +我的需求如下: +- 可以简单的通过编写markdown格式的文本制作网页。 +- 可以扩展其他功能。 +- 如果可能的话使用静态网页,以减少服务器方面的开销。 + +对于这类需求,比较符合条件的是文档制作器。其中扩展性主要分为两个阵营:react和vue。react阵营较为出名的是由Meta(Facebook)开发的Docusurus,vue阵营较为出名的是vue自己的主力静态网站生成器vitepress。 + +以前学过一点点Vue3,但是没整明白,又因为学习的课程[MIT WebLab](https://weblab.mit.edu/)使用的是react,并且发现react比vue好理解,最终选择了Docusurus。 + +简中互联网的Docusurus的内容比较少,特此记录一下自己部署笔记。 \ No newline at end of file diff --git a/docs/intro.md b/docs/intro.md index 45e8604..33b9398 100644 --- a/docs/intro.md +++ b/docs/intro.md @@ -1,5 +1,5 @@ --- -sidebar_position: 1 +sidebar_position: 4 --- # Tutorial Intro diff --git a/docs/tutorial-basics/markdown-features.mdx b/docs/tutorial-basics/markdown-features.mdx index 35e0082..393f5f8 100644 --- a/docs/tutorial-basics/markdown-features.mdx +++ b/docs/tutorial-basics/markdown-features.mdx @@ -43,18 +43,18 @@ Let's see how to [Create a page](./create-a-page.md). Regular Markdown images are supported. -You can use absolute paths to reference images in the static directory (`static/img/docusaurus.png`): +You can use absolute paths to reference images in the static directory (`static/img/french-fries.png`): ```md -![Docusaurus logo](/img/docusaurus.png) +![Docusaurus logo](/img/french-fries.png) ``` -![Docusaurus logo](/img/docusaurus.png) +![Docusaurus logo](/img/french-fries.png) You can reference images relative to the current file as well. This is particularly useful to colocate images close to the Markdown files using them: ```md -![Docusaurus logo](./img/docusaurus.png) +![Docusaurus logo](./img/french-fries.png) ``` ## Code Blocks diff --git a/docusaurus.config.js b/docusaurus.config.js index a6c1f00..32d1266 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -76,9 +76,9 @@ const config = { // Replace with your project's social card image: 'img/docusaurus-social-card.jpg', navbar: { - title: 'My Site', + title: '薯条港', logo: { - alt: 'My Site Logo', + alt: 'Fries Port Logo', src: 'img/logo.svg', }, items: [ @@ -86,11 +86,11 @@ const config = { type: 'docSidebar', sidebarId: 'tutorialSidebar', position: 'left', - label: 'Tutorial', + label: '文章', }, - {to: '/blog', label: 'Blog', position: 'left'}, + {to: '/blog', label: '博客', position: 'left'}, { - href: 'https://github.com/facebook/docusaurus', + href: 'https://github.com/friesport/fpac', label: 'GitHub', position: 'right', }, @@ -103,25 +103,29 @@ const config = { title: 'Docs', items: [ { - label: 'Tutorial', - to: '/docs/intro', + label: 'docusaurus文档', + href: 'https://docusaurus.io/zh-CN/docs', }, + { + label: 'MDN互联网文档', + href: 'https://developer.mozilla.org/zh-CN/docs/Web' + }, + { + label: '计算机自学手册', + href: 'https://csdiy.wiki' + } ], }, { title: 'Community', items: [ { - label: 'Stack Overflow', - href: 'https://stackoverflow.com/questions/tagged/docusaurus', - }, - { - label: 'Discord', - href: 'https://discordapp.com/invite/docusaurus', + label: 'matrix', + href: 'https://matrix.to/#/#friesport:mozilla.org', }, { - label: 'X', - href: 'https://x.com/docusaurus', + label: 'bilibili', + href: 'https://space.bilibili.com/1690617042', }, ], }, @@ -134,12 +138,13 @@ const config = { }, { label: 'GitHub', - href: 'https://github.com/facebook/docusaurus', + href: 'https://github.com/friesport/fpac', }, ], }, ], - copyright: `Copyright © ${new Date().getFullYear()} My Project, Inc. Built with Docusaurus.`, + // + copyright: `Copyright © ${new Date().getFullYear()} FriesPort. ALL RIGHTS RESERVED.
粤ICP备2022148146号`, }, prism: { theme: prismThemes.github, diff --git a/src/pages/index.js b/src/pages/index.js index ad054b8..0add728 100644 --- a/src/pages/index.js +++ b/src/pages/index.js @@ -32,8 +32,9 @@ export default function Home() { const {siteConfig} = useDocusaurusContext(); return ( + // ${siteConfig.title} + title={'首页'} + description="fries port is a platform for dreamer, where they can make dream come true. ">
diff --git a/src/pages/intro.md b/src/pages/intro.md new file mode 100644 index 0000000..0117236 --- /dev/null +++ b/src/pages/intro.md @@ -0,0 +1 @@ +这里是薯条港文章频道,记录着笔记、随笔、总结。 \ No newline at end of file diff --git a/src/pages/my-react-page.md b/src/pages/my-react-page.md new file mode 100644 index 0000000..2f6c2a3 --- /dev/null +++ b/src/pages/my-react-page.md @@ -0,0 +1,11 @@ +import React from 'react'; +import Layout from '@theme/Layout'; + +export default function MyReactPage() { + return ( + +

My React page

+

This is a React page

+
+ ); +} \ No newline at end of file diff --git a/static/img/docusaurus.png b/static/img/docusaurus.png deleted file mode 100644 index f458149e3c8f53335f28fbc162ae67f55575c881..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5142 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 F{0H{b<4^zq diff --git a/static/img/favicon.ico b/static/img/favicon.ico index c01d54bcd39a5f853428f3cd5aa0f383d963c484..c4c030b652397d58a1f4c75b60a90b2dfa9518d7 100644 GIT binary patch literal 209762 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 literal 3626 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 Q`G=vQqNCiP_$=bT0Gvs?qyPW_ literal 0 HcmV?d00001 diff --git a/static/img/logo.svg b/static/img/logo.svg index 9db6d0d..b3e736f 100644 --- a/static/img/logo.svg +++ b/static/img/logo.svg @@ -1 +1,29 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + +