From 99944039259df805b000cbbd5011f7848ed1a156 Mon Sep 17 00:00:00 2001 From: krek0 Date: Sun, 3 May 2026 16:29:45 +0200 Subject: [PATCH] Indicate docker config in readme and auto create admin user in docker --- README.md | 66 +++++++++++++++++++ entrypoint.sh | 1 + .../commands/create_default_admin.py | 32 +++++++++ 3 files changed, 99 insertions(+) create mode 100644 photologue/management/commands/create_default_admin.py diff --git a/README.md b/README.md index 5878775..8b118c4 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,72 @@ run and to maintain. ```./maintenance_tool.sh``` +## Docker install + +1. Create a `docker-compose.yml`: + + ```yaml + version: "3.9" + + services: + db: + image: postgres:16 + container_name: photo26-db + restart: unless-stopped + environment: + POSTGRES_DB: photo26 + POSTGRES_USER: photo26 + POSTGRES_PASSWORD: change-me + volumes: + - ./postgres_data:/var/lib/postgresql/data + + photo26: + image: git.sinfonie.org/sinfonie/photo26:latest + container_name: photo26-app + restart: unless-stopped + depends_on: + - db + environment: + DB_ENGINE: postgres + DB_NAME: photo26 + DB_USER: photo26 + DB_PASSWORD: change-me + DB_HOST: db + DB_PORT: 5432 + SECRET_KEY: change-me + EXTRA_HOSTS: photos.example.org + volumes: + - ./static:/app/static + - ./media:/app/media + ports: + - "8080:8000" + ``` + +2. Start the stack: + + ```bash + docker compose up -d + ``` + + On first start the container will run migrations and create a default admin account automatically. + +3. **Default credentials** — change these immediately after first login: + + | Field | Value | + |----------|-----------------| + | Username | `admin` | + | Password | `admin` | + | Email | `admin@localhost` | + + Admin panel: `http://localhost:8080/admin/` + +4. **Passwords to change** in `docker-compose.yml` before going to production: + - `POSTGRES_PASSWORD` / `DB_PASSWORD` — database password + - `SECRET_KEY` — Django secret key (use a long random string) + - Log in to the admin panel and change the `admin` user password + +--- + 6. *Enjoy \o/* In development, you can launch the development server using: diff --git a/entrypoint.sh b/entrypoint.sh index 37554d0..66d574e 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -2,4 +2,5 @@ set -e python manage.py migrate --noinput +python manage.py create_default_admin exec gunicorn photo21.wsgi:application --bind 0.0.0.0:8000 --workers 3 diff --git a/photologue/management/commands/create_default_admin.py b/photologue/management/commands/create_default_admin.py new file mode 100644 index 0000000..b9fee01 --- /dev/null +++ b/photologue/management/commands/create_default_admin.py @@ -0,0 +1,32 @@ +from django.contrib.auth import get_user_model +from django.core.management.base import BaseCommand + + +class Command(BaseCommand): + help = "Create default admin user (admin@localhost / admin) if it does not exist" + + def handle(self, *args, **kwargs): + User = get_user_model() + email = "admin@localhost" + username = "admin" + password = "admin" + + if User.objects.filter(username=username).exists(): + self.stdout.write("Default admin already exists, skipping.") + return + + user = User.objects.create_superuser(username=username, email=email, password=password) + + # Mark the email as verified via allauth + try: + from allauth.account.models import EmailAddress + EmailAddress.objects.create( + user=user, + email=email, + primary=True, + verified=True, + ) + except Exception as e: + self.stderr.write(f"Could not create allauth EmailAddress: {e}") + + self.stdout.write(f"Default admin created: {username} / {password}")