<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/rss.xsl"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Sveltekitblog Engine</title>
        <link>https://svelteblog-13g.pages.dev</link>
        <description>新しいブログへようこそ。（設定でこの文章を修正してください。）</description>
        <language>ja</language>
        <atom:link href="https://svelteblog-13g.pages.dev/ja/rss.xml" rel="self" type="application/rss+xml"/>
        <lastBuildDate>Mon, 29 Jun 2026 22:53:51 GMT</lastBuildDate>
        <item>
            <title><![CDATA[お問い合わせ]]></title>
            <link>https://svelteblog-13g.pages.dev/ja/contact/contact</link>
            <guid isPermaLink="true">https://svelteblog-13g.pages.dev/ja/contact/contact</guid>
            <pubDate>Sat, 27 Jun 2026 18:51:27 GMT</pubDate>
            <description><![CDATA[]]></description>
            <content:encoded><![CDATA[<div style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; line-height: 1.7; color: var(--color-text, #333); max-width: 800px; margin: 0 auto; padding: 20px 10px;">
  
  <!-- ヘッダー領域 -->
  <header style="text-align: center; margin-bottom: 40px; padding-bottom: 30px; border-bottom: 1px solid rgba(0, 0, 0, 0.1);">
    <h1 style="font-size: 2.3rem; font-weight: 800; margin-bottom: 10px; background: linear-gradient(45deg, #ff3e00, #40b3ff); -webkit-background-clip: text; -webkit-text-fill-color: transparent;" id="contact-us-ja">
      ✉️ お問い合わせ
    </h1>
    <p style="font-size: 1.1rem; color: #666; margin: 0;">フィードバック、機能提案、および技術的なお問い合わせを歓迎します。</p>
  </header>

  <!-- 1. 導入メッセージ (#ff3e00: Svelte Orange) -->
  <section style="margin-bottom: 35px;">
    <h2 style="font-size: 1.4rem; font-weight: 700; color: #333; margin-bottom: 15px; border-left: 5px solid #ff3e00; padding-left: 12px;" id="welcome-message">
      いつでもお気軽にご連絡ください。
    </h2>
    <p style="margin-bottom: 15px; color: #555;">
      当ブログエンジンをご利用の際、システムエラー（バグ）、機能追加の提案、テーマの改善案、またはコラボレーションのご提案などがございましたら、以下のチャンネルよりお気軽にご連絡ください。お寄せいただいた貴重なフィードバックは、今後の開発およびサービス向上に積極的に反映させていただきます。
    </p>
  </section>

  <!-- 2. お問い合わせ窓口 (#007acc: Technical Blue) -->
  <section style="margin-bottom: 35px;">
    <h2 style="font-size: 1.4rem; font-weight: 700; color: #333; margin-bottom: 20px; border-left: 5px solid #007acc; padding-left: 12px;" id="contact-channels">
      公式お問い合わせ窓口
    </h2>
    
    <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 15px; margin-bottom: 20px;">
      
      <!-- メールカード -->
      <div style="border: 1px solid rgba(0, 0, 0, 0.08); padding: 20px; border-radius: 12px; background: rgba(255, 255, 255, 0.5); box-shadow: 0 4px 6px rgba(0,0,0,0.02);">
        <h3 style="margin-top: 0; color: #ff3e00; font-size: 1.2rem; display: flex; align-items: center; gap: 8px;" id="email-inquiry">
          📧 メール
        </h3>
        <p style="font-size: 0.95rem; color: #555; margin: 8px 0 12px 0;">
          技術的なコラボレーションや一般的なお問い合わせは、メールにて承っております。確認次第、迅速にご返信いたします。
        </p>
        <a href="mailto:sveltekitblog@gmail.com" style="color: #ff3e00; text-decoration: none; font-weight: 600; font-size: 0.95rem;">
          sveltekitblog@gmail.com
        </a>
      </div>

      <!-- GitHub Issues カード -->
      <div style="border: 1px solid rgba(0, 0, 0, 0.08); padding: 20px; border-radius: 12px; background: rgba(255, 255, 255, 0.5); box-shadow: 0 4px 6px rgba(0,0,0,0.02);">
        <h3 style="margin-top: 0; color: #333; font-size: 1.2rem; display: flex; align-items: center; gap: 8px;" id="github-issue">
          💻 GitHub Issues
        </h3>
        <p style="font-size: 0.95rem; color: #555; margin: 8px 0 12px 0;">
          エンジンのソースコードに関するバグ報告や、具体的な機能要望（Feature Request）は、リポジトリのIssueに登録をお願いいたします。
        </p>
        <a href="https://github.com/sveltekitblog" target="_blank" style="color: #333; text-decoration: none; font-weight: 600; font-size: 0.95rem;">
          Issueを報告する
        </a>
      </div>

      <!-- ゲストブックカード -->
      <div style="border: 1px solid rgba(0, 0, 0, 0.08); padding: 20px; border-radius: 12px; background: rgba(255, 255, 255, 0.5); box-shadow: 0 4px 6px rgba(0,0,0,0.02);">
        <h3 style="margin-top: 0; color: #40b3ff; font-size: 1.2rem; display: flex; align-items: center; gap: 8px;" id="guestbook-message">
          💬 ゲストブック
        </h3>
        <p style="font-size: 0.95rem; color: #555; margin: 8px 0 12px 0;">
          公式なお問い合わせ以外に、簡単なご挨拶や訪問の足跡を残したい場合は、ゲストブックをご利用ください。
        </p>
        <a href="https://sveltekitblog/guestbook" style="color: #40b3ff; text-decoration: none; font-weight: 600; font-size: 0.95rem;">
          ゲストブックに書き込む
        </a>
      </div>

    </div>
  </section>

  <!-- 3. お問い合わせ時の注意事項 (#f59e0b: Amber Yellow) -->
  <section style="margin-bottom: 45px; padding: 20px; background: rgba(0, 0, 0, 0.02); border-radius: 12px; border: 1px dashed rgba(0,0,0,0.1);">
    <h2 style="font-size: 1.3rem; font-weight: 700; margin-top: 0; margin-bottom: 12px; color: #333; border-left: 5px solid #f59e0b; padding-left: 12px;" id="guidelines">
      📝 お問い合わせ時の参考事項
    </h2>
    <ul style="padding-left: 20px; margin: 0; color: #555;">
      <li style="margin-bottom: 8px;"><strong>詳細情報の提供</strong>: システムエラーに関するお問い合わせの際は、エラーの再現手順やエラーメッセージ（またはスクリーンショット）を添付していただけますと、迅速な解決に役立ちます。</li>
      <li style="margin-bottom: 8px;"><strong>返信の目安</strong>: メールでのお問い合わせは、通常1〜2営業日以内に確認し、ご返信いたします。</li>
      <li style="margin-bottom: 0;"><strong>広告および営業メール</strong>: 商業目的の広告やスパムメールについては、返信を控えさせていただきます。</li>
    </ul>
  </section>

  <!-- フッター / 下部領域 -->
  <footer style="text-align: center; margin-top: 50px; padding-top: 20px; border-top: 1px solid rgba(0, 0, 0, 0.05); font-size: 0.9rem; color: #888;">
    <p>当ブログの運営および開発のサポートをご希望の場合は、以下のリンクをご参照ください。</p>
    <div style="margin-top: 15px; display: flex; justify-content: center; gap: 15px;">
      <a href="https://github.com/sveltekitblog/sveltekitblogengine" target="_blank" style="color: #ff3e00; text-decoration: none; font-weight: 600;">GitHubリポジトリ</a>
      <span>•</span>
      <a href="https://sveltekitblog.com/guestbook" style="color: #40b3ff; text-decoration: none; font-weight: 600;">ゲストブックを書く</a>
    </div>
  </footer>

</div>
]]></content:encoded>
            <category>contact</category>
        </item>
        <item>
            <title><![CDATA[プライバシーポリシー ]]></title>
            <link>https://svelteblog-13g.pages.dev/ja/privacy/privacy</link>
            <guid isPermaLink="true">https://svelteblog-13g.pages.dev/ja/privacy/privacy</guid>
            <pubDate>Sat, 27 Jun 2026 18:46:40 GMT</pubDate>
            <description><![CDATA[]]></description>
            <content:encoded><![CDATA[<div style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; line-height: 1.7; color: var(--color-text, #333); max-width: 800px; margin: 0 auto; padding: 20px 10px;">
  
  <!-- ヘッダー領域 -->
  <header style="text-align: center; margin-bottom: 40px; padding-bottom: 30px; border-bottom: 1px solid rgba(0, 0, 0, 0.1);">
    <h1 style="font-size: 2.3rem; font-weight: 800; margin-bottom: 10px; background: linear-gradient(45deg, #ff3e00, #40b3ff); -webkit-background-clip: text; -webkit-text-fill-color: transparent;" id="privacy-policy-ja">
      🔒 プライバシーポリシー
    </h1>
    <p style="font-size: 0.95rem; color: #888; margin: 0;">最終更新日：2026年6月27日</p>
  </header>

  <!-- 1. 収集および利用目的 (#ff3e00: Svelte Orange) -->
  <section style="margin-bottom: 35px;">
    <h2 style="font-size: 1.4rem; font-weight: 700; color: #333; margin-bottom: 15px; border-left: 5px solid #ff3e00; padding-left: 12px;" id="1-個人情報の収集および利用目的">
      1. 個人情報の収集および利用目的
    </h2>
    <p style="margin-bottom: 15px; color: #555;">
      当ブログは、原則として個人情報を収集いたしません。ただし、ウェブサイトのアクセス統計のためにGoogle Analyticsを使用しており、広告配信のためにGoogle AdSenseを使用する場合があります。
    </p>
  </section>

  <!-- 2. 収集する情報 (#007acc: Technical Blue) -->
  <section style="margin-bottom: 35px;">
    <h2 style="font-size: 1.4rem; font-weight: 700; color: #333; margin-bottom: 15px; border-left: 5px solid #007acc; padding-left: 12px;" id="2-収集する情報">
      2. 収集する情報
    </h2>
    <div style="padding: 20px; background: rgba(0, 0, 0, 0.02); border-radius: 12px; border: 1px solid rgba(0, 0, 0, 0.05); margin-bottom: 15px;">
      <ul style="padding-left: 20px; margin: 0; color: #555;">
        <li style="margin-bottom: 8px;">訪問者のIPアドレス（匿名化された状態）</li>
        <li style="margin-bottom: 8px;">ブラウザの種類およびオペレーティングシステム（OS）情報</li>
        <li style="margin-bottom: 8px;">閲覧したページおよび滞在時間</li>
        <li style="margin-bottom: 0;">クッキー（Cookie）を通じたアクセス統計</li>
      </ul>
    </div>
    <p style="color: #666; font-size: 0.95rem;">
      上記の情報はウェブサイトの改善および統計分析の目的にのみ使用され、個人を特定するために使用されることはありません。
    </p>
  </section>

  <!-- 3. クッキーの使用 (#10b981: Mint Green) -->
  <section style="margin-bottom: 35px;">
    <h2 style="font-size: 1.4rem; font-weight: 700; color: #333; margin-bottom: 15px; border-left: 5px solid #10b981; padding-left: 12px;" id="3-クッキーcookieの使用">
      3. クッキー（Cookie）の使用
    </h2>
    <p style="margin-bottom: 15px; color: #555;">
      当ブログは、以下の目的でクッキーを使用しています。
    </p>
    <ul style="padding-left: 20px; margin-bottom: 15px; color: #555;">
      <li style="margin-bottom: 8px;"><strong>Google Analytics</strong> — 訪問者統計の収集および分析</li>
      <li style="margin-bottom: 8px;"><strong>Google AdSense</strong> — パーソナライズド広告の配信</li>
      <li style="margin-bottom: 8px;"><strong>セッション管理</strong> — ユーザー体験（UX）の向上</li>
    </ul>
    <p style="color: #555;">
      ほとんどのブラウザではクッキーが自動的に有効になりますが、ブラウザの設定でクッキーの受け入れを拒否することも可能です。ただし、クッキーを無効にした場合、サイトの一部機能が制限されることがあります。
    </p>
  </section>

  <!-- 4. Google Analytics (#f59e0b: Amber Yellow) -->
  <section style="margin-bottom: 35px;">
    <h2 style="font-size: 1.4rem; font-weight: 700; color: #333; margin-bottom: 15px; border-left: 5px solid #f59e0b; padding-left: 12px;" id="4-google-analytics">
      4. Google Analytics
    </h2>
    <p style="margin-bottom: 15px; color: #555;">
      当ブログは、アクセス統計の収集のためにGoogle Analyticsを使用しています。Google Analyticsはクッキーを使用してユーザーのウェブサイト利用情報を収集し、この情報は利用状況の把握やサービスの改善に役立てられます。
    </p>
    <p style="color: #555;">
      Googleによるデータの収集および処理方法の詳細については、<a target="_blank" rel="noopener noreferrer" style="color: #ff3e00; text-decoration: none; font-weight: 600;" href="https://policies.google.com/privacy">Googleプライバシーポリシー</a>をご参照ください。
    </p>
  </section>

  <!-- 5. Google AdSense (#8b5cf6: Violet Purple) -->
  <section style="margin-bottom: 35px;">
    <h2 style="font-size: 1.4rem; font-weight: 700; color: #333; margin-bottom: 15px; border-left: 5px solid #8b5cf6; padding-left: 12px;" id="5-google-adsense">
      5. Google AdSense
    </h2>
    <p style="margin-bottom: 15px; color: #555;">
      当ブログは、Google AdSenseを通じて広告を配信する場合があります。Google AdSenseはクッキーを使用し、ユーザーの興味・関心に基づいた広告を提供します。
    </p>
    <p style="color: #555;">
      パーソナライズド広告の配信を希望しない場合は、<a target="_blank" rel="noopener noreferrer" style="color: #40b3ff; text-decoration: none; font-weight: 600;" href="https://www.google.com/settings/ads">広告設定ページ</a>から設定をオフにすることができます。
    </p>
  </section>

  <!-- 6. 保有および利用期間 (#06b6d4: Cyan) -->
  <section style="margin-bottom: 35px;">
    <h2 style="font-size: 1.4rem; font-weight: 700; color: #333; margin-bottom: 15px; border-left: 5px solid #06b6d4; padding-left: 12px;" id="6-個人情報の保有および利用期間">
      6. 個人情報の保有および利用期間
    </h2>
    <p style="color: #555;">
      当ブログが独自に個人情報を保存・保有することはありません。Google AnalyticsおよびAdSenseによって収集される情報の保有期間は、各サービスのポリシーに準拠します。
    </p>
  </section>

  <!-- 7. 個人情報管理責任者 (#ec4899: Rose Pink) -->
  <section style="margin-bottom: 35px;">
    <h2 style="font-size: 1.4rem; font-weight: 700; color: #333; margin-bottom: 15px; border-left: 5px solid #ec4899; padding-left: 12px;" id="7-個人情報管理責任者お問い合わせ先">
      7. 個人情報管理責任者・お問い合わせ先
    </h2>
    <p style="color: #555; margin-bottom: 10px;">
      個人情報の取り扱いに関するご質問やご不明な点がございましたら、以下の連絡先までお問い合わせください。
    </p>
    <div style="padding: 15px 20px; background: rgba(255, 62, 0, 0.03); border-radius: 12px; border: 1px solid rgba(255, 62, 0, 0.08); display: inline-block;">
      <span style="font-weight: 600; color: #ff3e00;">📧 メールアドレス:</span> 
      <a target="_blank" rel="noopener noreferrer nofollow" style="color: #333; text-decoration: none; font-weight: 600; margin-left: 5px;" href="mailto:sveltekitblog@gmail.com">sveltekitblog@gmail.com</a>
    </div>
  </section>

  <!-- 8. プライバシーポリシーの変更 (#6366f1: Indigo) -->
  <section style="margin-bottom: 45px;">
    <h2 style="font-size: 1.4rem; font-weight: 700; color: #333; margin-bottom: 15px; border-left: 5px solid #6366f1; padding-left: 12px;" id="8-プライバシーポリシーの変更">
      8. プライバシーポリシーの変更
    </h2>
    <p style="color: #555;">
      本プライバシーポリシーは、法令、ポリシー、またはセキュリティ技術の変更に伴い、内容が追加、削除、または修正される場合があります。変更が生じる場合は、施行日の7日前から当ブログを通じて告知いたします。
    </p>
  </section>

  <!-- 外部リンク領域 -->
  <footer style="margin-top: 50px; padding-top: 25px; border-top: 1px solid rgba(0, 0, 0, 0.05); font-size: 0.95rem;">
    <h3 style="font-size: 1.1rem; font-weight: 700; color: #333; margin-top: 0; margin-bottom: 15px;" id="external-links-ja">
      🔗 外部リンク
    </h3>
    <div style="display: flex; flex-wrap: wrap; gap: 15px;">
      <a target="_blank" rel="noopener noreferrer" style="color: #ff3e00; text-decoration: none; font-weight: 600;" href="https://policies.google.com/privacy">Googleプライバシーポリシー</a>
      <span style="color: #ddd;">|</span>
      <a target="_blank" rel="noopener noreferrer" style="color: #40b3ff; text-decoration: none; font-weight: 600;" href="https://policies.google.com/technologies/ads">Google広告ポリシー</a>
      <span style="color: #ddd;">|</span>
      <a target="_blank" rel="noopener noreferrer" style="color: #ff3e00; text-decoration: none; font-weight: 600;" href="https://www.google.com/settings/ads">広告設定</a>
    </div>
  </footer>

</div>
]]></content:encoded>
            <category>privacy</category>
        </item>
        <item>
            <title><![CDATA[About]]></title>
            <link>https://svelteblog-13g.pages.dev/ja/about/about</link>
            <guid isPermaLink="true">https://svelteblog-13g.pages.dev/ja/about/about</guid>
            <pubDate>Sat, 27 Jun 2026 18:26:40 GMT</pubDate>
            <description><![CDATA[]]></description>
            <content:encoded><![CDATA[<div style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; line-height: 1.7; color: var(--color-text, #333); max-width: 800px; margin: 0 auto; padding: 20px 10px;">
  
  <!-- ヘッダー領域 -->
  <header style="text-align: center; margin-bottom: 40px; padding-bottom: 30px; border-bottom: 1px solid rgba(0, 0, 0, 0.1);">
    <h1 style="font-size: 2.5rem; font-weight: 800; margin-bottom: 10px; background: linear-gradient(45deg, #ff3e00, #40b3ff); -webkit-background-clip: text; -webkit-text-fill-color: transparent;" id="about-this-blog">
      About This Blog
    </h1>
    <p style="font-size: 1.1rem; color: #666; margin: 0;">Svelte 5.56.3 & SvelteKit 2.66.0 ベースの高速サーバーレスブログエンジン</p>
  </header>

  <!-- 本文: 挨拶・紹介 -->
  <section style="margin-bottom: 40px;">
    <h2 style="font-size: 1.6rem; font-weight: 700; margin-bottom: 15px; border-left: 5px solid #ff3e00; padding-left: 12px;" id="welcome-message-ja">
      こんにちは！ご訪問いただきありがとうございます。
    </h2>
    <p style="margin-bottom: 15px;">
      このブログは、既存のテンプレートや一般的なブログプラットフォームを使用せず、最新の <strong>Svelte 5.56.3、SvelteKit 2.66.0、Cloudflare D1、Better-Auth</strong> を組み合わせて独自に設計・構築したカスタムブログエンジンで稼働しています。
    </p>
    <p style="margin-bottom: 15px;">
      Web開発の生産性とユーザー体験（UX）の限界を超えるために構築され、エッジコンピューティングによる圧倒的な表示速度と、サーバーレス環境における高度なリレーショナルデータモデリングを両立しています。ブログの運営とコンテンツ執筆の双方において、最高水準のパフォーマンスと最適化されたUXを提供できるよう設計されています。
    </p>
  </section>

  <!-- 本目: 技術スタック -->
  <section style="margin-bottom: 40px;">
    <h2 style="font-size: 1.6rem; font-weight: 700; margin-bottom: 20px; border-left: 5px solid #40b3ff; padding-left: 12px;" id="key-technology-stack">
      Key Technology Stack
    </h2>
    
    <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 15px;">
      
      <!-- Svelte & SvelteKit カード -->
      <div style="border: 1px solid rgba(0, 0, 0, 0.08); padding: 20px; border-radius: 12px; background: rgba(255, 255, 255, 0.5); box-shadow: 0 4px 6px rgba(0,0,0,0.02);">
        <h3 style="margin-top: 0; color: #ff3e00; font-size: 1.2rem; display: flex; align-items: center; gap: 8px;" id="svelte-5563-sveltekit-2660">
          ⚡ Svelte 5.56.3 & SvelteKit 2.66.0
        </h3>
        <p style="font-size: 0.95rem; color: #555; margin: 8px 0 0 0;">
          Svelte 5 の Runes システムを活用し、不要なレンダリング処理を極限まで排除した状態管理と、SvelteKit 2 公式のファイルベースルーティングおよびデータプリフェッチ技術を採用しています。
        </p>
      </div>

      <!-- Database カード -->
      <div style="border: 1px solid rgba(0, 0, 0, 0.08); padding: 20px; border-radius: 12px; background: rgba(255, 255, 255, 0.5); box-shadow: 0 4px 6px rgba(0,0,0,0.02);">
        <h3 style="margin-top: 0; color: #f59e0b; font-size: 1.2rem; display: flex; align-items: center; gap: 8px;" id="d1-database-drizzle">
          💾 D1 Database & Drizzle
        </h3>
        <p style="font-size: 0.95rem; color: #555; margin: 8px 0 0 0;">
          Cloudflare のエッジネイティブな SQL データベースである D1 と、Type-Safe な Drizzle ORM を組み合わせて、ブログデータを柔軟かつ高速に管理します。
        </p>
      </div>

      <!-- Authentication カード -->
      <div style="border: 1px solid rgba(0, 0, 0, 0.08); padding: 20px; border-radius: 12px; background: rgba(255, 255, 255, 0.5); box-shadow: 0 4px 6px rgba(0,0,0,0.02);">
        <h3 style="margin-top: 0; color: #000; font-size: 1.2rem; display: flex; align-items: center; gap: 8px;" id="better-auth">
          🔒 Better-Auth
        </h3>
        <p style="font-size: 0.95rem; color: #555; margin: 8px 0 0 0;">
          モダンな Web エコシステムに最適化された認証ライブラリ Better-Auth を導入し、堅牢で安全なセッション管理とユーザープロファイル保護を実現しています。
        </p>
      </div>

    </div>
  </section>

  <!-- 本文: 目標とビジョン -->
  <section style="margin-bottom: 40px; padding: 20px; background: rgba(0, 0, 0, 0.02); border-radius: 12px; border: 1px dashed rgba(0,0,0,0.1);">
    <h2 style="font-size: 1.3rem; font-weight: 700; margin-top: 0; margin-bottom: 10px; color: #333;" id="goals-of-this-blog-ja">
      🎯 このブログの目標
    </h2>
    <ul style="padding-left: 20px; margin: 0; color: #555;">
      <li style="margin-bottom: 8px;"><strong>知見のアーカイブ</strong>: 開発中に直面した課題の解決策や、実務的な技術ノウハウを惜しみなく共有します.</li>
      <li style="margin-bottom: 8px;"><strong>エンジンの継続的な改善</strong>: パフォーマンスの最適化や機能アップグレードのプロセスを透明に公開します。</li>
      <li style="margin-bottom: 0;"><strong>開発ガイドの提供</strong>: このエンジンを用いて独自のブログを構築したい方のために、詳細なマニュアルやヒントを連載します。</li>
    </ul>
  </section>

<p style="font-size: 1rem; font-weight: 700; margin-bottom: 15px; border-left: 5px solid #003eff; padding-left: 12px;">このテキストはGemini 3.5 Flashによって翻訳されました。一部、表現やニュアンスが不自然な箇所がある場合がございます。あらかじめご了承ください。</p>

  <!-- フッター / ソーシャルリンク -->
  <footer style="text-align: center; margin-top: 50px; padding-top: 20px; border-top: 1px solid rgba(0, 0, 0, 0.05); font-size: 0.8rem; color: #888;">
    <p>プロジェクトの詳細やお問い合わせ、応援のサポート（ご支援）は、以下のリンクからお気軽にお願いします！</p>
    <div style="margin-top: 15px; display: flex; justify-content: center; gap: 15px;">
      <a href="https://github.com/sveltekitblog/sveltekitblogengine" target="_blank" style="color: #ff3e00; text-decoration: none; font-weight: 600;">GitHubリポジトリ</a>
      <span>•</span>
      <a href="https://sveltekitblog.com/guestbook" style="color: #40b3ff; text-decoration: none; font-weight: 600;">ゲストブックを残す</a>
      <span>•</span>
      <a href="https://www.buymeacoffee.com/sveltekitblogengine" target="_blank" style="color: #ffe20a; text-decoration: none; font-weight: 600;">Buy me a Coffee</a>
    </div>
  </footer>

</div>
]]></content:encoded>
            <category>about</category>
        </item>
        <item>
            <title><![CDATA[ブログと管理者機能の統合紹介]]></title>
            <link>https://svelteblog-13g.pages.dev/ja/general-guide/general-integration-guide</link>
            <guid isPermaLink="true">https://svelteblog-13g.pages.dev/ja/general-guide/general-integration-guide</guid>
            <pubDate>Sat, 20 Jun 2026 02:54:35 GMT</pubDate>
            <description><![CDATA[ブログアプリのレイアウトやコミュニケーション機能、管理者モードの多言語執筆、リアルタイムデザイン設定など、主要な機能紹介ドキュメントを統合して紹介します。]]></description>
            <content:encoded><![CDATA[<p><img src="https://sveltekitblog.com/images/posts/general-integration-guide/desktop/img-general-guide-general-integration-guide-ko-001.webp" alt="img-general-guide-general-integration-guide-ko-001"></p>
<h1 id="ブログと管理者機能の統合紹介">📖 ブログと管理者機能の統合紹介</h1>
<p>本ドキュメントは、ブログサービスおよび管理者機能（管理画面）の主要構成を一覧できるよう、個別の機能紹介ドキュメントを整理して案内します。</p>
<p><em>参考：各機能の具体的な連携手順や詳細なマニュアルは、後日個別の投稿を通じて順次案内される予定です。</em></p>
<hr>
<h2 id="主要機能の紹介一覧">📂 主要機能の紹介一覧</h2>
<ul>
<li><strong>管理者（管理画面）機能紹介</strong><ul>
<li><strong><a href="../admin-guide/admin-install-and-deploy">CMDワンクリックインストールとCloudflareデプロイガイド</a></strong>: ターミナルコマンド一行でCloudflareエッジインフラを構築し、ブログをデプロイする方法を案内します。</li>
<li><strong><a href="../admin-guide/admin-getting-started">管理画面の初回アクセスと環境設定の開始</a></strong>: マスターパスワードログイン、接続許可IP（ホワイトリスト）管理および多言語UI辞書環境設定の概要を紹介します。</li>
<li><strong><a href="../admin-guide/admin-core-features">管理者主要機能とデュアルエディタ紹介</a></strong>: ビジュアルHTMLエディタとMarkdownエディタを切り替えながら執筆し、デバイス別レイアウトウィジェットを配置する方法を紹介します。</li>
<li><strong><a href="../admin-guide/admin-design-editor">リアルタイムデザインエディタと背景演出紹介</a></strong>: テーマカラー、単色/グラデーション/背景画像/キャンバススクリプトの4種類の背景設定を、再ビルドなしでリアルタイムに反映する機能を紹介します。</li>
<li><strong><a href="../admin-guide/admin-faq">管理者よくある質問 (FAQ) およびトラブルシューティング</a></strong>: バージョンアップグレード、画像ストレージキーの点検、デプロイ後の不具合解消およびIPセキュリティブロック解除方法などを確認します。</li>
</ul>
</li>
<li><strong>ブログ機能紹介</strong><ul>
<li><strong><a href="../blog-guide/blog-getting-started">ブログ初期画面構成とログイン</a></strong>: ブログの画面レイアウト構成とメール・ソーシャルログイン方式を紹介します。</li>
<li><strong><a href="../blog-guide/blog-core-features">ブログ主要機能と多言語サービス紹介</a></strong>: 多言語本文のリアルタイム切り替えおよび未翻訳時の代替処理ロジック、階層型コメントと非公開ゲストブックを通じたコミュニケーション構造を扱います。</li>
<li><strong><a href="../blog-guide/blog-faq">読者ポリシーとよくある質問 (FAQ)</a></strong>: 退会時の作成データ処理原則、再登録の規定および利用制限（Ban）/強制退会（Kick）措置に関して確認します。</li>
</ul>
</li>
</ul>
<hr>
<h2 id="ブログ管理の基本プロセス">🚀 ブログ管理の基本プロセス</h2>
<p>管理者の権限を設定し、執筆を開始する基本的な流れの概要です。</p>
<h3 id="1-ip許可リストの適用とログイン">1. IP許可リストの適用とログイン</h3>
<ul>
<li>初めて管理画面にアクセスする際、セキュリティのため訪問者のグローバルIPアドレスが許可リスト（<code>ALLOWED_IP</code>）に登録されている必要があります。</li>
<li>ログイン画面で設定された管理者マスターパスワードを入力して接続を確立します。</li>
</ul>
<h3 id="2-多言語記事の一括保存">2. 多言語記事の一括保存</h3>
<ul>
<li>記事作成メニューに用意された多言語タブを切り替えながら本文をそれぞれ入力し、下部の保存ボタンをクリックしてデータベースへ多言語の記事データを一括で保存します。</li>
</ul>
<h3 id="3-リアルタイムテーマの適用">3. リアルタイムテーマの適用</h3>
<ul>
<li>デザインエディタでテーマカラー、フォントの種類、背景効果（Canvas、画像など）を保存すると、再ビルドなしに訪問者のブラウザ画面へリアルタイムで即座に反映されます。</li>
</ul>
<hr>
<h2 id="おわりに">💬 おわりに</h2>
<p>本ドキュメントで紹介した内容は、ブログと管理画面が提供する機能の<strong>簡単な概要</strong>です。実際には、ここでは取り上げきれなかった様々な詳細機能や便利なオプションがさらに多く用意されており、実際にお使いいただきながらひとつずつ発見していくのも、また一つの楽しみになるかと思います。</p>
<p>今後、各機能の詳細な使い方や活用のコツを盛り込んだ詳細ガイドも順次投稿していく予定ですので、必要な際にまたお越しいただければ幸いです。ご利用中にご不明な点やお問い合わせがございましたら、ゲストブックやコメントを通じていつでもお気軽にお寄せください。</p>
]]></content:encoded>
            <category>統合ガイド</category>
            <enclosure url="https://sveltekitblog.com/images/posts/general-integration-guide/desktop/img-general-guide-general-integration-guide-ko-001.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[読者ポリシーとよくある質問 (FAQ)]]></title>
            <link>https://svelteblog-13g.pages.dev/ja/blog-guide/blog-faq</link>
            <guid isPermaLink="true">https://svelteblog-13g.pages.dev/ja/blog-guide/blog-faq</guid>
            <pubDate>Sat, 20 Jun 2026 02:50:33 GMT</pubDate>
            <description><![CDATA[退会時の作成データ（コメント、ゲストブック）の取り扱い方針や、利用制限に関する基本原則を紹介します。]]></description>
            <content:encoded><![CDATA[<p><img src="https://sveltekitblog.com/images/posts/blog-faq/desktop/img-blog-guide-blog-faq-ko-001.webp" alt="img-blog-guide-blog-faq-ko-001"></p>
<h1 id="読者ポリシーとよくある質問-faq">❓ 読者ポリシーとよくある質問 (FAQ)</h1>
<p>本ドキュメントは、ブログサービス利用時に発生する可能性のある退会に伴う個人情報および作成データの処理方法、利用制限ポリシーなどの基本原則を紹介します。</p>
<hr>
<h2 id="q1-退会した場合これまで作成したコメントやゲストブックはどうなりますか">🚪 Q1. 退会した場合、これまで作成したコメントやゲストブックはどうなりますか？</h2>
<p>ブログシステムは、読者の個人情報保護とサイト内における対話の流れの整合性を同時に維持するため、**「作成者の匿名化処理ポリシー」**を適用しています。</p>
<h3 id="退会時の個人情報処理原則">💡 退会時の個人情報処理原則</h3>
<ol>
<li><strong>個人識別情報の削除</strong>:<ul>
<li>退会処理が行われると、ログインメールアドレス、ソーシャルプロファイル画像、ニックネームなど、会員を識別できる固有データはデータベースから即座に削除されます。ただし、不正加入および不正利用の防止、セキュリティ監査(Audit)を目的として、退会時のメールアドレスやソーシャルIDなどの最小限の情報が、隔離された内部脱退ログテーブル(<code>deleted_users</code>)にアーカイブ(バックアップ)されます。このログ情報は内部管理用であり、公開画面上からは作成者の特定や追跡が不可能なように完全に匿名化（作成者不明）処理されます。</li>
</ul>
</li>
<li><strong>作成データの保持</strong>:<ul>
<li>作成されたコメントやゲストブックの投稿は、これまでの会話の流れや文脈を保持するため、テキスト内容は画面上にそのまま維持されます。</li>
</ul>
</li>
<li><strong>ニックネームの匿名化処理</strong>:<ul>
<li>作成者ニックネームとアカウント間の連携情報が解除され、作成者表示名は自動的に <strong>「作成者不明」</strong> に一括で切り替わります。これにより、以前の作成者が実際に誰であったかをシステム的に逆追跡することが防がれます。</li>
</ul>
</li>
</ol>
<ul>
<li><em>参考：管理者が会員情報を直接完全に削除した場合には、作成されたコメントやメッセージも一緒に削除されることがあります。</em></li>
</ul>
<hr>
<h2 id="q2-退会後すぐに再登録再加入は可能ですか">🚪 Q2. 退会後、すぐに再登録（再加入）は可能ですか？</h2>
<ul>
<li><strong>自主退会の場合</strong>:<ul>
<li>本人の意思で退会手続きを完了した場合、特別な憂慮期間なく、同一のメールアドレスやソーシャルアカウントを使用して即座に再登録およびサービス利用が可能です。</li>
</ul>
</li>
<li><strong>利用制限（Ban）状態の場合</strong>:<ul>
<li>運営ポリシー違反によってアカウントが利用制限（Ban）されている間は、該当のメールアドレス情報がすでにデータベース上に存在するため、同一のメールアドレスで新たに再登録することは原則として不可能です。</li>
</ul>
</li>
<li><strong>強制退会（Kick）処理された場合</strong>:<ul>
<li>管理者によってアカウントが強制削除（Hard Delete）された場合、認証テーブルから既存の情報が完全に削除されるため、同一のメールアドレスでの即時再登録が技術的に可能になります。</li>
<li>内部脱退ログ（<code>deleted_users</code>）に強制退会時のメールアドレスおよびソーシャルID情報は保管されますが、現時点では登録時にこのログを照合して自動的に再入会を制限するシステム上のフィルタリング（ブロック）ロジックは実装されておりません。</li>
<li>したがって、同一人物による悪意ある活動の再発を物理的かつ完全に防ぐためには、アカウントを強制削除（Kick）する代わりに、<strong>「永久利用制限（Ban - ブロック済み）」</strong> 状態を維持することを推奨します。（Ban状態ではメールアドレスがデータベースに残るため、一意の制約によって同一メールアドレスでの再登録が遮断されます。）</li>
</ul>
</li>
</ul>
<hr>
<h2 id="q3-アカウント利用制限banまたは強制退会kick処理されました">🚫 Q3. アカウント利用制限（Ban）または強制退会（Kick）処理されました。</h2>
<p>スパム広告や誹謗中傷などの運営ポリシー違反により、サービスの一部利用制限（Ban）措置が適用された、または強制退会（Kick）された場合の確認事項です。</p>
<h3 id="利用制限適用時の確認事項">💡 利用制限適用時の確認事項</h3>
<ol>
<li><strong>利用制限 (Ban)</strong>:<ul>
<li><strong>状態</strong>: ログイン状態は維持されますが、コメント作成、返信、ゲストブック登録など、サイト内における直接的な活動権限が一時的または永久に制限されます。</li>
<li><strong>理由の確認</strong>: 制限が適用されると、コメント作成エリアに <strong>「ブロックされたユーザーはコメントを書き込めません。」</strong> という案内メッセージが表示され、具体的な制限事由や制限満了日（解除予定日時）を確認できます。</li>
</ul>
</li>
<li><strong>強制退会 (Kick/Delete)</strong>:<ul>
<li><strong>状態</strong>: ログインアカウント自体がデータベースから完全に削除（Hard Delete）された状態です。</li>
<li><strong>動作</strong>: 強制退会処理が完了すると、アクティブなログインセッションが即座に強制終了されます。その後ログインを試みた場合は、登録履歴のない新規会員（存在しないアカウント）として扱われます。管理者が設定した削除動作（deleteBehavior）によって、書き込まれたコメントがすべて一括削除されるか、作成者名が「作成者不明」として匿名化されて残るかが異なります。</li>
</ul>
</li>
</ol>
]]></content:encoded>
            <category>ユーザーガイド</category>
            <enclosure url="https://sveltekitblog.com/images/posts/blog-faq/desktop/img-blog-guide-blog-faq-ko-001.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[ブログの主要機能と多言語サービスの概要]]></title>
            <link>https://svelteblog-13g.pages.dev/ja/blog-guide/blog-core-features</link>
            <guid isPermaLink="true">https://svelteblog-13g.pages.dev/ja/blog-guide/blog-core-features</guid>
            <pubDate>Sat, 20 Jun 2026 02:47:24 GMT</pubDate>
            <description><![CDATA[記事本文のリアルタイム言語切り替えと手動翻訳データの代替表示ロジック、階層型コメント構造、非公開ゲストブックなど、ブログサービスの主要機能を紹介します。]]></description>
            <content:encoded><![CDATA[<h1 id="ブログの主要機能と多言語サービスの概要">🌐 ブログの主要機能と多言語サービスの概要</h1>
<p>本ドキュメントは、訪問者がブログの多言語翻訳記事を閲覧し、コメントやゲストブックを通じて他のユーザーと対話するための主要機能を紹介します。</p>
<hr>
<h2 id="1-記事本文のリアルタイム言語切り替え-i18n">🌐 1. 記事本文のリアルタイム言語切り替え (i18n)</h2>
<p>このブログは、メニューやボタンなどの基本的なUIだけでなく、<strong>作成された記事本文データ自体</strong>も選択した言語バージョンに切り替えて閲覧できる、リアルタイム多言語翻訳ビューアを提供しています。</p>
<h3 id="動作方式と特徴">⚙️ 動作方式と特徴</h3>
<ul>
<li><strong>言語別URLルーティング</strong>: 上部の地球儀アイコンまたは記事タイトル横の言語選択ボタンをクリックすると、URLアドレスに言語コードのプレフィックス（例：<code>/en</code>, <code>/ja</code>）が付与され、該当言語の専用ページへ即座にルーティングされます。デフォルトで提供される言語（韓国語、英語、日本語）だけでなく、管理者が多言語翻訳辞書（ディクショナリ）を追加定義することで、新たな言語バージョンを制限なく追加発行できます。</li>
</ul>
<img src="https://sveltekitblog.com/images/posts/blog-core-features/desktop/img-blog-guide-blog-core-features-ko-001.webp" alt="img-blog-guide-blog-core-features-ko-001" data-align="center" />
<img src="https://sveltekitblog.com/images/posts/blog-core-features/desktop/img-blog-guide-blog-core-features-ko-002.webp" alt="img-blog-guide-blog-core-features-ko-002" data-align="center" />
<figure data-align="center"><img src="https://sveltekitblog.com/images/posts/blog-core-features/desktop/img-blog-guide-blog-core-features-ko-003.webp" alt="img-blog-guide-blog-core-features-ko-003" data-align="center" data-caption="多言語で公開された記事は、対象の言語ボタンを押すことで、その言語の翻訳版ページに即時に切り替わります。" /><figcaption>多言語で公開された記事は、対象の言語ボタンを押すことで、その言語の翻訳版ページに即時に切り替わります。</figcaption></figure><ul>
<li><strong>手動作成データの読み込み（自動翻訳ではありません）</strong>: システムが自動的にリアルタイムで機械翻訳を行うわけではありません。作成者が各言語タブの翻訳記事本文データを直接執筆して個別に保存しておくと（外部AIや翻訳機で加工したものをデータベースにそれぞれ登録）、訪問者が選択した言語に対応する記事データをデータベースから正確に呼び出し、画面にレンダリングする方式です。</li>
<li><strong>本文およびメタデータの同時読み込み</strong>: 単純なテキストの置き換えにとどまらず、データベースに各言語向けに登録されているタイトル、概要、タグ、本文HTMLが、完全に選択した言語の個別データに切り替わって出力されます。</li>
<li><strong>未翻訳記事の代替（フォールバック）表示</strong>: 作成者が特定の言語の翻訳記事を登録していない場合、訪問者がコンテンツを閲覧できなくなるのを防ぐため、「翻訳準備中」の案内メッセージとともに、デフォルトの作成言語（例：韓国語本文）で記事内容を代替表示し、スムーズな読書をサポートします。</li>
</ul>
<hr>
<h2 id="2-コメントおよび返信スレッド機能">💬 2. コメントおよび返信（スレッド）機能</h2>
<p>各記事の下部には、ゲスト訪問者や会員が意見を交換できるコメント領域が配置されています。</p>
<ul>
<li><strong>意見の共有</strong>: ログインユーザーは、コメント入力欄に内容を記入して登録することで、即座に意見を共有できます。</li>
<li><strong>階層型の返信（スレッド表示）</strong>: 特定のコメントに対して返信を行うことができ、スレッドの対話の流れをツリー構造でわかりやすく整理します。</li>
<li><strong>セキュリティと完全性の維持</strong>: 自分が作成したコメントは削除が可能です。ただし、すでに返信がついているコメントを削除する場合、会話の階層構造が崩れるのを防ぐため、「削除されたコメントです」というメッセージにマスク処理され、構造自体は保持されます。</li>
</ul>
<hr>
<h2 id="3-ゲストブックと非公開メッセージの作成">📖 3. ゲストブックと非公開メッセージの作成</h2>
<p>ゲストブック（Guestbook）を通じて、ブログの開設者とプライベートにコミュニケーションをとる機能をサポートしています。</p>
<h3 id="非公開ゲストブック機能">⚙️ 非公開ゲストブック機能</h3>
<ul>
<li><strong>非公開メッセージの作成</strong>: メッセージ入力時に <strong>[🔒 非公開で作成]</strong> チェックボックスを有効にすることで、非公開メッセージの送信が可能です。</li>
<li><strong>表示権限の制限</strong>: 非公開で保存されたメッセージは、第三者（他の訪問者や未ログインの他ユーザー）のリストからは完全に除外されます。</li>
<li><strong>安全なメッセージ送信</strong>: メッセージを作成した本人（ログイン状態）とサイト管理者のみに本文が表示され、安全に対話を行うことができます。</li>
</ul>
]]></content:encoded>
            <category>ユーザーガイド</category>
            <enclosure url="https://sveltekitblog.com/images/posts/blog-core-features/desktop/img-blog-guide-blog-core-features-ko-001.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[ブログの初期画面構成とログインについて]]></title>
            <link>https://svelteblog-13g.pages.dev/ja/blog-guide/blog-getting-started</link>
            <guid isPermaLink="true">https://svelteblog-13g.pages.dev/ja/blog-guide/blog-getting-started</guid>
            <pubDate>Sat, 20 Jun 2026 02:41:11 GMT</pubDate>
            <description><![CDATA[ブログアプリのトップ画面レイアウト構成と、基本的な会員登録およびログイン手順の概要を紹介します。]]></description>
            <content:encoded><![CDATA[<h1 id="ブログの初期画面構成とログインについて">🌐 ブログの初期画面構成とログインについて</h1>
<p>本ドキュメントは、ブログ（<code>apps/blog</code>）トップ画面のレイアウト構成と、基本的な会員登録およびログイン方式の概要を紹介します。</p>
<hr>
<h2 id="1-ブログの画面構成とレイアウト">🎨 1. ブログの画面構成とレイアウト</h2>
<p>ブログの画面は、訪問者が情報を迅速に見つけられるよう、直感的なレイアウト（ヘッダー、本文、サイドバー、フッター）で設計されています。</p>
<ol>
<li><strong>ナビゲーションヘッダー (Header)</strong>:<ul>
<li><strong>サイトロゴ</strong>: クリックするといつでもトップ画面に戻ります。</li>
<li><strong>ショートカットメニュー</strong>: カテゴリへのショートカットや外部リンクなど、主要なリンクが表示されます。</li>
<li><strong>多言語切り替え</strong>: 地球儀アイコンをクリックすると、メニュー言語や記事の翻訳版をリアルタイムで切り替えて表示できます。</li>
</ul>
</li>
<li><strong>サイドバー (Sidebar)</strong>:<ul>
<li>PC画面では、カテゴリ一覧、運営者プロフィールカード、人気タグなどが表示され、自由な探索をサポートします。</li>
<li>モバイル端末からのアクセス時には、本文の視認性向上のため自動的に非表示になります。</li>
</ul>
</li>
<li><strong>メインコンテンツ領域 (Main Content)</strong>:<ul>
<li>最新の記事一覧とカテゴリフィルターが、カードデザイン形式で配置されています。</li>
</ul>
</li>
</ol>
<hr>
<h2 id="2-会員登録とログイン">🔑 2. 会員登録とログイン</h2>
<p>コメントの入力やゲストブックへのメッセージ作成に必要な、アカウント作成およびログイン機能をサポートしています。</p>
<h3 id="ログインおよび登録サポート方式">⚙️ ログインおよび登録サポート方式</h3>
<ul>
<li><strong>標準メールログイン/登録 (Default)</strong>:<ul>
<li>インストール直後にデフォルトで有効化されているログイン方式です。メールアドレス、表示名（ニックネーム）、パスワードを登録して新規登録でき、登録後は即座に自動ログインが適用されます。</li>
</ul>
</li>
</ul>
<figure data-align="center"><img src="https://sveltekitblog.com/images/posts/blog-getting-started/desktop/img-blog-guide-blog-getting-started-ja-001.webp" alt="img-blog-guide-blog-getting-started-ja-001" data-align="center" data-caption="デフォルトのメールログイン" /><figcaption>デフォルトのメールログイン</figcaption></figure>
* **ソーシャルログイン (Better-Auth)**:
  * 内部的にBetter-Authエンジンを搭載しており、Google、GitHub、カカオ、ネイバーなどを含む **計21種のソーシャルプロバイダーログイン** をサポートしています。
  * ただし、ソーシャルログインは、サイト構築後に管理者が各ソーシャルプラットフォームから取得したクライアントIDおよびシークレットキーを設定用の環境変数に手動で挿入する必要があります。入力されていない場合、ログイン画面にソーシャルボタンは表示されず動作しません。（プロバイダーごとの具体的な連携手順は、後日別のドキュメントで案内予定です。）
<figure data-align="center"><img src="https://sveltekitblog.com/images/posts/blog-getting-started/desktop/img-blog-guide-blog-getting-started-ja-002.webp" alt="img-blog-guide-blog-getting-started-ja-002" data-align="center" data-caption="ソーシャル＋メールログイン" /><figcaption>ソーシャル＋メールログイン</figcaption></figure>
* **ログイン状態の表示**:
  * ログインが完了すると、右上ボタンがユーザーのプロフィール画像アイコンとマイページへのショートカットに切り替わります。
  * *参考：ユーザーのプロフィール写真を実際に連携して表示する機能は現在開発中のため、デフォルトの画像アイコンで代替表示される場合があります。*]]></content:encoded>
            <category>ユーザーガイド</category>
            <enclosure url="https://sveltekitblog.com/images/posts/blog-getting-started/desktop/img-blog-guide-blog-getting-started-ja-001.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[管理者のよくある質問 (FAQ) およびトラブルシューティング]]></title>
            <link>https://svelteblog-13g.pages.dev/ja/admin-guide/admin-faq</link>
            <guid isPermaLink="true">https://svelteblog-13g.pages.dev/ja/admin-guide/admin-faq</guid>
            <pubDate>Sat, 20 Jun 2026 02:34:34 GMT</pubDate>
            <description><![CDATA[インストールやデプロイ中に発生するエラーの解決、バージョンアップグレード、画像ストレージの必須キー一覧、およびIPセキュリティによるアクセス制限の解除方法を確認します。]]></description>
            <content:encoded><![CDATA[<img src="https://sveltekitblog.com/images/posts/admin-faq/desktop/img-admin-guide-admin-faq-ko-001.webp" alt="img-admin-guide-admin-faq-ko-001" data-align="center"><h1 id="管理者のよくある質問-faq-およびトラブルシューティング">❓ 管理者のよくある質問 (FAQ) およびトラブルシューティング</h1>
<p>本ドキュメントは、ブログのインストール、デプロイ、および運営段階で発生する可能性のある主なトラブルシューティング解決策と、安全な最新バージョンへのアップグレードガイドを提供します。</p>
<hr>
<h2 id="q1-最新バージョンへ安全にアップグレードupgradeするかデータを復元する方法を教えてください">🗄️ Q1. 最新バージョンへ安全にアップグレード（Upgrade）するか、データを復元する方法を教えてください。</h2>
<p>データベースの整合性を維持し、予期しないビルドクラッシュを防ぐため、以下の安全なアップグレード手順を遵守することを強く推奨します。</p>
<h3 id="1-安全な最新バージョンへのアップグレード検証手順推奨">1. 安全な最新バージョンへのアップグレード検証手順（推奨）</h3>
<p>既存のデータベースとのスキーマ不一致やテンプレート変更に伴う衝突を予防するため、本番サーバーに直接適用するのではなく、まず隔離されたテスト環境で安全性を確認してください。（Gitを使用せずファイルを直接ダウンロードして使用するユーザーも同様です）</p>
<ol>
<li><strong>設定ファイルのバックアップ</strong>:<ul>
<li>現在の開発フォルダ内にある <code>wrangler.backup.json</code> と <code>.dev.vars</code> ファイルを安全な一時フォルダにコピーして保管します。</li>
<li><em>※ <code>.dev.vars</code> ファイルは重要な認証情報（パスワード、OAuthキーなど）を含みますが、セキュリティ保護のためGit管理対象外（<code>.gitignore</code>）に指定されています。そのため、コードの更新時や再取得時に紛失しやすいため、必ずバックアップを取ってください。</em></li>
</ul>
</li>
<li><strong>稼働中のデータバックアップ</strong>:<ul>
<li>現在稼働しているブログ管理画面の <code>コンテンツバックアップ</code> メニューから、記事全体および設定バックアップファイルをダウンロードします。</li>
</ul>
</li>
<li><strong>隔離されたフォルダに新バージョンをクローン/ダウンロード</strong>:<ul>
<li>既存のフォルダを上書きせず、<strong>完全に新しいディレクトリ</strong>に最新リリースのソースコードをダウンロードまたはクローンします。</li>
</ul>
</li>
<li><strong>一時テストサーバーのデプロイ</strong>:<ul>
<li>新しいフォルダに移動し、依存関係のインストール（<code>npm install</code>）を行い、一時的なテスト用データベースを構築してテストデプロイを実行します。</li>
</ul>
</li>
<li><strong>バックアップ復元テスト</strong>:<ul>
<li>新しくデプロイされたテスト用管理画面にアクセスし、ステップ2で取得したバックアップファイルをロードして、データが漏れなく正常に表示され、エラーが発生しないかを徹底的に検証します。</li>
</ul>
</li>
<li><strong>本番サーバーへの正式アップデート適用</strong>:<ul>
<li>テストサーバーですべての機能が正常に動作することを確認した後でのみ、元の開発フォルダに戻り、コードを更新（<code>git pull</code> またはソースコードの上書き）して、各アプリの個別デプロイコマンド（<code>npm run deploy:blog</code>、<code>npm run deploy:admin</code>）を実行し、正式なアップグレードを完了させます。</li>
</ul>
</li>
</ol>
<h3 id="2-データ紛失時の最終手段">2. データ紛失時の最終手段</h3>
<ul>
<li><strong><code>npm run restore</code> コマンドの使用</strong>:<ul>
<li>インフラ設定やデータベースが深刻に破損し、根本的な復旧が必要な場合にのみ、バックアップしておいた <code>wrangler.backup.json</code> ファイルを基にインフラ全体を再構築する**「最後のデータ復旧手段」**として実行してください。</li>
</ul>
</li>
</ul>
<hr>
<h2 id="q2-r2supabaseimagekitへの画像ストレージ変更時に入力すべき必須キーは何ですか">📂 Q2. R2、Supabase、ImageKitへの画像ストレージ変更時に入力すべき必須キーは何ですか？</h2>
<p>各外部画像ストレージ使用時に入力漏れのないよう確認すべき必須環境変数および設定のチェックリストです。</p>
<table>
<thead>
<tr>
<th align="left">ストレージタイプ</th>
<th align="left">必須入力項目 / 設定</th>
<th align="left">説明</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>Cloudflare R2</strong></td>
<td align="left"><code>IMAGES</code> R2バケットバインディング</td>
<td align="left"><code>wrangler.json</code> 内のR2バケット情報とのマッピングが必要です。</td>
</tr>
<tr>
<td align="left"><strong>Supabase Storage</strong></td>
<td align="left"><code>supabase_storage_url</code><br><code>supabase_storage_key</code><br><code>supabase_storage_bucket</code></td>
<td align="left">API URLおよびService Role Keyが正確である必要があり、Supabase Storage内のバケット権限ポリシーが <strong>Public（公開）</strong> に設定されていなければ画像が表示されません。</td>
</tr>
<tr>
<td align="left"><strong>ImageKit.io</strong></td>
<td align="left"><code>imagekit_url_endpoint</code><br><code>imagekit_public_key</code><br><code>imagekit_private_key</code></td>
<td align="left">エンドポイントURLの形式を確認し、クロスオリジンリソース共有（CORS）の許可を設定する必要があります。</td>
</tr>
</tbody></table>
<hr>
<h2 id="q3-ダッシュボードの統計グラフがデモデータのみで表示されます">📊 Q3. ダッシュボードの統計グラフがデモデータのみで表示されます。</h2>
<ul>
<li><strong>原因</strong>: Google Analytics 4 (GA4) APIの環境変数が入力されていない、または無効な場合、ダッシュボードのクラッシュを防ぐためにデモ用のダミーデータが代替表示されます。</li>
<li><strong>設定手順</strong>: Cloudflare Pages設定に以下の環境変数を入力し、再デプロイを行ってください。<ul>
<li><code>GA4_PROPERTY_ID</code>: Google Analytics プロパティ ID</li>
<li><code>GA4_CLIENT_EMAIL</code>: Google Cloud サービスアカウントメールアドレス</li>
<li><code>GA4_PRIVATE_KEY</code>: Google サービスアカウント秘密鍵</li>
</ul>
</li>
<li><strong>注意点</strong>: <code>.dev.vars</code> ファイルに <code>GA4_PRIVATE_KEY</code> を記述する際、改行コード（<code>\n</code>）の形式が崩れないよう、必ず鍵文字列全体を二重引用符（<code>&quot;</code>）で囲って登録してください。</li>
</ul>
<hr>
<h2 id="q4-初回setupデプロイ後管理画面にアクセスできなかったり一部のデータ同期が不足しているようです">⚡ Q4. 初回setupデプロイ後、管理画面にアクセスできなかったり、一部のデータ同期が不足しているようです。</h2>
<ul>
<li><strong>原因</strong>: ワンクリックセットアップ時に環境変数の設定が正常に完了していたとしても、一時的なネットワーク接続エラーやシステム上の不具合により、暗号化キーや秘密環境変数（Secrets）の同期が一部抜けてしまったり、データが破損した状態でデプロイが進行することがあります。</li>
<li><strong>解決策</strong>: 各アプリの <code>.dev.vars</code> 設定値の状態を再度確認した上で、各フォルダに移動し、手動で個別のデプロイコマンド <code>npm run deploy:blog</code> と <code>npm run deploy:admin</code> をそれぞれ <strong>1回実行</strong> してください。ローカルの <code>.dev.vars</code> ファイルに入力された秘密環境変数群が正常に上書きされることで、問題が解決します。</li>
</ul>
<hr>
<h2 id="q5-管理画面へのアクセス時にforbidden-ip-not-allowedまたは403エラーが表示されます">🔒 Q5. 管理画面へのアクセス時に「Forbidden (IP Not Allowed)」または403エラーが表示されます。</h2>
<p>本ブログのセキュリティ仕様上、デプロイスクリプトの実行時にデプロイを行っているPCのグローバルIPアドレスを自動的に検知し、アクセス許可IP（<code>ALLOWED_IP</code>）としてPages Secretに自動挿入します。</p>
<h3 id="管理者セキュリティ推奨事項">⚠️ 管理者セキュリティ推奨事項</h3>
<ul>
<li>アカウントの乗っ取りや不正アクセスを防ぐため、外部の公共エリア（カフェ、図書館など）や、信頼性の保証されない <strong>共有PC</strong> からの管理画面へのアクセス・投稿作業は、<strong>セキュリティ保護のため強く制限することを推奨</strong>します。</li>
</ul>
<h3 id="状況別の対処法">💡 状況別の対処法</h3>
<ul>
<li><strong>状況A. 自宅やオフィスのIPアドレスが変わった場合（ルーターの再起動など）</strong>:<ul>
<li>既存の作業を行っていた自宅やオフィスのメイン開発PCのターミナルから <code>npm run deploy:admin</code> を1回実行してください。変更後のグローバルIPを自動的に検知して再デプロイが行われ、即座にアクセスが再開されます。</li>
</ul>
</li>
<li><strong>状況B. やむを得ず外部の場所から投稿作業を行うため、一時的に開発環境を移動させる場合</strong>:<ul>
<li>以前取得したバックアップ設定ファイル（<code>wrangler.backup.json</code> など）を持参し、新しいPC環境でワンクリックセットアップを実行して、新規にビルド・デプロイすることでアクセス権限を取得する方法が最も簡単です。</li>
<li><strong>※ 注意:</strong> 外部での作業を終え、再び本来の自宅やオフィスに戻ってブログを管理する際には、<strong>必ず元のメイン開発PCから <code>npm run deploy:admin</code> を再実行し、アクセス許可IPを本来の固定IPに復元デプロイ</strong>してください。</li>
</ul>
</li>
</ul>
<hr>
<h2 id="q6-better-authソーシャルログイン・会員登録に関するエラーやログインの無限ループが発生します">🔐 Q6. Better Auth（ソーシャルログイン・会員登録）に関するエラーや、ログインの無限ループが発生します。</h2>
<ul>
<li><strong>原因</strong>: 認証セキュリティに使用される環境変数が欠落しているか無効な場合、セッション検証に失敗してログイン画面がループし続けます。</li>
<li><strong>解決策</strong>: <ol>
<li><code>apps/blog/.dev.vars</code> を開き、<code>BETTER_AUTH_SECRET</code> に <strong>最小32文字以上の安全なランダム暗号化文字列</strong> が入力されているか確認します。</li>
<li>正確に値を設定した後、<code>npm run deploy:blog</code> を実行して秘密キーを同期上書きすれば、認証機能が正常に復旧します。</li>
</ol>
</li>
</ul>
]]></content:encoded>
            <category>管理者ガイド</category>
            <enclosure url="https://sveltekitblog.com/images/posts/admin-faq/desktop/img-admin-guide-admin-faq-ko-001.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[リアルタイムデザインエディタと背景演出の概要]]></title>
            <link>https://svelteblog-13g.pages.dev/ja/admin-guide/admin-design-editor</link>
            <guid isPermaLink="true">https://svelteblog-13g.pages.dev/ja/admin-guide/admin-design-editor</guid>
            <pubDate>Sat, 20 Jun 2026 02:26:20 GMT</pubDate>
            <description><![CDATA[再ビルドと再デプロイ不要の1秒リアルタイムテーマ反映]]></description>
            <content:encoded><![CDATA[<h1 id="リアルタイムデザインエディタと背景演出の概要">🎨 リアルタイムデザインエディタと背景演出の概要</h1>
<p>本ドキュメントは、再ビルドや再デプロイを必要とせずにテーマ設定を即座に反映するシステムと、4つの背景設定（単一色、グラデーション、背景画像、カスタムJavaScriptキャンバス）の基本構成について紹介します。</p>
<hr>
<h2 id="1-リアルタイムデザインエディタの概要">🌌 1. リアルタイムデザインエディタの概要</h2>
<p>デザインエディタで設定値を変更して保存する際、ブログサーバーやCDNサービスを再ビルド・再デプロイする必要は一切ありません。保存するとデータベースが即座に更新され、<strong>訪問者のブラウザ画面にCSS変数と背景レンダリングモジュールが1秒で反映</strong>されます。<br>ブログに最終適用する前に、管理者ページ内のプレビュー画面でデザインの変化をあらかじめ確認することができます。</p>
<blockquote>
<p>[!WARNING]</p>
<h3 id="プレビューと実際のブログデザインの差異に関する注意点">⚠️ プレビューと実際のブログデザインの差異に関する注意点</h3>
<p>デザインエディタの<strong>プレビュー機能は、実際の訪問者画面と100%同一のレンダリング環境を保証するものではありません。</strong> ブラウザによるCSS変数の解釈やJavaScript Canvasの描画条件などにより、管理者ページのプレビューと実際のブログ表示に微細な差異が生じる場合があります。</p>
<p>それゆえ、デザイン設定を変更した後は、<strong>必ず実際のブログのメイン画面にアクセスし、再読み込み（F5）を行って最終的な表示状態を確認</strong>することを強く推奨します。</p>
</blockquote>
<hr>
<h3 id="レイアウトテーマ設定項目">🧱 レイアウト＆テーマ設定項目</h3>
<h4 id="レイアウト構成">① レイアウト構成</h4>
<ul>
<li><strong>ブログ基本構造</strong>: メインページの基本レイアウト構造（例：2カラム、3カラムなど）を選択できます。</li>
<li><strong>カラム幅の比率</strong>: メインコンテンツエリアとサイドバーカラムの横幅比率（例：1:2:1、2:1:2など）を調整します。</li>
<li><strong>最大横幅</strong>: ブログ画面全体の最大横幅解像度（例：1200px、1400pxなど）を制限します。</li>
<li><strong>レイアウト詳細設定</strong>: 左右の余白（Side Margin）、カードコンテナの角の丸み（Border Radius）、立体感を与えるシャドウ（Box Shadow）効果を細かく制御します。</li>
</ul>
<h4 id="テーマ基本配色">② テーマ基本配色</h4>
<ul>
<li>メインテーマ色（Primary）、サブ色（Secondary）、本文テキスト色（Text）、アクセント強調色（Accent）、カード背景色（Card Bg）、および枠線色（Border）をカスタマイズできます。</li>
</ul>
<h4 id="タイポグラフィフォント設定">③ タイポグラフィ（フォント）設定</h4>
<ul>
<li>Google Fontsのフォント一覧から任意のフォントファミリー名を直接入力して適用し、本文のフォント種類や基本文字サイズ（Base Font Size）を設定できます。</li>
</ul>
<h4 id="ウィジェットの配置・順序管理">④ ウィジェットの配置・順序管理</h4>
<ul>
<li>使用可能なウィジェットをドラッグ＆ドロップで各カラムに自由に配置し、表示順序を調整できます。</li>
</ul>
<hr>
<h2 id="2-デバイス別の独立ウィジェット配置">🧱 2. デバイス別の独立ウィジェット配置</h2>
<p>レイアウト設計時には、ドラッグ＆ドロップでサイドバーや本文領域のウィジェット位置と順序を調整できます。また、訪問者の画面サイズ（デバイスタイプ）に応じてレイアウトを動的に切り替えるフィルタリング機能を提供します。</p>
<ul>
<li><strong>Desktop (デスクトップ専用)</strong>: 画面幅の広いPC環境でのみ、指定されたウィジェット（例：タグクラウド、カテゴリツリーなど）を表示します。モバイル接続時には、読み込み速度を維持するため、HTML送信段階で該当要素をあらかじめ除外します。</li>
<li><strong>Mobile (モバイル専用)</strong>: デスクトップ環境では非表示にし、スマートフォンなどのモバイル解像度でのみモバイル向けに表示されるよう制限します。</li>
</ul>
<hr>
<h2 id="3-4つの背景設定の種類">🌈 3. 4つの背景設定の種類</h2>
<p>ブログ全体の雰囲気を決定する背景画面として、以下の4つのタイプがサポートされています。</p>
<h3 id="solid単一色背景">① Solid（単一色背景）</h3>
<ul>
<li>任意のHEXコード（例： <code>#3b82f6</code>）またはHSLカラーコードを指定して、最もシンプルで記事本文に集中しやすい画面を構成します。</li>
</ul>
<h3 id="gradientグラデーション背景">② Gradient（グラデーション背景）</h3>
<ul>
<li><strong>グラデーションビルダー</strong>ツールを使用して、複数のカラーがスムーズに混ざり合う線形グラデーションを作成します。</li>
<li>角度（Direction）スライダーの調整やカラーストップ（Stops）の追加・移動により、開始色、中間色、終了色を自由に配合できます。</li>
</ul>
<h3 id="image背景画像グラスモフィズム効果">③ Image（背景画像＆グラスモフィズム効果）</h3>
<ul>
<li>背景に使用する画像のURLを入力するか、アップロード（Upload）ボタンを使用してメディアファイルをライブラリに追加します。</li>
<li><strong>アップロード画像の最適化</strong>: 画像を登録すると、システムが自動的にWebP形式へ変換し、読み込みパフォーマンスの低下を防ぎます。</li>
<li><strong>グラスモフィズム効果</strong>: 背景画像がテキストの視認性を妨げないよう、以下の設定を組み合わせて半透明なガラス窓風のスタイルを構成できます。</li>
</ul>
<table>
<thead>
<tr>
<th align="left">設定項目</th>
<th align="center">推奨値の範囲</th>
<th align="left">詳細説明</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>背景のぼかし (Glass Blur)</strong></td>
<td align="center"><code>5px ~ 15px</code></td>
<td align="left">本文カードの下部レイヤーに半透明なすりガラス風のフィルターを適用します。</td>
</tr>
<tr>
<td align="left"><strong>オーバーレイ不透明度 (Overlay Opacity)</strong></td>
<td align="center"><code>10% ~ 30%</code></td>
<td align="left">カードコンテナの背後に敷く半透明マスクの不透明度を決定します。</td>
</tr>
<tr>
<td align="left"><strong>オーバーレイ色 (Overlay Color)</strong></td>
<td align="center"><code>#000000</code> または <code>#ffffff</code></td>
<td align="left">マスクの色をダーク（暗）またはライト（明）に設定し、テキストのコントラストを確保します。</td>
</tr>
</tbody></table>
<h3 id="custom-javascriptカスタムjavascriptcanvas背景">④ Custom JavaScript（カスタムJavaScript＆Canvas背景）</h3>
<ul>
<li>クライアントのブラウザ背景にインタラクティブなCanvasアニメーションを描画するため、カスタムJavaScriptの入力をサポートします。</li>
<li>背景キャンバス要素（<code>canvas id=&quot;bg-canvas&quot;</code>）に対して直接描画を制御できます。連動するセキュリティ制限や省電力ポリシーの詳細は、以下の <strong>[4. カスタムJavaScript連携仕様]</strong> で説明します。</li>
</ul>
<figure data-align="center"><img src="https://sveltekitblog.com/images/posts/admin-design-editor/desktop/img-admin-guide-admin-design-editor-ja-002.webp" alt="img-admin-guide-admin-design-editor-ja-002" data-align="center" data-caption="セキュリティサンドボックス搭載のCustom JSキャンバスアニメーション入力画面（有効化前）" /><figcaption>セキュリティサンドボックス搭載のCustom JSキャンバスアニメーション入力画面（有効化前）</figcaption></figure>
<figure data-align="center"><img src="https://sveltekitblog.com/images/posts/admin-design-editor/desktop/img-admin-guide-admin-design-editor-ja-001.webp" alt="img-admin-guide-admin-design-editor-ja-001" data-align="center" data-caption="セキュリティサンドボックス搭載のCustom JSキャンバスアニメーション入力画面（有効化後）" /><figcaption>セキュリティサンドボックス搭載のCustom JSキャンバスアニメーション入力画面（有効化後）</figcaption></figure><hr>
<h2 id="4-カスタムjavascript連携仕様">⚡ 4. カスタムJavaScript連携仕様</h2>
<p>セキュリティリスクを防止し、モバイル端末のバッテリー消費を抑えるため、以下のサンドボックス環境および省電力システムが適用されています。</p>
<h3 id="サンドボックスcspによるセキュリティ制限">🔒 サンドボックス＆CSPによるセキュリティ制限</h3>
<p>悪意あるスクリプトの混入による脆弱性を防ぐため、以下のセキュリティ対策が常時稼働しています。</p>
<ol>
<li><strong>隔離されたサンドボックス構造</strong>: キャンバスコードは、スクリプト実行のみが許可された隔離された <code>iframe</code> 内で動作します。親ページのDOMノードやログイン情報などへのアクセスは技術的に遮断されます。</li>
<li><strong>コンテンツセキュリティポリシー (CSP) 制限</strong>: 外部サーバーへのネットワーク通信や外部スクリプトの呼び出しが全面的に遮断されます。これにより、外部サーバーへデータを流出させることが不可能です。</li>
<li><strong>JS APIの制限</strong>: セキュリティ上のリスクとなる <code>fetch</code>, <code>XMLHttpRequest</code>, <code>WebSocket</code>, <code>eval</code>, <code>new Function</code>, <code>document.cookie</code>, <code>localStorage</code> などのAPIが検出された場合、検証スクリプト（<code>jsValidator.ts</code>）によって自動的にコメント処理（<code>/* f_e_t_c_h (blocked) */</code>）されます。</li>
</ol>
<h3 id="バッテリー消費の最適化省電力技術">🔋 バッテリー消費の最適化（省電力技術）</h3>
<ul>
<li><strong>画面外での自動一時停止</strong>: ユーザーがスクロールして背景アニメーションが完全に視野から外れると、ブラウザが不要にCPU/GPUを消費しないよう、レンダリングループを <strong>スリープ状態（一時停止）</strong> に切り替えます。再び画面に表示されると、即座に再開されます。</li>
<li><strong>モバイル用フレーム制限</strong>: スマートフォンやタブレットでアクセスする場合、発熱を抑えるためデフォルトで背景スクリプトの実行を停止します。<strong>「モバイル端末でもアニメーションを実行」</strong> オプションを明示的に有効にした場合は実行が可能となり、その際もパフォーマンスに負荷がかからないようパーティクル数を自動的に削減する制御パラメータが適用されます。</li>
</ul>
<hr>
<h2 id="5-サンプルスクリプト3種">📝 5. サンプルスクリプト3種</h2>
<p>背景設定メニューから <strong>[Custom JavaScript]</strong> を選択し、以下のコードのいずれかをコピーして適用できます。</p>
<blockquote>
<p>[!NOTE]<br>スクリプトを作成する際は、描画対象のキャンバス要素を取得するために必ず <code>document.getElementById(&#39;bg-canvas&#39;)</code> のID名を使用してください。</p>
</blockquote>
<h3 id="サンプルa-冬の雪snowfall">❄️ サンプルA. 冬の雪（Snowfall）</h3>
<p>画面上部から雪の結晶がゆっくりと舞い落ちる背景アニメーションです。</p>
<pre><code class="language-javascript">(function() {
  const canvas = document.getElementById(&#39;bg-canvas&#39;);
  if (!canvas) return;
  const ctx = canvas.getContext(&#39;2d&#39;);
  
  let width = canvas.width = window.innerWidth;
  let height = canvas.height = window.innerHeight;
  
  // モバイル省電力の判定
  const divisor = (window.bgConfig &amp;&amp; window.bgConfig.mobileThrottleDivisor) || 1;
  const maxSnowflakes = Math.floor(100 / divisor);
  const snowflakes = [];
  
  class Snowflake {
    constructor() {
      this.reset();
      this.y = Math.random() * height; // 初期ランダム高度
    }
    
    reset() {
      this.x = Math.random() * width;
      this.y = -10;
      this.radius = Math.random() * 3 + 1;
      this.speed = Math.random() * 1 + 0.5;
      this.opacity = Math.random() * 0.6 + 0.2;
    }
    
    update() {
      this.y += this.speed;
      // 緩やかな揺らぎ
      this.x += Math.sin(this.y / 30) * 0.5;
      
      if (this.y &gt; height || this.x &lt; 0 || this.x &gt; width) {
        this.reset();
      }
    }
    
    draw() {
      ctx.beginPath();
      ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2);
      ctx.fillStyle = `rgba(25, 25, 255, ${this.opacity})`;
      ctx.fill();
    }
  }
  
  // パーティクルの生成
  for (let i = 0; i &lt; maxSnowflakes; i++) {
    snowflakes.push(new Snowflake());
  }
  
  function animate() {
    ctx.clearRect(0, 0, width, height);
    
    for (let i = 0; i &lt; snowflakes.length; i++) {
      snowflakes[i].update();
      snowflakes[i].draw();
    }
    requestAnimationFrame(animate);
  }
  
  // リサイズハンドラ
  window.addEventListener(&#39;resize&#39;, () =&gt; {
    width = canvas.width = window.innerWidth;
    height = canvas.height = window.innerHeight;
  });
  
  animate();
})();
</code></pre>
<hr>
<h3 id="サンプルb-星座ネットワークconstellation-network">🕸️ サンプルB. 星座ネットワーク（Constellation Network）</h3>
<p>浮遊するノードパーティクル同士が近づいた際に、薄い半透明の線で結ばれ網状のネットワークを形成する背景アニメーションです。</p>
<pre><code class="language-javascript">(function() {
  const canvas = document.getElementById(&#39;bg-canvas&#39;);
  if (!canvas) return;
  const ctx = canvas.getContext(&#39;2d&#39;);
  
  let width = canvas.width = window.innerWidth;
  let height = canvas.height = window.innerHeight;
  
  const divisor = (window.bgConfig &amp;&amp; window.bgConfig.mobileThrottleDivisor) || 1;
  const particleCount = Math.floor(80 / divisor);
  const particles = [];
  const connectionDistance = 100;
  
  class Particle {
    constructor() {
      this.x = Math.random() * width;
      this.y = Math.random() * height;
      this.vx = (Math.random() - 0.5) * 0.8;
      this.vy = (Math.random() - 0.5) * 0.8;
      this.radius = Math.random() * 2 + 1.5;
    }
    
    update() {
      this.x += this.vx;
      this.y += this.vy;
      
      // 境界での反射
      if (this.x &lt; 0 || this.x &gt; width) this.vx *= -1;
      if (this.y &lt; 0 || this.y &gt; height) this.vy *= -1;
    }
    
    draw() {
      ctx.beginPath();
      ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2);
      ctx.fillStyle = &#39;rgba(99, 102, 241, 0.4)&#39;; // パステルインディゴ
      ctx.fill();
    }
  }
  
  for (let i = 0; i &lt; particleCount; i++) {
    particles.push(new Particle());
  }
  
  function drawLines() {
    for (let i = 0; i &lt; particles.length; i++) {
      for (let j = i + 1; j &lt; particles.length; j++) {
        const dx = particles[i].x - particles[j].x;
        const dy = particles[i].y - particles[j].y;
        const dist = Math.sqrt(dx * dx + dy * dy);
        
        if (dist &lt; connectionDistance) {
          const alpha = (connectionDistance - dist) / connectionDistance * 0.18;
          ctx.beginPath();
          ctx.moveTo(particles[i].x, particles[i].y);
          ctx.lineTo(particles[j].x, particles[j].y);
          ctx.strokeStyle = `rgba(99, 102, 241, ${alpha})`;
          ctx.lineWidth = 1;
          ctx.stroke();
        }
      }
    }
  }
  
  function animate() {
    ctx.clearRect(0, 0, width, height);
    for (let i = 0; i &lt; particles.length; i++) {
      particles[i].update();
      particles[i].draw();
    }
    drawLines();
    requestAnimationFrame(animate);
  }
  
  window.addEventListener(&#39;resize&#39;, () =&gt; {
    width = canvas.width = window.innerWidth;
    height = canvas.height = window.innerHeight;
  });
  
  animate();
})();
</code></pre>
<hr>
<h3 id="サンプルc-穏やかな波fluid-sine-waves">🌊 サンプルC. 穏やかな波（Fluid Sine Waves）</h3>
<p>画面下部でパステル調の半透明な複数の波が緩やかに揺れる背景アニメーションです。</p>
<pre><code class="language-javascript">(function() {
  const canvas = document.getElementById(&#39;bg-canvas&#39;);
  if (!canvas) return;
  const ctx = canvas.getContext(&#39;2d&#39;);
  
  let width = canvas.width = window.innerWidth;
  let height = canvas.height = window.innerHeight;
  
  let wave1 = {
    y: height * 0.85,
    length: 0.005,
    amplitude: 25,
    frequency: 0.012
  };
  
  let wave2 = {
    y: height * 0.88,
    length: 0.008,
    amplitude: 15,
    frequency: 0.022
  };
  
  let increment = 0;
  
  function animate() {
    ctx.clearRect(0, 0, width, height);
    
    // 背景の波の描画 (半透明ティール)
    ctx.beginPath();
    ctx.moveTo(0, height);
    for (let i = 0; i &lt; width; i++) {
      ctx.lineTo(i, wave1.y + Math.sin(i * wave1.length + increment) * wave1.amplitude);
    }
    ctx.lineTo(width, height);
    ctx.fillStyle = &#39;rgba(45, 212, 191, 0.1)&#39;;
    ctx.fill();
    
    // 手前の波の描画 (半透明スカイブルー)
    ctx.beginPath();
    ctx.moveTo(0, height);
    for (let i = 0; i &lt; width; i++) {
      ctx.lineTo(i, wave2.y + Math.sin(i * wave2.length - increment * 1.5) * wave2.amplitude);
    }
    ctx.lineTo(width, height);
    ctx.fillStyle = &#39;rgba(56, 189, 248, 0.15)&#39;;
    ctx.fill();
    
    // デバイスの設定に応じた速度の調整
    const speedFactor = (window.bgConfig &amp;&amp; window.bgConfig.mobileThrottleDivisor) ? 0.3 : 1;
    increment += wave1.frequency * speedFactor;
    
    requestAnimationFrame(animate);
  }
  
  window.addEventListener(&#39;resize&#39;, () =&gt; {
    width = canvas.width = window.innerWidth;
    height = canvas.height = window.innerHeight;
    wave1.y = height * 0.85;
    wave2.y = height * 0.88;
  });
  
  animate();
})();
</code></pre>
<hr>
<h2 id="6-モバイル個別背景設定">📱 6. モバイル個別背景設定</h2>
<p>利用環境に合わせて背景設定を変えることで、システムのパフォーマンスを最適化できます。</p>
<ol>
<li><strong>デスクトップ背景</strong>: PC環境では <strong>Custom JavaScript</strong> を選択し、任意のCanvasアニメーションを実行できます。</li>
<li><strong>モバイル個別背景チェック</strong>: <strong>「モバイルデバイスでデスクトップと異なる背景設定を使用する」</strong> トグルを有効にします。</li>
<li><strong>モバイル背景の軽量化</strong>: 独立したモバイル設定パネルから背景を <strong>Solid</strong> または <strong>Gradient</strong> に設定し、モバイル端末のプロセッサ負荷を最小限に抑えます。</li>
<li><strong>効果</strong>: スマートフォン接続時には軽量な背景を選択することでバッテリーを保護し、PC接続時には豊かなビジュアルモーション効果を最大限に表現するというイネーブル化が可能です。</li>
</ol>
]]></content:encoded>
            <category>管理者ガイド</category>
            <enclosure url="https://sveltekitblog.com/images/posts/admin-design-editor/desktop/img-admin-guide-admin-design-editor-ja-002.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[管理者機能とデュアルエディタの概要]]></title>
            <link>https://svelteblog-13g.pages.dev/ja/admin-guide/admin-core-features</link>
            <guid isPermaLink="true">https://svelteblog-13g.pages.dev/ja/admin-guide/admin-core-features</guid>
            <pubDate>Sat, 20 Jun 2026 01:23:13 GMT</pubDate>
            <description><![CDATA[多言語記事の同時保存、ビジュアルとMarkdownのデュアルエディタ切り替え、デバイス別独立ウィジェット配置など、管理者のコア機能を簡単に紹介します。]]></description>
            <content:encoded><![CDATA[<h1 id="管理者機能とデュアルエディタの概要">🎨 管理者機能とデュアルエディタの概要</h1>
<p>本ドキュメントは、多言語記事の同時パブリッシュ、デバイス別レイアウト設定、リアルタイムデザインテーマ設定など、管理者（管理画面）が提供する主要機能の基本構成と概要を紹介します。</p>
<hr>
<h2 id="1-多言語記事の作成およびデュアルエディタ">📝 1. 多言語記事の作成およびデュアルエディタ</h2>
<p>記事作成メニューに入ると、複数の言語タブが1つの画面に並んだ多言語作成環境が提供されます。</p>
<h3 id="多言語記事の一括作成と保存">① 多言語記事の一括作成と保存</h3>
<ul>
<li><strong>作成フロー</strong>: 上部の言語タブ（KO、EN、JAなど）を切り替えながら、各言語に応じたタイトル、概要、スラッグ（URLパス）、本文を入力します。</li>
<li><strong>一括保存</strong>: 下部の <strong>[すべてのタブを同時に保存する]</strong> ボタンをクリックすると、入力したすべての言語の記事がデータベースに一括で保存されます。 <strong>「公開」</strong> 設定がされていない言語は自動的に <strong>「下書き」</strong> として保存され、入力されていない言語タブはデータが生成されずにスキップされます。</li>
</ul>
<h3 id="デュアルエディタのサポートビジュアル-vs-markdown">② デュアルエディタのサポート（ビジュアル vs Markdown）</h3>
<ul>
<li><strong>ビジュアルHTMLエディタ（Visual）</strong>: 一般的なWebエディタのように、書式を設定したりメディアを埋め込んだりして直感的に作成する方式です。画像ファイルはツールバーのアップロードボタンから簡単に挿入できます。</li>
</ul>
<figure data-align="left"><img src="https://sveltekitblog.com/images/posts/admin-core-features/desktop/img-admin-guide-admin-core-features-ja-003.webp" alt="img-admin-guide-admin-core-features-ja-003" data-align="left" /></figure><ul>
<li><strong>Markdownエディタ（Markdown）</strong>: Markdown構文を好むユーザー向けに提供されています。タイトル、概要、カテゴリ、タグなどの情報は、ヘッダー領域にYAML Front Matter（<code>---</code>）形式で自動的に管理されます。保存時には、Markdownソースと変換後のHTML本文が一緒に保存されます。</li>
</ul>
<figure data-align="left"><img src="https://sveltekitblog.com/images/posts/admin-core-features/desktop/img-admin-guide-admin-core-features-ja-004.webp" alt="img-admin-guide-admin-core-features-ja-004" data-align="left" /></figure><h3 id="代表画像サムネイルの自動指定">③ 代表画像（サムネイル）の自動指定</h3>
<ul>
<li>サムネイル画像が手動で指定されていない場合、システムが本文を分析して代表画像を自動的に設定します。<ul>
<li><strong>第1優先</strong>: 本文内で最初に使用されている画像。</li>
<li><strong>第2優先</strong>: 本文に画像がなく、YouTubeのリンクやiframe埋め込みが含まれている場合、その動画の公式高解像度サムネイルURL。</li>
</ul>
</li>
</ul>
<hr>
<h2 id="2-デバイス別デスクトップモバイルの独立ウィジェット配置">🧱 2. デバイス別（デスクトップ/モバイル）の独立ウィジェット配置</h2>
<p>レイアウトエディタでは、ドラッグ＆ドロップでサイドバーや本文領域のウィジェットカードの並び順を調整できます。また、訪問者のデバイスタイプ（デスクトップまたはモバイル）に応じて、独立したウィジェット露出設定を構成できます。<br><figure data-align="left"><img src="https://sveltekitblog.com/images/posts/admin-core-features/desktop/img-admin-guide-admin-core-features-ja-002.webp" alt="img-admin-guide-admin-core-features-ja-002" data-align="left" data-caption="デスクトップ・モバイルモード選択アイコン" /><figcaption>デスクトップ・モバイルモード選択アイコン</figcaption></figure></p>
<h3 id="デバイス別のウィジェット表示条件">⚙️ デバイス別のウィジェット表示条件</h3>
<ol>
<li><strong><code>デザインエディタ</code></strong> メニュー内の <strong><code>ブログ構造</code></strong> タブから、全体のレイアウト構成と横幅の比率を選択します。</li>
<li>各ウィジェットの追加・編集時に、露出デバイス条件（Device）を指定できます。<ul>
<li><strong>Desktop (デスクトップ専用)</strong>: PC画面にのみウィジェットを表示し、モバイル接続時には不要なリソースの読み込みを遮断します。</li>
<li><strong>Mobile (モバイル専用)</strong>: PC画面では非表示にし、スマートフォンやタブレットなどのモバイル解像度でのみ表示されるように制限します。</li>
</ul>
</li>
<li><strong>効果</strong>: モバイルユーザーに対して不要または重いウィジェットのレンダリングや読み込みをスキップすることで、ページの読み込み速度とスクロールパフォーマンスを最適化します。</li>
</ol>
<hr>
<h2 id="3-リアルタイムデザインエディタとテーマ設定">🎨 3. リアルタイムデザインエディタとテーマ設定</h2>
<p>デザインエディタで変更したテーマカラーやスタイル情報は、サーバーの再ビルドやデプロイを行わずに、保存後すぐに訪問者のブラウザのCSS変数へ反映されます。</p>
<ul>
<li><strong>4種類の背景タイプ</strong>: 単色（Solid）、グラデーション（Gradient）、背景画像（Image）、HTML5 Canvasアニメーション（Canvas）から選択できます。</li>
<li><strong>グラスモフィズム効果</strong>: 背景画像を使用する際、テキストの視認性を確保するために不透明度（Opacity）とぼかし（Blur）を調整するガラス越しのような効果の設定をサポートしています。</li>
<li><strong>インタラクティブCanvas</strong>: サンドボックスで隔離された安全なキャンバス内で、雪、波、星座などの動きのあるモーションアートワークを背景として駆動できます。</li>
</ul>
<blockquote>
<p>[!TIP]<br>背景設定オプションの種類とサンプルスクリプトは、<strong><a href="./admin-design-editor.md">デザインエディタ設定の紹介</a></strong> 文書でご確認いただけます。</p>
</blockquote>
<hr>
<h2 id="4-メディアストレージのサポート">💾 4. メディアストレージのサポート</h2>
<p>本文で使用するメディアが保存されるクラウドストレージを、必要に応じて柔軟に切り替えて運用できます。<br><figure data-align="left"><img src="https://sveltekitblog.com/images/posts/admin-core-features/desktop/img-admin-guide-admin-core-features-ja-005.webp" alt="img-admin-guide-admin-core-features-ja-005" data-align="left" /></figure></p>
<ol>
<li><strong><code>メディアライブラリ</code></strong> メニュー下部の <strong><code>ストレージ設定</code></strong> 領域へ移動します。</li>
<li>連携するストレージタイプを選択し、情報を入力します。<ul>
<li><strong>Cloudflare KV</strong>: エッジノードのKVストレージにアセットを保管し、迅速に配信します。</li>
<li><strong>Cloudflare R2</strong>: 大容量オブジェクトストレージを使用し、コスト効率よく画像を管理します。</li>
<li><strong>Supabase Storage</strong>: Supabaseのストレージバケットパスにメディアをアップロードして安全に保管します.</li>
<li><strong>ImageKit.io</strong>: グローバル画像CDNプラットフォームと連携し、アップロードした画像の解像度最適化や圧縮処理を活用します。</li>
</ul>
</li>
<li><strong>ストレージのリアルタイム切り替え</strong>: 変更を保存すると、アップロードエンジンが指定したストレージへ即座に切り替わります。</li>
</ol>
<blockquote>
<p>[!NOTE]<br><strong>標準メディアストレージ (Cloudflare KV) のエクスプローラー機能の制限</strong><br>Cloudflare KVは、Workersの使用量とコストの最適化のため、画像エクスプローラー内での一覧表示（読み取りAPIの呼び出し）をサポートしていません。一方、Cloudflare R2、Supabase Storage、ImageKit.ioなどの外部ストレージを設定して接続した場合は、アップロードされた画像の一覧表示やプレビュー機能をすべて利用できます。</p>
</blockquote>
]]></content:encoded>
            <category>管理者ガイド</category>
            <enclosure url="https://sveltekitblog.com/images/posts/admin-core-features/desktop/img-admin-guide-admin-core-features-ja-003.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[管理者画面への初回アクセスと環境設定]]></title>
            <link>https://svelteblog-13g.pages.dev/ja/admin-guide/admin-getting-started</link>
            <guid isPermaLink="true">https://svelteblog-13g.pages.dev/ja/admin-guide/admin-getting-started</guid>
            <pubDate>Sat, 20 Jun 2026 00:55:48 GMT</pubDate>
            <description><![CDATA[管理者がブログシステムを制御するために管理者アプリへ安全にアクセスし、ログインセッションを維持して、多言語UI辞書を活用する方法について案内します。]]></description>
            <content:encoded><![CDATA[<h1 id="管理者画面への初回アクセスと環境設定">🔑 管理者画面への初回アクセスと環境設定</h1>
<p>本ドキュメントは、ブログシステムを制御するために管理者が管理者（アドミン）ページへ安全にアクセスし、ログインセッションを維持して、画面上の様々なテキスト（多言語辞書）を簡単に管理・編集する方法を案内します。</p>
<hr>
<h2 id="1-管理者ログイン前のipセキュリティ制限ポリシー">🔒 1. 管理者ログイン前のIPセキュリティ制限ポリシー</h2>
<p>本ブログエンジンは、外部からの不正アクセスや投稿権限の乗っ取りを完璧に防ぐため、厳格な<strong>接続IPフィルタリング</strong>セキュリティポリシーを採用しています。デプロイ時に検出された管理者のパブリックIPアドレスのみが、サーバーの許可リスト（<code>ALLOWED_IP</code>）に登録され、アクセスが許可されます。</p>
<blockquote>
<p>[!IMPORTANT]</p>
<h3 id="安全地帯中心の運用原則公共の場所での使用禁止">🛡️ 安全地帯中心の運用原則（公共の場所での使用禁止）</h3>
<p>本ブログの管理者画面での操作は、必ず<strong>自宅や信頼できるオフィスなど、物理的・ネットワーク的なセキュリティが確保された場所</strong>でのみ行ってください。<br><strong>セキュリティ漏洩を防止するため、不特定多数が利用しハッキングのリスクに直接さらされるPC房（ネットカフェ）、図書館、公共Wi-Fi環境などの公共の場所では、管理者画面への接続自体を一切推奨せず、避けていただきますよう強くお願いいたします。</strong></p>
</blockquote>
<p>接続許可された安全な場所であっても、ルーターの再起動やインターネット回線の都合によりパブリックIPアドレスが変更され、<code>403 Forbidden</code>ブロック画面が表示された場合は、以下の手順に従って許可リストを手動で更新する必要があります。</p>
<h3 id="接続許可ipアドレスの更新手順再デプロイが必要">⚙️ 接続許可IPアドレスの更新手順（再デプロイが必要）</h3>
<ol>
<li>変更されたインターネット環境下でターミナルを開き、ブログサービスの管理者アプリを再度**再デプロイ（Redeploy）**するコマンドを実行します。</li>
<li><strong>作業プロセスの案内</strong>: データベース内部を直接編集してIPを強制的に書き込む極端な動作方法よりは安全ですが、再デプロイコマンドが実行されるたびにビルドプロセスとファイルアップロードの待機時間が数分間発生するため、実質的にはかなり面倒で手間の伴う作業です。</li>
<li>デプロイスクリプトの実行中に、現在接続されているコンピュータの新しいパブリックIPアドレスを検出し、リモートサーバーの許可IPリストを最新のものに更新します。</li>
<li>デプロイ処理が完了した後に管理者URLへ再アクセスすると、正常にログイン画面が再び有効になります。</li>
<li>管理者ページのみを再デプロイしてください。</li>
</ol>
<hr>
<h2 id="2-管理者ログインおよびセッション管理">🔑 2. 管理者ログインおよびセッション管理</h2>
<p>ログインのブロックが正常に解除されたら、初期構築時に設定した管理者マスターパスワード（<code>ADMIN_PASSWORD</code>）を入力して接続します。</p>
<ul>
<li><strong>安全なセッションの維持</strong>: ブラウザの専用セキュアクッキー設定を利用して、30日間管理者のログインセッションが安全に維持されます。</li>
<li><strong>公共のコンピュータおよび危険区域へのアクセス禁止</strong>:<br>セキュリティが保証されていないネットカフェや公共の共有デバイス環境では、管理者ログイン自体を試みないことが最も確実な防衛策です。万が一、やむを得ない事情で公共の環境からログインした場合は、作業終了直後に必ず管理者画面下部の**[ログアウト]**ボタンをクリックし、さらにターミナルで<code>npx wrangler logout</code>を実行して、そのコンピュータに記録されたCloudflare管理者アカウントの連携情報まで確実に解除（ログアウト）してください。</li>
</ul>
<blockquote>
<p>[!WARNING]</p>
<h3 id="管理者ページのアクセスurlドメイン露出の最小化を推奨">🔒 管理者ページのアクセスURL（ドメイン）露出の最小化を推奨</h3>
<p>管理者画面はIP許可リストにより二重で安全に保護されていますが、攻撃対象領域（Attack Surface）そのものを最小化することが最も堅牢なセキュリティ対策です。</p>
<p>そのため、<code>admin.myblog.com</code>のような分かりやすいカスタムドメインをわざわざ紐付けるのではなく、Cloudflare Pagesからデフォルトで提供されるランダムなサブドメインアドレス（例：<code>[プロジェクト名].pages.dev</code>）をそのまま使用し、管理者用のアクセス経路を秘密にしておくことを強く推奨します。</p>
</blockquote>
<hr>
<h2 id="3-多言語辞書i18n設定ガイド">🌐 3. 多言語辞書（i18n）設定ガイド</h2>
<p>記事の本文以外の、サイト画面に固定されている共通テキスト（メニューラベル、コメント送信ボタン、ログインプロンプトなど）は、ソースコードを1行も修正することなく、管理者の辞書編集機能を通じて英語、韓国語、日本語などに即時書き換えることができます。<br><figure data-align="left"><img src="https://sveltekitblog.com/images/posts/admin-getting-started/desktop/img-admin-guide-admin-getting-started-ja-002.webp" alt="img-admin-guide-admin-getting-started-ja-002" data-align="left" /></figure></p>
<p>新しい対応言語は、<strong><code>言語を追加</code></strong> 機能を使用して登録することができます。ただし、新しく追加した言語が画面上に正しく表示されるようにするには、既存の辞書に登録されているすべての翻訳キー（Key）に対して、該当言語の翻訳テキストを漏れなく入力しておく必要があります。<br><figure data-align="left"><img src="https://sveltekitblog.com/images/posts/admin-getting-started/desktop/img-admin-guide-admin-getting-started-ja-001.webp" alt="img-admin-guide-admin-getting-started-ja-001" data-align="left" /></figure></p>
<ol>
<li>管理者画面の左側メニューから**<code>言語設定</code>**メニューに移動します。</li>
<li>現在サイト全域で使用されている各翻訳キーと保存されたテキストの一覧が、下部の**<code>UI多言語辞書エディタ</code>**セクションに表示されます。</li>
<li>編集したいキーの入力フィールドに希望のテキスト（韓国語、英語、日本語）を入力し、その行の右端にある**<code>保存</code>**アイコンをクリックします。</li>
<li>保存と同時にライブサイトへ即時に反映され、訪問者がブログの言語を切り替えた際、変更後のテキストでリアルタイムかつスムーズに翻訳表示されます。</li>
</ol>
]]></content:encoded>
            <category>管理者ガイド</category>
            <enclosure url="https://sveltekitblog.com/images/posts/admin-getting-started/desktop/img-admin-guide-admin-getting-started-ja-002.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[CMDワンクリックインストール＆Cloudflareデプロイガイド]]></title>
            <link>https://svelteblog-13g.pages.dev/ja/admin-guide/admin-install-and-deploy</link>
            <guid isPermaLink="true">https://svelteblog-13g.pages.dev/ja/admin-guide/admin-install-and-deploy</guid>
            <pubDate>Sat, 20 Jun 2026 00:27:52 GMT</pubDate>
            <description><![CDATA[ターミナル（CMD/PowerShell）環境で対話型インストールスクリプトを実行し、Cloudflareエッジインフラの構築と管理者/ブログアプリのデプロイ・同期を同時に行う最も簡単な方法を解説します。]]></description>
            <content:encoded><![CDATA[<h1 id="cmdワンクリックインストールcloudflareデプロイガイド">🚀 CMDワンクリックインストール＆Cloudflareデプロイガイド</h1>
<p>本ガイドは、ターミナル（CMDまたはPowerShell）環境で自動化コマンド（<code>npm run setup</code>）を実行してCloudflareエッジインフラを構築し、管理者アプリとブログアプリを同時にデプロイ・同期する、最も簡単かつ安全な方法を案内します。</p>
<hr>
<h2 id="1-ワンクリックデプロイ自動化の紹介">🛠️ 1. ワンクリックデプロイ自動化の紹介</h2>
<p>SvelteKitブログエンジンは、複雑なサーバーリソースの生成や設定ファイルの編集プロセスを、ターミナル上の<strong>対話型インストールツール</strong>を通じて完全に自動化しました。</p>
<p>ブログのソースコードを解凍するか、<code>git clone</code>でPCに保存した後、ターミナルを開いてプロジェクトのルートフォルダーに移動し、以下のコマンドを順番に実行するだけです。</p>
<pre><code class="language-bash"># 必要なパッケージのインストール
npm install
</code></pre>
<ul>
<li><strong>依存関係ライブラリのインストール</strong>: ターミナルで<code>npm install</code>を入力して、必要なパッケージをすべてインストールします。インストール完了後にセキュリティ警告（vulnerabilities）メッセージが表示された場合は、<code>npm audit fix</code>コマンドを実行して最新のセキュリティパッチを適用することをお勧めします。</li>
</ul>
<p>パッケージのインストールが終わったら<code>npm run setup</code>を実行します。ターミナル画面の案内に従って、以下のプロセスが自動的に処理されます。</p>
<ul>
<li><strong>Cloudflareアカウントの簡単認証</strong>: クリック1回でデプロイアカウントの連携が完了します。</li>
<li><strong>DBおよびストレージリソースの生成</strong>: ブログ専用のD1データベース2個と画像保存用のKVストレージを自動的に新規生成します。</li>
<li><strong>設定ファイルのリアルタイム更新</strong>: 生成されたデータベースの固有IDを検出し、モノレポの設定ファイル（<code>wrangler.json</code>）に自動的に注入します。</li>
<li><strong>データベースの初期データ注入</strong>: テーブルを生成し、選択したデフォルト言語に合わせてサンプル記事と基本環境設定情報を自動的に登録します。</li>
<li><strong>環境変数とアクセス許可IPのアップロード</strong>: 管理者アクセス用に、デプロイ実行者の現在のパブリックIPアドレス（<code>ALLOWED_IP</code>）と管理者パスワードをクラウドへ自動送信します。</li>
<li><strong>統合ビルドおよびWebサービスのデプロイ</strong>: ブログと管理者のSvelteKitプロジェクトを統合ビル드し、Cloudflare Pagesへ即時にアップロード・デプロイします。</li>
</ul>
<hr>
<h2 id="2-デプロイ前の確認事項">📋 2. デプロイ前の確認事項</h2>
<p>安全にインストールを開始する前に、以下の準備がすべて整っているかご確認ください。</p>
<ol>
<li><strong>Node.jsのインストール</strong>: パソコンでNode.js（バージョン18以上）が動作している必要があります。</li>
<li><strong>Cloudflareアカウント</strong>: ブログサイトとデータベースをホスティングするCloudflareアカウント（無料枠で十分対応可能です）が必要です。</li>
<li><strong>環境変数ファイル（.dev.vars）の生成（必須）</strong>:<ul>
<li>デプロイを開始する前に、<code>apps/admin/</code>フォルダと<code>apps/blog/</code>フォルダの配下に、それぞれ<code>.dev.vars</code>ファイルを<strong>手動で作成</strong>する必要があります。</li>
<li><code>apps/admin/.dev.vars</code>ファイルには、<code>ADMIN_PASSWORD=管理者ログインパスワード</code>を記述します。</li>
<li><code>apps/blog/.dev.vars</code>ファイルには、<code>BETTER_AUTH_SECRET=任意の文字列</code>を記述します。</li>
<li><blockquote>
<p>[!WARNING]<br>これらの環境変数が設定されていない場合、<code>npm run setup</code>の実行直後に、正常な動作のために<strong>インストールツールが中断</strong>されます。</p>
</blockquote>
</li>
</ul>
</li>
</ol>
<hr>
<h2 id="3-npm-run-setup-ステップ別解説">⚙️ 3. npm run setup ステップ別解説</h2>
<p>ターミナルを開き、ブログプロジェクトのルートディレクトリで<code>npm run setup</code>を入力してEnterキーを押します。</p>
<h3 id="step-0-環境変数の事前検査pre-validation"><strong>Step 0. 環境変数の事前検査（Pre-Validation）</strong></h3>
<ul>
<li>実行直後に、管理者およびブログフォルダ内の<code>.dev.vars</code>ファイルと、必須の環境変数（<code>ADMIN_PASSWORD</code>、<code>BETTER_AUTH_SECRET</code>）が入力されているか検査します。</li>
<li>未入力の項目がある場合は、ガイドログを表示して終了しますので、事前に必ず記載しておいてください。</li>
</ul>
<h3 id="step-1-デプロイプロジェクト名ドメインurlの設定"><strong>Step 1. デプロイプロジェクト名（ドメインURL）の設定</strong></h3>
<ul>
<li>読者がブログにアクセスする際に使用するアドレス（例：<code>[入力したプロジェクト名].pages.dev</code>）を決定する段階です。</li>
<li>デプロイターゲットであるブログと管理者の2つの名前を入力します。復元モード（<code>--restore</code>）で実行する場合、既存のバックアップ情報ファイル（<code>wrangler.backup.json</code>）から既存の名前を自動的に読み込んで設定します。</li>
</ul>
<h3 id="step-2-cloudflareアカウントのログイン認証"><strong>Step 2. Cloudflareアカウントのログイン認証</strong></h3>
<ul>
<li>Cloudflareの認証を確認します。すでにログイン履歴がある場合は、自動的にセッションを検出してこの手順をスキップします。</li>
<li>ログインしていない場合は、ブラウザウィンドウが開き認証要求画面が表示されます。**[Allow / 許可]**をクリックしてアカウント連携を承認してください。</li>
<li><em>セキュリティ情報：本自動化ツールは、インフラ生成およびデプロイに必要な最小限のアカウントAPI権限のみを要求するため、安心してお進みください。</em></li>
</ul>
<h3 id="step-3-リソース生成および設定の連携"><strong>Step 3. リソース生成および設定の連携</strong></h3>
<ul>
<li>実際のサービス動作に必要なデータベースとメディアストレージをクラウドに生成する段階です。ターミナルの案内に従って、適切な番号を入力してください。<ol>
<li><strong><code>1</code>（新規インストール / Fresh Install）</strong>: 以前に作成されたデータベースとストレージを<strong>完全に削除して新しく作成し直します。</strong> 既存のデータはすべて消去されるためご注意ください。</li>
<li><strong><code>2</code>（既存データの維持 / Keep Existing Data）[推奨]</strong>: すでに生成されたリソースがある場合、データを安全に保持したまま接続情報のみを紐付けます。</li>
</ol>
</li>
<li>連携完了後、新しく発行されたDBおよびKVの固有IDがモノレポの各設定ファイル（<code>wrangler.json</code>）に自動的に反映されます。</li>
</ul>
<h3 id="step-4-webプロジェクトの事前生成"><strong>Step 4. Webプロジェクトの事前生成</strong></h3>
<ul>
<li>デプロイの安定性を高めるため、Cloudflare Edge上に空のWebプロジェクトをあらかじめ登録・確保します。</li>
<li>すでに同じ名前のアドレスが占有されている場合は、<strong>既存のアドレスを再利用</strong>して次のステップへ自動的に移行します。</li>
</ul>
<h3 id="step-5-環境変数のリモート同期"><strong>Step 5. 環境変数のリモート同期</strong></h3>
<ul>
<li>ローカルで作成した<code>.dev.vars</code>内のマスターパスワードなどの秘密の値をCloudflareへ安全にアップロードして同期します。</li>
<li><strong>アクセス許可IPの自動登録</strong>: 特にこの段階で、デプロイを実行している管理者PCのパブリックIPアドレスをリアルタイムで検出し、<code>ALLOWED_IP</code>変数として自動的に注入します。これにより、デプロイ直後の初回ログイン時にIP制限でアクセスできなくなる事態を防ぎます。</li>
</ul>
<h3 id="step-6-データベーステーブルの構築デフォルトテーマの設定"><strong>Step 6. データベーステーブルの構築＆デフォルトテーマの設定</strong></h3>
<ul>
<li>ブログ機能の動作に必要なDBテーブルを構築し、初期設定値を移植します。</li>
<li>画面の案内に従って使用するデフォルトの言語（韓国語、英語、日本語）を選択すると、翻訳システムが構築され、サンプルカテゴリ、ヘッダーメニューの骨組み、およびデフォルトのウェルカム記事が自動的に設定されます。</li>
</ul>
<h3 id="step-7-webサービスのビルド最終デプロイ"><strong>Step 7. Webサービスのビルド＆最終デプロイ</strong></h3>
<ul>
<li>モノレポ全体のアプリの統合ビルドを実行し、Cloudflareサーバーへのデプロイコマンドを自動実行してインストールプロセスを完了します。デプロイが完了すると、ブログと管理者のPagesアクセス用URLが表示されます。</li>
</ul>
<hr>
<blockquote>
<p>[!TIP]</p>
<h3 id="環境変数の自動設定と即時アクセスサポート">💡 環境変数の自動設定と即時アクセスサポート</h3>
<p>本プロジェクトのインストールプロセスは、リソースの生成からWebプロジェクトの確保、環境変数の送信までを一貫して処理します。<br>デプロイ完了と同時に、ログインパスワードやIPアクセス許可設定がリモートサーバーに設定されるため、追加の手動操作なしで即座に動作します。</p>
</blockquote>
<hr>
<h2 id="4-ブログのアップデートとデータ復元デプロイnpm-run-restore">🔄 4. ブログのアップデートとデータ復元デプロイ（npm run restore）</h2>
<p>ブログの運用中に<strong>新しいパッチバージョンやバグが修正された最新リリースのコードが配布された際</strong>、これまでに作成した記事データやアドレスを失うことなく、新しいコードへ安全に画面を差し替える方法です。</p>
<h3 id="新バージョン移行の4ステップ手順">💡 新バージョン移行の4ステップ手順</h3>
<p>管理者のデータバックアップと**<code>npm run restore</code>**コマンドを使用すれば、データ消失のリスクなく安全にアップグレードを完了できます。</p>
<ol>
<li><strong>[ステップ1] 既存データおよびデプロイ設定のバックアップ</strong>:<ul>
<li>稼働中の管理者アプリの**<code>コンテンツバックアップ</code><strong>メニュー、および</strong><code>デザインエディタ</code>**メニューの下部バックアップセクションから、記事データとテーマデザイン設定をそれぞれパソコンへダウンロードします。</li>
<li>また、**<code>コンテンツバックアップ</code>**メニューの「設定バックアップダウンロード」ボタンをクリックして、[wrangler.backup.json]ファイルをPCに保存します。（これは、既存の運用データベースの固有ID連携を維持するための最も重要なファイルです。）</li>
</ul>
</li>
<li><strong>[ステップ2] 新コードの分離テスト</strong>:<ul>
<li>新しく入手した新バージョンのコードフォルダ配下で<code>npm run setup</code>を実行し、<strong>テスト用の仮DB</strong>と<strong>テスト用のPages仮デプロイ名</strong>を入力して別個にデプロイします。</li>
<li>仮デプロイされた新しい管理者にログインし、ステップ1で保存したバックアップデータファイルをインポートして、データが正常に読み込まれるか事前に確認します。</li>
</ul>
</li>
<li><strong>[ステップ3] 既存の運用サーバーへのバインディング復元（<code>npm run restore</code>）</strong>:<ul>
<li>検証が終了したら、新バージョンプロジェクトのルートディレクトリに、ステップ1で保存した<code>wrangler.backup.json</code>ファイルをコピーして貼り付けます。</li>
<li>ターミナルで**<code>npm run restore</code><strong>コマンドを実行します。スクリプトがバックアップファイルに記述された</strong>既存の運用DBおよびKVの固有ID情報**を読み込み、新しいコードの設定ファイルへ上書きの形で自動接続します。</li>
</ul>
</li>
<li><strong>[ステップ4] スキーマ同期と上書きデプロイ</strong>:<ul>
<li>復元スクリプトは既存の運用DBのテーブル構造スキーマのみを安全に最新仕様へ更新するため、<strong>すでに蓄積されている実際の記事やデータは破損または削除されず完璧に保持</strong>されます。</li>
<li>続いて、<code>npm run deploy:blog</code>と<code>npm run deploy:admin</code>をそれぞれ実行します。使用していたドメインそのままで、<strong>最新にアップグレードされたブログシステムが安全に上書きデプロイ</strong>されます。</li>
</ul>
</li>
</ol>
<hr>
<h2 id="5-バックアップファイルの種類と機能">📦 5. バックアップファイルの種類と機能</h2>
<p>管理者のバックアップメニューで安全にインポートおよびエクスポートできる各ファイルの役割は、以下の表をご参照ください。</p>
<table>
<thead>
<tr>
<th align="left">バックアップファイルの種類</th>
<th align="left">抽出経路</th>
<th align="left">フォルダ・ファイル名（推奨）</th>
<th align="left">機能・保存内容</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>1. コンテンツDBデータ</strong></td>
<td align="left"><strong><code>コンテンツバックアップ</code></strong> メニュー</td>
<td align="left"><code>blog-content-backup-[日付].json</code></td>
<td align="left">作成されたすべてのブログ記事本文、作成済みのカテゴリ情報、タグ一覧、および基本的なシステム設定値を保存</td>
</tr>
<tr>
<td align="left"><strong>2. デプロイ設定バックアップ</strong></td>
<td align="left"><strong><code>コンテンツバックアップ</code></strong> メニュー</td>
<td align="left"><code>wrangler.backup.json</code></td>
<td align="left">Cloudflare D1 DBおよびKVストレージ連携に必要なデプロイ名と固有のUUID情報を安全に保存（<strong>サーバー移行時に必須</strong>）</td>
</tr>
<tr>
<td align="left"><strong>3. メディアファイルバックアップ</strong></td>
<td align="left"><strong><code>コンテンツバックアップ</code></strong> メニューの「メディアバックアップと復元」セクション、または <strong><code>メディアライブラリ</code></strong> メニュー右上の「[バックアップ / 復元]」ボタン</td>
<td align="left"><code>[ストレージ名]-images-backup-[日付].zip</code> <br>(例: <code>r2-images-backup-[日付].zip</code>)</td>
<td align="left">有効化されている画像ストレージ（R2、Supabaseなど）にアップロードされたすべての画像ファイルをZIP形式で圧縮ダウンロードして保存</td>
</tr>
<tr>
<td align="left"><strong>4. デザイン設定バックアップ</strong></td>
<td align="left"><strong><code>デザインエディタ</code></strong> メニュー下部</td>
<td align="left"><code>blog-design-backup-[日付].json</code></td>
<td align="left">デザインエディタで設定したブログのテーマカラー情報、背景タイプ、およびデバイス別（PC/モバイル）のウィ젯配置構造を保存</td>
</tr>
<tr>
<td align="left"><strong>5. システム全体のバックアップ</strong></td>
<td align="left"><strong><code>サイト設定</code></strong> メニュー下部</td>
<td align="left"><code>full-system-backup-[日付].json</code></td>
<td align="left">2つのデータベース（BLOG_DB, USER_DB）内のすべてのテーブルの元データを1つのJSONファイルにまとめ、全体のバックアップおよび復元を実行</td>
</tr>
</tbody></table>
<figure data-align="left"><img src="https://sveltekitblog.com/images/posts/admin-install-and-deploy/desktop/img-admin-guide-admin-install-and-deploy-ja-001.webp" alt="img-admin-guide-admin-install-and-deploy-ja-001" data-align="left" data-caption="コンテンツDBデータ" /><figcaption>コンテンツDBデータ</figcaption></figure>
<figure data-align="left"><img src="https://sveltekitblog.com/images/posts/admin-install-and-deploy/desktop/img-admin-guide-admin-install-and-deploy-ja-002.webp" alt="img-admin-guide-admin-install-and-deploy-ja-002" data-align="left" data-caption="デプロイ設定バックアップ" /><figcaption>デプロイ設定バックアップ</figcaption></figure>
<figure data-align="left"><img src="https://sveltekitblog.com/images/posts/admin-install-and-deploy/desktop/img-admin-guide-admin-install-and-deploy-ja-003.webp" alt="img-admin-guide-admin-install-and-deploy-ja-003" data-align="left" data-caption="メディアファイルバックアップ" /><figcaption>メディアファイルバックアップ</figcaption></figure>
<figure data-align="left"><img src="https://sveltekitblog.com/images/posts/admin-install-and-deploy/desktop/img-admin-guide-admin-install-and-deploy-ja-004.webp" alt="img-admin-guide-admin-install-and-deploy-ja-004" data-align="left" data-caption="デザイン設定バックアップ" /><figcaption>デザイン設定バックアップ</figcaption></figure>
<figure data-align="left"><img src="https://sveltekitblog.com/images/posts/admin-install-and-deploy/desktop/img-admin-guide-admin-install-and-deploy-ja-005.webp" alt="img-admin-guide-admin-install-and-deploy-ja-005" data-align="left" data-caption="システム全体のバックアップ" /><figcaption>システム全体のバックアップ</figcaption></figure>]]></content:encoded>
            <category>管理者ガイド</category>
            <enclosure url="https://sveltekitblog.com/images/posts/admin-install-and-deploy/desktop/img-admin-guide-admin-install-and-deploy-ja-001.webp" length="0" type="image/webp"/>
        </item>
    </channel>
</rss>