Quick start¶
This guide shows how to setup your own instance of asciinema server for hosting terminal session recordings.
For a broader overview of what's possible with asciinema check out the intro guide.
To keep this guide simple we'll use the official asciinema server container image, ghcr.io/asciinema/asciinema-server, in a docker-compose based setup. If you prefer to use a different deployment solution it should be straightforward to adapt the configuration presented below to specifics of your environment.
Here's a basic docker-compose configuration for asciinema server you can use as a template.
services:
asciinema:
image: ghcr.io/asciinema/asciinema-server:20251114
environment:
- SECRET_KEY_BASE= # <- see below
- URL_HOST=asciinema.example.com
- URL_SCHEME=https
- SMTP_HOST=smtp.example.com
- SMTP_USERNAME=foobar
- SMTP_PASSWORD=hunter2
volumes:
- asciinema_data:/var/lib/asciinema
depends_on:
postgres:
condition: service_healthy
postgres:
image: docker.io/library/postgres:14
environment:
- POSTGRES_HOST_AUTH_METHOD=trust
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U postgres']
interval: 2s
timeout: 5s
retries: 10
caddy:
image: caddy:2
command: caddy reverse-proxy --from https://asciinema.example.com --to http://asciinema:4000
ports:
- '80:80'
- '443:443'
- '443:443/udp'
volumes:
- caddy_data:/data
- caddy_config:/config
volumes:
asciinema_data:
postgres_data:
caddy_data:
caddy_config:
services:
asciinema:
image: ghcr.io/asciinema/asciinema-server:20251114
ports:
- '80:4000'
environment:
- SECRET_KEY_BASE= # <- see below
- URL_HOST=asciinema.example.com
- URL_PORT=80
- SMTP_HOST=smtp.example.com
- SMTP_USERNAME=foobar
- SMTP_PASSWORD=hunter2
volumes:
- asciinema_data:/var/lib/asciinema
depends_on:
postgres:
condition: service_healthy
postgres:
image: docker.io/library/postgres:14
environment:
- POSTGRES_HOST_AUTH_METHOD=trust
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U postgres']
interval: 2s
timeout: 5s
retries: 10
volumes:
asciinema_data:
postgres_data:
Let's break it down.
The asciinema container uses a server image version tagged 20251114. This is
merely an example; please check the
releases page for the
latest stable version number and use that instead.
The SECRET_KEY_BASE environment variable is used for encryption/signing of
user sessions (amongst other things). You can generate one with the following
command:
tr -dc A-Za-z0-9 </dev/urandom | head -c 64; echo
The URL_SCHEME, URL_HOST and URL_PORT variables configure the root URL
used for link generation. The URL_HOST should match the DNS name by which the
server is accessible.
Check general configuration for more information on
SECRET_KEY_BASE and URL_* variables.
The SMTP_* variables configure SMTP server used for sending short-lived login
links. If you don't set those no mail will be sent. However, you can still
obtain a login link from the server logs after entering your email address on
the login page. Check email configuration for more
details, including configuration examples for popular SMTP providers.
The server stores the uploaded recordings and other data at
/var/lib/asciinema. We used volume mapping for this directory, but you can
also bind-mount it to a directory on the host system, e.g.
/path/to/asciinema/data:/var/lib/asciinema, or use S3-compatible object store
instead. Check file store configuration for
details.
The server utilizes PostgreSQL as its database; therefore we have included a
dedicated postgres service, mapping its data directory,
/var/lib/postgresql/data, to a volume. For convenience, asciinema server
container image sets DATABASE_URL to
postgresql://postgres@postgres/postgres, enabling it to connect to the
postgres container automatically. Check the database
configuration for more information on
DATABASE_URL, including the use of a separate/external PostgreSQL server.
Finally, the caddy service runs Caddy web server
in reverse proxy mode, with automatic HTTPS enabled for the domain specified
with the --from argument (which should be the same as the URL_HOST on
asciinema service). See HTTPS configuration for
additional information.
Assuming you have set SECRET_KEY_BASE and URL_* variables, and opened ports
80 and 443 in the host system's firewall, you can now launch the stack with:
docker compose up
You will see PostgreSQL perform its initial setup, asciinema server create its database tables, and Caddy attempt to obtain a TLS certificate for your domain. Visit the configured URL in your web browser to verify it's up and running.
Congratulations! You have your own asciinema server instance 🎉
Now, point asciinema CLI to your server by setting ASCIINEMA_API_URL, and
upload a recording:
export ASCIINEMA_SERVER_URL=https://asciinema.example.com
asciinema upload demo.cast
export ASCIINEMA_API_URL=https://asciinema.example.com
asciinema upload demo.cast
Check the CLI configuration section for information on how to set the server URL permanently via the configuration file.