QFieldCloud App ARM64. Patched & optimized for Raspberry Pi 4/5. Ready for standalone hosting.
10K+
This stack is specifically patched and compiled for ARM64 architecture. It allows running a full QFieldCloud instance on a Raspberry Pi 4 or 5. 🐧
samexit/qfieldcloud-app-arm64:latestsamexit/qgis-arm64:3.34⚠️ Instructions: Replace all 🔹your-value🔹 with your specific domain, passwords, and local paths.
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]🔹
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
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
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";
}
}
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
Thanks to OPENGIS.ch and Kartoza for the ARM64 images! 🥹
🔗 Official Project: Visit the QFieldCloud GitHub Repository
Content type
Image
Digest
sha256:270d82e51…
Size
315.1 MB
Last updated
8 months ago
docker pull samexit/qfieldcloud-app-arm64