<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: kevinadhiguna</title>
    <description>The latest articles on DEV Community by kevinadhiguna (@kevinadhiguna).</description>
    <link>https://dev.to/kevinadhiguna</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F525991%2F3d00f942-b39d-4de6-b656-aa7d9162ca80.png</url>
      <title>DEV Community: kevinadhiguna</title>
      <link>https://dev.to/kevinadhiguna</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kevinadhiguna"/>
    <language>en</language>
    <item>
      <title>Could not resolve peer dependency vuex@"^3.0 || ^4.0" with Vuex 4.0.0-rc.2 installed</title>
      <dc:creator>kevinadhiguna</dc:creator>
      <pubDate>Mon, 28 Feb 2022 08:04:30 +0000</pubDate>
      <link>https://dev.to/kevinadhiguna/could-not-resolve-peer-dependency-vuex30-40-with-vuex-400-rc2-installed-21kn</link>
      <guid>https://dev.to/kevinadhiguna/could-not-resolve-peer-dependency-vuex30-40-with-vuex-400-rc2-installed-21kn</guid>
      <description>&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;This post was written since &lt;a href="https://github.com/robinvdvleuten/vuex-persistedstate"&gt;robinvdvleuten/vuex-persistedstate&lt;/a&gt; has been archived on February 2022.&lt;/p&gt;

&lt;p&gt;However, &lt;a href="https://github.com/robinvdvleuten/vuex-persistedstate/issues/370"&gt;the issue&lt;/a&gt; is still open...&lt;/p&gt;




&lt;h2&gt;
  
  
  Problem
&lt;/h2&gt;

&lt;p&gt;The error message was shown when I was trying to install dependencies with &lt;code&gt;npm install&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Here was my &lt;code&gt;package.json&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"nuxt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^2.15.8"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vue"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^2.6.14"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vuex-persistedstate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^4.1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The log of &lt;code&gt;npm install&lt;/code&gt; was :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ npm install
npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR! 
npm ERR! While resolving: frontend-v2-nuxt2@1.0.0
npm ERR! Found: vue@2.6.14
npm ERR! node_modules/vue
npm ERR!   vue@"^2.6.14" from the root project
npm ERR! 
npm ERR! Could not resolve dependency:
npm ERR! peer vue@"^3.0.2" from vuex@4.0.2
npm ERR! node_modules/vuex
npm ERR!   peer vuex@"^3.0 || ^4.0.0-rc" from vuex-persistedstate@4.1.0
npm ERR!   node_modules/vuex-persistedstate
npm ERR!     vuex-persistedstate@"^4.1.0" from the root project
npm ERR! 
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force, or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.
npm ERR! 
npm ERR! See /home/kevin/.npm/eresolve-report.txt for a full report.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/kevin/.npm/_logs/2022-02-28T07_34_01_560Z-debug.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;p&gt;I noticed that the package &lt;code&gt;vuex-persistedstate@"^4.1.0"&lt;/code&gt; required &lt;code&gt;vuex@"^3.0 || ^4.0.0-rc"&lt;/code&gt;. Therefore, I added vuex package :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install vuex@^3.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that, try installing dependencies with :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The error was gone this time.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;package.json&lt;/code&gt; after being updated :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"nuxt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^2.15.8"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vue"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^2.6.14"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vuex"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^3.6.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vuex-persistedstate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^4.1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is clear that &lt;code&gt;vuex&lt;/code&gt; as a required package for &lt;code&gt;vuex-persistedstate&lt;/code&gt; has been added.&lt;/p&gt;

</description>
      <category>vuexpersistedstate</category>
      <category>vuex</category>
    </item>
    <item>
      <title>How to setup AWS SES email provider in your Strapi app</title>
      <dc:creator>kevinadhiguna</dc:creator>
      <pubDate>Thu, 11 Mar 2021 00:25:36 +0000</pubDate>
      <link>https://dev.to/kevinadhiguna/how-to-setup-aws-ses-email-provider-in-your-strapi-app-1m8l</link>
      <guid>https://dev.to/kevinadhiguna/how-to-setup-aws-ses-email-provider-in-your-strapi-app-1m8l</guid>
      <description>&lt;p&gt;When you forgot password and want to reset it, you usually get an email that contains a link to your application. Then it will redirect you to a page where you can create a new password. An operation like this requires an email provider, such as AWS Simple Email Service (SES).&lt;/p&gt;

