웹사이트 검색

Ubuntu 22.04에 표준 노트 서버를 설치하는 방법


이 페이지에서

  1. 전제 조건
  2. 1단계 - 방화벽 구성\n
  3. 2단계 - Docker 및 Docker Compose 설치
  4. 3단계 - Nginx 설치
  5. 4단계 - SSL 설치
  6. 5단계 - 표준 노트 다운로드 및 구성\n
  7. 6단계 - 표준 Notes 서버 시작\n
  8. 7단계 - Nginx 구성
  9. 8단계 - 표준 메모 사용\n
  10. 9단계 - 유료 기능 사용
  11. 10단계 - 파일 업로드를 위한 서버 구성\n
  12. 11단계 - 파일 업로드 테스트
  13. 결론

Standard Notes는 오픈 소스이며 완전히 암호화된 메모 앱입니다. 무료 및 유료 요금제를 모두 제공하며 클라우드 호스팅과 서버에서 호스팅하는 옵션을 모두 제공합니다. 서버를 사용하여 서로 다른 장치 간에 저장된 메모를 동기화할 수 있습니다. Standard Notes는 모든 데스크톱 운영 체제 및 모바일 플랫폼용 앱을 제공합니다.

이 자습서에서는 Ubuntu 22.04 시스템에서 표준 Notes 서버를 자체 호스팅하는 방법을 배웁니다. 자체 호스팅 인스턴스에서 유료 요금제 기능 및 파일 업로드를 활성화하는 방법도 알아봅니다.

전제 조건

  • A server running Ubuntu 22.04 with a minimum of 2 GB of RAM.

  • A non-root user with sudo privileges.

  • The Uncomplicated Firewall(UFW) is enabled and running.

  • A Fully Qualified domain name pointed to the server. For our tutorial, we will be using the domain standardnotes.example.com. You will need another domain name for your file server. We will be using the domain snotes-files.example.com.

  • Everything is updated.

    $ sudo apt update && sudo apt upgrade
    

1단계 - 방화벽 구성

패키지를 설치하기 전 첫 번째 단계는 HTTP 및 HTTPS 연결을 허용하도록 방화벽을 구성하는 것입니다.

방화벽의 상태를 확인하십시오.

$ sudo ufw status

다음과 같은 내용이 표시되어야 합니다.

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

HTTP 및 HTTP 포트를 허용합니다.

$ sudo ufw allow http
$ sudo ufw allow https

상태를 다시 확인하여 확인하십시오.

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443/tcp                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443/tcp (v6)               ALLOW       Anywhere (v6)

2단계 - Docker 및 Docker Compose 설치

Dockers 공식 GPG 키를 추가합니다.

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg

다음 명령을 실행하여 Docker 리포지토리를 추가합니다.

$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Dockers 리포지토리를 포함하도록 시스템을 업데이트합니다.

$ sudo apt update

도커를 설치합니다.

$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

이 자습서에서는 이전 레거시 바이너리 대신 Docker Compose v2 플러그인을 사용합니다. 따라서 이를 실행하는 명령이 docker-compose에서 docker compose로 변경되었으며 여기에 반영됩니다.

Docker는 상승된 권한으로 실행되므로 명령을 실행하려면 sudo를 자주 사용해야 합니다. 더 나은 옵션은 Linux 사용자 계정을 docker 사용자 그룹에 추가하는 것입니다.

$ sudo usermod -aG docker ${USER}

&#36 {USER} 변수는 현재 로그인된 시스템 계정을 선택합니다. 권한을 부여하려는 사용자로 로그인하지 않은 경우 &#36 {USER}를 사용자 이름으로 바꿉니다.

새로운 그룹 가입을 신청하려면 서버에서 로그아웃했다가 다시 로그인하거나 다음 명령을 사용하십시오. 사용자 암호를 묻는 메시지가 나타납니다.

$ su - $(USER)

3단계 - Nginx 설치

Ubuntu 22.04는 이전 버전의 Nginx와 함께 제공됩니다. 최신 버전을 설치하려면 공식 Nginx 저장소를 다운로드해야 합니다.

Nginxs 서명 키를 가져옵니다.

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Nginxs 안정 버전용 리포지토리를 추가합니다.

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list

시스템 리포지토리를 업데이트합니다.

$ sudo apt update

Nginx를 설치합니다.

$ sudo apt install nginx

설치를 확인하십시오.

$ nginx -v
nginx version: nginx/1.22.0

4단계 - SSL 설치

SSL 인증서를 생성하려면 Certbot을 설치해야 합니다. Ubuntus 저장소를 사용하여 Certbot을 설치하거나 Snapd 도구를 사용하여 최신 버전을 가져올 수 있습니다. 우리는 Snapd 버전을 사용할 것입니다.

Ubuntu 22.04는 기본적으로 Snapd가 설치된 상태로 제공됩니다. 다음 명령을 실행하여 Snapd 버전이 최신인지 확인하십시오.

$ sudo snap install core

Certbot을 설치합니다.

$ sudo snap install --classic certbot

다음 명령을 사용하여 /usr/bin 디렉토리에 대한 심볼릭 링크를 생성하여 Certbot 명령을 실행할 수 있는지 확인하십시오.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

SSL 인증서를 생성하려면 다음 명령을 실행하십시오.

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m  -d standardnotes.example.com

위의 명령은 서버의 /etc/letsencrypt/live/standardnotes.example.com 디렉토리에 인증서를 다운로드합니다.

Files 하위 도메인에 대해서도 동일한 작업을 수행해야 합니다.

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m  -d snotes-files.example.com

Diffie-Hellman 그룹 인증서를 생성합니다.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

편집을 위해 /etc/letsencrypt/renewal/standardnotes.example.com.conf 파일을 엽니다.

$ sudo nano /etc/letsencrypt/renewal/standardnotes.example.com.conf

하단에 다음 코드를 붙여넣습니다.

pre_hook = systemctl stop nginx
post_hook = systemctl start nginx

Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

/etc/letsencrypt/renewal/snotes-files.example.com.conf 파일을 편집하여 파일 하위 도메인에 대해 동일한 단계를 반복합니다.

Certbot의 독립 실행형 옵션을 사용하여 SSL 인증서를 생성했습니다. 갱신 중에 Nginx를 종료해야 함을 의미하는 인증서를 생성하기 위해 웹 서버를 실행합니다. pre_hook 및 post_hook 명령은 갱신 전후에 실행되어 Nginx 서버를 자동으로 종료하고 다시 시작하므로 수동 개입이 필요하지 않습니다.

SSL 갱신이 제대로 작동하는지 확인하려면 프로세스를 시험 실행하십시오.

$ sudo certbot renew --dry-run

오류가 표시되지 않으면 모든 설정이 완료된 것입니다. 인증서가 자동으로 갱신됩니다.

5단계 - 표준 노트 다운로드 및 구성

시스템 홈 디렉토리에 있는지 확인하십시오.

$ cd ~

Standard Notes Standalone 리포지토리를 복제합니다.

$ git clone --single-branch --branch main https://github.com/standardnotes/standalone.git

다운로드한 디렉터리로 전환합니다.

$ cd standalone

서버의 기본 구성 파일을 만듭니다.

$ ./server.sh setup

이렇게 하면 구성해야 하는 기본 환경 파일이 생성됩니다. 6개의 서로 다른 비밀 키를 생성해야 합니다. 다음 명령을 사용하여 생성하십시오.

$ openssl rand -hex 32

먼저 메인 폴더에 있는 .env 파일을 편집해야 합니다. 편집을 위해 엽니다.

$ nano .env

다음 변수의 값을 변경합니다.

NODE_ENV=production
..
AUTH_JWT_SECRET=c0f5bcf6f0f0dcca5b9078c3095e4255a055dfd6376b376733af0e50483cc629
..
DB_USERNAME=std_notes_user
DB_PASSWORD=changeme123
..
VALET_TOKEN_SECRET=977c978ca1d5ea22fe2fda65058905b191f724e33db6e47d0a41e034a082cb3b
..
FILES_SERVER_URL=https://snotes-files.example.com

Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

다음으로 docker/auth.env 파일을 엽니다.

$ nano  docker/auth.env

다음 변수의 값을 변경합니다.

JWT_SECRET=54deb1b0b2499e8d875b0d5266dabef9003e13c1787a959a94e339363c10e56e
LEGACY_JWT_SECRET=c36aae01803a616213f22422b6d3f998a2beb2cb53af8b95bf578a8a3d046cec
..
PSEUDO_KEY_PARAMS_KEY=ea09d3f9122b49c653524cd2285a45fee88beb94f9b76d4d25420b521b080fcd
..
ENCRYPTION_SERVER_KEY=04decf379fbe3bb48cf95dbb5997031418b308e724a25d88cb0b2ed6da725efe

Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

6단계 - 표준 Notes 서버 시작

다음 명령을 실행하여 서버를 시작하십시오.

$ ./server.sh start

이 명령을 완료하는 데 몇 분 정도 걸립니다. 이 시간 동안 프로세스는 모든 관련 Docker 이미지를 가져오고 모든 서비스에 대한 컨테이너를 생성합니다. 또한 데이터베이스를 채우고 적절한 마이그레이션을 수행합니다.

다음 명령을 사용하여 프로세스에 대한 로그를 확인할 수 있습니다.

