Create a new installation directory
mkdir /opt/colanode/ && \
cd /opt/colanode/
Create a new Docker Compose file for Colanode
bash -c "cat > /opt/colanode/docker-compose.yaml"<<'EOF'
version: '3.8'
services:
postgres:
image: pgvector/pgvector:pg17
container_name: colanode_postgres
restart: always
environment:
POSTGRES_USER: colanode_user
POSTGRES_PASSWORD: postgrespass123
POSTGRES_DB: colanode_db
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- '5432:5432'
networks:
- colanode_network
valkey:
image: valkey/valkey:8.1
container_name: colanode_valkey
restart: always
command: ['valkey-server', '--requirepass', 'your_valkey_password']
volumes:
- valkey_data:/data
ports:
- '6379:6379'
networks:
- colanode_network
minio:
image: minio/minio:RELEASE.2025-04-08T15-41-24Z
container_name: colanode_minio
restart: always
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: your_minio_password
MINIO_BROWSER: 'on'
MINIO_DOMAIN: minio
MINIO_ADDRESS: ':9000'
MINIO_CONSOLE_ADDRESS: ':9001'
volumes:
- minio_data:/data
ports:
- '9000:9000'
- '9001:9001'
entrypoint: sh
command: -c 'mkdir -p /data/colanode-avatars /data/colanode-files && minio server /data --address ":9000" --console-address ":9001"'
networks:
- colanode_network
# ---------------------------------------------------------------
# Optional SMTP Server (Mailpit) for Local Email Testing
# ---------------------------------------------------------------
# This service runs Mailpit, a local SMTP testing tool.
# If you want to test how emails are sent in the 'server' service,
# you can uncomment the 'smtp' service block and configure the
# SMTP_ENABLED variable to 'true' in the 'server' service environment
# variables.
#
# Access the Mailpit UI at http://localhost:8025
# ---------------------------------------------------------------
# smtp:
# image: axllent/mailpit:v1.24.1
# container_name: colanode_smtp
# restart: always
# ports:
# - '1025:1025' # SMTP IN (Connect server service to this port)
# - '8025:8025' # Web UI
# networks:
# - colanode_network
server:
image: ghcr.io/colanode/server:latest
container_name: colanode_server
restart: always
depends_on:
- postgres
- valkey
- minio
# - smtp # Optional
environment:
# ───────────────────────────────────────────────────────────────
# General Node/Server Config
# ───────────────────────────────────────────────────────────────
NODE_ENV: production
# The server requires a name and avatar URL which will be displayed in the desktop app login screen.
SERVER_NAME: 'Colanode Local'
SERVER_AVATAR: ''
# Possible values for SERVER_MODE: 'standalone', 'cluster'
SERVER_MODE: 'standalone'
# Optional custom path prefix for the server.
# Add a plain text without any slashes. For example if you set 'colanode'
# the URL 'https://localhost:3000/config' will be: 'https://localhost:3000/colanode/config'
# SERVER_PATH_PREFIX: 'colanode'
# Optional CORS Configuration. By default the server is accessible from 'http://localhost:4000'.
# You can change this to allow custom origins (use comma to separate multiple origins) or '*' to allow all origins.
# SERVER_CORS_ORIGIN: 'http://localhost:4000'
# SERVER_CORS_MAX_AGE: '7200'
# ───────────────────────────────────────────────────────────────
# Account Configuration
# ───────────────────────────────────────────────────────────────
# Possible values for ACCOUNT_VERIFICATION_TYPE: 'automatic', 'manual', 'email'
ACCOUNT_VERIFICATION_TYPE: 'automatic'
ACCOUNT_OTP_TIMEOUT: '600' # in seconds
# If you want to enable Google login, you need to set the following variables:
# ACCOUNT_GOOGLE_ENABLED: 'true'
# ACCOUNT_GOOGLE_CLIENT_ID: 'your_google_client_id'
# ACCOUNT_GOOGLE_CLIENT_SECRET: 'your_google_client_secret'
# ───────────────────────────────────────────────────────────────
# User Configuration
# ───────────────────────────────────────────────────────────────
USER_STORAGE_LIMIT: '10737418240' # 10 GB
USER_MAX_FILE_SIZE: '104857600' # 100 MB
# ───────────────────────────────────────────────────────────────
# PostgreSQL Configuration
# ───────────────────────────────────────────────────────────────
# The server expects a PostgreSQL database with the pgvector extension installed.
POSTGRES_URL: 'postgres://colanode_user:postgrespass123@postgres:5432/colanode_db'
# Optional variables for SSL connection to the database
# POSTGRES_SSL_REJECT_UNAUTHORIZED: 'false'
# POSTGRES_SSL_CA: ''
# POSTGRES_SSL_KEY: ''
# POSTGRES_SSL_CERT: ''
# ───────────────────────────────────────────────────────────────
# Redis Configuration
# ───────────────────────────────────────────────────────────────
REDIS_URL: 'redis://:your_valkey_password@valkey:6379/0'
REDIS_DB: '0'
# Optional variables:
REDIS_JOBS_QUEUE_NAME: 'jobs'
REDIS_JOBS_QUEUE_PREFIX: 'colanode'
REDIS_EVENTS_CHANNEL: 'events'
# ───────────────────────────────────────────────────────────────
# S3 configuration for files.
# In the future we will support other storage providers.
# ───────────────────────────────────────────────────────────────
STORAGE_S3_ENDPOINT: 'http://minio:9000'
STORAGE_S3_ACCESS_KEY: 'minioadmin'
STORAGE_S3_SECRET_KEY: 'your_minio_password'
STORAGE_S3_BUCKET: 'colanode'
STORAGE_S3_REGION: 'us-east-1'
STORAGE_S3_FORCE_PATH_STYLE: 'true'
# ───────────────────────────────────────────────────────────────
# SMTP configuration
# ---------------------------------------------------------------
# We leave the SMTP configuration disabled by default.
# ---------------------------------------------------------------
SMTP_ENABLED: 'false'
# ---------------------------------------------------------------
# If using the local Mailpit service (defined above), use:
# SMTP_ENABLED: 'true'
# SMTP_HOST: 'smtp'
# SMTP_PORT: '1025'
# SMTP_USER: ''
# SMTP_PASSWORD: ''
# SMTP_EMAIL_FROM: 'your_email@example.com'
# SMTP_EMAIL_FROM_NAME: 'Colanode'
# ---------------------------------------------------------------
# If using a real SMTP provider, update these:
# SMTP_ENABLED: 'true'
# SMTP_HOST: 'your_smtp_provider_host'
# SMTP_PORT: '587' # Or 465, etc.
# SMTP_USER: 'your_smtp_username'
# SMTP_PASSWORD: 'your_smtp_password'
# SMTP_EMAIL_FROM: 'your_email@example.com'
# SMTP_EMAIL_FROM_NAME: 'Colanode'
# ---------------------------------------------------------------
# ───────────────────────────────────────────────────────────────
# AI Configuration
# ---------------------------------------------------------------
# The AI integration is in experimental mode yet and we don't
# recommend using it.
# ---------------------------------------------------------------
AI_ENABLED: 'false'
# ───────────────────────────────────────────────────────────────
ports:
- '3000:3000'
networks:
- colanode_network
web:
image: ghcr.io/colanode/web:latest
container_name: colanode_web
restart: always
ports:
- '4000:80'
networks:
- colanode_network
volumes:
postgres_data:
valkey_data:
minio_data:
networks:
colanode_network:
driver: bridge
EOF
Pull and start Colanode
docker compose pull && \
docker compose up -d
All services from the Compose config should start listening on several different ports - connect to Colanode server via 3000/tcp
I'm going to use NGINX on the same host as Colanode to reverse proxy to setup SSL/TLS termination using a self-signed certificate. (From here, I'll also use my public facing reverse proxy to securely expose Colanode to the internet)
Install the following NGINX config. Make changes as necessary
bash -c "cat > /etc/nginx/sites-available/colanode.conf"<<'EOF'
server {
server_name colanode.exmaple.com;
listen 443 http2 ssl;
ssl_certificate <cert-file>;
ssl_certificate_key <key-file>;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE_ADDR $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
#proxy_set_header X-Forwarded-Host $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
location / {
proxy_pass http://127.0.0.1:3000/;
}
}
EOF
Disable the default site, enable the Colanode site, restart NGINX
rm /etc/nginx/sites-enabled/default && \
ln -s /etc/nginx/sites-available/colanode.conf /etc/nginx/sites-enabled/colanode.conf && \
systemctl restart nginx.service