通过在内部操作实时协作编辑工具” HackMD”并添加我喜欢的功能,使我感到高兴的一个故事


简介

最近,我担心自己的睡觉的脸,所以我记录下来并观看了它。
是@ k-waragai完全失去了下巴,完全处于Pipimi-chan的状态。
我决定减肥是在十二月。

顺便问一下,您在工作期间是否保留工作日志等?

我做笔记的目的是通过口头表达和与他人分享来确认没有疏忽。

通过继续总结在实施过程中发现的事实,背景,错误等作为备忘录
在创建PR时创建描述时,它也很有用,并且还可以节省时间。
这很简单,因为您只需粘贴 ???

如果您提到著名的备忘录工具,

  • 印象笔记
  • 黑客MD
  • Qiita或Qiita团队
  • DocBase

周围没有很多人在使用吗?

其中,这次要注意" HackMD"
我想我会写一个故事,让我在尝试本地操作并添加我最喜欢的功能时感到很高兴。
(这是一篇文章,每个人都应该使用它,因为" Hack MD"是总体上最好的)

为什么HackMD好?我比较了

通过比较著名的备忘录工具,我发现DocBase和HackMD很好。
*摘要基于个人印象

<表格>

服务名称

共同编辑

图片上传

Markdown

基于备注的角色限制功能

价格

个人喜好


<身体>

Evernote

×

-

基本:免费加:¥3,100 /年

×

HackMD

个人使用:免费企业:需要咨询(根据人数,每人大约500日元)


Qiita Team

×

微观:¥1,520 /月额外:¥15,300 /月


DocBase

入门级:每月900日元高级版:每月19,500日元




我认为Qiita Team或DocBase可以很好地用作个人文档,但是它经过了精心设计,可以用作工作备忘录。
它不是很好,因为它将与重要文档混在一起。

DocBase具有一个名为"专用"的角色设置,因此我曾经为自己的记事板创建一个文档。
但是,它并没有持续很长时间,因为按下保存按钮对我来说很麻烦。
(最后我用Atom做笔记)

我尝试过的最好的方法是" HackMD"。

HackMD可以实时进行共同编辑,并且没有保存按钮,因此始终可以保存。
您还可以导出到PDF,幻灯片等。
您可以进行5种类型的设置,例如只有您自己可以看到的"私人"设置和"锁定"这使得其他人无法编辑。

HackMD和CodiMD

概述

image.png

HackMD是作为实时降价共同编辑工具免费提供的。

HackMD还具有一个称为CodiMD的开源版本。

?? hackmdio / codimd:CodiMD-所有平台上的实时协作降价注释。

CodiMD作为开源提供了HackMD的大部分功能。
您只需克隆这些即可轻松移动HackMD。

许可证也是AGPL。

很好,嘿... .. ..

此外,最近,文档得到了很好的维护和增强。
?? CodiMD文档--HackMD

甚至更多!
Heroku上有一个一键式构建按钮,
?? https://hackmd.io/c/codimd-documentation//s/codimd-heroku-deployment

k8s头盔可用,
?? https://hackmd.io/c/codimd-documentation//s/codimd-kubernetes-deployment

可以使用Docker映像,
?? https://hackmd.io/c/codimd-documentation//s/codimd-docker-deployment

感觉就像CodiMD,因为它在许多领域都有很多覆盖物(?'Ω'?)?

让我们先克隆

节点似乎是Node.js 8.x LTS up to 11.x.
(所以看来您应该使它等于或大于8且等于或小于12)

顺便说一句,大约一年前,我不保证节点6或更高!我应该说
如果您注意到它,则它与该版本兼容,因此维护得相当好(?Ω?*)至少可以说是最好的吗?
我自己为本地开发构建Docker的美好回忆...

苹果系统

1
2
$ git clone https://github.com/hackmdio/codimd.git
$ cd codimd

我查看了环境变量和配置文件,并总结了必要的信息

有关环境变量,请参见此处。

  • 配置

生产操作中应设置的最小项目如下

config.json

<表格>

环境

示例值

说明


<身体>

日志级别

信息

