<?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>Forem: Seong Bae</title>
    <description>The latest articles on Forem by Seong Bae (@seongbae).</description>
    <link>https://forem.com/seongbae</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%2F1031331%2F321e4e41-db79-414c-9ab0-f7d096060318.jpeg</url>
      <title>Forem: Seong Bae</title>
      <link>https://forem.com/seongbae</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/seongbae"/>
    <language>en</language>
    <item>
      <title>Website Maintenance</title>
      <dc:creator>Seong Bae</dc:creator>
      <pubDate>Sun, 15 Mar 2026 11:40:19 +0000</pubDate>
      <link>https://forem.com/seongbae/website-maintenance-3m0i</link>
      <guid>https://forem.com/seongbae/website-maintenance-3m0i</guid>
      <description>&lt;p&gt;I have a client who needs quarterly maintenance of their website built with Laravel.  It is running on Ubuntu server hosted by Digital Ocean.  &lt;/p&gt;

&lt;p&gt;Below is what I do as part of the maintenance.  Please feel free to provide feedback if you have any.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create backups&lt;/li&gt;
&lt;li&gt;Update server&lt;/li&gt;
&lt;li&gt;Review server stats&lt;/li&gt;
&lt;li&gt;Update Laravel framework and packages&lt;/li&gt;
&lt;li&gt;Review firewall settings&lt;/li&gt;
&lt;li&gt;Review logs&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Details&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Create backups&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;During the maintenance, I make a number of backups.&lt;/p&gt;

&lt;p&gt;First backup is backup of the server.  Since the site is hosted with Digital Ocean, I create a snapshot of the server.  This allows me to safely revert should anything go wrong during the maintenance process.&lt;/p&gt;

&lt;p&gt;Second backup is user-generated files on the website.  This includes user profile photos, PDF documents uploaded, etc.  On a Laravel website, these are usually stored on the /storage/app folder.   So I create a backup of the entire app folder and send this to client.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-czf&lt;/span&gt; app.tar.gz app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Third backup is database.  I also send this to client after backup is made&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mysqldump &lt;span class="nt"&gt;-u&lt;/span&gt; username &lt;span class="nt"&gt;-p&lt;/span&gt; database &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; database.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The website codebase is hosted with github so there is no backup needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Update server&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The client's website is running on a Ubuntu server.  I update the server with following commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt upgrade
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt dist-upgrade
&lt;span class="nb"&gt;sudo &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="nt"&gt;-release-upgrade&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The last command is only if I'm updating the OS to the latest major release. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Review server stats&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After updating the server, I do a quick review of server performances from Digital Ocean's server dashboard.  In particular, I'm looking at CPU%, Load, Memory, Disk I/O, Disk Usage, and Bandwidth for the last 14 days and see if there are any anomalies or if the server needs to be upgraded.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fst43s9b0q6fu5f2n2tho.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fst43s9b0q6fu5f2n2tho.png" alt=" " width="800" height="1336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Update Laravel framework and packages&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Next, I update Laravel framework and any third party packages used within the application.  &lt;/p&gt;

&lt;p&gt;For upgrading Laravel, I always reference the release schedule that shows when the security fixes will be available.  Following is schedule taken from Laravel website.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fqyvcoo6mwlv7716pbx4w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fqyvcoo6mwlv7716pbx4w.png" alt=" " width="631" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As of today, 15 March 2026, Laravel 11 is supported through 11 March 2026.  So if my application is running 11, I'd do a major upgrade to 12. If not, I just run "composer update" to bring all packages to latest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Review firewall settings&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Run following commands to see ufw status and what ports are open:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw status verbose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;6. Review logs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Lastly, I review logs for any anomalies or any attempts by unauthorized users to access the server.  The logs include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Laravel logs&lt;/li&gt;
&lt;li&gt;Web server logs (access.log, error.log)&lt;/li&gt;
&lt;li&gt;Activity logs within the app&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That about sums up what I normally do for website/server maintenance.  What do you guys think?  &lt;/p&gt;

&lt;p&gt;Seong&lt;/p&gt;

