[TOC] # pynecone Self-Hosting example ## The demo of my working case In my case, my frontend code is running on https://pynecone-frontend.covidicq.net/ And backend code is running on https://pynecone-backend.covidicq.net/ It's work for my snake game example. The source code of snakegame is on https://github.com/pynecone-io/pynecone-examples/tree/main/snakegame And welcome to play and give me feedback and I can improve it more:) https://youtu.be/q2ydu3Wl-T0 <-- [Video]Work for App, pc browser and mobile browser, https://youtu.be/ZxBTrUvR3jo <-- [Video]Play on native modible app https://files.covidicq.net/python/snakegame.apk <- Download android apk **How do I make my snake game on self-hosting ?** I will guide you how to setting that in the following tutorial. ## pcconfig.py ``` import pynecone as pc my_deploy_config = pc.Config( app_name="myapp", port=3711, backend_port=8701, api_url="https://xxxxx-backend.mydomain.net", bun_path="$HOME/.bun/bin/bun", db_url="sqlite:///pynecone.db", env=pc.Env.PROD, ) config = my_deploy_config ``` ### Explanation of pcconfig.py The both frontend code and backend code refers to this same configuration. This config is says these three things frontend will service in http://localhost:3711 backend will service in http://localhost:8701 In the frontend's source code, it will communicate with the backend on https://xxxxx-backend.mydomain.net ### The plan for nginx setting. ``` After we have this config, we need to add nginx setting that can match to this config. ``` In my strategy, I assign one domain for the frontend and another domain for the backend. So when I setup my nginx setting, my plan is (1)mapping https://xxxxx-backend.mydomain.net -> http://localhost:8701 (2)mapping https://xxxxx-frontend.mydomain.net -> http://localhost:3711 After these two things are finished, everything can run well . The following is my detail setting related to nginx ## Nginx Settings ### /etc/nginx/nginx.conf ``` ... include /somepath/my-nginx-sites-enabled/* ... ``` ### /somepath/my-nginx-sites-enabled/xxxxx-backend.mydomain.net ``` server{ server_name xxxxx-backend.mydomain.net; location / { proxy_pass http://localhost:8701; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_redirect off; } listen 443 ssl; # managed by Certbot ssl_certificate /xxx/xxx/fullchain.pem; # managed by Certbot ssl_certificate_key /xxx/xxx/privkey.pem; # managed by Certbot } ``` ### /somepath/my-nginx-sites-enabled/xxxxx-frontend.mydomain.net ``` server{ server_name xxxxx-frontend.mydomain.net; location / { proxy_pass http://localhost:3711; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_redirect off; } listen 443 ssl; # managed by Certbot ssl_certificate /xxx/xxx/fullchain.pem; # managed by Certbot ssl_certificate_key /xxx/xxx/privkey.pem; # managed by Certbot } ``` The above two setting of nginx is the same. What they do is support secure websocket and secure http. In my case, I use AWS router-53 for DNS. So the domain can mapping to the IP address that running my code.