Skip to content

Containers get persistent storage automatically. Every container has a full filesystem that persists across restarts, snapshots, and copy operations.


Container Management:

File Access:


Storage is NOT adjustable on the container level yet. When you create a container, storage is allocated automatically by the system—there’s no API parameter to set storage size per container.

What you get automatically:

  • ✅ Full Linux filesystem (root directory /)
  • ✅ Persistent across container restarts
  • ✅ Survives snapshots and restores
  • ✅ Maintained during copy operations
  • ✅ Standard Linux filesystem with full POSIX support

/hoody/storage is where Hoody Kit services store their data.

When you create a container with hoody_kit: true, Hoody Kit services that keep state on disk use /hoody/storage as their data directory. Exact layout is service-dependent; a typical tree looks like:

Terminal window
/hoody/storage/
├── terminals/ # hoody-terminal session data
├── displays/ # hoody-displays configs
├── files/ # hoody-files backend configurations
├── exec/ # hoody-exec scripts and cache
├── sqlite/ # hoody-sqlite database metadata
├── browser/ # hoody-browser profiles and cache
├── code/ # hoody-code workspace settings
├── curl/ # hoody-curl job storage
├── cron/ # hoody-cron schedules
├── agent/ # agent service state (via workspaces)
├── daemons/ # hoody-daemon configs
├── notifications/ # hoody-notifications data
├── tunnel/ # hoody-tunnel configs
├── logs/ # aggregated service logs
└── ... # plus any service-specific subdirectories

Stateless services (pipe, ssh, proxy, dynamic http/https ports) don’t create a dedicated directory here — hoody-pipe is a pure streaming relay with no on-disk state.

This is automatic. You don’t create or configure /hoody/storage—it’s established when the container is created with Hoody Kit.

Why this matters:

  • All service data in one predictable location
  • Easy to back up via copy or instant ZIP download from hoody-files (folder-as-zip is served on the WebDAV-style root path, not the /api/v1/files REST surface)
  • Simple to inspect service state
  • Consistent across all containers

Container Root (/)
├── /home/ # User directories (writable)
├── /hoody/
│ ├── /hoody/storage/ # Hoody Kit service data ⭐
│ ├── /hoody/databases/ # SQLite concurrent-write mount ⭐
│ └── /hoody/shares/ # Mounted shared storage (if any)
├── /ramdisk/ # Ultra-fast RAM storage (if enabled) ⭐
├── /tmp/ # Temporary files (cleared on restart)
└── ... (standard Linux filesystem)

Three special storage locations:

  1. /hoody/storage - Hoody Kit service data (automatic)
  2. /hoody/databases - Concurrent-write-safe SQLite (automatic FUSE mount)
  3. /ramdisk - Optional RAM-based ultra-fast storage (capacity capped at 50% of container memory)

See dedicated pages for details on /hoody/databases and /ramdisk.


What persists:

Terminal window
POST /api/v1/containers/{id}/restart

All filesystem data persists

  • /hoody/storage - intact
  • /hoody/databases - intact
  • /ramdisk - PERSISTS (special Hoody feature!)
  • User files - intact
  • Installed packages - intact

Exception: /ramdisk is RAM-based and only survives container restarts, not host reboots. See /ramdisk for details.


Create a Container (Storage Allocated Automatically)

Section titled “Create a Container (Storage Allocated Automatically)”

When you create a container, storage is allocated automatically:

Terminal window
# Create a container — storage allocated automatically
hoody containers create --project $PROJECT_ID --server-id $SERVER_ID --name "my-app" --hoody-kit

No storage size parameter needed. The system allocates storage automatically at the host level.


You have multiple ways to access container storage:

HTTP API

Hoody Files - Direct HTTP access to filesystem

Terminal window
GET /api/v1/files/hoody/storage/exec/scripts.json
  • Read/write files via HTTP
  • Download with SHA256 verification
  • List directories with JSON/HTML output
  • Stream large files efficiently

Local Mounting

Mount Locally - SFTP/WebDAV server

Mount container filesystem on your local machine:

  • macOS Finder / Windows Explorer
  • FileZilla, Cyberduck, WinSCP
  • Command-line SFTP/WebDAV clients

hoody-files acts as server for local mounting.

Terminal Access

Hoody Terminal - Web-based shell

Terminal window
ls -la /hoody/storage/
cat /hoody/databases/app.db
echo "data" > /ramdisk/cache.txt

Full shell access via browser.

SSH Access

SSH - Secure shell

Terminal window
ssh root@ssh.$serverName.containers.hoody.icu # e.g. ssh.us-west-1.containers.hoody.icu
cd /hoody/storage

Optional - terminal access works without SSH.


Terminal window
# Code, dependencies, build artifacts
/home/user/projects/ # Your code
/hoody/storage/exec/ # HTTP-callable scripts
/ramdisk/build/ # Ultra-fast build cache

Pattern: Use /ramdisk for build artifacts (fast), regular filesystem for source code (persistent).

Terminal window
# Concurrent-write-safe SQLite
/hoody/databases/production.db # Automatic concurrent write safety
/hoody/databases/staging.db # No replication, just safe writes

Pattern: Store all SQLite databases in /hoody/databases/ for automatic concurrent-write protection. See SQLite Driver.

Terminal window
# User uploads, media files
/hoody/storage/uploads/ # Persistent user data
/ramdisk/processing/ # Temporary file processing

Pattern: Accept uploads to regular storage, use /ramdisk for temporary processing (image resize, video transcode).


Terminal window
# Check container details (includes storage info)
hoody containers get $CONTAINER_ID