&lt;p&gt;In this article, we will learn how to setup AWS SES email provider in your Strapi app.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Prerequisites :&lt;/b&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a Strapi app (Learn &lt;a href="https://strapi.io/documentation/developer-docs/latest/getting-started/quick-start.html#_1-install-strapi-and-create-a-new-project" rel="noopener noreferrer"&gt;how to install Strapi&lt;/a&gt;) &lt;/li&gt;
&lt;li&gt;a package manager, such as &lt;a href="https://classic.yarnpkg.com/en/docs/install/#debian-stable" rel="noopener noreferrer"&gt;Yarn&lt;/a&gt; or &lt;a href="https://nodejs.org/en/" rel="noopener noreferrer"&gt;NPM&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;b&gt;Step 1 : Install Strapi AWS S3 upload provider&lt;/b&gt;&lt;br&gt;
Open your terminal, then run :&lt;br&gt;
&lt;code&gt;yarn add strapi-provider-email-amazon-ses&lt;/code&gt;&lt;br&gt;
or&lt;br&gt;
&lt;code&gt;npm i strapi-provider-email-amazon-ses --save&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Check your &lt;code&gt;package.json&lt;/code&gt; if &lt;code&gt;strapi-provider-email-amazon-ses&lt;/code&gt; exists. If so, you have successfully installed Strapi AWS SES email provider.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Step 2 : Create plugins.js in config directory&lt;/b&gt;&lt;br&gt;
PATH : &lt;code&gt;./config/plugins.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
 &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;amazon-ses&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;providerOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AWS_ACCESS_KEY_ID&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
     &lt;span class="na"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AWS_SECRET_ACCESS_KEY&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
     &lt;span class="na"&gt;amazon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`https://email.&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AWS_REGION&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;.amazonaws.com`&lt;/span&gt;
   &lt;span class="p"&gt;},&lt;/span&gt;
   &lt;span class="na"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="na"&gt;defaultFrom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;EMAIL_DEFAULT_FROM&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
     &lt;span class="na"&gt;defaultReplyTo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;EMAIL_DEFAULT_REPLY_TO&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configuration&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2na3s0rhm8puf1wa8h5g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2na3s0rhm8puf1wa8h5g.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Learn more &lt;a href="https://www.npmjs.com/package/strapi-provider-email-amazon-ses" rel="noopener noreferrer"&gt;how to configure Strapi AWS SES email provider&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Step 3 : Fill in environment variables&lt;/b&gt;&lt;br&gt;
