陳彥勝
  • NEW!
    NEW!  Connect Ideas Across Notes
    Save time and share insights. With Paragraph Citation, you can quote others’ work with source info built in. If someone cites your note, you’ll see a card showing where it’s used—bringing notes closer together.
    Got it
      • Create new note
      • Create a note from template
        • Sharing URL Link copied
        • /edit
        • View mode
          • Edit mode
          • View mode
          • Book mode
          • Slide mode
          Edit mode View mode Book mode Slide mode
        • Customize slides
        • Note Permission
        • Read
          • Only me
          • Signed-in users
          • Everyone
          Only me Signed-in users Everyone
        • Write
          • Only me
          • Signed-in users
          • Everyone
          Only me Signed-in users Everyone
        • Engagement control Commenting, Suggest edit, Emoji Reply
      • Invite by email
        Invitee

        This note has no invitees

      • Publish Note

        Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note No publishing access yet

        Your note will be visible on your profile and discoverable by anyone.
        Your note is now live.
        This note is visible on your profile and discoverable online.
        Everyone on the web can find and read all notes of this public team.

        Your account was recently created. Publishing will be available soon, allowing you to share notes on your public page and in search results.

        Your team account was recently created. Publishing will be available soon, allowing you to share notes on your public page and in search results.

        Explore these features while you wait
        Complete general settings
        Bookmark and like published notes
        Write a few more notes
        Complete general settings
        Write a few more notes
        See published notes
        Unpublish note
        Please check the box to agree to the Community Guidelines.
        View profile
      • Commenting
        Permission
        Disabled Forbidden Owners Signed-in users Everyone
      • Enable
      • Permission
        • Forbidden
        • Owners
        • Signed-in users
        • Everyone
      • Suggest edit
        Permission
        Disabled Forbidden Owners Signed-in users Everyone
      • Enable
      • Permission
        • Forbidden
        • Owners
        • Signed-in users
      • Emoji Reply
      • Enable
      • Versions and GitHub Sync
      • Note settings
      • Note Insights New
      • Engagement control
      • Make a copy
      • Transfer ownership
      • Delete this note
      • Save as template
      • Insert from template
      • Import from
        • Dropbox
        • Google Drive
        • Gist
        • Clipboard
      • Export to
        • Dropbox
        • Google Drive
        • Gist
      • Download
        • Markdown
        • HTML
        • Raw HTML
    Menu Note settings Note Insights Versions and GitHub Sync Sharing URL Create Help
    Create Create new note Create a note from template
    Menu
    Options
    Engagement control Make a copy Transfer ownership Delete this note
    Import from
    Dropbox Google Drive Gist Clipboard
    Export to
    Dropbox Google Drive Gist
    Download
    Markdown HTML Raw HTML
    Back
    Sharing URL Link copied
    /edit
    View mode
    • Edit mode
    • View mode
    • Book mode
    • Slide mode
    Edit mode View mode Book mode Slide mode
    Customize slides
    Note Permission
    Read
    Only me
    • Only me
    • Signed-in users
    • Everyone
    Only me Signed-in users Everyone
    Write
    Only me
    • Only me
    • Signed-in users
    • Everyone
    Only me Signed-in users Everyone
    Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note No publishing access yet

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.

    Your account was recently created. Publishing will be available soon, allowing you to share notes on your public page and in search results.

    Your team account was recently created. Publishing will be available soon, allowing you to share notes on your public page and in search results.

    Explore these features while you wait
    Complete general settings
    Bookmark and like published notes
    Write a few more notes
    Complete general settings
    Write a few more notes
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       Owned this note    Owned this note      
    Published Linked with GitHub
    2
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    # 環境資訊 為了要快速安裝一套Rancher環境使用,需要一個小的K8s叢集,為此,我們有K3s跟RKE2兩種快速安裝的方法可以使用。 :::warning 不用裝Docker。 K3s與RKE2為SUSE的K8s發行版本,版號與K8s版一致(e.g. K3s 1.31.4 = K8s 1.31.4)。 SUSE提供K3s、RKE2與Rancher的商用支援。 舊版的RKE將在2025七月EoL。 有其他安裝方法,畢竟Rancher是container,需要搭配ingress使用。 ::: :::info K3s對資源的需求低,本文主要使用K3s作為快速安裝說明,Production環境請改用RKE2。 ::: 1. Rancher K3s單節點VM,也可相容於ARM架構,例如樹莓派環境,K8s環境為Rancher下轄之叢集,具備完整K8s架構,在Rancher Production環境建立時,請使用RKE2。 2. 最低資源需求,可參考[K3S](https://docs.k3s.io/installation/requirements#hardware)官方網站 1. Rancher管理節點: 1.1. 建議CPU: 4 core, RAM: 8G, Disk: 80G, 1 NIC可聯外。 2. K8S叢集: 2.1. Master(3 node): 4 core, RAM: 8G, Disk: 80G, 1 NIC可聯外。 2.2. Worker(1+N node): 4 core, RAM: 8G, Disk: 80G, 1 NIC可聯外。 4. K3S版本:v1.31.4+k3s1 5. Rancher版本:2.10.2 6. RKE2版本:1.31+ 7. Helm版本:3.16.4 :::info 為什麼要用nip.io? 因為另外架DNS花時間跟資源,用nip.io的方式直接指向到單節點上去解析就好。 ::: # 1. K3S安裝 ```shell= k3snode:~ # export INSTALL_K3S_VERSION=v1.31.4+k3s1 k3snode:~ # curl -sfL https://get.k3s.io | sh - [INFO] Using v1.31.4+k3s1 as release [INFO] Downloading hash https://github.com/k3s-io/k3s/releases/download/v1.31.4+k3s1/sha256sum-amd64.txt [INFO] Downloading binary https://github.com/k3s-io/k3s/releases/download/v1.31.4+k3s1/k3s [INFO] Verifying binary download [INFO] Installing k3s to /usr/local/bin/k3s [INFO] Skipping installation of SELinux RPM [INFO] Creating /usr/local/bin/kubectl symlink to k3s [INFO] Creating /usr/local/bin/crictl symlink to k3s [INFO] Creating /usr/local/bin/ctr symlink to k3s [INFO] Creating killall script /usr/local/bin/k3s-killall.sh [INFO] Creating uninstall script /usr/local/bin/k3s-uninstall.sh [INFO] env: Creating environment file /etc/systemd/system/k3s.service.env [INFO] systemd: Creating service file /etc/systemd/system/k3s.service [INFO] systemd: Enabling k3s unit Created symlink /etc/systemd/system/multi-user.target.wants/k3s.service → /etc/systemd/system/k3s.service. [INFO] systemd: Starting k3s ``` ## 1.1. 檢查k3s狀態 ```shell= k3snode:~ # systemctl status k3s ● k3s.service - Lightweight Kubernetes Loaded: loaded (/etc/systemd/system/k3s.service; enabled; preset: disabled) Active: active (running) since Mon 2025-02-03 09:15:26 CST; 44s ago Docs: https://k3s.io Process: 20398 ExecStartPre=/bin/sh -xc ! /usr/bin/systemctl is-enabled --quiet nm-cloud-setup.service 2>/dev/null> Process: 20400 ExecStartPre=/sbin/modprobe br_netfilter (code=exited, status=0/SUCCESS) Process: 20406 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS) Main PID: 20408 (k3s-server) Tasks: 92 CPU: 34.880s ``` ## 1.2. 檢查pod是否全部啟動 ```shell= k3snode:~ # kubectl get po -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-ccb96694c-bqzn4 1/1 Running 0 84s kube-system helm-install-traefik-crd-x4pmm 0/1 Completed 0 84s kube-system helm-install-traefik-wwtkk 0/1 Completed 1 84s kube-system local-path-provisioner-5cf85fd84d-kr8x4 1/1 Running 0 84s kube-system metrics-server-5985cbc9d7-7qlm4 1/1 Running 0 84s kube-system svclb-traefik-f6012ca2-6gwjz 2/2 Running 0 60s kube-system traefik-57b79cf995-xm4h5 1/1 Running 0 60s ``` ## 1.3. 檢察節點狀態 ```shell= k3snode:~ # kubectl get no NAME STATUS ROLES AGE VERSION k3snode Ready control-plane,master 4m2s v1.31.4+k3s1 ``` # 2. Helm安裝 Helm需對應K8s的發行版,請參照[Helm Version Support Policy](https://helm.sh/docs/topics/version_skew/) ```shell= k3snode:~ # wget https://get.helm.sh/helm-v3.16.4-linux-amd64.tar.gz --2025-02-03 09:26:40-- https://get.helm.sh/helm-v3.16.4-linux-amd64.tar.gz Resolving get.helm.sh (get.helm.sh)... 13.107.246.73, 2620:1ec:bdf::73 Connecting to get.helm.sh (get.helm.sh)|13.107.246.73|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 17344287 (17M) [application/x-tar] Saving to: ‘helm-v3.16.4-linux-amd64.tar.gz’ helm-v3.16.4-linux-amd64.tar. 100%[================================================>] 16.54M 1.74MB/s in 10s 2025-02-03 09:26:52 (1.63 MB/s) - ‘helm-v3.16.4-linux-amd64.tar.gz’ saved [17344287/17344287] k3snode:~ # tar -zxvf helm-v3.16.4-linux-amd64.tar.gz linux-amd64/ linux-amd64/LICENSE linux-amd64/README.md linux-amd64/helm k3snode:~ # sudo cp linux-amd64/helm /usr/local/bin/ k3snode:~ # helm --help The Kubernetes package manager Common actions for Helm: - helm search: search for charts ... ... ... ``` ## 2.1. 指定helm使用k3s產出的kubeconfig :::warning 需要指定K8s config file給helm使用。 RKE2不用這個步驟。 ::: ```shell= k3snode:~ # export KUBECONFIG=/etc/rancher/k3s/k3s.yaml ``` # 3. cert-manager安裝 Rancher需要使用憑證,可以透過Cert-manager處理。 如果想要自簽憑證的話,可以透過openssl來產生,對指令覺得很生澀的話,可以透過xca來處理,但是要裝GUI才能使用。 ```shell= k3snode:~ # helm repo add jetstack https://charts.jetstack.io "jetstack" has been added to your repositories k3snode:~ # kubectl create namespace cert-manager namespace/cert-manager created k3snode:~ # kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.1/cert-manager.crds.yaml customresourcedefinition.apiextensions.k8s.io/certificaterequests.cert-manager.io created customresourcedefinition.apiextensions.k8s.io/certificates.cert-manager.io created customresourcedefinition.apiextensions.k8s.io/challenges.acme.cert-manager.io created customresourcedefinition.apiextensions.k8s.io/clusterissuers.cert-manager.io created customresourcedefinition.apiextensions.k8s.io/issuers.cert-manager.io created customresourcedefinition.apiextensions.k8s.io/orders.acme.cert-manager.io created k3snode:~ # helm install cert-manager jetstack/cert-manager \ --namespace cert-manager \ --create-namespace \ --version v1.13.1 NAME: cert-manager LAST DEPLOYED: Mon Feb 3 09:41:44 2025 NAMESPACE: cert-manager STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: cert-manager v1.13.1 has been deployed successfully! In order to begin issuing certificates, you will need to set up a ClusterIssuer or Issuer resource (for example, by creating a 'letsencrypt-staging' issuer). More information on the different types of issuers and how to configure them can be found in our documentation: https://cert-manager.io/docs/configuration/ For information on how to configure cert-manager to automatically provision Certificates for Ingress resources, take a look at the `ingress-shim` documentation: https://cert-manager.io/docs/usage/ingress/ k3snode:~ # kubectl -n cert-manager get po NAME READY STATUS RESTARTS AGE cert-manager-6f8689cf7-bxqwk 1/1 Running 0 68s cert-manager-cainjector-7f4fbb5c79-mqkq5 1/1 Running 0 68s cert-manager-webhook-b4bff58b5-xmvz8 1/1 Running 0 68s ``` # 4. Rancher安裝 :::info 1. 商用版本Rancher有指定的repo位置。 2. 社群跟商用版本在新功能支援、安規上會有差異,請多留意。 3. 如果你有自架DNS,可以把hostname換成你要的fqdn,只要全部的節點可以透過DNS解析到即可。 ::: :::danger 從主機上面加fqdn進hosts是沒用的。 ::: ```shell= k3snode:~ # helm repo add rancher-stable https://releases.rancher.com/server-charts/stable "rancher-stable" has been added to your repositories k3snode:~ # helm search repo rancher-stable NAME CHART VERSION APP VERSION DESCRIPTION rancher-stable/rancher 2.10.2 v2.10.2 Install Rancher Server to manage Kubernetes clu... k3snode:~ # helm repo update Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "jetstack" chart repository ...Successfully got an update from the "rancher-stable" chart repository Update Complete. ⎈Happy Helming!⎈ k3snode:~ # helm install rancher rancher-stable/rancher --namespace cattle-system \ --create-namespace --set hostname=rancher.192.168.122.112.nip.io \ --version 2.10.2 --set global.cattle.psp.enabled=false --set replicas=1 NAME: rancher LAST DEPLOYED: Mon Feb 3 09:45:19 2025 NAMESPACE: cattle-system STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: Rancher Server has been installed. NOTE: Rancher may take several minutes to fully initialize. Please standby while Certificates are being issued, Containers are started and the Ingress rule comes up. Check out our docs at https://rancher.com/docs/ If you provided your own bootstrap password during installation, browse to https://rancher.192.168.122.112.nip.io to get started. If this is the first time you installed Rancher, get started by running this command and clicking the URL it generates: echo https://rancher.192.168.122.112.nip.io/dashboard/?setup=$(kubectl get secret --namespace cattle-system bootstrap-secret -o go-template='{{.data.bootstrapPassword|base64decode}}') To get just the bootstrap password on its own, run: kubectl get secret --namespace cattle-system bootstrap-secret -o go-template='{{.data.bootstrapPassword|base64decode}}{{ "\n" }}' Happy Containering! ``` # 4.1. Check cattle-system與取得隨機密碼 ```shell! k3snode:~ # kubectl get po -n cattle-system NAME READY STATUS RESTARTS AGE helm-operation-4mvzp 0/2 Completed 0 3m7s helm-operation-56rf7 0/2 Completed 0 74s helm-operation-87wln 0/2 Completed 0 3m31s helm-operation-htkds 0/2 Completed 0 2m38s helm-operation-jkpgj 0/2 Completed 0 115s helm-operation-js9s7 0/2 Completed 0 2m27s helm-operation-z4zxq 0/2 Completed 0 101s rancher-6fffd8796c-6srtv 1/1 Running 0 5m8s rancher-webhook-554ffd94d8-5h77h 1/1 Running 0 2m23s system-upgrade-controller-5fb67f585d-9zd2q 1/1 Running 0 111s k3snode:~ # kubectl get secret --namespace cattle-system bootstrap-secret -o go-template='{{.data.bootstrapPassword|base64decode}}{{"\n"}}' xfwbrnv6j4r8wcm9tldzjt567tkpmxbsr27hprv4g4t6q94xfq9tfw ``` :::info 登入瀏覽器,進入rancher.192.168.122.112.nip.io 貼上隨機密碼、修改密碼後再次登入。 ::: # 5. 新增k3s叢集 ## 5.1. 建立叢集基本資訊 建立叢集時先點選RKE2/K3s後,點選下方 **Custom** ![截圖 2024-08-02 09.58.24](https://hackmd.io/_uploads/r1jQx6KK0.png) 輸入基本資訊 ![截圖 2025-02-03 09.57.16](https://hackmd.io/_uploads/rkFnGoT_kx.png) ## 5.2. 複製建立指令 :::danger 1. 注意,節點腳色需要特別注意etcd,建議為奇數台,例如1, 3, 5,不可偶數。 2. 不建議把etcd、Control跟worker node在Production環境混用,你可能沒遇過壞人? ::: ![截圖 2024-07-01 12.52.09](https://hackmd.io/_uploads/r1yaInkwC.png) ## 5.3. 貼上註冊腳本 :::info 1. OS可先把防火牆關閉。 2. OS可參考support matrix上所指定的版本。 ::: ```shell= k3scluster1:~ # curl --insecure -fL https://rancher.192.168.122.112.nip.io/system-agent-install.sh | sudo sh -s - --server https://rancher.192.168.122.112.nip.io --label 'cattle.io/os=linux' --token lfj97gnn7r786j9njtrt9z9jbtl9c6lq7m7xzk5gbhw4hn998c5kvt --ca-checksum e8891a52d7b74b83131d744ece0f6e97d2639da48974355c9bbe075f54d10516 --etcd --controlplane --worker % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 33698 0 33698 0 0 102k 0 --:--:-- --:--:-- --:--:-- 102k [INFO] Label: cattle.io/os=linux [INFO] Role requested: etcd [INFO] Role requested: controlplane [INFO] Role requested: worker [INFO] CA strict verification is set to true [INFO] Using default agent configuration directory /etc/rancher/agent [INFO] Using default agent var directory /var/lib/rancher/agent [WARN] /usr/local is read-only or a mount point; installing to /opt/rancher-system-agent [INFO] Successfully downloaded CA certificate [INFO] Value from https://rancher.192.168.122.112.nip.io/cacerts is an x509 certificate [INFO] Successfully tested Rancher connection [INFO] Downloading rancher-system-agent binary from https://rancher.192.168.122.112.nip.io/assets/rancher-system-agent-amd64 [INFO] Successfully downloaded the rancher-system-agent binary. [INFO] Downloading rancher-system-agent-uninstall.sh script from https://rancher.192.168.122.112.nip.io/assets/system-agent-uninstall.sh [INFO] Successfully downloaded the rancher-system-agent-uninstall.sh script. [INFO] Generating Cattle ID [INFO] Successfully downloaded Rancher connection information [INFO] systemd: Creating service file [INFO] Creating environment file /etc/systemd/system/rancher-system-agent.env [INFO] /usr/local is unsuitable for installation: adding fallback path to systemd unit env file. [INFO] Enabling rancher-system-agent.service Created symlink /etc/systemd/system/multi-user.target.wants/rancher-system-agent.service → /etc/systemd/system/rancher-system-agent.service. [INFO] Starting/restarting rancher-system-agent.service ``` ## 5.4. 確認節點進度 部署中。 ![截圖 2025-02-03 10.06.06](https://hackmd.io/_uploads/B1ntHiauke.png) 部署完畢。 ![截圖 2025-02-03 10.09.24](https://hackmd.io/_uploads/r1f5rja_Jg.png) 點擊上方的Explore就可以查看建立好叢集囉。 ## 5.5. 確認環境 確認目前叢集資源狀態 ![截圖 2025-02-03 10.11.50](https://hackmd.io/_uploads/r18VUi6_Je.png) 點選右上角的指令圖示 >_ 確認容器相關狀態 ![截圖 2025-02-03 10.14.38](https://hackmd.io/_uploads/r11i0iad1e.png) :::info 安裝參考影片:https://drive.google.com/file/d/1FlEn7QM-pPMcqIZ_m79ajgqQrVzJnXOC/view?usp=drive_link 其他參考影片:https://drive.google.com/drive/folders/1AZDKx7XTZY6gq_tE24f8kjudJvfF46RX?usp=drive_link RKE2, also known as RKE Government, is Rancher's next-generation Kubernetes distribution. K3s, Lightweight Kubernetes. Easy to install, half the memory, all in a binary of less than 100 MB. :::

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password
    or
    Sign in via Google Sign in via Facebook Sign in via X(Twitter) Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    By signing in, you agree to our terms of service.

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully