diff --git a/.forgejo/workflows/deploy-beta.yaml b/.forgejo/workflows/deploy-beta.yaml index b5b31604..5b2d22e3 100644 --- a/.forgejo/workflows/deploy-beta.yaml +++ b/.forgejo/workflows/deploy-beta.yaml @@ -40,9 +40,16 @@ jobs: } EOF - - name: Package Application + - name: Package Applications run: | - tar -czf app.tar.gz -C backend --exclude=tmp --exclude=__pycache__ --exclude=.pytest_cache . + tar -czf app.tar.gz -C backend --exclude=tmp --exclude=__pycache__ --exclude=.pytest_cache . + corepack enable + corepack prepare pnpm@12.15.0 --activate + cd frontend + pnpm install --frozen-lockfile + pnpm build + tar -czf ../frontend.tar.gz build package.json pnpm-lock.yaml pnpm-workspace.yaml .npmrc + cd .. - name: Deploy to Beta EC2 run: | @@ -51,8 +58,8 @@ jobs: echo "${{ secrets.BETA_EC2_SSH_KEY }}" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa - # Copy app archive and configuration files - scp -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa app.tar.gz tmp/amazon-cloudwatch-agent.json crm-backend.service crmbackend.nginx.conf configure_nginx_proxy.py ${{ secrets.BETA_EC2_USERNAME }}@${{ secrets.BETA_EC2_HOST }}:/tmp/ + # Copy app archives and configuration files + scp -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa app.tar.gz frontend.tar.gz tmp/amazon-cloudwatch-agent.json crm-backend.service crm-frontend.service crmbackend.nginx.conf crmfrontend.nginx.conf configure_nginx_proxy.py ${{ secrets.BETA_EC2_USERNAME }}@${{ secrets.BETA_EC2_HOST }}:/tmp/ # Execute deployment commands on remote server ssh -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa ${{ secrets.BETA_EC2_USERNAME }}@${{ secrets.BETA_EC2_HOST }} << 'EOF' @@ -61,8 +68,9 @@ jobs: # ── 2. Install Host Dependencies ────────────────────────────── sudo apt-get update sudo apt-get install -y python3-pip python3-venv python3-dev default-libmysqlclient-dev pkg-config libpq-dev build-essential libcairo2 libpango-1.0-0 libpangocairo-1.0-0 libgdk-pixbuf2.0-0 shared-mime-info + sudo corepack enable - # ── 3. Extract codebase to target directory ─────────────────── + # ── 3. Extract backend codebase ─────────────────────────────── sudo mkdir -p /home/ubuntu/crmbackend sudo chown -R ubuntu:ubuntu /home/ubuntu/crmbackend tar -xzf /tmp/app.tar.gz -C /home/ubuntu/crmbackend @@ -100,21 +108,35 @@ jobs: # ── 6. Run Database Migrations ───────────────────────────────── ./venv/bin/python manage.py migrate --noinput - # ── 7. Configure and restart Systemd service ─────────────────── + # ── 7. Configure and restart Backend Systemd service ─────────── sudo mv /tmp/crm-backend.service /etc/systemd/system/crm-backend.service sudo systemctl daemon-reload sudo systemctl enable crm-backend sudo systemctl restart crm-backend - # ── 8. Configure CloudWatch Agent ────────────────────────────── + # ── 8. Extract & Deploy Frontend ─────────────────────────────── + sudo mkdir -p /home/ubuntu/crmfrontend + sudo chown -R ubuntu:ubuntu /home/ubuntu/crmfrontend + tar -xzf /tmp/frontend.tar.gz -C /home/ubuntu/crmfrontend/ + cd /home/ubuntu/crmfrontend + pnpm install --prod --frozen-lockfile --ignore-scripts + sudo mv /tmp/crm-frontend.service /etc/systemd/system/crm-frontend.service + sudo mv /tmp/crmfrontend.nginx.conf /etc/nginx/sites-available/crmfrontend + sudo ln -sf /etc/nginx/sites-available/crmfrontend /etc/nginx/sites-enabled/crmfrontend + sudo systemctl daemon-reload + sudo systemctl enable crm-frontend + sudo systemctl restart crm-frontend + + # ── 9. Configure CloudWatch Agent ────────────────────────────── sudo mv /tmp/amazon-cloudwatch-agent.json /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \ -a fetch-config -m ec2 -s \ -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json - # ── 9. Configure Nginx Proxy for /crm ────────────────────────── + # ── 10. Configure Nginx Proxy & Reload ───────────────────────── python3 /tmp/configure_nginx_proxy.py + sudo nginx -t && sudo systemctl reload nginx - # ── 10. Cleanup tmp files ─────────────────────────────────────── - rm -f /tmp/app.tar.gz /tmp/configure_nginx_proxy.py + # ── 11. Cleanup tmp files ────────────────────────────────────── + rm -f /tmp/app.tar.gz /tmp/frontend.tar.gz /tmp/configure_nginx_proxy.py EOF diff --git a/.forgejo/workflows/deploy-production.yaml b/.forgejo/workflows/deploy-production.yaml index 64d4c8b2..e6f6d8b1 100644 --- a/.forgejo/workflows/deploy-production.yaml +++ b/.forgejo/workflows/deploy-production.yaml @@ -40,9 +40,16 @@ jobs: } EOF - - name: Package Application + - name: Package Applications run: | - tar -czf app.tar.gz -C backend --exclude=tmp --exclude=__pycache__ --exclude=.pytest_cache . + tar -czf app.tar.gz -C backend --exclude=tmp --exclude=__pycache__ --exclude=.pytest_cache . + corepack enable + corepack prepare pnpm@12.15.0 --activate + cd frontend + pnpm install --frozen-lockfile + pnpm build + tar -czf ../frontend.tar.gz build package.json pnpm-lock.yaml pnpm-workspace.yaml .npmrc + cd .. - name: Deploy to Production EC2 run: | @@ -51,8 +58,8 @@ jobs: echo "${{ secrets.PROD_EC2_SSH_KEY || secrets.BETA_EC2_SSH_KEY }}" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa - # Copy app archive and configuration files - scp -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa app.tar.gz tmp/amazon-cloudwatch-agent.json crm-backend.service crmbackend.nginx.conf configure_nginx_proxy.py ${{ secrets.PROD_EC2_USERNAME || secrets.BETA_EC2_USERNAME }}@${{ secrets.PROD_EC2_HOST || secrets.BETA_EC2_HOST }}:/tmp/ + # Copy app archives and configuration files + scp -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa app.tar.gz frontend.tar.gz tmp/amazon-cloudwatch-agent.json crm-backend.service crm-frontend.service crmbackend.nginx.conf crmfrontend.nginx.conf configure_nginx_proxy.py ${{ secrets.PROD_EC2_USERNAME || secrets.BETA_EC2_USERNAME }}@${{ secrets.PROD_EC2_HOST || secrets.BETA_EC2_HOST }}:/tmp/ # Execute deployment commands on remote server ssh -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa ${{ secrets.PROD_EC2_USERNAME || secrets.BETA_EC2_USERNAME }}@${{ secrets.PROD_EC2_HOST || secrets.BETA_EC2_HOST }} << 'EOF' @@ -61,8 +68,9 @@ jobs: # ── 2. Install Host Dependencies ────────────────────────────── sudo apt-get update sudo apt-get install -y python3-pip python3-venv python3-dev default-libmysqlclient-dev pkg-config libpq-dev build-essential libcairo2 libpango-1.0-0 libpangocairo-1.0-0 libgdk-pixbuf2.0-0 shared-mime-info + sudo corepack enable - # ── 3. Extract codebase to target directory ─────────────────── + # ── 3. Extract backend codebase ─────────────────────────────── sudo mkdir -p /home/ubuntu/crmbackend sudo chown -R ubuntu:ubuntu /home/ubuntu/crmbackend tar -xzf /tmp/app.tar.gz -C /home/ubuntu/crmbackend @@ -76,7 +84,7 @@ jobs: # ── 5. Configure environment variables ───────────────────────── echo "DEBUG=0" > .env - echo "CRM_DB_NAME=crmprofile_prod" >> .env + echo "CRM_DB_NAME=tradhoxcrm" >> .env echo "CRM_DB_USER=vignesh" >> .env echo "CRM_DB_PASSWORD=vignesh_secret_pass_2026" >> .env echo "CRM_DB_HOST=16.113.106.152" >> .env @@ -100,21 +108,35 @@ jobs: # ── 6. Run Database Migrations ───────────────────────────────── ./venv/bin/python manage.py migrate --noinput - # ── 7. Configure and restart Systemd service ─────────────────── + # ── 7. Configure and restart Backend Systemd service ─────────── sudo mv /tmp/crm-backend.service /etc/systemd/system/crm-backend.service sudo systemctl daemon-reload sudo systemctl enable crm-backend sudo systemctl restart crm-backend - # ── 8. Configure CloudWatch Agent ────────────────────────────── + # ── 8. Extract & Deploy Frontend ─────────────────────────────── + sudo mkdir -p /home/ubuntu/crmfrontend + sudo chown -R ubuntu:ubuntu /home/ubuntu/crmfrontend + tar -xzf /tmp/frontend.tar.gz -C /home/ubuntu/crmfrontend/ + cd /home/ubuntu/crmfrontend + pnpm install --prod --frozen-lockfile --ignore-scripts + sudo mv /tmp/crm-frontend.service /etc/systemd/system/crm-frontend.service + sudo mv /tmp/crmfrontend.nginx.conf /etc/nginx/sites-available/crmfrontend + sudo ln -sf /etc/nginx/sites-available/crmfrontend /etc/nginx/sites-enabled/crmfrontend + sudo systemctl daemon-reload + sudo systemctl enable crm-frontend + sudo systemctl restart crm-frontend + + # ── 9. Configure CloudWatch Agent ────────────────────────────── sudo mv /tmp/amazon-cloudwatch-agent.json /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \ -a fetch-config -m ec2 -s \ -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json - # ── 9. Configure Nginx Proxy for /crm ────────────────────────── + # ── 10. Configure Nginx Proxy & Reload ───────────────────────── python3 /tmp/configure_nginx_proxy.py + sudo nginx -t && sudo systemctl reload nginx - # ── 10. Cleanup tmp files ─────────────────────────────────────── - rm -f /tmp/app.tar.gz /tmp/configure_nginx_proxy.py + # ── 11. Cleanup tmp files ────────────────────────────────────── + rm -f /tmp/app.tar.gz /tmp/frontend.tar.gz /tmp/configure_nginx_proxy.py EOF diff --git a/crm-frontend.service b/crm-frontend.service new file mode 100644 index 00000000..0dc5fc03 --- /dev/null +++ b/crm-frontend.service @@ -0,0 +1,20 @@ +[Unit] +Description=BottleCRM SvelteKit Frontend Service +After=network.target + +[Service] +Type=simple +User=ubuntu +WorkingDirectory=/home/ubuntu/crmfrontend +Environment=NODE_ENV=production +Environment=PORT=3000 +Environment=HOST=127.0.0.1 +Environment=PUBLIC_DJANGO_API_URL=https://betaapicsa.tradhox.com +Environment=ADDRESS_HEADER=X-Forwarded-For +Environment=XFF_DEPTH=1 +ExecStart=/usr/bin/node build/index.js +Restart=always +RestartSec=5 + +[Install] +WantedBy=multi-user.target diff --git a/crmfrontend.nginx.conf b/crmfrontend.nginx.conf new file mode 100644 index 00000000..33b480ce --- /dev/null +++ b/crmfrontend.nginx.conf @@ -0,0 +1,18 @@ +server { + listen 80; + server_name betacsa.tradhox.com csa.tradhox.com; + + client_max_body_size 20M; + + location / { + proxy_pass http://127.0.0.1:3000; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto https; + proxy_cache_bypass $http_upgrade; + } +}