Via hoody-terminal (in-container):

Terminal window
df -h
# Shows filesystem usage
du -sh /hoody/storage/*
# Shows Hoody Kit service data sizes
du -sh /hoody/databases/*
# Shows database sizes

Remove unused data:

Terminal window
# Clear package manager cache
apt-get clean
# Remove old logs
rm -rf /hoody/storage/*/logs/*.old
# Clear ramdisk (regenerates on next restart anyway)
rm -rf /ramdisk/*

Currently: Storage is NOT adjustable per container.

Workaround: Create new container + transfer data:

  1. Create snapshot of old container
  2. Create new container (receives system-allocated storage)
  3. Transfer data via storage shares
  4. Verify migration
  5. Delete old container

1. Use /hoody/storage for Application Data

Section titled “1. Use /hoody/storage for Application Data”

Store your app’s persistent data in /hoody/storage/myapp/ to keep it organized with Hoody Kit services:

Terminal window
mkdir -p /hoody/storage/myapp/data
mkdir -p /hoody/storage/myapp/configs
mkdir -p /hoody/storage/myapp/logs

2. SQLite Databases Go in /hoody/databases/

Section titled “2. SQLite Databases Go in /hoody/databases/”

Always store SQLite databases in /hoody/databases/ for automatic concurrent-write safety:

Terminal window
# ✅ Correct - concurrent write safe
sqlite3 /hoody/databases/app.db
# ❌ Wrong - risk of database corruption
sqlite3 /hoody/storage/app.db

3. Use /ramdisk for Temporary Fast Storage

Section titled “3. Use /ramdisk for Temporary Fast Storage”

Perfect for caches, build artifacts, temporary processing:

Terminal window
# Ultra-fast temporary storage
/ramdisk/npm-cache/
/ramdisk/build-output/
/ramdisk/image-processing/

Remember: /ramdisk is cleared on host reboot (not container restart).

Before modifying large amounts of data or testing destructive operations:

Terminal window
POST /api/v1/containers/{id}/snapshots
{"alias": "before-cleanup-2025-11-10"}

Storage is persistent but not immune to accidental deletion.

Set up monitoring for storage capacity:

Terminal window
# Check if storage >80% full
df -h / | awk 'NR==2 {print $5}' | sed 's/%//'

Integrate with hoody-notifications for alerts.


Can I change storage size after creating a container?

Section titled “Can I change storage size after creating a container?”

No. Storage allocation is currently not adjustable on the container level. Storage is managed automatically at the host level when containers are created.

Workaround: Create new container and migrate data via storage shares or manual copy.

What happens to /hoody/storage if I disable Hoody Kit?

Section titled “What happens to /hoody/storage if I disable Hoody Kit?”

The directory remains (it’s just a directory), but services won’t write to it since they’re not installed. Existing data persists.

Is /hoody/storage a special mount or just a directory?

Section titled “Is /hoody/storage a special mount or just a directory?”

Just a regular directory with a specific purpose—Hoody Kit services use it by convention. No special filesystem characteristics.

How is /hoody/storage different from /hoody/databases/?

Section titled “How is /hoody/storage different from /hoody/databases/?”
  • /hoody/storage = Regular directory where Hoody Kit stores service data
  • /hoody/databases/ = Special FUSE mount with concurrent-write safety for SQLite

See SQLite Driver for /hoody/databases/ details.

Can I share /hoody/storage between containers?

Section titled “Can I share /hoody/storage between containers?”

Yes! Use Storage Shares:

Terminal window
POST /api/v1/containers/{source}/storage/shares
{
"source_path": "/hoody/storage/myapp",
"target_project_id": "{project}",
"mode": "readonly"
}

Does /hoody/storage count toward storage quota?

Section titled “Does /hoody/storage count toward storage quota?”

Yes. All filesystem usage (including /hoody/storage) counts toward your container’s total storage. The per-container allocation is system-managed — the API strips any allocated_storage field on create/update, so you can’t resize it directly from the client.


Problem: “No space left on device” errors

Solutions:

  1. Check storage usage:

    Terminal window
    df -h
    du -sh /* | sort -h
  2. Clean package cache:

    Terminal window
    apt-get clean
    apt-get autoremove
  3. Remove old logs:

    Terminal window
    find /hoody/storage -name "*.log" -mtime +30 -delete
  4. Clear /ramdisk if full:

    Terminal window
    rm -rf /ramdisk/*

Problem: Permission denied writing to /hoody/storage

Solution: Containers run as root - this shouldn’t happen. Check:

Terminal window
ls -la /hoody/
# Should show: drwxr-xr-x root root

If permissions are wrong, fix them:

Terminal window
chown -R root:root /hoody/storage
chmod -R 755 /hoody/storage

Problem: Directory doesn’t exist in new container

Cause: Container created with hoody_kit: false

Solution: /hoody/storage is only created when Hoody Kit is installed. If you need it:

Terminal window
mkdir -p /hoody/storage

But services won’t use it without Hoody Kit enabled.


Storage ecosystem:

File access methods:

Understanding gained:

  • ✅ Storage is persistent (survives restarts, snapshots, copy)
  • ✅ Storage is NOT adjustable per container (automatic allocation)
  • /hoody/storage is where Hoody Kit services store data
  • /hoody/databases/ and /ramdisk are special storage locations
  • ✅ Multiple access methods (HTTP API, local mounting, terminal, SSH)

Storage is automatic, persistent, and HTTP-accessible.
No configuration needed—it just works.

Your data persists. Your services know where to store it. You access it via HTTP.