Postgres
Image: postgres:17
- Port 5432/tcp
- 10 GB volume at /var/lib/postgresql/data
- 1 vCPU · 1 GB
Template · Business apps
Headless GraphQL e-commerce platform (API + Celery worker) with Postgres and Redis.
Opens the dashboard with this template pre-selected. Sign in with GitHub if you are new; the free tier needs no card.
4 services in the environment you pick, on the private network of the project.
ghcr.io/saleor/saleor:3.21 API with migrations on start and a Celery worker, PostgreSQL 17, Redis. Dashboard is a separate app (saleor-dashboard) — point it at /graphql/.
Create the first superuser: python3 manage.py createsuperuser inside the Saleor container.
Image: postgres:17
Image: redis:7-alpine
redis-server --appendonly yes --dir /data
Image: ghcr.io/saleor/saleor:3.21
python3 manage.py migrate --noinput && uvicorn saleor.asgi:application --host 0.0.0.0 --port 8000 --workers 2 --lifespan off --ws none --no-server-header --no-access-log --timeout-keep-alive 35
Image: ghcr.io/saleor/saleor:3.21
celery -A saleor --app=saleor.celeryconf:app worker --loglevel=info -B
Generated secrets never leave the platform; references are resolved on the private network. Anything marked required is asked for at deploy time.
| Name | Value |
|---|---|
| POSTGRES_USER | postgresSuperuser name |
| POSTGRES_PASSWORD | generated (password)Generated at deploy |
| POSTGRES_DB | saleorDatabase created on first start |
| PGDATA | /var/lib/postgresql/data/pgdata |
| DATABASE_URL | postgresql://${{self.POSTGRES_USER}}:${{self.POSTGRES_PASSWORD}}@${{self.SKIFFLY_PRIVATE_DOMAIN}}:5432/${{self.POSTGRES_DB}}Connection string on the private network |
| Name | Value |
|---|---|
| REDIS_URL | redis://${{self.SKIFFLY_PRIVATE_DOMAIN}}:6379Private network only, no auth |
| Name | Value |
|---|---|
| DATABASE_URL | ${{Postgres.DATABASE_URL}} |
| CELERY_BROKER_URL | ${{Redis.REDIS_URL}}/1 |
| REDIS_URL | ${{Redis.REDIS_URL}}/0 |
| SECRET_KEY | generated (secret) |
| RSA_PRIVATE_KEY | Optional PEM for JWT signing |
| ALLOWED_HOSTS | * |
| ALLOWED_CLIENT_HOSTS | * |
| PUBLIC_URL | https://${{self.SKIFFLY_PUBLIC_DOMAIN}} |
| DEFAULT_FROM_EMAIL | noreply@example.com |
| DEBUG | False |
| DEFAULT_CHANNEL_SLUG | default-channel |
| HTTP_IP_FILTER_ENABLED | False |
| Name | Value |
|---|---|
| DATABASE_URL | ${{Postgres.DATABASE_URL}} |
| CELERY_BROKER_URL | ${{Redis.REDIS_URL}}/1 |
| REDIS_URL | ${{Redis.REDIS_URL}}/0 |
| SECRET_KEY | ${{Saleor.SECRET_KEY}} |
| RSA_PRIVATE_KEY | Optional PEM for JWT signing |
| ALLOWED_HOSTS | * |
| ALLOWED_CLIENT_HOSTS | * |
| PUBLIC_URL | ${{Saleor.PUBLIC_URL}} |
| DEFAULT_FROM_EMAIL | noreply@example.com |
| DEBUG | False |
| DEFAULT_CHANNEL_SLUG | default-channel |
| HTTP_IP_FILTER_ENABLED | False |
Volumes, secrets and domain pre-wired. Runs on EU nodes, paid per minute from a prepaid balance.