Files
SealShare/Dockerfile
T
Andreas Reinhold / reiniandClaude Opus 5 d860a16551
docker / test (8.5) (push) Successful in 2m13s
linter / quality (push) Successful in 1m8s
tests / ci (8.5) (push) Successful in 2m7s
docker / build-and-push (push) Failing after 9m54s
docker / release (push) Has been skipped
Move SealShare from GitHub to Gitea only
The workflows live in .gitea/workflows. The Docker workflow logs in to
the Gitea container registry with REGISTRY_TOKEN (Gitea's job token cannot
publish packages yet), publishes gitea.nonameweb.ch/nonameweb/sealshare
with a registry build cache, and makes the release on Gitea with the
version's section of the changelog as its notes.

The README, the website's quick start, both compose files and the image
label point to Gitea; the changelog announces the new image name and
links Gitea. GiteaOnlyTest keeps GitHub and ghcr.io out.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V9NnLxnPp8vaaurb3Z1MFy
2026-09-13 13:59:07 +02:00

107 lines
2.9 KiB
Docker

# ============================================
# Stage 1: Install PHP dependencies
# ============================================
FROM composer:2 AS vendor
WORKDIR /app
COPY composer.json composer.lock* ./
RUN composer install \
--no-dev \
--no-interaction \
--no-autoloader \
--no-scripts \
--prefer-dist
COPY . .
RUN composer dump-autoload --optimize --no-dev
# ============================================
# Stage 2: Build frontend assets
# ============================================
# After Composer: the stylesheet and script import Livewire Material from vendor/.
FROM node:24-alpine AS assets
WORKDIR /app
COPY package.json package-lock.json* ./
RUN npm ci --prefer-offline
COPY vite.config.js ./
COPY resources/ ./resources/
COPY --from=vendor /app/vendor/nonameweb ./vendor/nonameweb
RUN npm run build
# ============================================
# Stage 3: Production image (FrankenPHP/Octane)
# ============================================
FROM dunglas/frankenphp:php8.5-alpine AS production
LABEL maintainer="surtic86"
LABEL org.opencontainers.image.source="https://gitea.nonameweb.ch/noNameWEB/SealShare"
LABEL org.opencontainers.image.description="Self-hosted encrypted file sharing"
# Install required PHP extensions
RUN install-php-extensions \
intl \
pcntl \
zip
# Laravel environment defaults
ENV APP_NAME="SealShare" \
APP_ENV="production" \
APP_DEBUG="false" \
APP_URL="http://localhost" \
LOG_CHANNEL="stderr" \
LOG_LEVEL="warning" \
DB_CONNECTION="sqlite" \
SESSION_DRIVER="database" \
QUEUE_CONNECTION="database" \
CACHE_STORE="database" \
FILESYSTEM_DISK="local" \
BROADCAST_CONNECTION="log" \
BCRYPT_ROUNDS="12" \
OCTANE_SERVER="frankenphp"
WORKDIR /app
# Copy Caddyfile
COPY docker/Caddyfile /etc/caddy/Caddyfile
# Copy PHP ini for upload limits
COPY docker/php/uploads.ini /usr/local/etc/php/conf.d/99-uploads.ini
# Copy application code
COPY . .
# Copy vendor dependencies from composer stage
COPY --from=vendor /app/vendor ./vendor
# Copy built frontend assets from node stage
COPY --from=assets /app/public/build ./public/build
# Remove dev/build files and stale cache not needed in production
RUN rm -rf node_modules tests .gitea docker/dev.Dockerfile docker/dev-entrypoint.sh .env .env.example \
bootstrap/cache/*.php \
&& mkdir -p storage/app/shares storage/app/public storage/framework/cache \
storage/framework/sessions storage/framework/testing storage/framework/views \
storage/logs database \
&& chmod -R 777 storage database bootstrap/cache
# Create SQLite database file if it doesn't exist
RUN touch database/database.sqlite \
&& chmod 666 database/database.sqlite
# Make entrypoint executable
RUN chmod +x docker/entrypoint.sh
EXPOSE 80 443 443/udp
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
CMD curl --silent --fail http://localhost/up || exit 1
ENTRYPOINT ["docker/entrypoint.sh"]