$ ./server.sh logs

Ctrl + C를 눌러 로그를 종료합니다. 다음 명령을 사용하여 실행 중인 컨테이너의 상태를 확인할 수 있습니다.

$ ./server.sh status

비슷한 출력을 받게 됩니다.

Services State:
NAME                                  COMMAND                  SERVICE                    STATUS              PORTS
api-gateway-standalone                "./wait-for.sh auth …"   api-gateway                running             0.0.0.0:3000->3000/tcp, :::3000->3000/tcp
auth-standalone                       "./wait-for.sh db 33…"   auth                       running
auth-worker-standalone                "./wait-for.sh db 33…"   auth-worker                running
cache-standalone                      "docker-entrypoint.s…"   cache                      running             6379/tcp
db-standalone                         "docker-entrypoint.s…"   db                         running             3306/tcp
files-standalone                      "./wait-for.sh db 33…"   files                      running             0.0.0.0:3125->3000/tcp, :::3125->3000/tcp
syncing-server-js-standalone          "./wait-for.sh db 33…"   syncing-server-js          running
syncing-server-js-worker-standalone   "./wait-for.sh db 33…"   syncing-server-js-worker   running

다음 명령을 사용하여 서버의 상태를 확인할 수 있습니다.

$ curl http://localhost:3000/healthcheck
OK

Standard Notes는 기본적으로 포트 3000을 사용합니다. .env 파일에서 다른 포트를 구성한 경우 위 명령에서 업데이트해야 합니다.

7단계 - Nginx 구성

편집을 위해 /etc/nginx/nginx.conf 파일을 엽니다.

$ sudo nano /etc/nginx/nginx.conf

