# Ubuntu System Setup Guide

This guide will help you set up a basic development environment on Ubuntu with the following tools:
- Update and upgrade the system
- Install **nvm** (Node Version Manager)
- Install **Node.js 20**
- Install **Git**
- Install **NGINX**
- Install **mysql-server**
- Install **phpmyadmin**
- Install **php** latest version with php-fpm

## Prerequisites
- Ubuntu (any version)
- A terminal or SSH access to the system

---

## 1. Update and Upgrade the System

Start by updating and upgrading your Ubuntu packages to make sure you have the latest versions and security patches.

```bash
sudo apt update && sudo apt upgrade -y
```

This will:
Update the local package index (apt update)
Upgrade all the installed packages to the latest version (apt upgrade)

## 2. Install NVM (Node Version Manager)
Next, we'll install nvm (Node Version Manager) to manage multiple versions of Node.js.

Install NVM
```bash
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash

```

Once the installation is complete, you’ll need to restart your terminal or source your profile:
```bash
source ~/.bashrc   # Or use ~/.zshrc or ~/.profile based on your shell
```

Verify the Installation
You can verify that nvm is installed successfully by running:

```bash
command -v nvm
```

If the installation was successful, it should return nvm.

## 3. Install Node.js Version 20
Now that nvm is installed, you can use it to install Node.js version 20:

```bash
nvm install 20
```


### Set Node.js 20 as Default Version
To set Node.js version 20 as the default version for your terminal sessions, run:

```bash
nvm use 20
nvm alias default 20
```

You can verify the installed version of Node.js by running:

```bash
node -v
```

## 4. Install Git
Git is essential for version control. To install Git, run the following:

```
sudo apt install git -y
```

### Verify the Installation
To check if Git is installed correctly, run:

```bash
git --version
```

5. Install NGINX
Finally, install NGINX, a popular web server.

Install NGINX
```
sudo apt install nginx -y
sudo systemctl start nginx
sudo systemctl enable nginx
```


## 5.Install MySQL Server
```bash
sudo apt install mysql-server -y
```
Secure the MySQL installation:
```bash
sudo mysql_secure_installation
```
Follow the prompts to set a root password and secure the database.

---



## 6. Install PHP 8.3 or Latest Version
Add the repository and install PHP:
```bash
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
sudo apt install php8.3 php8.3-fpm php8.3-cli php8.3-mysql php8.3-curl php8.3-xml php8.3-mbstring php8.3-zip php8.3-bcmath php8.3-gd php8.3-intl php8.3-readline -y
```
Restart PHP-FPM:
```bash
sudo systemctl restart php8.3-fpm
```

---

## 7. Install phpMyAdmin
```bash
sudo apt install phpmyadmin -y
```
During the installation, select **NGINX** and configure the database for phpMyAdmin.

Create a symbolic link for phpMyAdmin in the NGINX web directory:
```bash
sudo ln -s /usr/share/phpmyadmin /var/www/html/phpmyadmin
```
Restart NGINX:
```bash
sudo systemctl restart nginx
```

---

## 8. Create a User for phpMyAdmin and Grant Privileges
Log in to MySQL:
```bash
sudo mysql -u root -p
```
Create a new user:
```sql
CREATE USER 'phpmyadmin_user'@'localhost' IDENTIFIED BY 'secure_password';
```
Grant privileges:
```sql
GRANT ALL PRIVILEGES ON *.* TO 'phpmyadmin_user'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EXIT;
```

---

## 9. Configure Firewall (UFW)
Allow necessary ports:
```bash
sudo ufw allow 22/tcp  # SSH
sudo ufw allow 80/tcp  # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw enable
```

---

## 10. Install and Configure Code Server
### **Step 1: Install Code Server**
```bash
curl -fsSL https://code-server.dev/install.sh | sh
```
### **Step 2: Configure Code Server for the Current User**
```bash
mkdir -p ~/.config/code-server
nano ~/.config/code-server/config.yaml
```
Add the following configuration:
```yaml
bind-addr: 127.0.0.1:8080
auth: password
password: "your_secure_password"
cert: false
```
Save and exit (`CTRL+X`, `Y`, `ENTER`).

Start Code Server:
```bash
code-server
```

To run it as a service:
```bash
sudo systemctl enable --now code-server@$USER
```

---

## 11. Install Certbot and Secure Domain with Let's Encrypt
```bash
sudo apt install certbot python3-certbot-nginx -y
```
Obtain an SSL certificate:
```bash
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
```
Verify auto-renewal:
```bash
sudo certbot renew --dry-run
```

---