</description>
      <category>devops</category>
      <category>laravel</category>
      <category>php</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Upgrade Node on Laravel Forge</title>
      <dc:creator>Seong Bae</dc:creator>
      <pubDate>Sun, 14 Dec 2025 12:20:58 +0000</pubDate>
      <link>https://forem.com/seongbae/upgrade-node-on-laravel-forge-3f9l</link>
      <guid>https://forem.com/seongbae/upgrade-node-on-laravel-forge-3f9l</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt-get update --allow-releaseinfo-change &amp;amp;&amp;amp; sudo apt-get install -y ca-certificates curl gnupg
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
NODE_MAJOR=22
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list
sudo apt-get update --allow-releaseinfo-change &amp;amp;&amp;amp; sudo apt-get install nodejs -y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change NODE_MAJOR=22 to your desired version (e.g., 20 for Node 20). &lt;/p&gt;

</description>
    </item>
    <item>
      <title>MySQL Safe Update Mode</title>
      <dc:creator>Seong Bae</dc:creator>
      <pubDate>Thu, 27 Nov 2025 00:08:59 +0000</pubDate>
      <link>https://forem.com/seongbae/mysql-safe-update-mode-2eel</link>
      <guid>https://forem.com/seongbae/mysql-safe-update-mode-2eel</guid>
      <description>&lt;p&gt;I swear... I can never remember the syntax to change MySQL's safe update mode.  I always have to google it.&lt;/p&gt;

&lt;p&gt;To turn off safe update mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SET SQL_SAFE_UPDATES = 0;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Please remember to set it back to 1 after running your mass-update/mass-delete query.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SET SQL_SAFE_UPDATES = 1;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Safe coding!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Creating a clone of SSD</title>
      <dc:creator>Seong Bae</dc:creator>
      <pubDate>Thu, 13 Nov 2025 05:03:12 +0000</pubDate>
      <link>https://forem.com/seongbae/creating-a-clone-of-ssd-3go</link>
      <guid>https://forem.com/seongbae/creating-a-clone-of-ssd-3go</guid>
      <description>&lt;p&gt;Recently, I had a few instances where I needed to upgrade SSD on my laptops and computers because I was running out of space.  These were usually 512gb SSD and I'd upgrade them to either 1TB or 2TB.  &lt;/p&gt;

&lt;p&gt;Part of the upgrade process is to clone the current SSD to a bigger SSD.  For this, you will need two things: SSD enclosure and cloning software.&lt;/p&gt;

&lt;p&gt;For SSD enclosure, below is what I have and it worked well.  It is only $16.99 on Amazon.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fi2culjztdfkfor30ta90.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fi2culjztdfkfor30ta90.jpg" alt=" " width="800" height="743"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the cloning software, I used Macrium Reflect X Home.  If you want to buy it, it's $50/year.  But it comes with 30-day free trial which I used without any issues.&lt;/p&gt;

&lt;p&gt;Using the above two, I was able to successfully upgrade my SSD from 512gb to 2TB in no time!&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>tooling</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How I fixed 403 error in Laravel</title>
      <dc:creator>Seong Bae</dc:creator>
      <pubDate>Wed, 10 Sep 2025 04:23:15 +0000</pubDate>
      <link>https://forem.com/seongbae/how-i-fixed-403-error-in-laravel-2eg3</link>
      <guid>https://forem.com/seongbae/how-i-fixed-403-error-in-laravel-2eg3</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.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%2Fku1h4vnyts8m0z1zifq3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fku1h4vnyts8m0z1zifq3.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Recently, I had to set up a development environment on a new computer running on Ubuntu 24.  I've done this thousand times and the business went as usual - installing LAMP, git, composer, etc.  Then I downloaded an existing Laravel project from github to continue working on it.  After setting up the project, when I went to url in browser, I saw "403 forbidden access" error.  I've tried everything but what fixed the issue at the end was definitely not what I expected!&lt;/p&gt;

&lt;p&gt;First, I double-checked my apache configuration file for any errors or wrong directives used:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;VirtualHost *:80&amp;gt;
    ServerAdmin webmaster@localhost
    ServerName mysite.test
    DocumentRoot /home/seongbae/projects/mysite/public

    &amp;lt;Directory "/home/seongbae/projects/mysite/public"&amp;gt;
        AllowOverride All
        Require all granted
        Options FollowSymLinks
        Order allow,deny
        Allow from all
    &amp;lt;/Directory&amp;gt;

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
&amp;lt;/VirtualHost&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything looked good.  All my other Laravel projects had similar apache configuration settings.&lt;/p&gt;

&lt;p&gt;Next, I was curious if this has anything to do with apache rewrite module not being enabled.  By default, on a fresh install of LAMP on Ubuntu, the rewrite module was not enabled.  So I enabled it as following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd /etc/apache2/mods-available
a2enmod rewrite
service apache2 restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That did not fix either.  &lt;/p&gt;