include /etc/nginx/conf.d/*.conf; 줄 앞에 다음 줄을 추가합니다.

server_names_hash_bucket_size  64;

Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

편집을 위해 /etc/nginx/conf.d/standardnotes.conf 파일을 만들고 엽니다.

$ sudo nano /etc/nginx/conf.d/standardnotes.conf

다음 코드를 붙여넣습니다. standardnotes.example.com을 도메인 이름으로 바꿉니다. client_max_body_size의 값을 50MB로 설정했습니다. 요구 사항에 따라 변경할 수 있습니다.

server {

    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name standardnotes.example.com;

    client_max_body_size 50M;

    access_log  /var/log/nginx/standardnotes.access.log;
    error_log   /var/log/nginx/standardnotes.error.log;

    ssl_certificate      /etc/letsencrypt/live/standardnotes.example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/standardnotes.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/standardnotes.example.com/chain.pem;
    
    ssl_session_timeout  5m;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;
    
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_cache off;
    }
}
# enforce HTTPS
server {
    listen 80;
    listen [::]:80;
    server_name  standardnotes.example.com;
    return 301   https://$host$request_uri;
}

Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

위의 파일은 기본 표준 메모 응용 프로그램용입니다. 다음으로 Files 하위 도메인에 대해 다른 파일을 구성해야 합니다.

$ sudo nano /etc/nginx/conf.d/files-standardnotes.conf

다음 코드를 붙여넣습니다. snotes-files.example.com을 도메인 이름으로 바꿉니다. client_max_body_size 변수의 값을 50MB로 설정했습니다. 요구 사항에 따라 변경할 수 있습니다.

server {

    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name snotes-files.example.com;

    client_max_body_size 50M;

    access_log  /var/log/nginx/files-standardnotes.access.log;
    error_log   /var/log/nginx/files-standardnotes.error.log;

    ssl_certificate      /etc/letsencrypt/live/snotes-files.example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/snotes-files.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/snotes-files.example.com/chain.pem;
    
    ssl_session_timeout  5m;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;
    
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;

    location / {
        proxy_pass http://127.0.0.1:3125;
        proxy_cache off;
    }
}
# enforce HTTPS
server {
    listen 80;
    listen [::]:80;
    server_name  snotes-files.example.com;
    return 301   https://$host$request_uri;
}

Nginx 구성을 확인합니다.

$ sudo nginx -t

구성 파일을 활성화하려면 Nginx 서버를 다시 시작하십시오.

$ sudo systemctl restart nginx

8단계 - 표준 메모 사용

브라우저에서 URL https://standardnotes.example.com을 열면 다음 출력이 표시되어야 합니다.

이는 서버가 가동되어 실행 중임을 의미합니다. 표준 노트를 사용하려면 공식 앱을 사용해야 합니다. 튜토리얼에서는 웹 앱을 사용하지만 방법은 데스크톱 및 모바일 앱에서 동일하게 유지됩니다.

URL https://app.standardnotes.com을 열어 웹 앱에 액세스합니다. 페이지 왼쪽 하단에 있는 무료 계정 만들기 링크를 클릭하고 이메일 주소와 비밀번호를 입력합니다. 고급 기능 버튼을 클릭하고 사용자 지정 동기화 서버 옵션을 선택 취소하고 상자에 URL https://standardnotes.example.com을 입력합니다.

로그인하면 노트 작성 및 애플리케이션 사용을 시작할 수 있습니다.

9단계 - 유료 기능 활성화

지금까지 Standard Notes 애플리케이션의 기본 기능을 활성화했습니다. 이 응용 프로그램은 여러 메모 형식, 암호화된 클라우드 저장소, 더 긴 수정 내역 등과 같은 몇 가지 고급 기능을 제공합니다.

클라우드 호스팅 애플리케이션의 경우 고급 기능을 활성화하기 위해 직접 비용을 지불할 수 있습니다. 그러나 자체 호스팅 애플리케이션의 경우 결제 애플리케이션이 작동하지 않기 때문에 고급 기능에 대한 비용을 지불할 수 없습니다. 그래도 기부할 수 있습니다. 그러나 자체 호스팅 애플리케이션에서 유료 기능을 활성화하려면 Standard Notes 디렉토리에서 다음 명령을 실행해야 합니다.

$ cd ~/standardnotes
$ bash ./server.sh create-subscription 

웹 애플리케이션을 다시 로드하면 계정에 대해 유료 기능이 활성화됩니다.

10단계 - 파일 업로드를 위한 서버 구성

파일 업로드는 Standard Notes의 유료 기능입니다. 파일 업로드를 위해 사용자 지정 API URL을 활성화했습니다. 그러나 그들은 여전히 작동하지 않을 것입니다. 이를 작동시키려면 업로드 디렉토리에 적절한 권한을 부여해야 합니다. 업로드는 ~/standardnotes/data/uploads 디렉터리에 저장됩니다. 다음 명령을 실행하여 권한을 변경하십시오.

$ chmod -R 775 data
$ mkdir -p data/uploads
$ sudo chmod -R 755 data/uploads
$ sudo chown -R 1001.1001 data/uploads

이제 Standard Notes는 모든 사용자의 업로드 한도를 0으로 설정합니다. 할당량을 수동으로 지정하지 않으면 사용자가 파일을 업로드할 수 없음을 의미합니다. 따라서 파일 업로드 작업의 마지막 단계는 유료 사용자 계정에 대한 파일 할당량을 활성화하는 것입니다. 데이터베이스 컨테이너 내에서 SQL 쿼리를 수행하여 이를 수행할 수 있습니다.

데이터베이스 컨테이너 내부의 MySQL 셸에 로그인합니다.

$ docker exec -it db-standalone mysql -u std_notes_user -p
Enter password:

MySQL 셸에 들어가면 데이터베이스 목록을 확인하겠습니다.

mysql > show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| standard_notes_db  |
+--------------------+
2 rows in set (0.00 sec)

표준 메모 데이터베이스로 전환합니다.

mysql > use standard_notes_db;

다음 SQL 명령을 실행하여 위의 유료 사용자 활성화에 10GB 파일 할당량을 추가합니다.

mysql> INSERT INTO subscription_settings(uuid, name, value, created_at, updated_at, user_subscription_uuid) VALUES (UUID(), "FILE_UPLOAD_BYTES_LIMIT", 10737418240, FLOOR(UNIX_TIMESTAMP(NOW(6))*1000000), FLOOR(UNIX_TIMESTAMP(NOW(6))*1000000), (SELECT us.uuid FROM user_subscriptions us INNER JOIN users u ON us.user_uuid=u.uuid WHERE u.email=""));

여기서 10737418240은 10GB로 변환되는 총 바이트를 나타냅니다. 이 번호를 필요한 것으로 수정할 수 있습니다.

MySQL 셸과 데이터베이스 컨테이너를 종료합니다.

mysql > exit

11단계 - 파일 업로드 테스트

Standard Notes 웹 앱에 로그인하고 상단 행의 첨부 파일 아이콘을 클릭합니다.

파일 업로드 버튼을 클릭하고 업로드할 파일을 선택합니다. 파일이 성공적으로 업로드되고 아이콘을 다시 클릭하면 파일이 나열된 것을 볼 수 있습니다.

파일 이름 옆에 있는 세 개의 점을 클릭하면 파일과 관련된 추가 옵션이 나타납니다.

메모에 이미지를 추가하려면 메모에 첨부 링크를 클릭합니다. 나머지 옵션은 자명합니다.

결론

이것으로 Ubuntu 22.04 시스템에 Standard Notes 서버를 설치하고 구성하는 방법에 대한 자습서를 마칩니다. 질문이 있으시면 아래 의견에 게시하십시오.