定义提供给标准输出的日志类型。

gyokuro-team.com

域名

useSSL

true

使用SSL?

protocolUseSSL

true

您是否使用SSL协议?

urlAddPort

80

应用程序端口号

allowAnonymousEdits

允许匿名用户编辑

defaultPermission

私有

默认权限设置 -free:任何人都可以查看和编辑 -editable:查看并编辑(如果已登录) -limited:Guest除了可以查看之外并已被锁定:只能编辑所有者,受保护:只有来宾以外的所有者可以查看和编辑-私人:仅所有者可以被查看和编辑

allowEmailRegister

我可以通过电子邮件注册吗?

电子邮件

您是否要允许电子邮件登录?

allowGravatar

您是否使用化身

sslKeyPath

./cert/privkey.pem

使用SSL时指定私钥位置

sslCertPath

./cert/cert.pem

使用SSL时指定证书位置

dhParamPath

./cert/fullchain.pem

使用SSL时指定FullChain位置

sslCAPath

./certchain.pem/

使用SSL时指定CA位置

imageuploadtype

s3

用于上传的图像存储 -imgur -s3 -minio -azure -文件系统

github

{clientID:" x",clientSecret:" x"}

在github上启用注册时

s3bucket

hackmd-bucket

指定使用s3上传时

数据库

各种

数据库配置信息


环境变量

<表格>

环境

示例值

说明


<身体>

NODE_ENV

生产

环境状态

HMD_IMAGE_UPLOAD_TYPE

s3

如何上传图片

CMD_DOMAIN

生产

域名

CMD_URL_ADDPORT

生产

端口号

HMD_DB_URL

示例:mysql:// hackmd:[email protected]:3306 / hackmd

放置mysql或PostgreSQL的


让我们在本地运行它(Docker)

如您在

文档中所见,分发了codimd的图像。
image: nabo.codimd.dev/hackmdio/hackmd:1.4.0
?? Docker部署

但是,这次我不会使用它。
原因是我过去做的时候是节点6.x系统
因为11.x系列是当时的最新版本,所以我真的很想使其成为11.x系列,因此我以最低要求的配置自己制造了它,因此我将对其进行介绍。

步骤1.创建docker-compose.yml

苹果系统

1
$ touch docker-compose.yml

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
version: '3'
services:

  # MySQL
  database:
    image: mariadb:10.4.4
    container_name: hackmd_mysql
    environment:
      MYSQL_USER: "${MYSQL_USER:-hackmd}"
      MYSQL_PASSWORD: "${MYSQL_PASSWORD:-hackmdpass}"
      MYSQL_DATABASE: "${MYSQL_DATABASE:-hackmd}"
      MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD:-rootpassword}"
    volumes:
      - database:/var/lib/mysql
      - ./provisioning/resources/utf8mb4.cnf:/etc/mysql/conf.d/utf8mb4.cnf
    restart: always
    ports:
      - "${MYSQL_USE_PORT:-3306}:3306"
    networks:
      - app-net

  # Node.js
  app:
    build:
      context: .
      dockerfile: ./provisioning/Dockerfile
    container_name: hackmd_app
    tty: true
    volumes:
      - .:/app
      - /app/node_modules
    working_dir: /app
    env_file:
      - ./provisioning/docker-env
    restart: always
    depends_on:
      - database
    ports:
      - "${APP_USE_PORT:-3000}:3000"
    networks:
      - app-net

networks:
  app-net:
    driver: bridge

volumes:
  database:

Step2。创建Dcokerfile等

苹果系统

1
2
3
4
5
$ mkdir -p provisioning/resources
$ touch provisioning/Dockerfile
$ touch provisioning/resources/utf8mb4.cnf
$ touch provisioning/docker-env
$ touch provisioning/resources/docker-entrypoint.sh
  • Docker文件

供应/ Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
FROM node:11.14.0-stretch

ENV DEBCONF_NOWARNINGS=yes

# Set some default config variables
ENV DOCKERIZE_VERSION=v0.6.1

