Zenn
🍣

Shopifyのアプリ開発:WSLでトンネルを作りメール送信まで

2025/03/22に公開

Shopifyのテーマのカスタマイズは以前行っていたのですが、パソコンをクリーンインストールしてShopifyの開発環境が着ているため、今回WSL2でShopifyのアプリ開発環境を作ることにしました。

ネットで見つけた記事を基に進めましたが、コマンドでエラーが出たので、備忘録を兼ねて書きます。

こちらの記事を参考にしました。
https://zenn.dev/shige/articles/a521d9b241ead694a0bc
https://qiita.com/whike_chan/items/fbda06e389f3a7ccde2a

こちらのコマンドでエラーになりました。

shopify app create

今回こちらで、進めました。
とりあえず、コマンドを調べました。

shopify --help

出力内容です。

$ shopify --help
A CLI tool to build for the Shopify platform

VERSION
  @shopify/cli/3.76.2 wsl-x64 node-v23.4.0

USAGE
  $ shopify [COMMAND]

TOPICS
  app       Build Shopify apps.
  auth      Auth operations.
  config    CLI configuration options.
  hydrogen  Build Hydrogen storefronts.
  theme     Build Liquid themes.

COMMANDS
  commands  List all shopify commands.
  help      Display help for Shopify CLI
  search    Starts a search on shopify.dev.
  upgrade   Shows details on how to upgrade Shopify CLI.
  version   Shopify CLI version currently installed.

出力内容の説明

VERSION
現在インストールされている CLI のバージョン(@shopify/cli/3.76.2)や、実行環境(wsl-x64、node-v23.4.0)が表示されています。

USAGE
基本的な使い方として、$ shopify [COMMAND] の形式でコマンドを実行することを示しています。

TOPICS
Shopify プラットフォームに関連する主要な機能のカテゴリが表示されています。

app: Shopify アプリの構築
auth: 認証関連の操作
config: CLI の設定オプション
hydrogen: Hydrogen ストアフロントの構築
theme: Liquid テーマの構築
COMMANDS
具体的なサブコマンドがリストアップされています。

commands: 利用可能な全てのコマンドの一覧
help: ヘルプ情報の表示
search: shopify.dev での検索開始
upgrade: Shopify CLI のアップグレード手順の詳細
version: 現在のバージョン情報の確認

アプリのテンプレート

$ shopify app init

To run this command, log in to Shopify.
User verification code: SCPF-NTHD
👉 Press any key to open the login page on your browser
Opened link to start the auth process: https://accounts.shopify.com/activate-with-code?device_code%5Buser_code%5D=SCPF-NTHD
✔ Logged in.
?  Get started building your app:
✔  Build a Remix app (recommended)

?  For your Remix template, which language do you want?
✔  JavaScript

?  App name:
✔  アプリ名

╭─ info ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│                                                                                                                                    │
│  Initializing project with `npm`                                                                                                   │
│  Use the `--package-manager` flag to select a different package manager.                                                           │
│                                                                                                                                    │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯


╭─ success ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│                                                                                                                                    │
│  アプリ名 is ready for you to build!                                                                                                  │
│                                                                                                                                    │
│  Next steps                                                                                                                        │
│    • Run `cd アプリ名`                                                                                                                │
│    • For extensions, run `shopify app generate extension`                                                                          │
│    • To see your app, run `shopify app dev`                                                                                        │
│                                                                                                                                    │
│  Reference                                                                                                                         │
│    • Shopify docs                                                                                                                  │
│    • For an overview of commands, run `shopify app --help`                                                                         │
│                                                                                                                                    │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

shopify app generate extension
で、作るアプリの種類を選びます。




管理画面向けの主な拡張ポイント

「Admin」セクションには複数の拡張ポイントが並んでいます。それぞれ役割が少しずつ異なるので、やりたいことに応じて選択してください。

Admin block

管理画面内に「ブロック」として独自のUIを埋め込むための拡張ポイントです。
たとえば、商品詳細ページや注文詳細ページなど、対応している場所に追加のコンポーネント(UIブロック)を表示できます。
「管理画面に独自のUIを差し込みたい」「入力フォームやダッシュボード風のUIを表示したい」といった場合に有力です。

Shopify管理画面の「その他の操作」や特定のメニューにリンクを追加する拡張ポイントです。
リンクをクリックすると、埋め込みアプリ(または外部ページ)に飛ばせるので、「管理画面から自作アプリへの導線を追加したい」というケースに向いています。
UI自体を管理画面の中に直接埋め込むわけではなく、リンクを挿入するだけです。

Admin action / Admin print action / Conditional admin action など

管理画面上で「ボタン」や「アクション」として追加し、押下時に特定の処理を走らせる拡張ポイントです。
例: 「注文一覧にカスタムのアクションボタンを追加し、クリックすると外部APIを呼んで処理する」など。
アクションの種類によって表示できる場所や振る舞いが変わるので、要件に合わせて使い分けます。

Product configuration / Editor extension collection

商品編集画面に対して追加のフィールドや設定UIを組み込むための拡張ポイントです。
もし「商品管理画面に独自の設定項目を加えたい」という場合は、こちらを検討します。

特定の用途(サブスクリプション設定や購入オプション設定、サポートリンクなど)に特化した拡張ポイントです。
一般的なカスタムUIにはあまり使わないケースが多いですが、該当する機能を拡張したい場合には便利です。

どれを選べばいいか?

  • 管理画面の特定のページに独自のUIコンポーネントを直接埋め込みたい
    → Admin block や Editor extension collection(商品ページ等)

  • 管理画面のメニューや「その他の操作」などにリンクを追加して、自作アプリに飛ばしたい
    → Admin link

  • 管理画面でボタンやアクションを追加して、クリック時に処理を実行したい
    Admin action や Admin print action、Conditional admin action