&lt;p&gt;Someone mentioned that the project should have .htaccess file that looks like following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;IfModule mod_rewrite.c&amp;gt;
    RewriteEngine on
    RewriteCond %{REQUEST_URI} !^public
    RewriteRule ^(.*)$ public/$1 [L]
&amp;lt;/IfModule&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That didn't fix.&lt;/p&gt;

&lt;p&gt;Then I thought this has to be some type of permission issue...most likely the www-data user is not able to access the project folder which is located at /home/seongbae/projects folder.  To test this theory, I created a Laravel project under apache root folder at /var/www/html.  It worked!  So I narrowed down the issue to incorrect permission setup.&lt;/p&gt;

&lt;p&gt;So the next step I tried was following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd /home/seongbae/projects/mysite
sudo chown -R $USER:www-data .
sudo find . -type f -exec chmod 664 {} \;   
sudo find . -type d -exec chmod 775 {} \;
sudo chmod -R ug+rwx storage bootstrap/cache
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Above basically gives www-data access to the site folder and changes permission for all folders and files so that www-data can access them.  I also made sure that www-data can write to the storage and cache folders.&lt;/p&gt;

&lt;p&gt;When the above didn't fix the issue, I was starting to pull my hair.  I know I've set up new installation of Ubuntu thousands of times before and I've come across this issue.  I've fixed it in the past... but I just could not remember how I fixed it.  I must be getting old.  Then I thought that if I ever fix this again, I must write a blog post for my future self.&lt;/p&gt;

&lt;p&gt;Then I vaguely remembered that www-data must have access to parent folders as well.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/home/seongbae/projects/mysite
/home/seongbae/projects/
/home/seongbae
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So one at a time, I changed the group for each of above parent folder and made sure www-data group user can access the folders:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo chgrp www-data folder
sudo chmod g+x folder
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And when I changed group for all the above 3 parent folders, the 403 forbidden error went away!&lt;/p&gt;

&lt;p&gt;I don't know why all the discussions and solutions I found on the net did not address fixing the permission of parent folders.&lt;/p&gt;

&lt;p&gt;Hopefully this will help someone....and also future me from wasting too much time trying to fix the forbidden issue.  &lt;/p&gt;

</description>
      <category>ubuntu</category>
      <category>tutorial</category>
      <category>laravel</category>
      <category>php</category>
    </item>
    <item>
      <title>Getting dev laptop ready</title>
      <dc:creator>Seong Bae</dc:creator>
      <pubDate>Tue, 09 Sep 2025 09:11:23 +0000</pubDate>
      <link>https://forem.com/seongbae/getting-dev-laptop-ready-83e</link>
      <guid>https://forem.com/seongbae/getting-dev-laptop-ready-83e</guid>
      <description>&lt;p&gt;More often than not, I have to set up a new computer for development environment.  Sometimes, I buy a new computer... other times, I try upgrading OS and it fails and I have to completely re-install OS (such as upgrading from Ubuntu 22 to 24 last week).&lt;/p&gt;

&lt;p&gt;In either cases, I have to set up a new dev environment ready quickly.  This includes installing LAMP to my favorite front-end development tools such as PhpStorm.  I don't want to waste any time... within a couple of hours, my new computer should be ready for me to continue with development.&lt;/p&gt;

&lt;p&gt;Below is a guide I created for myself on steps to get the new computer ready.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Install LAMP
&lt;/h2&gt;

&lt;p&gt;I've written on installing LAMP on Ubuntu. Please reference &lt;a href="https://dev.to/seongbae/install-lamp-stack-on-ubuntu-15f"&gt;this page&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install Composer
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install php-cli unzip
sudo apt install curl
curl -sS https://getcomposer.org/installer -o /tmp/composer-setup.php
sudo php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After installing composer, don't forget to add composer vendor bin path to your PATH so that you can run commands like "laravel".&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if [ -d "/home/your-user/.config/composer/vendor/bin" ] ; then
    PATH="/home/your-user/.config/composer/vendor/bin:$PATH"
fi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Install Git
&lt;/h2&gt;



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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Install Node &amp;amp; npm
&lt;/h2&gt;



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

&lt;/div&gt;