RUN wget https://github.com/jwilder/dockerize/releases/download/${DOCKERIZE_VERSION}/dockerize-linux-amd64-${DOCKERIZE_VERSION}.tar.gz && \
    tar -C /usr/local/bin -xzvf dockerize-linux-amd64-${DOCKERIZE_VERSION}.tar.gz && \
    rm dockerize-linux-amd64-${DOCKERIZE_VERSION}.tar.gz

RUN mkdir /app
WORKDIR /app
COPY . /app

# update
RUN apt-get update

# install
RUN apt-get install -y build-essential vim

RUN yarn install && \
    yarn global add webpack && \
    npm run build

EXPOSE 3000

COPY ./provisioning/resources/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh

ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]

CMD ["node", "app.js"]
  • utf8mb4.cnf

供应/资源/ utf8mb4.cnf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# MariaDB-specific config file.
# Read by /etc/mysql/my.cnf

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
collation-server=utf8mb4_general_ci
init-connect='SET NAMES utf8mb4'
character-set-server=utf8mb4

# Import all .cnf files from configuration directory
!includedir /etc/mysql/mariadb.conf.d/
  • docker环境

.envrc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# dockerで動かすのはdevelopment前提です。

NODE_ENV=development
CMD_CONFIG_FILE=config.json
DEBUG=true
CMD_LOGLEVEL=info
CMD_PROTOCOL_USESSL=false
CMD_URL_ADDPORT=false
CMD_USECDN=true
CMD_ALLOW_ANONYMOUS=false
CMD_ALLOW_ANONYMOUS_EDITS=false
CMD_ALLOW_FREEURL=false
CMD_DEFAULT_PERMISSION=limited
CMD_EMAIL=false
CMD_ALLOW_PDF_EXPORT=true
CMD_ALLOW_EMAIL_REGISTER=false
CMD_ALLOW_GRAVATAR=true
CMD_IMAGE_UPLOAD_TYPE=filesystem

# Change Require
CMD_DB_URL=mysql://hackmd:hackmdpass@database:3306/hackmd
# Githubログイン使いたいなら
# CMD_GITHUB_CLIENTID={YOUR_GITHUB_CLIENT_ID}
# CMD_GITHUB_CLIENTSECRET={YOUR_GITHUB_SECRET_KEY}

# option: Docker Environment
# MYSQL_USER=
# MYSQL_PASSWORD=
# MYSQL_DATABASE=
# MYSQL_ROOT_PASSWORD=
# APP_USE_PORT=
  • docker-entrypoint.sh

调配/资源/ docker-entrypoint.sh

1
2
3
4
5
6
7
#!/usr/bin/env bash

dockerize -wait tcp://database:3306 -timeout 30s

node_modules/.bin/sequelize db:migrate

exec "$@"

步骤3.准备配置文件等

苹果系统

1
2
$ cp config.json.example config.json
$ cp .sequelizerc.example .sequelizerc
  • config.json

一次,不要考虑提高到SAML或图像S3,而要做到最低。

我想使用Github登录名登录,但是稍后我将对其进行更改,因此在此我将不做。

config.json

1
2
3
4
5
6
7
8
9
10
{
  "development": {
    "useSSL": false,
    "tmpPath": "./tmp/",
    "defaultNotePath": "./public/default.md",
    "docsPath": "./public/docs",
    "viewPath": "./public/views",
    "uploadsPath": "./public/uploads"
  }
}

Step4。让我们尝试使用docker up

苹果系统

1
$ docker-compose up -d

现在您可以通过访问localhost:3000 来查看它

地方发展在进行中吗(?'Ω'?)?

image.png

*如果访问后出现类似构建错误的屏幕,请尝试以下操作。

1
2
$ docker-compose run --rm app npm run build
$ docker-compose run --rm yarn install

步骤5,让我们更改标题

修复了public/views/index/body.ejs

的第43行附近的以下内容

1
2
- <h1 class="cover-heading"><i class="fa fa-file-text"></i> CodiMD</h1>
+ <h1 class="cover-heading"><i class="fa fa-file-text"></i> k-waragaiMD</h1>

image.png

