diff --git a/.env.unraid.example b/.env.unraid.example new file mode 100644 index 0000000..892f509 --- /dev/null +++ b/.env.unraid.example @@ -0,0 +1,109 @@ +# VacatureRadar — all-in-one container (docker-compose.unraid.yml) +# +# Gebruik: +# cp .env.unraid.example .env +# # vervang ALLE CHANGE_ME-waarden +# docker compose -f docker-compose.unraid.yml up -d --build --force-recreate +# +# Dit profiel draait rechtstreeks op http://:1226 zonder TLS. +# Zet pas een reverse proxy ervoor via deployment/production.env.example +# (SECURE_SSL_REDIRECT, cookie-secure en HSTS staan hier bewust uit). +# +# PostgreSQL en Redis draaien IN de container op 127.0.0.1; laat die waarden staan. + +# Genereer met: python -c "import secrets; print(secrets.token_urlsafe(64))" +DJANGO_SECRET_KEY=CHANGE_ME_generate_at_least_50_random_characters +DJANGO_DEBUG=0 +# Leeg laten tot er een publieke HTTPS-URL is. +PUBLIC_BASE_URL= +DJANGO_ALLOWED_HOSTS=192.168.10.150,127.0.0.1,localhost +DJANGO_CSRF_TRUSTED_ORIGINS=http://192.168.10.150:1226,http://127.0.0.1:1226 +DJANGO_TIME_ZONE=Europe/Brussels +VACATURERADAR_OWNER_NAME=Jens +VACATURERADAR_VERSION=0.3.12 + +# Interne database en cache. Niet wijzigen voor de AIO-container. +POSTGRES_DB=vacatureradar +POSTGRES_USER=vacatureradar +POSTGRES_PASSWORD=CHANGE_ME_unique_database_password +POSTGRES_HOST=127.0.0.1 +POSTGRES_PORT=5432 +DATABASE_URL= +REDIS_URL=redis://127.0.0.1:6379/0 +CACHE_URL=redis://127.0.0.1:6379/1 +HEALTHCHECK_REQUIRE_CACHE=1 +CELERY_TASK_ALWAYS_EAGER=0 + +# Maakt bij een lege database eenmalig het beheerdersaccount aan. +# Inloggen kan met de gebruikersnaam of het e-mailadres. +VACATURERADAR_ADMIN_USERNAME=jens@itworx.tech +VACATURERADAR_ADMIN_EMAIL=jens@itworx.tech +VACATURERADAR_ADMIN_PASSWORD=CHANGE_ME_unique_admin_password +VACATURERADAR_AUTO_BOOTSTRAP=1 + +DEMO_MODE_ENABLED=0 +DEMO_READ_ONLY=1 +DEMO_SESSION_SECONDS=3600 +DEMO_USERNAME=demo +DEMO_EMAIL=demo@vacatureradar.local + +# Geen proxy voor de container: laat deze op 0 tot NPM/Traefik ervoor staat. +TRUST_PROXY_HEADERS=0 +USE_X_FORWARDED_HOST=0 +TRUSTED_PROXY_CIDRS= +SESSION_COOKIE_SECURE=0 +CSRF_COOKIE_SECURE=0 +SECURE_SSL_REDIRECT=0 +SECURE_HSTS_SECONDS=0 +SECURE_HSTS_INCLUDE_SUBDOMAINS=0 +SECURE_HSTS_PRELOAD=0 +SEARCH_ENGINE_INDEXING_ENABLED=0 + +AUTH_LOGIN_RATE_LIMIT_MAX_ATTEMPTS=8 +AUTH_LOGIN_RATE_LIMIT_WINDOW_SECONDS=300 +AUTH_LOGIN_RATE_LIMIT_BLOCK_SECONDS=300 +MANUAL_IMPORT_RATE_LIMIT_MAX_ATTEMPTS=12 +MANUAL_IMPORT_RATE_LIMIT_WINDOW_SECONDS=120 +MANUAL_IMPORT_RATE_LIMIT_BLOCK_SECONDS=300 + +EMAIL_BACKEND=django.core.mail.backends.console.EmailBackend +DEFAULT_FROM_EMAIL=VacatureRadar +DIGEST_RECIPIENT= +SMTP_HOST= +SMTP_PORT=587 +SMTP_USER= +SMTP_PASSWORD= +SMTP_USE_TLS=1 + +# Genereer met: python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())" +MAILBOX_CREDENTIAL_KEYS= +IMAP_CONNECT_TIMEOUT_SECONDS=15 +IMAP_MAX_MESSAGES_PER_POLL=200 +IMAP_MAX_MESSAGE_BYTES=1000000 + +FETCHER_USER_AGENT=VacatureRadar/0.1 (+personal-use; contact=local-admin) +FETCHER_TIMEOUT_SECONDS=20 +FETCHER_MAX_BYTES=3000000 +FETCHER_MAX_REDIRECTS=5 +FETCHER_ALLOW_NONSTANDARD_PORTS=0 +SOURCE_POLICY_MODE=strict + +OLLAMA_ENABLED=0 +OLLAMA_BASE_URL=http://127.0.0.1:11434 +OLLAMA_MODEL= +OLLAMA_TIMEOUT_SECONDS=60 + +ENTRA_ID_ENABLED=0 +ENTRA_CLIENT_ID= +ENTRA_CLIENT_SECRET= +ENTRA_TENANT_ID= +ENTRA_REDIRECT_URI= +ENTRA_ALLOWED_DOMAINS= +ENTRA_SCOPES=User.Read + +# Optioneel: pad in de container naar een pg_dump-bestand dat bij een lege +# database eenmalig wordt teruggezet, bv. /app/local/backups/aio-migration.dump +VACATURERADAR_RESTORE_DUMP= + +# Optioneel: andere hostpoort dan 1226 publiceren. +VACATURERADAR_HOST_PORT=1226 diff --git a/.gitignore b/.gitignore index 73e2cc6..7d3bed0 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ local/ .env .env.* !.env.example +!.env.unraid.example secrets/ # IDE / OS diff --git a/deploy-log.txt b/deploy-log.txt new file mode 100644 index 0000000..56ea08a Binary files /dev/null and b/deploy-log.txt differ diff --git a/deployment/unraid/README.md b/deployment/unraid/README.md index cc9049b..376c322 100644 --- a/deployment/unraid/README.md +++ b/deployment/unraid/README.md @@ -1,5 +1,12 @@ # Unraid-installatiebestanden -De composebron staat in de repositoryroot als `docker-compose.unraid.yml`. Deze bouwt één Dockerman-container via `Dockerfile.unraid`; interne processen worden door Supervisor bewaakt. Volg eerst [`docs/operations/UNRAID_DEPLOYMENT.md`](../../docs/operations/UNRAID_DEPLOYMENT.md). +De composebron staat in de repositoryroot als `docker-compose.unraid.yml`. Deze bouwt één Dockerman-container via `Dockerfile.unraid`; interne processen worden door Supervisor bewaakt. Alle paden zijn relatief aan de map met het composebestand, dus je kopieert de projectmap naar de server en start daar: + +```bash +cp .env.unraid.example .env # eenmalig, daarna alle CHANGE_ME-waarden invullen +docker compose -f docker-compose.unraid.yml up -d --build --force-recreate +``` + +Volg voor de volledige procedure [`docs/operations/UNRAID_DEPLOYMENT.md`](../../docs/operations/UNRAID_DEPLOYMENT.md). Deze directory is gereserveerd voor toekomstige Unraid-template-XML en release-specifieke voorbeelden. Commit hier geen ingevulde `.env`, app-password, registrypulltoken of databaseback-up. diff --git a/docker-compose.unraid.yml b/docker-compose.unraid.yml index 42914c4..84bfbcc 100644 --- a/docker-compose.unraid.yml +++ b/docker-compose.unraid.yml @@ -1,4 +1,10 @@ # Eén Dockerman-container met intern bewaakte PostgreSQL-, Redis-, web- en Celery-processen. +# +# Kopieer de projectmap naar de server en start vanuit die map: +# cp .env.unraid.example .env # eenmalig, daarna alle CHANGE_ME-waarden invullen +# docker compose -f docker-compose.unraid.yml up -d --build --force-recreate +# +# Alle paden zijn relatief aan deze map, zodat de map overal kan staan. name: vacatureradar services: @@ -9,22 +15,25 @@ services: image: vacatureradar:unraid container_name: VacatureRadar env_file: - - ${VACATURERADAR_ENV_FILE:-/mnt/user/appdata/vacatureradar/source/.env} + - ${VACATURERADAR_ENV_FILE:-.env} environment: POSTGRES_HOST: 127.0.0.1 + POSTGRES_PORT: "5432" REDIS_URL: redis://127.0.0.1:6379/0 CACHE_URL: redis://127.0.0.1:6379/1 HEALTHCHECK_REQUIRE_CACHE: "1" - VACATURERADAR_RESTORE_DUMP: /app/local/backups/aio-migration.dump + # Alleen gebruikt bij een lege datadir; laat leeg wanneer je niet migreert. + VACATURERADAR_RESTORE_DUMP: ${VACATURERADAR_RESTORE_DUMP:-} restart: unless-stopped security_opt: - no-new-privileges:true + stop_grace_period: 30s ports: - - "1226:8080" + - "${VACATURERADAR_HOST_PORT:-1226}:8080" volumes: - - /mnt/user/appdata/vacatureradar/source/local/media:/app/media - - /mnt/user/appdata/vacatureradar/source/local/logs:/app/logs - - /mnt/user/appdata/vacatureradar/source/local:/app/local + - ./local/media:/app/media + - ./local/logs:/app/logs + - ./local:/app/local labels: net.unraid.docker.managed: dockerman net.unraid.docker.webui: http://[IP]:[PORT:8080]/ @@ -37,4 +46,4 @@ services: interval: 30s timeout: 5s retries: 5 - start_period: 60s + start_period: 90s diff --git a/docs/operations/UNRAID_DEPLOYMENT.md b/docs/operations/UNRAID_DEPLOYMENT.md index 2a6c086..20674a9 100644 --- a/docs/operations/UNRAID_DEPLOYMENT.md +++ b/docs/operations/UNRAID_DEPLOYMENT.md @@ -4,21 +4,32 @@ Deze handleiding gebruikt `docker-compose.unraid.yml` als declaratieve bron van ## Vooraf -Maak deze directories: +Alle paden in `docker-compose.unraid.yml` zijn relatief aan de map waarin dat bestand staat. Je kopieert de projectmap dus naar een plek naar keuze; de aanbevolen locatie blijft: ```text /mnt/user/appdata/vacatureradar/source -/mnt/user/appdata/vacatureradar/source/local -/mnt/user/appdata/vacatureradar/source/local/media -/mnt/user/appdata/vacatureradar/source/local/logs -/mnt/user/appdata/vacatureradar/source/local/postgres-aio17 -/mnt/user/appdata/vacatureradar/source/local/redis-aio -/mnt/user/appdata/vacatureradar/ollama # alleen bij lokale AI -/mnt/user/backups/vacatureradar ``` +De container maakt `local/`, `local/media`, `local/logs`, `local/postgres-aio17`, `local/redis-aio` en `local/backups` bij de eerste start zelf aan en zet de juiste eigenaar. Voor back-ups blijft `/mnt/user/backups/vacatureradar` de aanbevolen doelmap. + Gebruik bij voorkeur een cache-backed `appdata`-share en neem die afzonderlijk in je back-upregime op. De PostgreSQL-datadir mag niet gelijktijdig door file-syncsoftware worden gemuteerd. +## Manueel kopiëren en uitrollen + +Wanneer je niet via `scripts/deploy_unraid.sh` werkt maar de map met de hand kopieert (rsync, SMB-share, ZIP): + +```bash +cd /mnt/user/appdata/vacatureradar/source +cp .env.unraid.example .env # alleen de eerste keer +nano .env # alle CHANGE_ME-waarden vervangen +docker compose -f docker-compose.unraid.yml up -d --build --force-recreate +docker compose -f docker-compose.unraid.yml logs -f +``` + +Kopieer `local/` niet mee vanaf je werkstation: die map bevat de databasedirectory van de server. Kopieer `.env` evenmin over een bestaand serverbestand heen. + +Een afwijkende hostpoort zet je in `.env` via `VACATURERADAR_HOST_PORT`; standaard is dat `1226`. + ## Dockerman De container verschijnt als **VacatureRadar** en bevat metadata voor: @@ -47,13 +58,13 @@ Gebruik in productie geen zwevende `latest` zonder gecontroleerd rollbackpad. ## Configuratiebestand -De standaardlocatie die `docker-compose.unraid.yml` leest is: +`docker-compose.unraid.yml` leest `.env` naast het composebestand zelf: ```text -/mnt/user/appdata/vacatureradar/source/.env +/.env ``` -Een afwijkende locatie kan vóór Compose via `VACATURERADAR_ENV_FILE` worden ingesteld. Gebruik [`deployment/production.env.example`](../../deployment/production.env.example) alleen als checklist en kopieer nooit ongewijzigde `CHANGE_ME`-waarden. +Een afwijkende locatie kan vóór Compose via `VACATURERADAR_ENV_FILE` worden ingesteld. Start van [`.env.unraid.example`](../../.env.unraid.example) voor een all-in-one container die rechtstreeks op poort 1226 draait, of van [`deployment/production.env.example`](../../deployment/production.env.example) zodra er een reverse proxy met TLS voor staat. Kopieer nooit ongewijzigde `CHANGE_ME`-waarden. Configureer een bestaand bestand voor de publieke URL zonder secrets te overschrijven: @@ -61,7 +72,7 @@ Configureer een bestaand bestand voor de publieke URL zonder secrets te overschr cd /mnt/user/appdata/vacatureradar/source python scripts/configure_public_url.py \ https://vacatureradar.example.be \ - --env-file /mnt/user/appdata/vacatureradar/source/.env \ + --env-file .env \ --cache-url redis://127.0.0.1:6379/1 ``` diff --git a/scripts/unraid_aio_entrypoint.sh b/scripts/unraid_aio_entrypoint.sh index 31c4ab2..f7b035e 100644 --- a/scripts/unraid_aio_entrypoint.sh +++ b/scripts/unraid_aio_entrypoint.sh @@ -6,10 +6,11 @@ redis_data=/app/local/redis-aio pg_bin="$(pg_config --bindir)" fresh_database=0 -mkdir -p "$pg_data" "$redis_data" /app/media /app/logs /tmp/celery +mkdir -p "$pg_data" "$redis_data" /app/media /app/logs /app/local/backups /tmp/celery chown -R postgres:postgres "$pg_data" chown -R redis:redis "$redis_data" -chown -R app:app /app/media /app/logs /tmp/celery +chown -R app:app /app/media /app/logs /app/local/backups /tmp/celery +chmod 0700 "$pg_data" if [[ ! -s "$pg_data/PG_VERSION" ]]; then runuser -u postgres -- "$pg_bin/initdb" -D "$pg_data" --auth-local=trust --auth-host=scram-sha-256 diff --git a/stitch_vacatureradar_intelligence_cockpit (1).zip b/stitch_vacatureradar_intelligence_cockpit (1).zip deleted file mode 100644 index 1c90eaf..0000000 Binary files a/stitch_vacatureradar_intelligence_cockpit (1).zip and /dev/null differ