In &lt;code&gt;./config/plugins.js&lt;/code&gt; above, we assigned a lot of environment variables. Now it’s time to fill them in.&lt;br&gt;
PATH : &lt;code&gt;.env&lt;/code&gt; (root directory of your Strapi app)&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2r26t28ggzeuchskwr5n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2r26t28ggzeuchskwr5n.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is not mandatory to include defaultFrom (EMAIL_DEFAULT_FROM) and defaultReplyTo (EMAIL_DEFAULT_REPLYTO) in environment variables but optional.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;How do I gain my AWS security credentials ?&lt;/b&gt;&lt;br&gt;
Simply sign in to the AWS management console, then open the dropdown menu. Select My Security Credentials.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcf2il3l7d5w2f7nnra2b.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcf2il3l7d5w2f7nnra2b.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After that you will see a page like this :&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7swqkw1ydn29dftpnslv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7swqkw1ydn29dftpnslv.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Learn more &lt;a href="https://aws.amazon.com/blogs/security/how-to-find-update-access-keys-password-mfa-aws-management-console/" rel="noopener noreferrer"&gt;how to gain your AWS security credentials&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Hooray! It’s time to start your Strapi app and make sure it works. Thanks for reading, hope you have a great day today!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connect with me&lt;/strong&gt; :&lt;br&gt;
&lt;a href="https://linkedin.com/in/kevinadhiguna" rel="noopener noreferrer"&gt;LinkedIn - kevinadhiguna&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/kevinadhiguna" rel="noopener noreferrer"&gt;Github - kevinadhiguna&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;References&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.npmjs.com/package/strapi-provider-email-amazon-ses" rel="noopener noreferrer"&gt;NPM strapi-provider-email-amazon-ses&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://strapi.io/documentation/developer-docs/latest/setup-deployment-guides/deployment/hosting-guides/amazon-aws.html" rel="noopener noreferrer"&gt;Strapi Amazon AWS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/security/how-to-find-update-access-keys-password-mfa-aws-management-console/" rel="noopener noreferrer"&gt;AWS Security Blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>How to setup AWS SES email provider in your Strapi app</title>
      <dc:creator>kevinadhiguna</dc:creator>
      <pubDate>Thu, 11 Mar 2021 00:24:52 +0000</pubDate>
      <link>https://dev.to/kevinadhiguna/how-to-setup-aws-ses-email-provider-in-your-strapi-app-a40</link>
      <guid>https://dev.to/kevinadhiguna/how-to-setup-aws-ses-email-provider-in-your-strapi-app-a40</guid>
      <description>&lt;p&gt;When you forgot password and want to reset it, you usually get an email that contains a link to your application. Then it will redirect you to a page where you can create a new password. An operation like this requires an email provider, such as AWS Simple Email Service (SES).&lt;/p&gt;

