File size: 1,825 Bytes
8ea09fa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# Persistence β€” staying logged in

The Chrome profile (cookies/logins) lives in `/home/chrome/data`. How it survives a restart
depends on where you run.

## Hugging Face β†’ Neon Postgres (required)

HF free `cpu-basic` Spaces have **no persistent disk** β€” the filesystem is wiped on every
restart/rebuild. So the profile is snapshotted to an external Postgres DB by the `profilesync` tool:

- **Boot:** `profilesync restore` pulls the last snapshot.
- **Every 5 min + on shutdown:** `profilesync backup` saves it.
- Stored as one row: `chrome_profile(id, updated_at, data bytea)` (auto-created).
- **Gated on `DATABASE_URL`.** Not set β†’ restore/backup skipped β†’ logins lost on restart.

### Setup
1. Free DB at [neon.tech](https://neon.tech) β†’ copy the connection string
   (`postgresql://user:pass@host.neon.tech/db?sslmode=require`).
2. HF Space β†’ Settings β†’ Variables and secrets β†’ secret **`DATABASE_URL`** = that string.
3. Saving auto-restarts the Space. **Log in once** after that β†’ first backup within 5 min β†’ survives
   all future restarts.

### Verify a backup landed
```sql
SELECT id, updated_at, octet_length(data) FROM chrome_profile;
```
A row with non-zero size = persisted. (Profile stays small β€” junk/cache is stripped each boot;
typically 0.5–2 MB. Neon free = 512 MB, so it's ~0.1% used.)

## Self-host Docker β†’ named volume (no DB needed)

`docker-compose.yml` mounts the `chrome-profile` named volume at `/home/chrome/data`, so logins
survive `docker compose down/up` and reboots automatically. **`DATABASE_URL` is not needed** for
Docker. To wipe the profile: `docker compose down -v`.

> Important: setting a new secret on HF forces a restart. If you log in *before* `DATABASE_URL` is
> set, that login is lost on the restart the secret triggers β€” log in again afterward.