参考:埋め込みアプリと拡張機能の違い

  • 埋め込みアプリ:
    Shopify パートナーダッシュボード(あるいは CLI)で「アプリ」を作成し、Shopify 管理画面のサイドバーや「その他の操作」から開く形で、アプリ独自の画面を提供するもの。React などで自由にUIを作りこめます。

  • 拡張機能(Extension):
    上記のように、Shopify 管理画面やチェックアウト、テーマ、Flow などの特定の場所に直接UIや機能を差し込むためのポイント。CLI の shopify extension create や shopify app generate extension などから生成してカスタマイズします。

Shopifyのアプリのリセット

今回アプリの再設定を行うことが、度々ありました。
その度に、アプリが新しくなってしまうので大変でした。
こちらのコマンドで、アプリをリセットできます。

npm run dev -- --reset

上記のコマンドを実行すると、ディレクトリにある内容で新しいアプリとしてスタートできます。

今回はトンネルを使いました

WSLで動いているローカルサーバーがShopifyの開発ストアで使えるように、webhookのURLを作ることができるように、トンネルを作りました。
トンネルは、Cloudflareを使いました。
ngrokは、起動するたびにURLが変わってしまうので大変です。
有料版を使えばURLを固定できますが、今回使わないです。
そのため、Cloudflareを使いました。

WSLでCloudflare Tunnelを使う手順まとめ

前提条件

  • WSLがセットアップ済み(Ubuntuなど)
  • cloudflared コマンドをインストール済み
  • Cloudflare アカウントを作成済み
  • Cloudflare に独自ドメインを登録済み(例: example.com)

Step 1: cloudflared のインストール(WSL内で実行)

sudo apt update
sudo apt install cloudflared

※ apt パッケージに cloudflared がない場合は、以下の手順を使用:

# バイナリをダウンロードしてインストール
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb

Step 2: Cloudflare にログイン

cloudflared login
  • ブラウザが起動して Cloudflare にログインするよう促されます。
  • ドメインを選択(例: example.com)して認証します。
  • 認証が成功すると、WSL内に証明書ファイルが保存されます:
    • 通常は ~/.cloudflared/cert.pem

Step 3: トンネルの作成

cloudflared tunnel create my-tunnel

  • my-tunnel の部分は任意のトンネル名にできます。
  • この操作で credentials-file が自動生成されます(例:~/.cloudflared/<UUID>.json)

Step 4: 構成ファイル(config.yml)の作成

~/.cloudflared/config.yml を作成します:

tunnel: <上で作成したトンネルのUUID>
credentials-file: /home/ユーザー名/.cloudflared/<UUID>.json

ingress:
  - hostname: myapp.example.com
    service: http://localhost:3000  # アプリが動作しているポート
  - service: http_status:404

Step 5: DNSレコードの作成

以下のコマンドで、Cloudflare に CNAME レコード(アプリ公開URL)を作成:

cloudflared tunnel route dns my-tunnel myapp.example.com

Step 6: トンネルの起動

cloudflared tunnel run my-tunnel

これで myapp.example.com でローカルアプリに外部アクセスできます!

よく使う補足コマンド

トンネル一覧表示

cloudflared tunnel list

トンネル削除

cloudflared tunnel delete my-tunnel

トンネルログ表示

cloudflared tunnel run my-tunnel --loglevel debug

ワンポイント

  • トンネルを 常時起動したい場合 は systemd などを使ってサービス化することもできます(WSLの場合、tmuxやscreenで常駐させてもOK)
  • 複数のトンネル・サブドメインを使いたい場合、config.yml に ingress を複数設定可能

Shopifyのアプリの起動

こちらのコマンドでトンネルのURLとポート番号を指定して起動できます。

shopify app dev --tunnel-url=https://ホスト名:ポート番号

Shopify CLIでアプリを起動するので、他の方法で個別にserver.tsなどを起動しなくても良いです。
起動すると重複などでエラーが出て、ハマってしまいます。

FLOWに設定するときの内容

Send HTTP request·Flow ACTION

メールの送信もできる

使用したモジュール:nodemailer

概要

  • Node.js用のメール送信ライブラリ
  • SMTPを使って、プログラムからメールを送信可能
  • Gmailや独自SMTPサーバー、SendGridなど様々な送信方法に対応

基本的な使い方(SMTP経由)

import nodemailer from 'nodemailer';

const transporter = nodemailer.createTransport({
  host: 'smtp.example.com', // SMTPサーバーのホスト(Gmailの場合は smtp.gmail.com)
  port: 587,                // 通常は 587(TLS)か 465(SSL)
  secure: false,            // trueならSSL(ポート465)
  auth: {
    user: 'your_email@example.com',
    pass: 'your_password_or_app_password',
  },
});

const mailOptions = {
  from: 'your_email@example.com',
  to: 'recipient@example.com',
  subject: '件名',
  text: 'プレーンテキストの本文',
  html: '<b>HTMLメールの本文</b>',
};

await transporter.sendMail(mailOptions);

Gmailでの使用時の問題点(2024年以降)

  1. 「安全性の低いアプリのアクセス許可」が廃止
    Gmailでは、パスワード認証による外部SMTP接続(nodemailerなど)を原則禁止するように変更

  2. アプリパスワードも使えないケースが増加
    二段階認証を設定してアプリパスワードを発行する方法がありましたが、現在は使えないようです。

まとめ

今回Shopifyのアプリ開発という貴重な経験が、できました。
WSLで作ったローカルサーバーをトンネルを使って、Shopifyの開発ストアで使えるようにできました。
今回メール送信も、行う方法を知ることができました。

Discussion

ログインするとコメントできます