&lt;p&gt;Additionally, I use following desktop applications for development.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PhpStorm - for Laravel development&lt;/li&gt;
&lt;li&gt;Mysql Workbench - for working with Mysql databases&lt;/li&gt;
&lt;li&gt;Sublime - for editing simple files&lt;/li&gt;
&lt;li&gt;Postman - for API testing and development&lt;/li&gt;
&lt;li&gt;Slack - for communication with team&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I think that's all I can remember for now. If I can think of anything else, I'll come back later to update the post.&lt;/p&gt;

&lt;p&gt;Update on 9/11/2025&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add git credentials on your local computer so that you don't have to provide username and password every time you push or pull updates:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git config --global credential.helper store
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Happy coding!&lt;/p&gt;

</description>
      <category>tooling</category>
      <category>ubuntu</category>
      <category>tutorial</category>
      <category>php</category>
    </item>
    <item>
      <title>How to grant access to Firebase Cloud Messaging (v1 API)</title>
      <dc:creator>Seong Bae</dc:creator>
      <pubDate>Sat, 02 Aug 2025 03:03:44 +0000</pubDate>
      <link>https://forem.com/seongbae/how-to-grant-access-to-firebase-cloud-messaging-v1-api-58ei</link>
      <guid>https://forem.com/seongbae/how-to-grant-access-to-firebase-cloud-messaging-v1-api-58ei</guid>
      <description>&lt;p&gt;Create service account&lt;br&gt;
Go to your Google Firebase Console, open a project you want to integrate&lt;/p&gt;

&lt;p&gt;Navigate to Project Overview → Project Settings&lt;/p&gt;

&lt;p&gt;Go to Service accounts → Manage service account permissions&lt;/p&gt;

&lt;p&gt;Click onCreate service account&lt;/p&gt;

&lt;p&gt;Fill in Service account ID field, click on Create and continue&lt;/p&gt;

&lt;p&gt;Click on + ADD ROLE&lt;/p&gt;

&lt;p&gt;Find and select Firebase Cloud Messaging API Admin role, press CONTINUE&lt;/p&gt;

&lt;p&gt;Third step “Grant users access to this service account” is optional. You may press DONE&lt;/p&gt;

&lt;p&gt;Create and share service account JSON key&lt;br&gt;
Find your new service account, click on ⋮ on the right side and select Manage keys&lt;/p&gt;

&lt;p&gt;Click on ADD KEY → Create new key&lt;/p&gt;

&lt;p&gt;Choose JSON and press CREATE&lt;/p&gt;

&lt;p&gt;Copy the contents of the JSON file.&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://docs.ngrow.ai/en/articles/8886580-how-to-grant-access-to-firebase-cloud-messaging-v1-api" rel="noopener noreferrer"&gt;https://docs.ngrow.ai/en/articles/8886580-how-to-grant-access-to-firebase-cloud-messaging-v1-api&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Composer use local package</title>
      <dc:creator>Seong Bae</dc:creator>
      <pubDate>Mon, 30 Jun 2025 01:24:16 +0000</pubDate>
      <link>https://forem.com/seongbae/composer-use-local-package-3g0m</link>
      <guid>https://forem.com/seongbae/composer-use-local-package-3g0m</guid>
      <description>&lt;p&gt;When you are working on Laravel package development, I don't know about other developers but I found it easier to work off of local copy on my computer.  This allows making any changes to packages and you can see the changes instantly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"repositories": [
    {
        "type": "path",
        "url": "/full/or/relative/path/to/development/package"
    }
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;composer require "vendorname/packagename @dev"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do you develop Laravel packages?  What's your best practices?&lt;/p&gt;

</description>
      <category>php</category>
      <category>howto</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Updating Ubuntu</title>
      <dc:creator>Seong Bae</dc:creator>
      <pubDate>Sat, 28 Jun 2025 06:52:01 +0000</pubDate>
      <link>https://forem.com/seongbae/updating-ubuntu-51bg</link>
      <guid>https://forem.com/seongbae/updating-ubuntu-51bg</guid>
      <description>&lt;p&gt;Ensuring that your server is up-to-date with all the security fixes is important.  &lt;/p&gt;

