Edward Kenneway on board
This commit is contained in:
39
.env.example
Normal file
39
.env.example
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
# Lightweight Docker Registry Configuration
|
||||||
|
# Copy this file to .env and customize for your environment
|
||||||
|
|
||||||
|
# Registry Configuration
|
||||||
|
REGISTRY_PORT=5000
|
||||||
|
REGISTRY_STORAGE_PATH=/var/lib/registry
|
||||||
|
REGISTRY_DATA_PATH=./data
|
||||||
|
REGISTRY_LOG_LEVEL=info
|
||||||
|
REGISTRY_DELETE_ENABLED=true
|
||||||
|
|
||||||
|
# Authentication (optional)
|
||||||
|
REGISTRY_AUTH_ENABLED=false
|
||||||
|
REGISTRY_AUTH_PATH=./auth
|
||||||
|
REGISTRY_AUTH_REALM=Registry Realm
|
||||||
|
|
||||||
|
# TLS/SSL (optional)
|
||||||
|
REGISTRY_SECURED=false
|
||||||
|
REGISTRY_TLS_CERT_PATH=/certs/server.crt
|
||||||
|
REGISTRY_TLS_KEY_PATH=/certs/server.key
|
||||||
|
REGISTRY_TLS_PATH=./certs
|
||||||
|
|
||||||
|
# UI Configuration
|
||||||
|
UI_PORT=8080
|
||||||
|
REGISTRY_TITLE=Docker Registry
|
||||||
|
REGISTRY_URL=http://registry:5000
|
||||||
|
SINGLE_REGISTRY=true
|
||||||
|
DELETE_IMAGES=true
|
||||||
|
SHOW_CONTENT_DIGEST=true
|
||||||
|
SHOW_CATALOG_NB_TAGS=true
|
||||||
|
CATALOG_MIN_BRANCHES=1
|
||||||
|
CATALOG_MAX_BRANCHES=1
|
||||||
|
TAGLIST_PAGE_SIZE=100
|
||||||
|
CATALOG_ELEMENTS_LIMIT=1000
|
||||||
|
|
||||||
|
# Coolify-specific variables (override as needed)
|
||||||
|
# These can be set in Coolify's environment variables section
|
||||||
|
# DOMAIN=your-domain.com
|
||||||
|
# REGISTRY_DOMAIN=registry.your-domain.com
|
||||||
|
# UI_DOMAIN=ui.your-domain.com
|
||||||
22
.gitignore
vendored
Normal file
22
.gitignore
vendored
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
# Ignore data directories
|
||||||
|
data/
|
||||||
|
auth/
|
||||||
|
certs/
|
||||||
|
|
||||||
|
# Ignore environment file with secrets
|
||||||
|
.env
|
||||||
|
|
||||||
|
# Ignore Docker files
|
||||||
|
.dockerignore
|
||||||
|
|
||||||
|
# Ignore logs
|
||||||
|
*.log
|
||||||
|
logs/
|
||||||
|
|
||||||
|
# Ignore temporary files
|
||||||
|
.tmp/
|
||||||
|
*.tmp
|
||||||
|
|
||||||
|
# Ignore OS files
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
34
Dockerfile
34
Dockerfile
@@ -1,34 +0,0 @@
|
|||||||
# Use a lightweight Linux image
|
|
||||||
FROM ubuntu:22.04
|
|
||||||
|
|
||||||
# Install dependencies
|
|
||||||
RUN apt-get update && \
|
|
||||||
apt-get install -y curl tar wget docker.io docker-compose sudo && \
|
|
||||||
rm -rf /var/lib/apt/lists/* && \
|
|
||||||
export TERM=xterm
|
|
||||||
|
|
||||||
# Set environment variables
|
|
||||||
ENV HARBOR_VERSION=2.9.0
|
|
||||||
ENV HARBOR_INSTALLER=harbor-online-installer-v$HARBOR_VERSION.tgz
|
|
||||||
ENV HARBOR_DIR=/opt/harbor
|
|
||||||
|
|
||||||
# Create directory
|
|
||||||
RUN mkdir -p $HARBOR_DIR
|
|
||||||
WORKDIR $HARBOR_DIR
|
|
||||||
|
|
||||||
# Download and extract Harbor
|
|
||||||
RUN curl -LO https://github.com/goharbor/harbor/releases/download/v$HARBOR_VERSION/$HARBOR_INSTALLER && \
|
|
||||||
tar xvf $HARBOR_INSTALLER && \
|
|
||||||
rm $HARBOR_INSTALLER
|
|
||||||
|
|
||||||
# Set workdir to the Harbor folder
|
|
||||||
WORKDIR $HARBOR_DIR/harbor
|
|
||||||
|
|
||||||
# Copy a default harbor.yml config
|
|
||||||
COPY harbor.yml ./harbor.yml
|
|
||||||
|
|
||||||
# Expose default Harbor ports
|
|
||||||
EXPOSE 80 443 4443
|
|
||||||
|
|
||||||
# Run the installer
|
|
||||||
CMD ["./install.sh", "--with-trivy"]
|
|
||||||
96
README.md
96
README.md
@@ -1,2 +1,96 @@
|
|||||||
# Registry
|
# Lightweight Docker Registry
|
||||||
|
|
||||||
|
A simple, lightweight Docker registry with web UI using docker-compose.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
- Lightweight Docker Registry (official registry:2 image)
|
||||||
|
- Web UI for browsing and managing images
|
||||||
|
- Configurable via environment variables
|
||||||
|
- Optional authentication and TLS support
|
||||||
|
- Perfect for Coolify deployment
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
1. Copy environment file:
|
||||||
|
```bash
|
||||||
|
cp .env.example .env
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Start the registry:
|
||||||
|
```bash
|
||||||
|
docker-compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Access:
|
||||||
|
- Registry API: http://localhost:5000
|
||||||
|
- Web UI: http://localhost:8080
|
||||||
|
|
||||||
|
## Coolify Deployment
|
||||||
|
|
||||||
|
In Coolify, set these environment variables as needed:
|
||||||
|
|
||||||
|
### Basic Configuration
|
||||||
|
- `REGISTRY_PORT`: Registry port (default: 5000)
|
||||||
|
- `UI_PORT`: UI port (default: 8080)
|
||||||
|
- `REGISTRY_TITLE`: Registry title for UI
|
||||||
|
- `REGISTRY_URL`: Internal registry URL
|
||||||
|
|
||||||
|
### Storage
|
||||||
|
- `REGISTRY_DATA_PATH`: Data storage path
|
||||||
|
- `REGISTRY_DELETE_ENABLED`: Allow image deletion (true/false)
|
||||||
|
|
||||||
|
### Security (Optional)
|
||||||
|
- `REGISTRY_AUTH_ENABLED`: Enable authentication (true/false)
|
||||||
|
- `REGISTRY_SECURED`: Enable HTTPS (true/false)
|
||||||
|
- `REGISTRY_TLS_CERT_PATH`: Path to TLS certificate
|
||||||
|
- `REGISTRY_TLS_KEY_PATH`: Path to TLS private key
|
||||||
|
|
||||||
|
### UI Settings
|
||||||
|
- `DELETE_IMAGES`: Allow deletion via UI (true/false)
|
||||||
|
- `SHOW_CONTENT_DIGEST`: Show image digests (true/false)
|
||||||
|
- `TAGLIST_PAGE_SIZE`: Number of tags per page
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### Push an image
|
||||||
|
```bash
|
||||||
|
docker tag myimage localhost:5000/myimage
|
||||||
|
docker push localhost:5000/myimage
|
||||||
|
```
|
||||||
|
|
||||||
|
### Pull an image
|
||||||
|
```bash
|
||||||
|
docker pull localhost:5000/myimage
|
||||||
|
```
|
||||||
|
|
||||||
|
### List images
|
||||||
|
```bash
|
||||||
|
curl http://localhost:5000/v2/_catalog
|
||||||
|
```
|
||||||
|
|
||||||
|
## Authentication (Optional)
|
||||||
|
|
||||||
|
To enable basic authentication:
|
||||||
|
|
||||||
|
1. Set `REGISTRY_AUTH_ENABLED=true`
|
||||||
|
2. Create htpasswd file:
|
||||||
|
```bash
|
||||||
|
mkdir -p auth
|
||||||
|
docker run --rm -it httpd:alpine htpasswd -Bbn user password > auth/htpasswd
|
||||||
|
```
|
||||||
|
|
||||||
|
## TLS/SSL (Optional)
|
||||||
|
|
||||||
|
To enable HTTPS:
|
||||||
|
|
||||||
|
1. Set `REGISTRY_SECURED=true`
|
||||||
|
2. Place certificates in `certs/` directory
|
||||||
|
3. Set `REGISTRY_TLS_CERT_PATH` and `REGISTRY_TLS_KEY_PATH`
|
||||||
|
|
||||||
|
## Resource Usage
|
||||||
|
|
||||||
|
- **RAM**: ~100-200MB total
|
||||||
|
- **Storage**: Minimal base + image storage
|
||||||
|
- **CPU**: Very low usage
|
||||||
|
|
||||||
|
Perfect for resource-constrained environments!
|
||||||
55
docker-compose.yml
Normal file
55
docker-compose.yml
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
registry:
|
||||||
|
image: registry:2
|
||||||
|
container_name: registry
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "${REGISTRY_PORT:-5000}:5000"
|
||||||
|
environment:
|
||||||
|
- REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=${REGISTRY_STORAGE_PATH:-/var/lib/registry}
|
||||||
|
- REGISTRY_AUTH=${REGISTRY_AUTH_ENABLED:-false}
|
||||||
|
- REGISTRY_AUTH_HTPASSWD_PATH=${REGISTRY_AUTH_PATH:-/auth/htpasswd}
|
||||||
|
- REGISTRY_AUTH_HTPASSWD_REALM=${REGISTRY_AUTH_REALM:-Registry Realm}
|
||||||
|
- REGISTRY_HTTP_TLS_CERTIFICATE=${REGISTRY_TLS_CERT_PATH:-}
|
||||||
|
- REGISTRY_HTTP_TLS_KEY=${REGISTRY_TLS_KEY_PATH:-}
|
||||||
|
- REGISTRY_LOG_LEVEL=${REGISTRY_LOG_LEVEL:-info}
|
||||||
|
- REGISTRY_STORAGE_DELETE_ENABLED=${REGISTRY_DELETE_ENABLED:-true}
|
||||||
|
volumes:
|
||||||
|
- ${REGISTRY_DATA_PATH:-./data}:/var/lib/registry
|
||||||
|
- ${REGISTRY_AUTH_PATH:-./auth}:/auth
|
||||||
|
- ${REGISTRY_TLS_PATH:-./certs}:/certs
|
||||||
|
networks:
|
||||||
|
- registry-network
|
||||||
|
|
||||||
|
registry-ui:
|
||||||
|
image: joxit/docker-registry-ui:latest
|
||||||
|
container_name: registry-ui
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "${UI_PORT:-8080}:80"
|
||||||
|
environment:
|
||||||
|
- SINGLE_REGISTRY=${SINGLE_REGISTRY:-true}
|
||||||
|
- REGISTRY_TITLE=${REGISTRY_TITLE:-Docker Registry}
|
||||||
|
- DELETE_IMAGES=${DELETE_IMAGES:-true}
|
||||||
|
- SHOW_CONTENT_DIGEST=${SHOW_CONTENT_DIGEST:-true}
|
||||||
|
- NGINX_PROXY_PASS_URL=${REGISTRY_URL:-http://registry:5000}
|
||||||
|
- SHOW_CATALOG_NB_TAGS=${SHOW_CATALOG_NB_TAGS:-true}
|
||||||
|
- CATALOG_MIN_BRANCHES=${CATALOG_MIN_BRANCHES:-1}
|
||||||
|
- CATALOG_MAX_BRANCHES=${CATALOG_MAX_BRANCHES:-1}
|
||||||
|
- TAGLIST_PAGE_SIZE=${TAGLIST_PAGE_SIZE:-100}
|
||||||
|
- REGISTRY_SECURED=${REGISTRY_SECURED:-false}
|
||||||
|
- CATALOG_ELEMENTS_LIMIT=${CATALOG_ELEMENTS_LIMIT:-1000}
|
||||||
|
depends_on:
|
||||||
|
- registry
|
||||||
|
networks:
|
||||||
|
- registry-network
|
||||||
|
|
||||||
|
networks:
|
||||||
|
registry-network:
|
||||||
|
driver: bridge
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
registry-data:
|
||||||
|
driver: local
|
||||||
72
harbor.yml
72
harbor.yml
@@ -1,72 +0,0 @@
|
|||||||
# Harbor configuration file
|
|
||||||
|
|
||||||
# General settings
|
|
||||||
hostname: harbor.craftmatrix.org
|
|
||||||
http:
|
|
||||||
port: 80
|
|
||||||
https:
|
|
||||||
port: 443
|
|
||||||
certificate: /data/cert/server.crt
|
|
||||||
private_key: /data/cert/server.key
|
|
||||||
|
|
||||||
# Database settings
|
|
||||||
database:
|
|
||||||
password: root123
|
|
||||||
max_idle_conns: 100
|
|
||||||
max_open_conns: 900
|
|
||||||
|
|
||||||
# Redis settings
|
|
||||||
redis:
|
|
||||||
password: redis123
|
|
||||||
|
|
||||||
# Log settings
|
|
||||||
log:
|
|
||||||
level: info
|
|
||||||
local:
|
|
||||||
rotate_count: 50
|
|
||||||
rotate_size: 200M
|
|
||||||
location: /var/log/harbor
|
|
||||||
|
|
||||||
# Storage settings
|
|
||||||
storage_service:
|
|
||||||
ca_bundle: /data/registry/ca-bundle.crt
|
|
||||||
filesystem:
|
|
||||||
maxthreads: 100
|
|
||||||
# Uncomment and configure for other storage types
|
|
||||||
# s3:
|
|
||||||
# region: us-west-1
|
|
||||||
# bucket: harbor-bucket
|
|
||||||
# accesskey: access-key
|
|
||||||
# secretkey: secret-key
|
|
||||||
|
|
||||||
# Project creation quotas
|
|
||||||
project_creation_restriction: everyone
|
|
||||||
|
|
||||||
# Admin password
|
|
||||||
adminserver:
|
|
||||||
password: Harbor12345
|
|
||||||
|
|
||||||
# Jobservice settings
|
|
||||||
jobservice:
|
|
||||||
max_job_workers: 10
|
|
||||||
job_logger_provider: file
|
|
||||||
|
|
||||||
# Registry settings
|
|
||||||
registry:
|
|
||||||
credentials_ttl: 5m
|
|
||||||
|
|
||||||
# Chart storage settings
|
|
||||||
chart:
|
|
||||||
absolute_url: disabled
|
|
||||||
|
|
||||||
# Clair settings
|
|
||||||
clair:
|
|
||||||
updaters_interval: 12
|
|
||||||
|
|
||||||
# Trivy settings
|
|
||||||
trivy:
|
|
||||||
ignore_unfixed: false
|
|
||||||
skip_update: false
|
|
||||||
offline_scan: false
|
|
||||||
security_check: vuln
|
|
||||||
insecure: false
|
|
||||||
33
setup.sh
Executable file
33
setup.sh
Executable file
@@ -0,0 +1,33 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Setup script for Lightweight Docker Registry
|
||||||
|
|
||||||
|
echo "🐳 Setting up Lightweight Docker Registry..."
|
||||||
|
|
||||||
|
# Create necessary directories
|
||||||
|
mkdir -p data auth certs
|
||||||
|
|
||||||
|
# Copy environment file if it doesn't exist
|
||||||
|
if [ ! -f .env ]; then
|
||||||
|
cp .env.example .env
|
||||||
|
echo "✅ Created .env file from template"
|
||||||
|
else
|
||||||
|
echo "ℹ️ .env file already exists"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Set proper permissions
|
||||||
|
chmod 755 data auth certs
|
||||||
|
|
||||||
|
echo "🚀 Starting registry..."
|
||||||
|
docker-compose up -d
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "✅ Registry is running!"
|
||||||
|
echo "📊 Web UI: http://localhost:8080"
|
||||||
|
echo "🔌 Registry API: http://localhost:5000"
|
||||||
|
echo ""
|
||||||
|
echo "💡 To push an image:"
|
||||||
|
echo " docker tag myimage localhost:5000/myimage"
|
||||||
|
echo " docker push localhost:5000/myimage"
|
||||||
|
echo ""
|
||||||
|
echo "📝 Edit .env file to customize configuration"
|
||||||
Reference in New Issue
Block a user