Sign inSign up

samexit/qfieldcloud-app-arm64

By samexit

•Updated 8 months ago

QFieldCloud App ARM64. Patched & optimized for Raspberry Pi 4/5. Ready for standalone hosting.

Image
Developer tools
0

10K+

samexit/qfieldcloud-app-arm64 repository overview

⁠🚀 Full QFieldCloud Stack for ARM64 (Raspberry Pi 4/5)

This stack is specifically patched and compiled for ARM64 architecture. It allows running a full QFieldCloud instance on a Raspberry Pi 4 or 5. 🐧

📦 Required Custom ARM64 Images:
  • Main App & Worker: samexit/qfieldcloud-app-arm64:latest
  • QGIS Engine: samexit/qgis-arm64:3.34

⚠️ Instructions: Replace all 🔹your-value🔹 with your specific domain, passwords, and local paths.


⁠1️⃣ File: .env

Environment variables and security keys. 🔑

# --- GENERAL CONFIG ---
DEBUG=0
QFIELDCLOUD_HOST=🔹your-domain.com🔹
ENVIRONMENT=production
SECRET_KEY=🔹REPLACE_WITH_A_LONG_RANDOM_STRING🔹
SALT_KEY=🔹REPLACE_WITH_A_RANDOM_SALT🔹

⁠--- DATABASE (Postgres) ---

POSTGRES_USER=🔹db_admin_user🔹 POSTGRES_PASSWORD=🔹STRONG_PASSWORD🔹 # Required for database security POSTGRES_DB=qfieldcloud_db POSTGRES_HOST=db POSTGRES_PORT=5432

⁠--- DOMAINS & SECURITY ---

DJANGO_ALLOWED_HOSTS="🔹your-domain.com🔹 localhost 127.0.0.1 app 🔹192.168.1.XX🔹" CSRF_TRUSTED_ORIGINS="https://🔹your-domain.com🔹⁠ http://🔹192.168.1.XX🔹:8010⁠"

⁠--- CUSTOM ENGINE ---

QFIELDCLOUD_QGIS_IMAGE_NAME=samexit/qgis-arm64:3.34

⁠--- STORAGE (Minio) ---

MINIO_ROOT_USER=minioadmin MINIO_ROOT_PASSWORD=minioadmin # Required for S3 storage access QFIELDCLOUD_ADMIN_EMAIL=🔹[email protected]⁠🔹


⁠2️⃣ File: docker-compose.yml

Core infrastructure with all services. 📦

version: '3.8'

services: db: image: kartoza/postgis:15-3.4 container_name: qfield_db restart: unless-stopped environment: - POSTGRES_DB=${POSTGRES_DB} - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASS=${POSTGRES_PASSWORD} - ALLOW_IP_RANGE=0.0.0.0/0 volumes: - 🔹/your/path/🔹postgres_data:/var/lib/postgresql

redis: image: redis:latest container_name: qfield_redis restart: unless-stopped

memcached: image: memcached:latest container_name: qfield_memcached restart: unless-stopped

app: image: samexit/qfieldcloud-app-arm64:latest container_name: qfield_app user: "root" depends_on: - db ports: - "8010:8000" environment: - DJANGO_SETTINGS_MODULE=qfieldcloud.settings - POSTGRES_HOST=db - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRES_DB=${POSTGRES_DB} - QFIELDCLOUD_HOST=${QFIELDCLOUD_HOST} - SECRET_KEY=${SECRET_KEY} - STORAGE_ACCESS_KEY_ID=${MINIO_ROOT_USER} - STORAGE_SECRET_ACCESS_KEY=${MINIO_ROOT_PASSWORD} - STORAGE_BUCKET_NAME=qfieldcloud - STORAGE_ENDPOINT_URL=http://minio:9000⁠ - STORAGE_USE_S3=True volumes: - 🔹/your/path/🔹staticfiles:/usr/src/app/staticfiles:rw - 🔹/your/path/🔹media:/usr/src/app/media:rw command: > sh -c "python3 manage.py migrate --noinput && python3 manage.py collectstatic --noinput && python3 manage.py runserver 0.0.0.0:8000"

worker: image: samexit/qfieldcloud-app-arm64:latest container_name: qfield_worker restart: unless-stopped depends_on: - app environment: - QFIELDCLOUD_QGIS_IMAGE_NAME=samexit/qgis-arm64:3.34 volumes: - 🔹/your/path/🔹media:/usr/src/app/media:rw

minio: image: minio/minio:latest container_name: qfield_minio restart: unless-stopped volumes: - 🔹/your/path/🔹minio_data:/data1 environment: MINIO_ROOT_USER: ${MINIO_ROOT_USER} MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD} command: server /data1 --console-address :9001

ofelia: image: mcuadros/ofelia:0.3.18 container_name: qfield_ofelia restart: unless-stopped command: daemon --docker volumes: - /var/run/docker.sock:/var/run/docker.sock:ro

nginx: image: nginx:stable-alpine container_name: qfield_nginx restart: always ports: - "8081:80" volumes: - 🔹/your/path/🔹nginx/conf.d:/etc/nginx/conf.d:ro - 🔹/your/path/🔹staticfiles:/usr/share/nginx/html/static:ro - 🔹/your/path/🔹media:/usr/share/nginx/html/static:ro depends_on: - app


⁠3️⃣ File: docker-compose.override.standalone.yml

Production optimizations for ARM64 standalone mode. ⚡

version: '3.8'
services:
  db:
    volumes:
      - ~/qfield_db_local:/var/lib/postgresql/15/main
    restart: always

app: image: samexit/qfieldcloud-app-arm64:latest container_name: qfield_app ports: - "8010:8000" command: > sh -c "python3 manage.py collectstatic --noinput && gunicorn qfieldcloud.wsgi:application --bind 0.0.0.0:8000 --workers 2"

worker: image: samexit/qfieldcloud-app-arm64:latest container_name: qfield_worker restart: always user: "root" command: python3 manage.py rqworker delta qgis

nginx: container_name: qfield_nginx image: nginx:alpine ports: - "🔹8085🔹:80" volumes: - 🔹/your/path/🔹staticfiles:/usr/share/nginx/html/static:ro - ./nginx_simple.conf:/etc/nginx/conf.d/default.conf:ro


⁠4️⃣ File: nginx_simple.conf

Reverse proxy and static files management. 🌐

server {
    listen 80;
    server_name _;
location / {
    proxy_pass http://app:8000;
    proxy_set_header Host $host:🔹8085🔹;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Host $host:🔹8085🔹;
}

location /staticfiles/ {
    alias /usr/share/nginx/html/static/;
    expires 30d;
    add_header Cache-Control "public, no-transform";
}

}


⁠🛠️ Deployment & Database Setup

1. Start the services: 🚀

docker compose -f docker-compose.yml -f docker-compose.override.standalone.yml up -d

2. Run Database Migrations: 🗄️

docker exec -it qfield_app python3 manage.py migrate

3. Create Superuser (Admin Access): 👤

docker exec -it qfield_app python3 manage.py createsuperuser

⁠🙏 Credits & Thanks

Thanks to OPENGIS.ch and Kartoza for the ARM64 images! 🥹

🔗 Official Project: Visit the QFieldCloud GitHub Repository⁠

Tag summary

Content type

Image

Digest

sha256:270d82e51…

Size

315.1 MB

Last updated

8 months ago

docker pull samexit/qfieldcloud-app-arm64