From f46b82f64a6f00f0e0a31091e9c65aed473c1056 Mon Sep 17 00:00:00 2001 From: Robert Douglass Date: Mon, 29 Jul 2024 13:00:10 +0200 Subject: [PATCH] new article on developing locally --- .gitignore | 1 + ...p-locally-django-postgresql-redis-upsun.md | 147 ++++++++++++++++++ .../01_file_upload.png | Bin 0 -> 32899 bytes 3 files changed, 148 insertions(+) create mode 100644 hugosite/content/posts/develop-locally-django-postgresql-redis-upsun.md create mode 100644 hugosite/content/posts/develop-locally-django-postgresql-redis-upsun/01_file_upload.png diff --git a/.gitignore b/.gitignore index ca7cbe4..848da5d 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ hugosite/public/* */myenv */.hugo_build.lock hugosite/content/posts/.DS_Store +hugosite/content/posts/.DS_Store/* diff --git a/hugosite/content/posts/develop-locally-django-postgresql-redis-upsun.md b/hugosite/content/posts/develop-locally-django-postgresql-redis-upsun.md new file mode 100644 index 0000000..4122886 --- /dev/null +++ b/hugosite/content/posts/develop-locally-django-postgresql-redis-upsun.md @@ -0,0 +1,147 @@ ++++ +title = 'Develop Django Locally - PostgreSQL and Redis on Upsun' +date = 2024-07-29T16:58:24+02:00 +draft = false ++++ + +This post shows how to develop Django locally using the PostgreSQL and Redis servers in the cloud, [on Upsun](https://upsun.com). + +There are several reasons why a developer would want to develop without installing a copy of the services on their local computer: + +1. Time and effort: why install services you don't need if they're available elsewhere? +2. Data: If you're working on a production site, there's likely production data that influences how the app works. Synchronizing this data to your local machine can be burdensome. +3. Context switching: If you work on mutiple projects, switching between them can be cumbersome. + +Connecting your local Django installation to the databases in the cloud solves these. Doing it on Upsun brings further advantages, though. + +1. Instant cloning of production data into development environments. +2. Connect to databases of your choice with 2 local commands. +3. Share databases with other devs working on the same branch. + +To start, deploy the File Uploader example app onto Upsun. + +```bash +git clone git@github.com:robertDouglass/on_upsun.git +cd on_upsun/03_django_redis_celery +upsun project:create +# name your project and choose a region, and set the remote to the repository +git init +git add . +git commit -m "File Uploader" +upsun push +``` + +At this point you have a running Django app on Upsun, and you have the code for that app locally. Let's test it and get some data into it. + +```bash +upsun url +``` +Pick any of the URLs and you should end up on this very simple screen where you can upload a file or two. + +![File Uploader](/posts/develop-locally-django-postgresql-redis-upsun/01_file_upload.png) + +Upload a file or two so that you have data in the database. Then you can test that data: + +```bash +upsun sql "select * from uploads_uploadedfile;" +``` + +## Make a development branch + +Now pretend that the version of the app that you interacted with, on the `main` branch, is your production environment. You don't want to work directly on that, so let's make a development environment. + +```bash + upsun environment:branch dev + ``` + +You now have two copies of your app on Upsun, and they have exactly the same code and a copy of the same data. You're ready to develop. Make sure your local git repo is also on the new dev branch: + +```bash +git pull upsun dev +git checkout dev +``` +{{% notice info %}} +You will need to create a python virtual environment and `pip install -r requirements.txt` to actually run the application locally. +{{% /notice %}} + +### Tunnels to the Upsun Services + +Open tunnels to the Upsun services: + +```bash +upsun tunnel:open +SSH tunnel opened to postgresql at: pgsql://main:main@127.0.0.1:30000/main +SSH tunnel opened to redis at: redis://127.0.0.1:30001 + +Logs are written to: /Users/robert/.upsun-cli/tunnels.log + +List tunnels with: upsun tunnels +View tunnel details with: upsun tunnel:info +Close tunnels with: upsun tunnel:close + +Save encoded tunnel details to the PLATFORM_RELATIONSHIPS variable using: + export PLATFORM_RELATIONSHIPS="$(upsun tunnel:info --encode)" +``` + +The `upsun tunnel:open` creates local endpoints to the PostgreSQL and Redis servers. You can inspect them with: + +```bash +upsun tunnel:info +``` + +And you can use those credentials in your local development by exporting them: +```bash +export PLATFORM_RELATIONSHIPS="$(upsun tunnel:info --encode)" +``` +Due to the way the `settings_psh.py` is written in this demo app, we also need to set an application name: +```bash +export PLATFORM_APPLICATION_NAME="uploader" +``` + +Now you're ready to run Django locally using the PostgreSQL and Redis servers in the cloud: + +```bash +python manage.py runserver +``` + +## Make a change and merge into Production + +To complete this example, let's make a change to our app. I made a change to my template: + +```diff +diff --git a/uploads/templates/uploads/upload.html b/uploads/templates/uploads/upload.html +index ed97d3a..7625353 100644 +--- a/uploads/templates/uploads/upload.html ++++ b/uploads/templates/uploads/upload.html + + +-

File Upload

++

Awesome File Upload

+
+ ``` + + Then we can: + ```bash + git add . + git commit -m "improve the heading" + upsun push + ``` + + Once you've tested the change on the `dev` branch, you can safely merge it into production. + + ```bash +upsun merge +Are you sure you want to merge dev into its parent, main? [Y/n] +``` + +That's it! You've now developed a Django app locally while using the databases provided by Upsun on an environment specifically for development. After making the changes, you merged them into production. + +Thanks for reading the tutorial! If you have any questions, my email address is rob@robshouse.net and you can [find me on LinkedIn](https://www.linkedin.com/in/roberttdouglass/). There is also an [Upsun Discord forum](https://discord.gg/PkMc2pVCDV) where I hang out, and you're welcome to find me there. + + + + + + + + diff --git a/hugosite/content/posts/develop-locally-django-postgresql-redis-upsun/01_file_upload.png b/hugosite/content/posts/develop-locally-django-postgresql-redis-upsun/01_file_upload.png new file mode 100644 index 0000000000000000000000000000000000000000..c6841340762b38a9c8bf9a26a2195a38850948aa GIT binary patch literal 32899 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 z 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 literal 0 HcmV?d00001