Skip to content

prevent duplicate notification groups #353

prevent duplicate notification groups

prevent duplicate notification groups #353

Workflow file for this run

name: Build and Push Docker Images
on:
workflow_dispatch:
push:
branches:
- main # or your default branch
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
SERVICES_TO_PUSH: remix
ROOT_DIRECTORY: /opt
jobs:
build-and-push:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: "3.x"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install pyyaml
- name: Log in to the Container registry
uses: docker/login-action@v1
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Parse docker-compose file and build/push images
run: |
import yaml
import os
def parse_docker_compose():
with open('docker-compose.yml', 'r') as file:
return yaml.safe_load(file)
def build_and_push_image(service, config):
context = config.get('build', {}).get('context', '.')
dockerfile = config.get('build', {}).get('dockerfile', 'Dockerfile')
if not os.path.isabs(dockerfile):
dockerfile = os.path.join(context, dockerfile)
print(f"Processing service: {service}")
print(f"Context for {service}: {context}")
print(f"Dockerfile for {service}: {dockerfile}")
registry = os.environ['REGISTRY']
image_name = os.environ['IMAGE_NAME'].lower()
build_cmd = f"docker build -t {registry}/{image_name}/{service}:latest -f {dockerfile} {context}"
push_cmd = f"docker push {registry}/{image_name}/{service}:latest"
print(f"Building image for {service}...")
os.system(build_cmd)
print(f"Pushing image for {service}...")
os.system(push_cmd)
print(f"Completed processing for {service}")
print(f"Image pushed to: {registry}/{image_name}/{service}:latest")
print("-----------------------------------")
docker_compose = parse_docker_compose()
services_to_push = os.environ['SERVICES_TO_PUSH'].split(',')
for service in services_to_push:
if service in docker_compose['services']:
build_and_push_image(service, docker_compose['services'][service])
else:
print(f"Warning: Service {service} not found in docker-compose.yml")
print("\nSummary of pushed images:")
for service in services_to_push:
if service in docker_compose['services']:
print(f"ghcr.io/{os.environ['IMAGE_NAME']}/{service}:latest")
shell: python
- name: Create .env file for host
run: |
echo "ENVIRONMENT=PRODUCTION" >> .env
echo "NODE_ENV=production" >> .env
echo "USE_SSL=true" >> .env
echo "WEB_DOMAIN=${{ secrets.PUBLIC_DOMAIN }}" >> .env
echo "PUBLIC_URL=https://${{ secrets.PUBLIC_DOMAIN }}" >> .env
echo "TRAEFIK_DASHBOARD_DOMAIN=traefik.sill.social" >> .env
echo "ACME_EMAIL=${{ secrets.ACME_EMAIL }}" >> .env
echo "DATABASE_URL=${{ secrets.DATABASE_URL }}" >> .env
echo "DOZZLE_DOMAIN=${{ secrets.DOZZLE_DOMAIN }}" >> .env
echo "HONEYPOT_SECRET=${{ secrets.HONEYPOT_SECRET }}" >> .env
echo "MAILGUN_API_KEY=${{ secrets.MAILGUN_API_KEY }}" >> .env
echo "MASTODON_REDIRECT_URI=${{ secrets.MASTODON_REDIRECT_URI }}" >> .env
echo "POSTGRES_DB=${{ secrets.POSTGRES_DB }}" >> .env
echo "POSTGRES_PASSWORD=${{ secrets.POSTGRES_PASSWORD }}" >> .env
echo "POSTGRES_USER=${{ secrets.POSTGRES_USER }}" >> .env
echo "PRIVATE_KEY_ES256_B64=${{ secrets.PRIVATE_KEY_ES256_B64 }}" >> .env
echo "RESEND_API_KEY=${{ secrets.RESEND_API_KEY }}" >> .env
echo "SESSION_SECRET=${{ secrets.SESSION_SECRET }}" >> .env
echo "TRAEFIK_DASHBOARD_AUTH=${{ secrets.TRAEFIK_DASHBOARD_AUTH }}" >> .env
echo "CRON_API_KEY=${{ secrets.CRON_API_KEY }}" >> .env
echo "UPDATE_BATCH_SIZE=${{ secrets.UPDATE_BATCH_SIZE }}" >> .env
- name: Copy .env and docker-compose-prod files to remote server
uses: appleboy/scp-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USER }}
key: ${{ secrets.SSH_KEY }}
source: ".env,docker-compose-deploy.yml"
target: "/tmp"
# - name: Create dozzle/data directory and copy user.yml
# uses: appleboy/[email protected]
# with:
# host: ${{ secrets.HOST }}
# username: ${{ secrets.USER }}
# key: ${{ secrets.SSH_KEY }}
# script: |
# sudo mkdir -p ${{ env.ROOT_DIRECTORY }}/dozzle/data
# cat ${{ secrets.DOZZLE_USER_YAML }} > ${{ env.ROOT_DIRECTORY }}/dozzle/data/users.yml
# sudo chown -R ${{ secrets.USER }}:${{ secrets.USER }} ${{ env.ROOT_DIRECTORY }}/dozzle
# sudo chmod 600 ${{ env.ROOT_DIRECTORY }}/dozzle/data/users.yml
- name: Move files to ROOT_DIRECTORY and set permissions
uses: appleboy/[email protected]
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USER }}
key: ${{ secrets.SSH_KEY }}
script: |
sudo mkdir -p /tmp
sudo mv /tmp/.env /tmp/docker-compose-deploy.yml ${{ env.ROOT_DIRECTORY }}/
sudo mv ${{ env.ROOT_DIRECTORY }}/docker-compose-deploy.yml ${{ env.ROOT_DIRECTORY }}/docker-compose.yml
sudo chown ${{ secrets.USER }}:${{ secrets.USER }} ${{ env.ROOT_DIRECTORY }}/.env ${{ env.ROOT_DIRECTORY }}/docker-compose.yml
sudo chmod 600 ${{ env.ROOT_DIRECTORY }}/.env
sudo chmod 644 ${{ env.ROOT_DIRECTORY }}/docker-compose.yml
- name: Deploy with Docker Compose
uses: appleboy/[email protected]
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USER }}
key: ${{ secrets.SSH_KEY }}
script_stop: true
script: |
cd ${{ env.ROOT_DIRECTORY }}
COMPOSE_FILE="docker-compose.yml"
# Authenticate Docker with GitHub Container Registry
echo ${{ secrets.GITHUB_TOKEN }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin
# Deploy services in SERVICES_TO_PUSH
docker compose -f "$COMPOSE_FILE" pull $(echo ${{ env.SERVICES_TO_PUSH }} | tr ',' ' ')
IFS=',' read -ra SERVICES <<< "${{ env.SERVICES_TO_PUSH }}"
for service in "${SERVICES[@]}"; do
docker rollout -f "$COMPOSE_FILE" "$service"
done
# Remove orphaned Docker containers
docker container prune -f
docker image prune -af
# manually restart worker
docker compose -f "$COMPOSE_FILE" up -d --build worker
echo "🚀 Deployment complete! 🎉 Services are now up and running. 🌟"