这个('?`∩)↑年龄↑

的动机

Step6。让我们启用Github登录

转到

?? https://github.com/settings/developers并单击New OAuth App

输入所需的信息,然后单击Register application

OAuth_application_settings.png

吐出

ClientIDSecretKey时记下它们。

OAuth_application_settings.png

一次执行docker-compose down

编辑

docker-env。

docker环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
...

  # Change Require
  CMD_DB_URL=mysql://hackmd:hackmdpass@database:3306/hackmd
  # Githubログイン使いたいなら
- # CMD_GITHUB_CLIENTID={YOUR_GITHUB_CLIENT_ID}
- # CMD_GITHUB_CLIENTSECRET={YOUR_GITHUB_SECRET_KEY}
+ CMD_GITHUB_CLIENTID=SampeClientIdDesu
+ CMD_GITHUB_CLIENTSECRET=SampeSecretKeyDesu

  # option: Docker Environment
  # MYSQL_USER=
  # MYSQL_PASSWORD=
  # MYSQL_DATABASE=
  # MYSQL_ROOT_PASSWORD=
  # APP_USE_PORT=

编辑完成后,执行docker-compose up -d
现在将出现以前不存在的サインイン按钮。

如果您尝试登录,则可以登录,因为您可以从Github获取用户名等。
image.png

让我们在EC2(主机)

上运行它

我想大致在不使用docker的情况下在Ubuntu上构建它。
我认为有一些基本的安全设置等,因此我将省略它们。

我说的是您已经使用EC2的状态。

步骤1.准备工作

  • apt更新升级

EC2实例[ubuntu用户]

1
2
$ sudo apt update
$ sudo apt upgrade

Step2。创建用户并添加sudo组

EC2实例[ubuntu用户]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# ユーザーの作成
$ sudo adduser hackmd
    Adding user `hackmd' ...
    Adding new group `hackmd' (1001) ...
    Adding new user `hackmd' (1001) with group `hackmd' ...
    Creating home directory `/home/hackmd' ...
    Copying files from `/etc/skel' ...
    Enter new UNIX password: passwordを入力...
    Retype new UNIX password: passwordを入力...
    passwd: password updated successfully
    Changing the user information for hackmd
    Enter the new value, or press ENTER for the default
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:

# sudo グループへ hackmd ユーザーを追加
$ sudo gpasswd -a hackmd sudo

# スイッチッ!!!!!!
$ sudo su - hackmd

第三步:安装必需的软件包

  • 安装似乎是核心的东西

EC2实例[hackmd用户]

1
[hackmd]$ sudo apt-get install -y git build-essential wget vim unzip libssl-dev python
  • nvm安装

EC2实例[hackmd用户]

1
2
3
4
5
6
7
[hackmd]$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.35.0/install.sh | bash
[hackmd]$ export NVM_DIR="$HOME/.nvm"
[hackmd]$ [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[hackmd]$ [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
[hackmd]$ source ~/.bashrc
[hackmd]$ nvm --version
0.35.0
  • 安装节点

EC2实例[hackmd用户]

1
2
3
4
[hackmd]$ nvm install v11.14.0
[hackmd]$ nvm use v11.14.0
[hackmd]$ node -v
11.14.0
  • 纱线安装

EC2实例[hackmd用户]

1
2
3
4
5
6
7
[hackmd]$ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
[hackmd]$ echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
[hackmd]$ sudo apt-get update && sudo apt-get -y install yarn
[hackmd]$ export PATH="$PATH:/opt/yarn-1.15.2/bin"
[hackmd]$ source ~/.bashrc
[hackmd]$ yarn -v
1.15.2
  • mariaDB安装(MySQL很好)

EC2实例[hackmd用户]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
[hackmd]$ curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
[hackmd]$ sudo apt -y update
[hackmd]$ apt install -y mariadb-server-10.3
[hackmd]$ mysql_secure_installation


        Enter current password for root (enter for none):
        > パスワード

        Change the root password? [Y/n]
        > Y
        > New password: パスワード
        > Re-enter new password: パスワード

        Remove anonymous users? [Y/n]
        > n

        Disallow root login remotely? [Y/n]
        > Y

        Remove test database and access to it? [Y/n]
        > Y

        Reload privilege tables now? [Y/n]
        > Y

[hackmd]$ mysql -uroot -p -h 127.0.0.1 -e "show databases;"
> ルートパスワード

        +--------------------+
        | Database           |
        +--------------------+
        | information_schema |
        | mysql              |
        | performance_schema |
        +--------------------+

# ユーザー作成
[hackmd]$ mysql -uroot -p -h 127.0.0.1 -e "CREATE USER ユーザー名 IDENTIFIED BY 'パスワード';"

# 権限付与
[hackmd]$ mysql -uroot -p -h 127.0.0.1 -e "GRANT ALL ON *.* TO 'ユーザー名'@'localhost' IDENTIFIED BY 'パスワード';"

# 適用
[hackmd]$ mysql -uroot -p -h 127.0.0.1 -e "FLUSH PRIVILEGES;"

[hackmd]$ mysql -uユーザー名 -p -h 127.0.0.1 -e "create database データベース名;"
  • Nginx的

EC2实例[hackmd用户]

1
2
3
4
5
[hackmd]$ curl http://nginx.org/keys/nginx_signing.key | sudo apt-key add -
[hackmd]$ VCNAME=`cat /etc/lsb-release | grep DISTRIB_CODENAME | cut -d= -f2` && sudo -E sh -c "echo "deb http://nginx.org/packages/ubuntu/ $VCNAME nginx" >> /etc/apt/sources.list"
[hackmd]$ VCNAME=`cat /etc/lsb-release | grep DISTRIB_CODENAME | cut -d= -f2` && sudo -E sh -c "echo "deb-src http://nginx.org/packages/ubuntu/ $VCNAME nginx" >> /etc/apt/sources.list"
[hackmd]$ sudo apt-get update
[hackmd]$ sudo apt-get install -y nginx

Step4。储存库克隆和配置

诸如

github上的.netrc之类的设置将被省略一次。
另外,config.json和sequelizerc与本地时几乎相同,因此您可以跳过它们。
但是,由于SSL,环境变量等已略有增加。

EC2实例[hackmd用户]

1
2
3
4
[hackmd]$ git clone https://github.com/hackmdio/codimd.git
[hackmd]$ cd codimd
[hackmd]$ cp .sequelizerc.example .sequelizerc
[hackmd]$ cp config.json.example config.json
  • utf8mb4.cnf的设置

EC2实例[hackmd用户]

1
[hackmd]$ sudo vim /etc/mysql/mariadb.conf.d/utf8mb4.cnf

/etc/mysql/mariadb.conf.d/utf8mb4.cnf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    # MariaDB-specific config file.
    # Read by /etc/mysql/my.cnf

    [client]
    default-character-set=utf8mb4

    [mysql]
    default-character-set=utf8mb4

    [mysqld]
    collation-server=utf8mb4_general_ci
    init-connect='SET NAMES utf8mb4'
    character-set-server=utf8mb4

    # Import all .cnf files from configuration directory
    !includedir /etc/mysql/mariadb.conf.d/
  • config.json设置

  • 将图像上传到S3

  • 登录名禁止电子邮件注册,只有Github登录名

  • 来宾用户无法编写和浏览

  • 指定域

我们将以

的形式创建一个配置。

SSL在此阶段尚未完成,但稍后会完成。

Github

EC2实例[hackmd用户]

1
[hackmd]$ vim config.json

config.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{
  "production": {
    "loglevel": "info",
    "useSSL": false,
    "protocolUseSSL": false,
    "domain": "xxxxxxxxxxx.com", #--ドメインがあるのであれば
    "urlAddPort": "80",
    "allowAnonymousEdits": false,
    "defaultPermission": "private",
    "allowEmailRegister": false,
    "email": false,
    "allowGravatar": true,
    "db": {
      "username": "xxxxxxxxxxx",
      "password": "xxxxxxxxxxx",
      "database": "xxxxxxxxxxx",
      "host": "127.0.0.1",
      "port": "3306",
      "dialect": "mysql"
    },
    "github": {
      "clientID": "xxxxxxxxxxxxxxxxxxxxxx",
      "clientSecret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    },
    "imageuploadtype": "s3",
    "s3": {
      "accessKeyId": "xxxxxxxxxxxxxxxxxxxxxx",
      "secretAccessKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "region": "ap-northeast-1"
    },
    "s3bucket": "codimd-production"
  }
}
  • Nginx设置

EC2实例[hackmd用户]

1
[hackmd]$ sudo vim /etc/nginx/conf.d/node-app.conf

/etc/nginx/conf.d/node-app.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
server {
  listen 80;
  # listen  443 ssl;
  ssl on;

  # 編集すること
  server_name  {YOUR_DOMAIN}.com;

  # 今はまだ使わない
  # ssl_certificate      /etc/letsencrypt/live/{YOUR_DOMAIN}.com/fullchain.pem;
  # ssl_certificate_key  /etc/letsencrypt/live/{YOUR_DOMAIN}.com/privkey.pem;

  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

  proxy_redirect                          off;
  proxy_set_header Host                   $host;
  proxy_set_header X-Real-IP              $remote_addr;
  proxy_set_header X-Forwarded-Host       $host;
  proxy_set_header X-Forwarded-Server     $host;
  proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;

  location / {
    proxy_pass https://localhost:3000;
      proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
  }

  # あとで SSL取得に使う
  location ^~ /.well-known/acme-challenge/ {
    default_type "text/plain";
    root         /home/hackmd/codimd/public;
  }

  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   /home/hackmd/codimd/public;
  }
}

EC2实例[hackmd用户]

1
[hackmd]$ sudo systemctl restart nginx
  • 如果是自由帧,则RAM受到限制,因此请创建一个SWAP区域

EC2实例[hackmd用户]

1
2
3
4
[hackmd]$  sudo dd if=/dev/zero of=/swap bs=1M count=1024
[hackmd]$  sudo mkswap /swap
[hackmd]$  sudo swapon /swap
[hackmd]$  sudo chmod 600 /swap

步骤5.启动

EC2实例[hackmd用户]

1
2
3
4
5
[hackmd:~/codimd]$ yarn install
[hackmd:~/codimd]$ yarn global add webpack
[hackmd:~/codimd]$ npm run build
[hackmd:~/codimd]$ node_modules/.bin/sequelize db:migrate
[hackmd:~/codimd]$ node app.js

步骤6.永久启动应用程序

EC2实例[hackmd用户]

1
2
[hackmd:~/codimd]$ npm install -g forever
[hackmd:~/codimd]$ forever start app.js

Step7。SSL(HTTPS)

这次我们将使用Let's Encrypt

  • certbot挑战

EC2实例[hackmd用户]

1
2
3
4
5
[hackmd:~/codimd]$ mkdir -p .well-known/acme-challenge/
[hackmd:~/codimd]$ chmod 644 .well-known/acme-challenge/
[hackmd:~/codimd]$ cd ~/
[hackmd:~/]$ git clone https://github.com/certbot/certbot.git && cd certbot
[hackmd:~/]$ sudo ./certbot-auto certonly --webroot -w /home/hackmd/codimd/public -d {YOUR_DOMAIN}.com -m {YOUR_MAIL_ADDR} --debug
  • 应用程序侧的对应

EC2实例[hackmd用户]

1
[hackmd:~/]$ cd codimd
  • 更改环境变量

EC2实例[hackmd用户]

1
[hackmd:~/codimd]$ direnv edit .

.ervrc

1
2
- export CMD_PROTOCOL_USESSL=false
+ export CMD_PROTOCOL_USESSL=true
  • 修改config.json

EC2实例[hackmd用户]

1
[hackmd:~/codimd]$ vim config.json

config.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
{
  "production": {
    "loglevel": "info",
-   "useSSL": false,
-   "protocolUseSSL": false,
+   "useSSL": true,
+   "protocolUseSSL": true,
+   "sslKeyPath": "/etc/letsencrypt/live/xxxxxxxxxxx.com/privkey.pem",
+   "sslCertPath": "/etc/letsencrypt/live/xxxxxxxxxxx.com/cert.pem",
+   "dhParamPath": "/etc/letsencrypt/live/xxxxxxxxxxx.com/fullchain.pem",
+   "sslCAPath": ["/etc/letsencrypt/live/xxxxxxxxxxx.com/chain.pem"],
    "domain": "xxxxxxxxxxx.com", #--ドメインがあるのであれば
    "urlAddPort": "80",
    "allowAnonymousEdits": false,
    "defaultPermission": "private",
    "allowEmailRegister": false,
    "email": false,
    "allowGravatar": true,
    "db": {
      "username": "xxxxxxxxxxx",
      "password": "xxxxxxxxxxx",
      "database": "xxxxxxxxxxx",
      "host": "127.0.0.1",
      "port": "3306",
      "dialect": "mysql"
    },
    "github": {
      "clientID": "xxxxxxxxxxxxxxxxxxxxxx",
      "clientSecret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    },
    "imageuploadtype": "s3",
    "s3": {
      "accessKeyId": "xxxxxxxxxxxxxxxxxxxxxx",
      "secretAccessKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "region": "ap-northeast-1"
    },
    "s3bucket": "codimd-production"
  }
}
  • Nginx的变化

EC2实例[hackmd用户]

1
[hackmd:~/codimd]$ sudo vim /etc/nginx/conf.d/node-app.conf

/etc/nginx/conf.d/node-app.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
upstream node-app {
  server localhost:3000;
}

server {
  listen  443 ssl;
  ssl on;

  server_name  xxxxxxxxxxxx.com;

  ssl_certificate      /etc/letsencrypt/live/xxxxxxxxxxx.com/fullchain.pem;
  ssl_certificate_key  /etc/letsencrypt/live/xxxxxxxxxxx.com/privkey.pem;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

  proxy_redirect                          off;
  proxy_set_header Host                   $host;
  proxy_set_header X-Real-IP              $remote_addr;
  proxy_set_header X-Forwarded-Host       $host;
  proxy_set_header X-Forwarded-Server     $host;
  proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;

  location / {
    proxy_pass http://node-app/;
  }

  location ^~ /.well-known/acme-challenge/ {
    default_type "text/plain";
    root         /home/hackmd/codimd/public;
  }

  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   /home/hackmd/codimd/public;
  }
}

EC2实例[hackmd用户]

1
[hackmd:~/codimd]$ sudo systemctl restart nginx

步骤8.重新启动

EC2实例[hackmd用户]

1
[hackmd:~/codimd]$ forever app.js restart

访问!

image.png

对于

Github New OAuth App,请遵循与SSL相同时相同的步骤。

我可以获取密钥并登录吗? \\ Sai&Co /

故障排除

  • 如果使用SSL的质询失败,则可能无法访问.well-known/acme-challenge/作为原因。

    • 尝试类似chmod 644 .well-known/acme-challenge/的操作。

    • 同样,在挑战时,您应该可以通过80号(HTTP)进行访问,因此在更新时不要忘记将其设置为listen 80
  • 这次我还没有发布域设置,但是我有A型设置。 (我使用的是我在Google上购买的域名。)
  • 我试图使其能够自动将团队使用的董事会发布到Qiita团队

    我们的团队占用一个董事会,并且每天都在不断更新。
    板上写的内容如下。

    • 共同事项

      • 带薪天数,弹性工作日等
    • 今天的目标

      • 明确今天要完成的任务
    • 工作日志

      • 工作时,每个人都用h2剪切标题并总结日志等。

    直到现在,我都将所有这些内容复制到第二天的Qiita团队,但是
    好吧,是工程师的灵魂想要自动化甚至一点重复(?Ω?*)这很烦人

    这很容易做到,只需在每个工作日22:00左右使用Cron中的Qiita API运行脚本即可。

    我将放置示例代码。

    post_daily_report_by_cosmos_team.rb

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    require 'net/https'
    require 'mysql2'
    require "json"
    require "date"

    mysql_username = ENV['MYSQL_USERNAME'].freeze
    mysql_password = ENV['MYSQL_PASSWORD'].freeze
    mysql_database = ENV['MYSQL_DATABASE'].freeze
    team_note_id   = ENV['TEAM_NOTE_ID'].freeze
    qiita_api_key  = ENV['QIITA_API_KEY'].freeze
    domain         = ENV['TEAM_DOMAIN'].freeze

    client = Mysql2::Client.new(
      socket: '/var/run/mysqld/mysqld.sock',
      username: mysql_username,
      password: mysql_password,
      encoding: 'utf8',
      database: mysql_database
    )

    statement = client.prepare('SELECT content FROM Notes WHERE id = ?')
    # 事前にタイトルで select しておき ID を控えています。
    # example:
    #   mysql -uhackmd -p hackmd -e "select id from Notes where title = 'cosmos開発日報'"
    results = statement.execute(team_note_id)

    weekday = ["日", "月", "火", "水", "木", "金", "土"]
    today = Date.today
    title = "cosmos開発日報" + today.strftime("%Y/%m/%d (#{weekday[today.wday]})")
    content = ""

    results.each do |row|
      content = row["content"]
    end

    # 組み立て
    qiita = "https://#{domain}.qiita.com/"
    path = '/api/v2/items'
    url = qiita + path

    uri = URI.parse(url)
    http = Net::HTTP.new(uri.host, uri.port)

    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE

    req = Net::HTTP::Post.new(uri.request_uri)
    req["Authorization"] = "Bearer #{qiita_api_key}"
    req["Content-Type"] = "application/json"

    post_data = {
      title: title,
      body: content,
      coediting: true,
      group_url_name: "cosmos",
      private: false,
      tags: [{name: "cosmos"},{name: "日報"}],
      tweet: false,
    }.to_json

    # 投稿
    req.body = post_data
    # 結果
    res = http.request(req)
    puts res.code, res.msg

    crontab

    1
    2
    # Edit this file to introduce tasks to be run by cron.
    00 13 * * 1-5 bash -cl 'cd /home/hackmd/cron_scripts/ && ruby -Ku post_daily_report_by_cosmos_team.rb'

    image.png

    现在每天都这样张贴! \\私人标签/

    这样,您可以添加自己喜欢的功能并将其用作实验站点!

    终于

    这次,我介绍了两种方法,一种是使用docker构建,另一种是直接在主机上构建!
    如果应用它,则可以使其成为ECS(?Ω?*)

    作为工程师,我经常想到:"如果该服务具有此功能,那就太好了……"。

    我认为能够修改最初使用的HackMD很棒。幸福

    我提到HackMD具有企业版,但是在企业版中,它经常变为504,并等待自动恢复。
    有时它会连续发生,有时却不会发生,事实是我们因为不稳定状态持续而提升了内部部署。

    实际尝试时,并不难,您可以轻松扩展功能并播放一段时间(?Ω?*)

    费用还使用EC2实例的免费套餐(t2.micro),但到目前为止,活动用户数从未降至15左右。

    由于图像也提供给S3,因此可以舒适地使用它而不会引起容量压力!

    由于只有

    个字符,因此mysql本身的负担很小,因此该公司的大约50个人使用的免费框架似乎没有问题。

    请尝试使用CodiMD(?Ω?*)再见

    ?? hackmdio / codimd:CodiMD-所有平台上的实时协作降价注释。

    还有更好的工具!请告诉我!

    我也做Twitter,所以请关注我。
    ?鹎褂鉓ayo(@mayoxtuna)/ Twitter
    寻找朋友与Apex Legends(PC版)发展兴趣吗?(?'Ω'?)?

    下次通知

    明天是平安夜?(?'Ω'?)???:.。 。:愿您的圣诞节愿望成真:.. 。:??

    12月24日是众筹工程师@cesare的"支持多项工作的技术"!
    期待吗?再见

    2019/12/24附录

    在发布本文之后,我通过Twitter从HackMD的首席执行官那里获得了直接的感谢DM。
    因此,有人告诉我有关成为504企业版的问题。

    目前,它仍在高性能下运行,据说不会出现这些问题(?Ω?*)

    不断发展的HackMD是最好的(?'?'?)?