├── .do └── deploy.template.yaml ├── Dockerfile ├── README.md ├── app.json ├── nginx.conf └── render.yaml /.do/deploy.template.yaml: -------------------------------------------------------------------------------- 1 | spec: 2 | name: mixpanel-api-proxy 3 | services: 4 | - name: mixpanel-api-proxy 5 | git: 6 | branch: master 7 | repo_clone_url: https://github.com/mixpanel/tracking-proxy.git 8 | dockerfile_path: ./Dockerfile 9 | http_port: 80 10 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM nginx 2 | COPY nginx.conf /etc/nginx/nginx.conf 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Nginx Proxy for Mixpanel 2 | An example nginx config that serves as a proxy to Mixpanel's Ingestion API and JavaScript library endpoints. To learn more, visit our [docs on Tracking via Proxy](https://docs.mixpanel.com/docs/tracking/how-tos/tracking-via-proxy). 3 | 4 | 5 | ## Installation 6 | 7 | There are a few ways you can use this repo to deploy a server that can be use to proxy Mixpanel API requests: 8 | 9 | 1. **one-click deploy** to your cloud provider 10 | 2. **build a docker image** and run it on your own servers 11 | 3. **copy and paste** the nginx settings to your existing nginx config file 12 | 13 | ### Option 1: One-Click Deploy 14 | click on a button below to deploy to your favorite cloud provider: 15 | 16 | [![Google Cloud Btn]][Google Cloud Deploy] 17 | [][Digital Ocean Deploy] 18 | [![Railway Btn]][Railway Deploy] 19 | [![Render Btn]][Render Deploy] 20 | 21 | 22 | 23 | [Google Cloud Btn]: https://binbashbanana.github.io/deploy-buttons/buttons/remade/googlecloud.svg 24 | [Google Cloud Deploy]: https://deploy.cloud.run 25 | 26 | [Digital Ocean Btn]: https://www.deploytodo.com/do-btn-blue.svg 27 | [Digital Ocean Deploy]: https://cloud.digitalocean.com/apps/new?repo=https://github.com/mixpanel/tracking-proxy/tree/master 28 | 29 | [Railway Btn]: https://binbashbanana.github.io/deploy-buttons/buttons/remade/railway.svg 30 | [Railway Deploy]: https://railway.app/template/_RaWSW 31 | 32 | [Render Btn]: https://binbashbanana.github.io/deploy-buttons/buttons/remade/render.svg 33 | [Render Deploy]: https://render.com/deploy?repo=https://github.com/mixpanel/tracking-proxy 34 | 35 | 36 | 37 | 38 | 39 | [Heroku Btn]: https://binbashbanana.github.io/deploy-buttons/buttons/remade/heroku.svg 40 | [Heroku Deploy]: https://heroku.com/deploy/?template=https://github.com/mixpanel/tracking-proxy 41 | 42 | 43 | [Azure Btn]: https://binbashbanana.github.io/deploy-buttons/buttons/remade/azure.svg 44 | [Azure Deploy]: https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FYOUR_GITHUB_USERNAME%2FYOUR_REPO_NAME%2FYOUR_BRANCH_NAME%2Fpath%2Fto%2Fazuredeploy.json 45 | 46 | 47 | 48 | 49 | ### Option 2: Docker Image 50 | Assuming you have Docker installed on your system, you can do the following: 51 | 52 | 1. Clone the repo 53 | `git clone https://github.com/mixpanel/tracking-proxy` 54 | 2. Build the Docker image: 55 | `docker build -t mixpanel-proxy .` 56 | 3. Run a container using the image: 57 | `docker run --name my-tracking-proxy -d -p 8080:80 mixpanel-proxy` 58 | 4. Visit 59 | `http://localhost:8080` 60 | 61 | You should see: 62 | 63 | ```json 64 | { 65 | "error": "Welcome. Get started with our API by visiting https://developer.mixpanel.com/" 66 | } 67 | ``` 68 | This is same response you would get from visiting https://api.mixpanel.com/ (which means your proxy is working as expected). 69 | 70 | You can also verify the nginx config on the command line: 71 | 72 | ```bash 73 | nginx -t -c /etc/nginx/nginx.conf 74 | ``` 75 | 76 | For production, you would deploy this docker image to whatever servers you run your production services on. 77 | 78 | ### Option 3: Add locations to your existing Nginx config 79 | If you already have servers running nginx, you can copy and paste the locations from the [nginx.conf](https://github.com/mixpanel/tracking-proxy/blob/master/nginx.conf) file in this repo and adjust the locations to match your preference. 80 | 81 | ### Additional Configuration 82 | In case you see events tracked to your project, but geo-location properties are not being added correctly, there's likely a configuration issue with passing the IP address through the headers. Within the [nginx configuration]([url](https://github.com/mixpanel/tracking-proxy/blob/2c08e999d4b38aa943fad55884bcfe0ef72bb681/nginx.conf#L31)), by default, we leverage `$http_x_forwarded_for` and pass it through the `X-Real-IP` header to forward the IP from the original client; in some providers, this is not available and you will want to review which header/variable provides the IP address from the client. As an example, in Cloudflare, you need to pass `$realip_remote_addr` instead. You'll want to review the option that applies to your cloud provider. 83 | 84 | When you're seeing events ingested into Mixpanel, but no geo-location data included as properties (you don't see the mp_country_code property created, for example), one more aspect to check is if the query string param/value `ip=1` is being passed to our ingestion endpoint. Our client-side libraries, by default (unless you've disabled geo-location tracking), will append `ip=1` to the URL of the ingestion endpoint to indicate we should parse geo-location from the IP address of the incoming request. In some setups, this param might not be included in the request from the proxy, so it's also an aspect to check in this situation. 85 | 86 | ### EU Residency 87 | This proxy server resolves requests to `api.mixpanel.com`, which points to Mixpanel's primary data centers in the United States. If you are using Mixpanel's **[EU Data Residency](https://docs.mixpanel.com/docs/other-bits/privacy-and-security/eu-residency)**, you will need to change the [nginx.config](https://github.com/mixpanel/tracking-proxy/blob/master/nginx.conf#L34) from `api.mixpanel.com` to `api-eu.mixpanel.com` 88 | 89 | ### IN Residency 90 | This proxy server resolves requests to `api.mixpanel.com`, which points to Mixpanel's primary data centers in the United States. If you are using Mixpanel's **[IN Data Residency](https://docs.mixpanel.com/docs/privacy/in-residency)**, you will need to change the [nginx.config](https://github.com/mixpanel/tracking-proxy/blob/master/nginx.conf#L34) from `api.mixpanel.com` to `api-in.mixpanel.com` 91 | 92 | ### Load Testing 93 | 94 | If you wish to load test your proxy, see **[mp-proxy-load-test](https://github.com/ak--47/mp-proxy-load-test/)** for a load testing script with artillery. 95 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mixpanel-tracking-proxy", 3 | "options": { 4 | "allow-unauthenticated": true, 5 | "memory": "512Mi", 6 | "cpu": "1", 7 | "port": 80, 8 | "concurrency": 80 9 | } 10 | } -------------------------------------------------------------------------------- /nginx.conf: -------------------------------------------------------------------------------- 1 | events {} 2 | http { 3 | server { 4 | listen 80 default backlog=16384; 5 | listen [::]:80 default backlog=16384; 6 | 7 | location /lib.min.js { 8 | proxy_set_header X-Real-IP $http_x_forwarded_for; 9 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 10 | proxy_set_header X-Forwarded-Host $server_name; 11 | proxy_pass https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js; 12 | } 13 | 14 | location /lib.js { 15 | proxy_set_header X-Real-IP $http_x_forwarded_for; 16 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 17 | proxy_set_header X-Forwarded-Host $server_name; 18 | proxy_pass https://cdn.mxpnl.com/libs/mixpanel-2-latest.js; 19 | } 20 | 21 | location /decide { 22 | proxy_set_header Host decide.mixpanel.com; 23 | proxy_set_header X-Real-IP $http_x_forwarded_for; 24 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 25 | proxy_set_header X-Forwarded-Host $server_name; 26 | proxy_pass https://decide.mixpanel.com/decide; 27 | } 28 | 29 | location / { 30 | proxy_set_header Host api.mixpanel.com; 31 | proxy_set_header X-Real-IP $http_x_forwarded_for; 32 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 33 | proxy_set_header X-Forwarded-Host $server_name; 34 | proxy_pass https://api.mixpanel.com/; 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /render.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | - type: web 3 | name: nginx-proxy 4 | env: docker 5 | plan: starter 6 | dockerfilePath: './Dockerfile' 7 | envVars: 8 | - key: PORT 9 | value: '80' 10 | --------------------------------------------------------------------------------