Skip to content

Self-Hosting

FloImg Studio is open-source and designed for self-hosting. Run it on your own servers with full control.

Terminal window
docker run -d \
--name floimg-studio \
-p 5100:5100 \
ghcr.io/teamflojo/floimg-studio

Open http://localhost:5100 in your browser.

version: '3.8'
services:
floimg-studio:
image: ghcr.io/teamflojo/floimg-studio
ports:
- "5100:5100"
environment:
- NODE_ENV=production
restart: unless-stopped
Terminal window
docker-compose up -d
VariableDescriptionDefault
PORTServer port5100
NODE_ENVEnvironmentdevelopment
CORS_ORIGINAllowed origins*
OUTPUT_DIRDefault output directory/tmp/floimg
AWS_ACCESS_KEY_IDFor S3 outputs-
AWS_SECRET_ACCESS_KEYFor S3 outputs-
AWS_REGIONFor S3 outputs-
services:
floimg-studio:
image: ghcr.io/teamflojo/floimg-studio
ports:
- "5100:5100"
environment:
- NODE_ENV=production
- AWS_ACCESS_KEY_ID=your-key
- AWS_SECRET_ACCESS_KEY=your-secret
- AWS_REGION=us-east-1
server {
listen 80;
server_name studio.yourdomain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name studio.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/studio.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/studio.yourdomain.com/privkey.pem;
location / {
proxy_pass http://localhost:5100;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_cache_bypass $http_upgrade;
}
}
services:
floimg-studio:
image: ghcr.io/teamflojo/floimg-studio
labels:
- "traefik.enable=true"
- "traefik.http.routers.studio.rule=Host(`studio.yourdomain.com`)"
- "traefik.http.routers.studio.tls.certresolver=letsencrypt"
- "traefik.http.services.studio.loadbalancer.server.port=5100"
  1. Add new resource → Docker Image
  2. Image: ghcr.io/teamflojo/floimg-studio
  3. Port: 5100
  4. Add environment variables as needed
  5. Deploy
apiVersion: apps/v1
kind: Deployment
metadata:
name: floimg-studio
spec:
replicas: 1
selector:
matchLabels:
app: floimg-studio
template:
metadata:
labels:
app: floimg-studio
spec:
containers:
- name: floimg-studio
image: ghcr.io/teamflojo/floimg-studio
ports:
- containerPort: 5100
env:
- name: NODE_ENV
value: "production"
---
apiVersion: v1
kind: Service
metadata:
name: floimg-studio
spec:
selector:
app: floimg-studio
ports:
- port: 80
targetPort: 5100

Studio is part of the floimg monorepo at apps/studio/:

Terminal window
# Clone the floimg monorepo
git clone https://github.com/teamflojo/floimg.git
cd floimg
# Install all dependencies
pnpm install
# Build studio
pnpm build:studio
# Run studio dev server
pnpm dev:studio

From the apps/studio/ directory:

Terminal window
cd apps/studio
docker build -t floimg-studio .
docker run -p 5100:5100 floimg-studio

The server exposes a health endpoint:

Terminal window
curl http://localhost:5100/health

Response:

{"status": "ok", "version": "1.0.0"}

For workflow persistence, mount a volume:

services:
floimg-studio:
image: ghcr.io/teamflojo/floimg-studio
volumes:
- ./data:/app/data
environment:
- DATA_DIR=/app/data