&lt;p&gt;In this article, we will learn how to setup AWS SES email provider in your Strapi app.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Prerequisites :&lt;/b&gt;&lt;br&gt;
Please make sure you have created a Strapi app (Learn &lt;a href="https://strapi.io/documentation/developer-docs/latest/getting-started/quick-start.html#_1-install-strapi-and-create-a-new-project"&gt;how to install Strapi&lt;/a&gt;) &lt;br&gt;
A package manager, such as &lt;a href="https://classic.yarnpkg.com/en/docs/install/#debian-stable"&gt;Yarn&lt;/a&gt; or &lt;a href="https://nodejs.org/en/"&gt;NPM&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Step 1 : Install Strapi AWS S3 upload provider&lt;/b&gt;&lt;br&gt;
Open your terminal, then run :&lt;br&gt;
&lt;code&gt;yarn add strapi-provider-email-amazon-ses&lt;/code&gt;&lt;br&gt;
or&lt;br&gt;
&lt;code&gt;npm i strapi-provider-email-amazon-ses --save&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Check your &lt;code&gt;package.json&lt;/code&gt; if &lt;code&gt;strapi-provider-email-amazon-ses&lt;/code&gt; exists. If so, you have successfully installed Strapi AWS SES email provider.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Step 2 : Create plugins.js in config directory&lt;/b&gt;&lt;br&gt;
PATH : &lt;code&gt;./config/plugins.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;module.exports &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;({&lt;/span&gt; &lt;span class="nb"&gt;env&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;({&lt;/span&gt;
 email: &lt;span class="o"&gt;{&lt;/span&gt;
   provider: &lt;span class="s1"&gt;'amazon-ses'&lt;/span&gt;,
   providerOptions: &lt;span class="o"&gt;{&lt;/span&gt;
     key: &lt;span class="nb"&gt;env&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'AWS_ACCESS_KEY_ID'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,
     secret: &lt;span class="nb"&gt;env&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'AWS_SECRET_ACCESS_KEY'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,
     amazon: &lt;span class="sb"&gt;`&lt;/span&gt;https://email.&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'AWS_REGION'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;.amazonaws.com&lt;span class="sb"&gt;`&lt;/span&gt;
   &lt;span class="o"&gt;}&lt;/span&gt;,
   settings: &lt;span class="o"&gt;{&lt;/span&gt;
     defaultFrom: &lt;span class="nb"&gt;env&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'EMAIL_DEFAULT_FROM'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,
     defaultReplyTo: &lt;span class="nb"&gt;env&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'EMAIL_DEFAULT_REPLY_TO'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
   &lt;span class="o"&gt;}&lt;/span&gt;
 &lt;span class="o"&gt;}&lt;/span&gt;,
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configuration&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UT3tQSTP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2na3s0rhm8puf1wa8h5g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UT3tQSTP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2na3s0rhm8puf1wa8h5g.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Step 3 : Fill in environment variables&lt;/b&gt;&lt;br&gt;
In &lt;code&gt;./config/plugins.js&lt;/code&gt; above, we assigned a lot of environment variables. Now it’s time to fill them in.&lt;br&gt;
PATH : &lt;code&gt;.env&lt;/code&gt; (root directory of your Strapi app)&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6_WPcxHM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2r26t28ggzeuchskwr5n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6_WPcxHM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2r26t28ggzeuchskwr5n.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is not mandatory to include defaultFrom (EMAIL_DEFAULT_FROM) and defaultReplyTo (EMAIL_DEFAULT_REPLYTO) in environment variables but optional.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;How do I gain my AWS security credentials ?&lt;/b&gt;&lt;br&gt;
Simply sign in to the AWS management console, then open the dropdown menu. Select My Security Credentials.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RRuNCYG9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cf2il3l7d5w2f7nnra2b.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RRuNCYG9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cf2il3l7d5w2f7nnra2b.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After that you will see a page like this :&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uS6UzppI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7swqkw1ydn29dftpnslv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uS6UzppI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7swqkw1ydn29dftpnslv.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Learn more how to gain your AWS security credentials.&lt;/p&gt;

&lt;p&gt;Hooray! It’s time to start your Strapi app and make sure it works. Thanks for reading, hope you have a great day today!&lt;/p&gt;

&lt;p&gt;Connect with me :&lt;br&gt;
&lt;a href="http://linkedin.com/in/kevinadhiguna"&gt;LinkedIn - kevinadhiguna&lt;/a&gt;&lt;br&gt;
&lt;a href=""&gt;Github - kevinadhiguna&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;References :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.npmjs.com/package/strapi-provider-email-amazon-ses"&gt;NPM strapi-provider-email-amazon-ses&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://strapi.io/documentation/developer-docs/latest/setup-deployment-guides/deployment/hosting-guides/amazon-aws.html"&gt;Strapi Amazon AWS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/security/how-to-find-update-access-keys-password-mfa-aws-management-console/"&gt;AWS Security Blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>How to setup Amazon S3 upload provider in your Strapi app</title>
      <dc:creator>kevinadhiguna</dc:creator>
      <pubDate>Thu, 11 Mar 2021 00:17:36 +0000</pubDate>
      <link>https://dev.to/kevinadhiguna/how-to-setup-amazon-s3-upload-provider-in-your-strapi-app-1opc</link>
      <guid>https://dev.to/kevinadhiguna/how-to-setup-amazon-s3-upload-provider-in-your-strapi-app-1opc</guid>
      <description>&lt;p&gt;Strapi, by default, stores all files in public/uploads. In a production environment, you definitely would utilize a service, such as AWS Simple Storage Service (S3). Besides that it makes your Strapi app a stateless application according to &lt;a href="https://12factor.net/processes" rel="noopener noreferrer"&gt;the Twelve-Factor App methodology&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In this article, we will learn how to setup AWS S3 upload provider in your Strapi app.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Prerequisites :&lt;/b&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Strapi app (Learn &lt;a href="https://strapi.io/documentation/developer-docs/latest/getting-started/quick-start.html#_1-install-strapi-and-create-a-new-project" rel="noopener noreferrer"&gt;how to install Strapi&lt;/a&gt;) &lt;/li&gt;
&lt;li&gt;A package manager, such as &lt;a href="https://classic.yarnpkg.com/en/docs/install/#debian-stable" rel="noopener noreferrer"&gt;Yarn&lt;/a&gt; or &lt;a href="https://nodejs.org/en/" rel="noopener noreferrer"&gt;NPM&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;b&gt;Step 1 : Install Strapi AWS S3 upload provider&lt;/b&gt;&lt;br&gt;
Open your terminal, then run :&lt;br&gt;
&lt;code&gt;yarn add strapi-provider-upload-aws-s3&lt;/code&gt;&lt;br&gt;
or&lt;br&gt;
&lt;code&gt;npm i strapi-provider-upload-aws-s3 --save&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Check your &lt;code&gt;package.json&lt;/code&gt; if &lt;code&gt;strapi-provider-upload-aws-s3&lt;/code&gt; exists. If so, you have successfully installed Strapi AWS S3 upload provider.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Step 2 : Create plugins.js in config directory&lt;/b&gt;&lt;br&gt;
PATH : &lt;code&gt;./config/plugins.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
 &lt;span class="na"&gt;upload&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aws-s3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;providerOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="na"&gt;accessKeyId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AWS_ACCESS_KEY_ID&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
     &lt;span class="na"&gt;secretAccessKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AWS_ACCESS_SECRET&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
     &lt;span class="na"&gt;region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AWS_REGION&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
     &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="na"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AWS_BUCKET_NAME&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="na"&gt;StorageClass&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AWS_S3_STORAGE_CLASSES&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Configure your Amazon S3 Storage Classes (including this to environment variable is not a must)&lt;/span&gt;
     &lt;span class="p"&gt;},&lt;/span&gt;
     &lt;span class="na"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt; &lt;span class="c1"&gt;// Only if you want to `stdout` logs&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configuration&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4hi7fru0zudt2eptn9gn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4hi7fru0zudt2eptn9gn.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please refer to &lt;a href="https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#constructor-property" rel="noopener noreferrer"&gt;constructor details&lt;/a&gt; for complete configuration.&lt;/p&gt;

&lt;p&gt;You may be wondering what &lt;code&gt;AWS_S3_STORAGE_CLASSES&lt;/code&gt; is. Here are Amazon S3 Storage Classes :&lt;br&gt;
&lt;strong&gt;S3 Standard&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;general-purpose storage of frequently accessed data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;S3 Intelligent-Tiering&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;data with unknown or changing access patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;S3 Standard-Infrequent Access (S3 Standard-IA)&lt;/strong&gt; and &lt;strong&gt;S3 One Zone-Infrequent Access (S3 One Zone-IA)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;for long-lived, but less frequently accessed data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Amazon S3 Glacier (S3 Glacier)&lt;/strong&gt; and &lt;strong&gt;Amazon S3 Glacier Deep Archive (S3 Glacier Deep Archive)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;for long-term archive and digital preservation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Read &lt;a href="https://aws.amazon.com/s3/storage-classes/" rel="noopener noreferrer"&gt;Amazon S3 Storage Classes&lt;/a&gt; for more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3 : Fill in environment variables&lt;/strong&gt;&lt;br&gt;
In &lt;code&gt;./config/plugins.js&lt;/code&gt; above, we assigned a lot of environment variables. Now it’s time to fill them in.&lt;br&gt;
PATH : &lt;code&gt;.env&lt;/code&gt; (root directory of your Strapi app)&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy9awqscvwkc9cxpewu1h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy9awqscvwkc9cxpewu1h.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;How do I gain my AWS security credentials ?&lt;/b&gt;&lt;br&gt;
Simply sign in to the AWS management console, then open the dropdown menu. Select My Security Credentials.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcf2il3l7d5w2f7nnra2b.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcf2il3l7d5w2f7nnra2b.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After that you will see a page like this :&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7swqkw1ydn29dftpnslv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7swqkw1ydn29dftpnslv.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Learn more &lt;a href="https://aws.amazon.com/blogs/security/how-to-find-update-access-keys-password-mfa-aws-management-console/" rel="noopener noreferrer"&gt;how to gain your AWS security credentials&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Great! Everything is set, next you can start your Strapi app and upload files. Your files will be stored in AWS S3.&lt;/p&gt;

&lt;p&gt;Thank you for reading, hope you have a great day today!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connect with me&lt;/strong&gt; :&lt;br&gt;
&lt;a href="http://linkedin.com/in/kevinadhiguna" rel="noopener noreferrer"&gt;LinkedIn - kevinadhiguna&lt;/a&gt;&lt;br&gt;
&lt;a href="http://github.com/kevinadhiguna" rel="noopener noreferrer"&gt;Github - kevinadhiguna&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;References&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/s3/storage-classes/" rel="noopener noreferrer"&gt;Amazon Object Storage Classes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://strapi.io/documentation/developer-docs/latest/setup-deployment-guides/deployment/hosting-guides/amazon-aws.html" rel="noopener noreferrer"&gt;Strapi Amazon AWS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#constructor-property%0AAWS%20Security%20Blog.%20https://aws.amazon.com/blogs/security/how-to-find-update-access-keys-password-mfa-aws-management-console/" rel="noopener noreferrer"&gt;AWS Javascript SDK&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>strapi</category>
      <category>aws</category>
      <category>awss3</category>
      <category>emailprovider</category>
    </item>
    <item>
      <title>How to setup AWS SES email provider in your Strapi app</title>
      <dc:creator>kevinadhiguna</dc:creator>
      <pubDate>Thu, 11 Mar 2021 00:00:08 +0000</pubDate>
      <link>https://dev.to/kevinadhiguna/how-to-setup-aws-ses-email-provider-in-your-strapi-app-2lf2</link>
      <guid>https://dev.to/kevinadhiguna/how-to-setup-aws-ses-email-provider-in-your-strapi-app-2lf2</guid>
      <description>&lt;p&gt;When you forgot password and want to reset it, you usually get an email that contains a link to your application. Then it will redirect you to a page where you can create a new password. An operation like this requires an email provider, such as AWS Simple Email Service (SES).&lt;/p&gt;

&lt;p&gt;In this article, we will learn how to setup AWS SES email provider in your Strapi app.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Prerequisites :&lt;/b&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Strapi app (Learn &lt;a href="https://strapi.io/documentation/developer-docs/latest/getting-started/quick-start.html#_1-install-strapi-and-create-a-new-project"&gt;how to install Strapi&lt;/a&gt;) &lt;/li&gt;
&lt;li&gt;A package manager, such as &lt;a href="https://classic.yarnpkg.com/en/docs/install/#debian-stable"&gt;Yarn&lt;/a&gt; or &lt;a href="https://nodejs.org/en/"&gt;NPM&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;b&gt;Step 1 : Install Strapi AWS SES email provider&lt;/b&gt;&lt;br&gt;
Open your terminal, then run :&lt;br&gt;
&lt;code&gt;yarn add strapi-provider-email-amazon-ses&lt;/code&gt;&lt;br&gt;
or&lt;br&gt;
&lt;code&gt;npm i strapi-provider-email-amazon-ses --save&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Check your &lt;code&gt;package.json&lt;/code&gt; if &lt;code&gt;strapi-provider-email-amazon-ses&lt;/code&gt; exists. If so, you have successfully installed Strapi AWS SES email provider.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Step 2 : Create plugins.js in config directory&lt;/b&gt;&lt;br&gt;
PATH : &lt;code&gt;./config/plugins.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
 &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;amazon-ses&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;providerOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AWS_ACCESS_KEY_ID&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
     &lt;span class="na"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AWS_SECRET_ACCESS_KEY&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
     &lt;span class="na"&gt;amazon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`https://email.&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AWS_REGION&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;.amazonaws.com`&lt;/span&gt;
   &lt;span class="p"&gt;},&lt;/span&gt;
   &lt;span class="na"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="na"&gt;defaultFrom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;EMAIL_DEFAULT_FROM&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
     &lt;span class="na"&gt;defaultReplyTo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;EMAIL_DEFAULT_REPLY_TO&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configuration&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UT3tQSTP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2na3s0rhm8puf1wa8h5g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UT3tQSTP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2na3s0rhm8puf1wa8h5g.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Step 3 : Fill in environment variables&lt;/b&gt;&lt;br&gt;
In &lt;code&gt;./config/plugins.js&lt;/code&gt; above, we assigned a lot of environment variables. Now it’s time to fill them in.&lt;br&gt;
PATH : &lt;code&gt;.env&lt;/code&gt; (root directory of your Strapi app)&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6_WPcxHM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2r26t28ggzeuchskwr5n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6_WPcxHM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2r26t28ggzeuchskwr5n.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is not mandatory to include defaultFrom (EMAIL_DEFAULT_FROM) and defaultReplyTo (EMAIL_DEFAULT_REPLYTO) in environment variables but optional.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;How do I gain my AWS security credentials ?&lt;/b&gt;&lt;br&gt;
Simply sign in to the AWS management console, then open the dropdown menu. Select My Security Credentials.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RRuNCYG9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cf2il3l7d5w2f7nnra2b.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RRuNCYG9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cf2il3l7d5w2f7nnra2b.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After that you will see a page like this :&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uS6UzppI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7swqkw1ydn29dftpnslv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uS6UzppI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7swqkw1ydn29dftpnslv.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Learn more &lt;a href="https://aws.amazon.com/blogs/security/how-to-find-update-access-keys-password-mfa-aws-management-console/"&gt;how to gain your AWS security credentials&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Hooray! It’s time to start your Strapi app and make sure it works. Thanks for reading, hope you have a great day today!&lt;/p&gt;

&lt;p&gt;Connect with me :&lt;br&gt;
&lt;a href="http://linkedin.com/in/kevinadhiguna"&gt;LinkedIn - kevinadhiguna&lt;/a&gt;&lt;br&gt;
&lt;a href="http://github.com/kevinadhiguna"&gt;Github - kevinadhiguna&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;References :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.npmjs.com/package/strapi-provider-email-amazon-ses"&gt;NPM strapi-provider-email-amazon-ses&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://strapi.io/documentation/developer-docs/latest/setup-deployment-guides/deployment/hosting-guides/amazon-aws.html"&gt;Strapi Amazon AWS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/security/how-to-find-update-access-keys-password-mfa-aws-management-console/"&gt;AWS Security Blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>strapi</category>
      <category>aws</category>
      <category>emailprovider</category>
      <category>awsses</category>
    </item>
    <item>
      <title>What is CORS ? How to configure CORS in Strapi ?</title>
      <dc:creator>kevinadhiguna</dc:creator>
      <pubDate>Wed, 10 Mar 2021 23:48:02 +0000</pubDate>
      <link>https://dev.to/kevinadhiguna/what-is-cors-how-to-configure-cors-in-strapi-461b</link>
      <guid>https://dev.to/kevinadhiguna/what-is-cors-how-to-configure-cors-in-strapi-461b</guid>
      <description>&lt;p&gt;CORS stands for Cross-Origin Resource Sharing. According to developer.mozilla.org, Cross-Origin Resource Sharing (CORS) is a mechanism that uses additional HTTP headers to tell browsers to give a web application running at one origin, access to selected resources from a different origin. Simply, it is a web application security feature in a browser.&lt;/p&gt;

&lt;p&gt;Image below shows how CORS is implemented :&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwlqcjbb4ncbl4wdjo87v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwlqcjbb4ncbl4wdjo87v.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can see that domain-a.com contains an image from domain-b.com. However, of course the image from domain-b.com is not stored in the web server of domain-a.com which means the image is fetched from domain-b.com.&lt;/p&gt;

&lt;p&gt;So, domain-a.com sends a GET request of image.png to the web server of domain-b.com. This request is called a cross-origin request and it is controlled by CORS in the web server of domain-b.com. In other words, The web server of domain-b.com must allow cross-origin requests from domain-a.com. So that domain-a.com can retrieve the image or whatever it requests.&lt;/p&gt;

&lt;p&gt;In Strapi, CORS is controlled in this path : &lt;br&gt;
&lt;code&gt;./config/middleware.js&lt;/code&gt;&lt;br&gt;
Then you would like to specify allowed CORS origin which can be only one, or two, even more than three URLs. &lt;/p&gt;

&lt;p&gt;Here is an example, if you have multiple URLs as allowed CORS origin :&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv2qyal10ztjujowynql4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv2qyal10ztjujowynql4.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The theory is that you must set enabled to true then put URLs of allowed CORS origin in your environment variable, in .env file. What .env file contains :&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fay4p3ciphyis55n754mt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fay4p3ciphyis55n754mt.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(Please note that of course you are also able to put a single URL as allowed CORS origin)&lt;/p&gt;

&lt;p&gt;However, if you do not specify certain URLs in your environment variable, Strapi will recognize a string beside ‘CORS_ORIGIN’ as allowed CORS origin. Split function that comes after is to split the URLs if you have more than a single URL as allowed CORS origin. Otherwise, you do not have to split it. Usually the reason why it has more at least than one URL is :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your app’s client side&lt;/li&gt;
&lt;li&gt;Your Strapi admin panel (still considered as an external source)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thank you for reading this article! See you in another Strapi post and have a nice day ~&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connect with me&lt;/strong&gt; :&lt;br&gt;
&lt;a href="http://linkedin.com/in/kevinadhiguna" rel="noopener noreferrer"&gt;LinkedIn - kevinadhiguna&lt;/a&gt;&lt;br&gt;
&lt;a href="http://github.com/kevinadhiguna" rel="noopener noreferrer"&gt;Github - kevinadhiguna&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read in Blog&lt;/strong&gt; : &lt;a href="https://about.lovia.life/how-to-configure-cors-in-strapi/" rel="noopener noreferrer"&gt;https://about.lovia.life/how-to-configure-cors-in-strapi/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reference&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mozilla. ‘Cross-Origin Resource Sharing (CORS)’. &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Strapi Middleware Configuration. &lt;a href="https://strapi.io/documentation/developer-docs/latest/setup-deployment-guides/configurations.html#middlewares" rel="noopener noreferrer"&gt;https://strapi.io/documentation/developer-docs/latest/setup-deployment-guides/configurations.html#middlewares&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>strapi</category>
      <category>cors</category>
    </item>
    <item>
      <title>How to disable telemetry in Strapi 📊</title>
      <dc:creator>kevinadhiguna</dc:creator>
      <pubDate>Sat, 06 Mar 2021 04:34:43 +0000</pubDate>
      <link>https://dev.to/kevinadhiguna/disable-telemetry-in-strapi-2egf</link>
      <guid>https://dev.to/kevinadhiguna/disable-telemetry-in-strapi-2egf</guid>
      <description>&lt;p&gt;Strapi contains a feature in which anonymous and otherwise non-sensitive data is collected. Like any other software, the main aim is to provide the best experience to users.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What data is collected ?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Unique project ID (generated with UUID)&lt;/li&gt;
&lt;li&gt;Unique machine ID (generated with node-machine-id)&lt;/li&gt;
&lt;li&gt;Environment state (development, staging, production)&lt;/li&gt;
&lt;li&gt;System information (OS)&lt;/li&gt;
&lt;li&gt;Build configurations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Of course, &lt;b&gt;no personal data is collected and any data collected is secured, encrypted and anonymized&lt;/b&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How do I disable Telemetry in Strapi ?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Simply, please remove &lt;code&gt;uuid&lt;/code&gt; in your strapi app’s &lt;code&gt;package.json&lt;/code&gt; file.&lt;br&gt;
Before :&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fayu9gr2f7urohtgcklil.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fayu9gr2f7urohtgcklil.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After :&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl50apel6mvm3zb2lhy3r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl50apel6mvm3zb2lhy3r.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have any questions regarding collected data usage in Strapi, do not hesitate to send an email to &lt;a href="mailto:privacy@strapi.io"&gt;privacy@strapi.io&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Read more : &lt;a href="https://strapi.io/documentation/developer-docs/latest/getting-started/usage-information.html" rel="noopener noreferrer"&gt;Strapi - Collected Usage Information&lt;/a&gt;&lt;/p&gt;

</description>
      <category>strapi</category>
      <category>telemetry</category>
      <category>data</category>
    </item>
  </channel>
</rss>
