Ephes Blog

Miscellaneous things. Mostly Weeknotes and links I stumbled upon.


TIL Deploying Takahē

, Jochen

Setting up Takahē for Local Development

Clone the repository from GitHub:

git clone git@github.com:jointakahe/takahe.git && cd takahe

Create the Postgres database, and add it to ProcfileDev:

mkdir databases && pg_ctl initdb -D databases/postgres

echo "postgres: postgres -D databases/postgres" > ProcfileDev

Copy the environment variables from the test environment via cp test.env .env and change the database URL in .env to TAKAHE_DATABASE_SERVER="postgres://takahe@localhost/takahe". Also add ProcfileDev to the .env file, because Procfile is already used for deployment stuff 😕 (isn't heroku dead already?):

echo "PROCFILE=ProcfileDev" >> .env

Now it should be possible to start up the database server with:

honcho start

Create the database and database user used by the Django application:

createdb takahe && createuser takahe

Create a virtualenv and activate it. This step is probably different for you but for me it is:

vf new takahe && vf connect

First Caveat

On my M1 mac, the lxml wheel seems to be broken, when I just install the requirements via python -m pip install -r requirements-dev.txt. Trying to import etree after installing the dependencies like this yields this traceback:

>>> from lxml import etree

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

ImportError: dlopen(/Users/jochen/.virtualenvs/takahe/lib/python3.11/site-packages/lxml/etree.cpython-311-darwin.so, 0x0002): symbol not found in flat namespace '_exsltDateXpathCtxtRegister'

>>>

But installing lxml with python -m pip install lxml works as expected. Really weird. Anyway installing lxml before installing the other dependencies without using a binary worked for me:

python -m pip install lxml --no-binary :all:

Installing the Development Dependencies

Install the development dependencies:

python -m pip install -r requirements-dev.txt

Now it's time to run the Django migrations: python manage.py migrate

Add the Django application and stator to the Procfile:

echo "django: PYTHONUNBUFFERED=true python manage.py runserver 0.0.0.0:8000" >> ProcfileDev

echo "worker: python manage.py runstator" >> ProcfileDev

If you now stop your running honcho and restart it, you should be able to see the takahē webinterface.

Running Tests

If you want to be able to run the tests, you have to add the CREATEDB privilege to the takahe database user:

psql -c "ALTER USER takahe CREATEDB;" -d takahe

Now it should by possible to run the tests:

pytest

Production Deployment

This is a little bit more complicated. To see an example for ansible, have a look at the deploy directory in my takahē fork (without_docker branch). You have to replace the hosts in the inventory but then this should work:

ansible-playbook deploy.yml --limit production


Weeknotes 2022-12-19

, Jochen
modern js frameworks are only possible in a negative real interest rate environment --htmx.org

Got more stuff done last week - getting better I guess 😀:

Articles

Weeklogs

Videos

Mastodon / Twitter

Software

Podcasts

Out of Context Images


TIL: Flush the FRITZ!Box DNS Cache

, Jochen

I tried to change some DNS records today, and even after the TTL was over, I couldn't get the updated records on my notebook. I flushed the DNS cache on macOS but it didn't work. After some debugging, I found that my FRITZ!Box might be the culprit.

How to do it

Just go to:

Heimnetz > Netzwerk > Netzwerkeinstellungen > IPv4-Einstellungen

And then deactivate DHCP and reactivate it afterward. This will flush the DNS cache without the need for a restart. My changed DNS records were available right after doing this 🤪.


TIL: Change Owner of Postgres Database Objects Using Ansible

, Jochen

For my very modest deployment needs, I use ansible. After restoring a postgres database backup using the community.general.postgresql_db role, the normal deployment of a Django app didn't work anymore. The python manage.py migrate command failed complaining it cannot modify a table not owned by the user running the migration. Turns out that all the tables in the database are owned by the postgres user after restoring the database.

Ok, let's just add an ansible task changing the owner using the postgresql_owner role. But reassign_owned_by does not work if the source user is postgres and specifying all the tables, sequences, and views manually seems to be just wrong. So my solution for this was to copy and paste a solution from StackOverflow into two ansible tasks.

- name: Create postgres function to be able to change owner of db objects
      postgresql_query:
        db: "{{ postgres_database }}"
        query: |
          CREATE FUNCTION exec(text) returns text language plpgsql volatile
            AS $f$
              BEGIN
                EXECUTE $1;
                RETURN $1;
              END;
          $f$;
      become: true
      become_user: postgres
      ignore_errors: true

    - name: "Change owner of all tables in db to {{ postgres_user }}"
      postgresql_query:
        db: "{{ postgres_database }}"
        query: |
          SELECT exec('ALTER TABLE ' || quote_ident(s.nspname) || '.' ||
                      quote_ident(s.relname) || ' OWNER TO "{{ postgres_user }}"')
            FROM (SELECT nspname, relname
                    FROM pg_class c JOIN pg_namespace n ON (c.relnamespace = n.oid)
                   WHERE nspname NOT LIKE E'pg\\_%' AND
                         nspname <> 'information_schema' AND
                         relkind IN ('r','S','v') ORDER BY relkind = 'S') s;

      become: true
      become_user: postgres

Update: This should no longe be an image. Code blocks ftw!

Sorry for the image, I still have to implement code blocks for wagtail. I added those two tasks to my database restore playbook and now all database objects belong to the original user. Maybe there's a better way to do this, but maybe this is also helpful for someone. If you know how to do this properly: let me know 🙂.


Weeknotes 2022-12-12

, Jochen
Due to personal reasons, I've decided to replace my hair with snakes & turn people who stare at me into stone. @roxiqt@mastodon.social

Had a stressful week due to private turmoil and couldn't get anything done.

Articles

Videos

Weeklogs

Mastodon / Twitter

Software

Podcasts

Out of Context Images