As I mentioned in the vuzon post, the Cloudflare dashboard has so many buttons and options that navigating it can be a massive pain (especially on mobile).

I created this project because there are days when you just want to upload a simple pilot project, or hit the "redeploy" button without having to wade through thousands of menus and subtabs just to find the right project.

EasyPages is a visual wrapper built on top of the Cloudflare API. Using only Cloudflare Pages permissions, it allows you to manage your static sites right from your own server, featuring a clean and distraction-free interface.

What can you do with EasyPages?

Don't expect a massive settings page, as that goes against the project's goal. Instead, it lets you control the bare essentials quickly and efficiently:

  • Project Visualization: View all your Cloudflare Pages sites at a glance.
  • Create New Projects: A basic option to create new Direct Upload projects.
  • Delete Deployments: Remove specific old deployments or wipe your entire non-production history at once to free up space.
  • Quick Deployments: Trigger manual deployments directly from the interface (for GitHub-linked projects).
  • Custom Domains: View associated domains and instantly add or remove them.
  • Build Settings: Update your build command and project output directory directly.

As always, you can find all the installation and configuration details in the new official repo: KN990x/EasyPages.

Prerequisite: The Cloudflare Token

To allow the app to communicate with your account, you need to create a custom API token. For security reasons, do not use your global token.

  1. Go to Cloudflare Dashboard > My Profile > API Tokens.
  2. Create a custom token with the following single permission:
    • Account ➜ Cloudflare Pages ➜ Edit

Safely save that token and your Account ID; we are going to use them right now.

Quick Installation via Docker Compose

1) Create and configure the .env file

# Your Cloudflare account configuration
CF_API_TOKEN=your_cloudflare_token_here
CF_ACCOUNT_ID=your_cloudflare_account_id_here

# User credentials to access your EasyPages dashboard
AUTH_USER=admin
# RECOMMENDED: Insert the bcrypt hash of your password here (e.g., cost 10).
# The server supports plain text for quick homelabs, but bcrypt is ideal.
AUTH_PASS=$2b$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy

# Optional: Key to sign session cookies (if left empty, it will auto-generate in /data)
# SESSION_SECRET=a_long_and_secure_secret

# IMPORTANT: Set to 'false' if you are accessing via standard HTTP (no SSL) on your local network or home environment.
# If you are placing a reverse proxy in front of it with HTTPS (Nginx, Caddy, Traefik), change this to 'true'.
SESSION_COOKIE_SECURE=false

(Note: If you leave SESSION_COOKIE_SECURE=true and connect via regular HTTP, your browser will discard the cookie for security reasons, looping you back to the login screen continuously).

2) Create the docker-compose.yml file

In the same folder where you created your .env, add the Docker Compose file:

services:
  easypages:
    container_name: easypages
    image: ghcr.io/kn990x/easypages
    restart: unless-stopped
    ports:
      - "8002:8002"
    environment:
      EASYPAGES_DATA_DIR: /data
    env_file:
      - .env
    volumes:
      - ./easypages-data:/data

⚠️ Note for Linux users (Folder Permissions): The container runs securely under an internal node user (UID 1000). To prevent the app from failing at startup due to missing write permissions on the mounted volume, create the folder in your terminal and change its ownership before spinning up the environment:

mkdir easypages-data && sudo chown -R 1000:1000 ./easypages-data

3) Deploy

Once everything is configured, spin up the service using the following command:

docker compose up -d --pull always

All set! You can now access the interface at http://localhost:8002 (or your server's local IP) and log in using the credentials you defined in your .env file.

Troubleshooting & FAQ

  • Am I getting kicked out of my session continuously / stuck in a login loop?
    • Check the SESSION_COOKIE_SECURE variable in your .env. If you are accessing without HTTPS, this variable must be set to false.
  • Are large .ZIP uploads failing?
    • EasyPages has internal security limits to protect the server (the maximum allowed ZIP is 100MB). If you are using a reverse proxy (like Nginx), make sure you have configured the client_max_body_size 100M; parameter (or higher) in your proxy so it doesn't cut off the upload before it reaches the container.
  • I'm having permission issues on Linux, what should I do?
    • Make sure that the ./easypages-data folder belongs to user 1000:1000. If you are using a remote filesystem (such as an NFS mount), verify that it allows file ownership modifications.