Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 67 additions & 0 deletions .github/workflows/docker-build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
name: Build and Push Docker Image

on:
push:
branches:
- sysblok-dev
- sysblok-main

env:
REGISTRY: ghcr.io
IMAGE_NAME: sysblok/focalboard/focalboard

jobs:
build-and-push:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write

steps:
- name: Checkout repository
uses: actions/checkout@v3

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2

- name: Log in to Container Registry
uses: docker/login-action@v2
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Determine image tags
id: tags
run: |
BRANCH_NAME=${GITHUB_REF#refs/heads/}
SHORT_SHA=${GITHUB_SHA::7}

if [ "$BRANCH_NAME" = "sysblok-dev" ]; then
TAG="dev"
elif [ "$BRANCH_NAME" = "sysblok-main" ]; then
TAG="main"
else
TAG="$BRANCH_NAME"
fi

echo "tag=$TAG" >> $GITHUB_OUTPUT
echo "sha_tag=${TAG}-${SHORT_SHA}" >> $GITHUB_OUTPUT
echo "full_image=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}" >> $GITHUB_OUTPUT

- name: Build and push Docker image
uses: docker/build-push-action@v4
with:
context: .
file: ./docker/Dockerfile
push: true
tags: |
${{ steps.tags.outputs.full_image }}:${{ steps.tags.outputs.tag }}
${{ steps.tags.outputs.full_image }}:${{ steps.tags.outputs.sha_tag }}
build-args: |
FOCALBOARD_ENVIRONMENT=${{ vars.FOCALBOARD_ENVIRONMENT || 'prod' }}
FOCALBOARD_ADMINS=${{ vars.FOCALBOARD_ADMINS || '' }}
cache-from: type=gha
cache-to: type=gha,mode=max
platforms: linux/amd64

56 changes: 33 additions & 23 deletions docker/docker-compose-db-nginx-testing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,46 +2,52 @@ version: "3"

services:
app:
build:
context: ../
dockerfile: docker/Dockerfile
# Use pre-built image from GitHub Container Registry
# Set FOCALBOARD_TAG environment variable to use 'dev' (default) or 'main' tag
# To authenticate: echo $GITHUB_TOKEN | docker login ghcr.io -u YOUR_USERNAME --password-stdin
image: ghcr.io/sysblok/focalboard/focalboard:${FOCALBOARD_TAG:-dev}
# Uncomment below and comment 'image:' above to build locally instead
# build:
# context: ../
# dockerfile: docker/Dockerfile
container_name: focalboard-dev-app
depends_on:
- focalboard-db
expose:
- 8001
- 8000
labels:
- "traefik.enable=true"
- "traefik.http.routers.focalboard-dev.rule=Host(`${FOCALBOARD_HOST}`)"
- "traefik.http.routers.focalboard-dev.entrypoints=web"
- "traefik.http.routers.focalboard-dev.middlewares=focalboard-dev-redirect"
- "traefik.http.routers.focalboard-dev-secure.rule=Host(`${FOCALBOARD_HOST}`)"
- "traefik.http.routers.focalboard-dev-secure.entrypoints=websecure"
- "traefik.http.routers.focalboard-dev-secure.tls.certresolver=le"
- "traefik.http.routers.focalboard-dev-secure.service=focalboard-dev"
- "traefik.http.middlewares.focalboard-dev-redirect.redirectscheme.scheme=https"
- "traefik.http.middlewares.focalboard-dev-redirect.redirectscheme.permanent=true"
- "traefik.http.services.focalboard-dev.loadbalancer.server.port=8000"
- "traefik.http.services.focalboard-dev.loadbalancer.healthcheck.path=/api/v2/system/ping"
- "traefik.http.services.focalboard-dev.loadbalancer.healthcheck.interval=10s"
environment:
- VIRTUAL_HOST=${FOCALBOARD_HOST}
- LETSENCRYPT_HOST=${FOCALBOARD_HOST}
- FOCALBOARD_ENVIRONMENT=${FOCALBOARD_ENVIRONMENT:-dev}
- VIRTUAL_PORT=8001
- VIRTUAL_PROTO=http
- FOCALBOARD_ADMINS=${FOCALBOARD_ADMINS:-}
volumes:
- "./config.json:/opt/focalboard/config.json"
- fbdata:/opt/focalboard/data
restart: always
networks:
- proxy
- default

proxy:
image: nginx:latest
restart: always
ports:
- "8443:8443"
volumes:
- ./nginx-testing.conf:/etc/nginx/conf.d/default.conf:ro
- ./client_max_body_size.conf:/etc/nginx/conf.d/client_max_body_size.conf:ro
networks:
- default
depends_on:
- app

focalboard-db:
image: postgres:latest
image: postgres:16
container_name: focalboard-dev-db
restart: always
volumes:
- pgdata:/var/lib/postgresql/data
- type: bind
source: /backups
source: /backups/focalboard-dev
target: /backups
environment:
POSTGRES_DB: boards
Expand All @@ -51,3 +57,7 @@ services:
volumes:
fbdata:
pgdata:

networks:
proxy:
external: true
84 changes: 29 additions & 55 deletions docker/docker-compose-db-nginx.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,39 @@ version: "3"

services:
app:
build:
context: ../
dockerfile: docker/Dockerfile
args:
FOCALBOARD_ENVIRONMENT: ${FOCALBOARD_ENVIRONMENT:-prod}
FOCALBOARD_ADMINS: ${FOCALBOARD_ADMINS:-}
container_name: focalboard
# Use pre-built image from GitHub Container Registry
# Set FOCALBOARD_TAG environment variable to use 'dev' (default) or 'main' tag
# To authenticate: echo $GITHUB_TOKEN | docker login ghcr.io -u YOUR_USERNAME --password-stdin
image: ghcr.io/sysblok/focalboard/focalboard:${FOCALBOARD_TAG:-latest}
# Uncomment below and comment 'image:' above to build locally instead
# build:
# context: ../
# dockerfile: docker/Dockerfile
# args:
# FOCALBOARD_ENVIRONMENT: ${FOCALBOARD_ENVIRONMENT:-prod}
# FOCALBOARD_ADMINS: ${FOCALBOARD_ADMINS:-}
container_name: focalboard-prod-app
depends_on:
- focalboard-db
expose:
- 8000
environment:
- VIRTUAL_HOST=${FOCALBOARD_HOST}
- LETSENCRYPT_HOST=${FOCALBOARD_HOST}
- FOCALBOARD_ENVIRONMENT=${FOCALBOARD_ENVIRONMENT:-dev}
- FOCALBOARD_ADMINS=${FOCALBOARD_ADMINS:-}
- VIRTUAL_PORT=8000
- VIRTUAL_PROTO=http
labels:
- "traefik.enable=true"
- "traefik.http.routers.focalboard-prod.rule=Host(`${FOCALBOARD_HOST}`)"
- "traefik.http.routers.focalboard-prod.entrypoints=web"
- "traefik.http.routers.focalboard-prod.middlewares=focalboard-prod-redirect"
- "traefik.http.routers.focalboard-prod-secure.rule=Host(`${FOCALBOARD_HOST}`)"
- "traefik.http.routers.focalboard-prod-secure.entrypoints=websecure"
- "traefik.http.routers.focalboard-prod-secure.tls.certresolver=le"
- "traefik.http.routers.focalboard-prod-secure.service=focalboard-prod"
- "traefik.http.middlewares.focalboard-prod-redirect.redirectscheme.scheme=https"
- "traefik.http.middlewares.focalboard-prod-redirect.redirectscheme.permanent=true"
- "traefik.http.services.focalboard-prod.loadbalancer.server.port=8000"
- "traefik.http.services.focalboard-prod.loadbalancer.healthcheck.path=/api/v2/system/ping"
- "traefik.http.services.focalboard-prod.loadbalancer.healthcheck.interval=10s"
volumes:
- "./config.json:/opt/focalboard/config.json"
- fbdata:/opt/focalboard/data
Expand All @@ -28,46 +43,9 @@ services:
- proxy
- default

proxy:
image: jwilder/nginx-proxy:latest
container_name: focalboard-proxy
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- ./client_max_body_size.conf:/etc/nginx/conf.d/client_max_body_size.conf:ro
- "html:/usr/share/nginx/html"
- "dhparam:/etc/nginx/dhparam"
- "vhost:/etc/nginx/vhost.d"
- "certs:/etc/nginx/certs"
- "letsencrypt-acme:/etc/acme.sh"
networks:
- proxy

letsencrypt:
image: "nginxproxy/acme-companion:latest"
container_name: "letsencrypt-helper"
volumes:
- "html:/usr/share/nginx/html"
- "dhparam:/etc/nginx/dhparam"
- "vhost:/etc/nginx/vhost.d"
- "certs:/etc/nginx/certs"
- "/run/docker.sock:/var/run/docker.sock:ro"
- "letsencrypt-acme:/etc/acme.sh"
environment:
NGINX_PROXY_CONTAINER: "focalboard-proxy"
DEFAULT_EMAIL: ${LETSENCRYPT_EMAIL}
restart: "always"
depends_on:
- "proxy"
networks:
- proxy

focalboard-db:
image: postgres:latest
container_name: focalboard-postgres
image: postgres:16
container_name: focalboard-prod-db
restart: always
volumes:
- pgdata:/var/lib/postgresql/data
Expand All @@ -82,12 +60,8 @@ services:
volumes:
fbdata:
pgdata:
certs:
html:
vhost:
dhparam:
letsencrypt-acme:

networks:
proxy:
external: true

Loading