&lt;p&gt;You can reference this page to learn about Ubuntu's lifecycle and release schedule: &lt;a href="https://ubuntu.com/about/release-cycle" rel="noopener noreferrer"&gt;https://ubuntu.com/about/release-cycle&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt update        # Fetches the list of available updates
sudo apt upgrade       # Installs some updates; does not remove packages
sudo apt full-upgrade  # Installs updates; may also remove some packages, if needed
sudo apt autoremove    # Removes any old packages that are no longer needed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If reboot required,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo reboot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Changing PHP versions on Ubuntu</title>
      <dc:creator>Seong Bae</dc:creator>
      <pubDate>Sun, 01 Jun 2025 23:59:37 +0000</pubDate>
      <link>https://forem.com/seongbae/changing-php-versions-on-ubuntu-34f5</link>
      <guid>https://forem.com/seongbae/changing-php-versions-on-ubuntu-34f5</guid>
      <description>&lt;p&gt;When you have multiple versions of PHP installed on your Ubuntu and you want to switch to a specific version, this magic command allows you to change:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo update-alternatives --config php
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>php</category>
      <category>ubuntu</category>
      <category>cli</category>
      <category>linux</category>
    </item>
    <item>
      <title>Coffee Review - Trader Joe's French Roast</title>
      <dc:creator>Seong Bae</dc:creator>
      <pubDate>Mon, 21 Apr 2025 18:37:15 +0000</pubDate>
      <link>https://forem.com/seongbae/coffee-review-trader-joes-french-roast-3kmb</link>
      <guid>https://forem.com/seongbae/coffee-review-trader-joes-french-roast-3kmb</guid>
      <description>&lt;p&gt;As a developer, it is important to have a good source of caffeine to stay refreshed and sometimes late at night.  I am not a big fan of energy drinks but I do enjoy having a good cup of coffee in the morning to start the day.  &lt;/p&gt;

&lt;p&gt;Today, I want to share with you this coffee I came across and it was really good.  It is French Roast from Trader Joe's.  It is dark roast  and very strong and rich in flavor.  Recently this has been my favorite coffee.  &lt;/p&gt;

&lt;p&gt;If you have not tried, it, give it a try!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F7ih0bpti45ys2wwy25fw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F7ih0bpti45ys2wwy25fw.png" alt=" " width="423" height="918"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>watercooler</category>
    </item>
    <item>
      <title>Install LAMP stack on Ubuntu</title>
      <dc:creator>Seong Bae</dc:creator>
      <pubDate>Fri, 21 Feb 2025 07:23:16 +0000</pubDate>
      <link>https://forem.com/seongbae/install-lamp-stack-on-ubuntu-15f</link>
      <guid>https://forem.com/seongbae/install-lamp-stack-on-ubuntu-15f</guid>
      <description>&lt;p&gt;This post is to save in one place all the commands used to build LAMP stack on a Ubuntu server.  I am creating this post so that I can reference this whenever I need to set up a new Ubuntu server for web development which happens quite often.&lt;/p&gt;

&lt;p&gt;First, update package manager cache:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo apt update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install Apache web server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo apt install apache2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this point, if you go to &lt;a href="http://localhost" rel="noopener noreferrer"&gt;http://localhost&lt;/a&gt;, you should be able to see the Apache2 default page.&lt;/p&gt;

&lt;p&gt;You can configure firewall for Apache but I'm usually setting up LAMP stack for local development so I'm going to skip configuring firewall.&lt;/p&gt;

&lt;p&gt;Install MySQL server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install mysql-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then configure MySQL server using the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo mysql_secure_installation 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set mysql root password using following commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo mysql
mysql&amp;gt; ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
mysql&amp;gt; exit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install PHP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install php libapache2-mod-php php-mysql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Confirm php is installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ php -v
PHP 8.3.6 (cli) (built: Dec  2 2024 12:36:18) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.6, Copyright (c) Zend Technologies
    with Zend OPcache v8.3.6, Copyright (c), by Zend Technologies
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install PHP Extensions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install php8.3-cli php8.3-{bz2,curl,mbstring,intl,xml,mysql,fpm,bcmath,zip,gd}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enable php-fpm and apache mod for php:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo a2enconf php8.3-fpm
sudo a2enmod proxy_fcgi setenvif
sudo a2enmod php8.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart apache2:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo systemctl restart apache2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If creating a new Laravel website, use the following apache config file to get started with creating a virtual site:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;VirtualHost *:80&amp;gt;
    ServerAdmin admin@example.com
    ServerName mysite.test
    DocumentRoot /home/baese/projects/mysite/public/

    &amp;lt;Directory /home/baese/projects/mysite/public/&amp;gt;
        DirectoryIndex index.php
         AllowOverride All
         Require all granted
         Order allow,deny
         Allow from all
    &amp;lt;/Directory&amp;gt;

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
  </channel>
</rss>
