# Customer Portal - Portainer Deployment ## Quick Setup ### 1. Load Docker Images Upload your images to the server and load them: ```bash docker load < portal-frontend-latest.tar docker load < portal-backend-latest.tar ``` Verify they're loaded: ```bash docker images | grep portal ``` ### 2. Create Stack in Portainer 1. Go to Portainer → Stacks → Add Stack 2. Name: `customer-portal` 3. Paste contents of `docker-compose.yml` 4. Scroll down to **Environment Variables** 5. Copy variables from `env.example` and fill in your production values ### 3. Generate Secrets Generate secure random values for: ```bash # JWT Secret openssl rand -base64 32 # CSRF Secret openssl rand -base64 32 # PostgreSQL Password openssl rand -base64 24 | tr -d '/+=' | cut -c1-32 ``` Encode your Salesforce private key: ```bash base64 -w 0 < sf-private.key ``` ### 4. Deploy Click **Deploy the stack** in Portainer. --- ## How It Works This setup uses `network_mode: bridge` with Docker `links` to avoid the iptables/IPv6 issues that can occur on some servers. ### Key Points - **No custom networks** - Uses Docker's default bridge network - **Service discovery via links** - Services reference each other by container name - **Localhost binding** - Ports are bound to `127.0.0.1` for security (use Nginx/Plesk to proxy) - **All config via Portainer** - No external env files needed ### Service URLs (internal) | Service | Internal URL | | -------- | -------------------------- | | Backend | http://backend:4000 | | Database | postgresql://database:5432 | | Redis | redis://cache:6379 | ### Nginx/Plesk Proxy Configure your domain to proxy to: - Frontend: `http://127.0.0.1:3000` - Backend API: `http://127.0.0.1:4000` --- ## Updating the Stack 1. Load new images: ```bash docker load < portal-frontend-latest.tar docker load < portal-backend-latest.tar ``` 2. In Portainer: Stacks → customer-portal → **Update the stack** 3. Check **Re-pull image** and click **Update** --- ## Troubleshooting ### View Logs ```bash docker logs portal-frontend docker logs portal-backend docker logs portal-database docker logs portal-cache ``` ### Check Container Health ```bash docker ps ``` ### Access Database ```bash docker exec -it portal-database psql -U portal -d portal_prod ``` ### Test Service Connectivity ```bash # From backend container docker exec -it portal-backend sh -c "nc -zv database 5432" docker exec -it portal-backend sh -c "nc -zv cache 6379" ```