# Déploiement d'une Application Node.js sur un Serveur Linux

Ce guide explique comment déployer une application Node.js sur un serveur Linux, avec Apache comme reverse proxy.

---

## Prérequis

1. **Accès SSH** au serveur Linux.
2. **Paquets nécessaires** :
   - Apache2
   - Node.js (v16 ou supérieure)
   - npm (Node Package Manager)

---

## Étapes de déploiement

### 1. **Installer Apache2, Node.js et npm**

Exécutez les commandes suivantes pour installer Apache2, Node.js, et npm :

```bash
sudo apt update
sudo apt install apache2 -y
sudo apt install nodejs npm -y
```

Vérifiez que Node.js et npm sont bien installés :

```bash
node -v
npm -v
```

---

### 2. **Installer les dépendances de l'application**

1. Naviguez dans le répertoire de votre application :
   ```bash
   cd /chemin/vers/votre/application
   ```

2. Installez les dépendances en utilisant la commande suivante :
   ```bash
   npm i --force
   ```

---

### 3. **Configurer un nom de domaine ou un sous-domaine**

Déterminez le domaine ou sous-domaine pour accéder à l'application. Par exemple :
- Nom de domaine : `sio.sentech.tech`

Configurez votre DNS pour pointer le domaine ou sous-domaine vers l'adresse IP de votre serveur.

---

### 4. **Configurer Apache comme reverse proxy**

1. Accédez au répertoire des sites disponibles :
   ```bash
   cd /etc/apache2/sites-available
   ```

2. Créez un fichier de configuration pour votre application (exemple : `000-sio.sentech.tech.conf`) :

   ```bash
   sudo nano 000-sio.sentech.tech.conf
   ```

3. Ajoutez la configuration suivante dans le fichier :

   ```apache
   <VirtualHost *:80>
       ServerName sio.sentech.tech
       ServerAlias www.sio.sentech.tech

       ProxyRequests Off
       ProxyPreserveHost On
       ProxyPass / http://localhost:3000/
       ProxyPassReverse / http://localhost:3000/

       ErrorLog ${APACHE_LOG_DIR}/sio-error.log
       CustomLog ${APACHE_LOG_DIR}/sio-access.log combined
   </VirtualHost>
   ```

4. Activez la configuration :
   ```bash
   sudo a2ensite 000-sio.sentech.tech.conf
   ```

5. Rechargez Apache pour appliquer les modifications :
   ```bash
   sudo systemctl reload apache2
   ```

---

### 5. **Transformer l'application en service `systemd`**

1. Créez un fichier de service `systemd` pour votre application :

   ```bash
   sudo nano /etc/systemd/system/sio-app.service
   ```

2. Ajoutez le contenu suivant dans le fichier :

   ```ini
   [Unit]
   Description=Application Node.js pour sio.sentech.tech
   After=network.target

   [Service]
   ExecStart=/usr/bin/node /chemin/vers/votre/application/app.js
   Restart=always
   User=www-data
   Group=www-data
   Environment=NODE_ENV=production
   WorkingDirectory=/chemin/vers/votre/application

   [Install]
   WantedBy=multi-user.target
   ```

3. Rechargez les services pour prendre en compte cette configuration :
   ```bash
   sudo systemctl daemon-reload
   ```

4. Démarrez le service :
   ```bash
   sudo systemctl start sio-app.service
   ```

5. Vérifiez l’état du service :
   ```bash
   sudo systemctl status sio-app.service
   ```

6. Activez le service pour qu'il démarre automatiquement au démarrage du serveur :
   ```bash
   sudo systemctl enable sio-app.service
   ```

---

## Documentation supplémentaire

Des exemples de fichiers de configuration sont disponibles dans le dossier `docs` :
- `docs/000-sio.sentech.tech.conf` : Exemple de configuration Apache.
- `docs/sio-app.service` : Exemple de fichier de service `systemd`.

---

### Journaux et Débogage

- **Journaux de l'application** :
  ```bash
  sudo journalctl -u sio-app.service -f
  ```

- **Journaux Apache** :
  ```bash
  tail -f /var/log/apache2/sio-error.log
  ```

---

Votre application est maintenant accessible via le domaine ou sous-domaine configuré. 🎉